一、实验目的
1、了解单片机实验开发板电路原理图
2、掌握KEIL软件开发单片机C51程序的流程
3、掌握单片机开发程序的烧录方法和流程
二、实验内容
1、完成单片机开发相关必备软件的安装
2、学习单片机开发板套件的实验原理图
3、编写、下载及实现第一个单片机程序(点亮一个LED灯)
三、实验原理
单片机开发板原理图;单片机并行输入输出接口
四、实验电路与程序
1、软件实验一:存储器块清零
1)实验要求:指定存储器中某块的起始地址和长度,要求能将其内容清零。
2)实验目的:1. 掌握存储器读写方法;2. 了解存储器的块操作方法
3)实验说明:通过本实验,学生可以了解单片机读写存储器的读写方法,同时也可以了解单片机编程,调试方法。
4)程序框图
5)程序源代码
汇编代码
ORG 0000H ;程序执行的起始地址1. LJMP Main ;跳转到main函数
2.
3. ORG 0100H ;程序跳转到0100H开始执行
4.
5. Main: ;主函数
6. INIT: ;初始化存储块,把立即数写到内存块里面
7. MOV 30H, #1FH
8. MOV 31H, #2FH
9. MOV 32H, #3FH
10. MOV 33H, #4FH
11. MOV 34H, #5FH
12. MOV 35H, #6FH
13.
14.
15. MOV R0, #30H ;起始位置设置
16. MOV R1, #06H ;长度设置
17.
18. CLS: MOV @ R0, #00H ;清零
19. INC R0 ;选择下一个清零地址
20. DJNZ R1, CLS ;循环直到这段长度的地址全部清零
21.
22.
23. SJMP Main ;跳转到main,死循环
24. END
C语言代码:
main.c
1. #include <reg51.h>
2. #include <stdio.h>
3. #include <cls.h>
4. int length=5;
5. char *start_addr=0x30;
6. int num=0x9F;
7.
8. void main(void)
9. {
10. int i;
11. for(i=0;i<length;i++)//往地址里面写值
12. {
13. *start_addr=num;
14. start_addr++;
15. }
16. start_addr=start_addr-length;//回到初始地址
17. clear(start_addr,length);//清理指定位置的值
18. while(1)
19. {
20. ;//让单片机在死循环内跑,保持工作状态
21. }
22.
23. }
cls.h
1. #ifndef _CLS_H
2. #define _CLS_H//设置条件编译,防止多处引用头文件造成连接错误
3. void clear(char* addr, int length);
4. #endif
cls.cvoid clear(char* addr, int length)//起始地址和清零空间长度1. {
2. int i;
3. for(i=0;i<length;i++)
4. {
5. *addr =0;//该地址清零
6. addr++;
7. }
8. }
2、软件实验二:二进制数转换成二十进制(BCD)码
1)实验要求:将给定的一个二进制数,转换成二十进制(BCD)码。
2)实验目的:1. 掌握简单的数值转换算法; 2. 基本了解数值的各种表达方法
3)实验说明:计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。
4)程序框图
5)程序源代码
汇编代码:
1. ORG 0000H ;程序执行的起始地址
2. LJMP Main ;跳转到main函数
3.
4. ORG 0100H ;程序跳转到0100H开始执行
5.
6. Main: ;主函数
7. MOV A, #9FH ;待转换的二进制数
8.
9. MOV B, #100
10. D
1. IV AB ;除一百,取出百位在A,余数在B
2. MOV 30H, A ;存百位数在32H
3. MOV A, #10
4. XCH A, B ;A为除了一百之后的余数,B为10
5. DIV AB ;十位放在A,个位放在B
6. RLC A
7. RLC A
8. RLC A
9. RLC A ;四次左移指令,把十位移到高字节
10. ADD A, B ;把个位放到低字节
11. MOV 31H, A ;十位和个位放到31H
12. SJMP Main ;跳转到main,死循环
13. END
C语言代码:
main.c代码
1. #include <reg51.h>
2. #include <stdio.h>
3. #include <intrins.h>
4. #include <b2bcd.h>
5. char *high=0x30;//BCD码的百位存放地址
6. char *low=0x31;//BCD码的十位和各位存放地址,十位在高字节
7.
8. void main(void)
9. {
10. char b=123;//待转换的BCD码
11. b2bcd(high,low,b);
12. while(1)
13. {
14. ;//让单片机在死循环内跑,保持工作状态
15. }
16. }
b2bcd.h代码
1. #ifndef _BSP_BUZZER_H
2. #define _BSP_BUZZER_H
3. #include “stm32f1xx.h”
4. void init_buzzer(void);
5. void beep_buzzer(void);
6. #endif
b2bcd.c代码
1. #include <b2bcd.h>
2. void b2bcd(char *high,char *low,char b)
3. {
4. char temp;
5. *high=b/100;//算百位,存百位
6. temp=(b%100)/10;//算十位
7. *low=temp;//存十位
8. temp=b-100*(high)-10temp;//算个位
9. *low=crol(*low,4)+temp;//十位移到高位,个位放低位
10. }
3、软件实验一:点亮LED灯
1)实验要求:控制P1口的八个LED灯依次亮起,成流水状,并完成proteus仿真。
2)实验目的:1. 掌握GPIO口控制方法;2. 掌握proteus和keil联合仿真方法;3.掌握利用宏晶的isp下载软件下载程序的方法。
3)实验说明:通过本实验,学生可以了解单片机控制GPIO的方法,proteus仿真和程序烧写。
4)程序流程图
5)程序源代码
main.c
1. #include <reg52.h>
2. #include <stdio.h>
3. #include <intrins.h>
4. void delay_ms(unsigned int n)
5. {
unsigned int i=0,j=0;for(i=0;i<n;i++)for(j=0;j<123;j++);1. }
2. void main()
3. {
4. int i=0;
5. P1=0xFE;//LED接上拉电阻,故GPIO高低平时灯亮
6. while(1)
7. {
8.
9. for(i=0;i<8;i++)
10. {
11. delay_ms(500);
12. P1=(P1<<1)|(P1>>7);//循环左移1位
13. }
14. }
15.
16. }
6)proteus仿真图
五、实验结果与总结
1.指定位置清零
现象:30H到35H地址被清零。
心得
注意51单片机的存储形式是大端模式,而查找存储地址时要注意是c,d还是x。
2.二进制转BCD码
现象:二进制数被转化为BCD码存在30H和31H中。
心得
注意地址传参;注意%和/的用法。
3.点亮LED灯:
现象:LED灯依次变绿
心得:注意P1口接的是上拉电阻,输出低电平时灯亮;延时时间需要长一些,否则看起来像是所有灯都亮。