51单片机实验合集
实验一 多字节十进制加法程序设计
一.实验目的:
1.熟悉仿真器的软件使用环境及单片机汇编语言编程;
2.掌握多字节十进制加法的程序设计及实现方法。
二.实验内容:
编写多字节十进制加法程序,实现下式运算 :
4574+6728=11302
要求:被加数在片内RAM区20H、21H单元;分别为学号(7),学号+1(8);
加数在片内RAM区30H、31H单元;分别为学号+2(9),学号+3(10);
结果在片内RAM区20H(最高位进位)、21H(高位)、22H(低位)单元。
三.实验步骤:
1.开机启动Keil C51软件进入μVision2 集成开发环境,确认89C51处于软件仿真状态。
2.完成程序的设计、编辑、编译、连接。
3.进入DEBUG方式,打开存储器Memory 1窗口,在窗口Address栏键入D:20H;点击鼠标右键,选择最后一项Modify Memory ,输入被加数;在窗口Address栏键入D:30H;点击鼠标右键,选择最后一项Modify Memory ,输入加数。
4.调试和运行程序并记录存储器Memory 1窗口实验结果。
四.实验参考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV A,20H
ADD A,30H
DA A
MOV 22H,A
MOV A,21H
ADDC A,31H
DA A
MOV 21H,A
CLR A
MOV R3,00H
ADDC A,R3
MOV 20H,A
SJMP $
END
五.实验截图:
实验总结:学会了多字节十进制加法程序设计,对keilc51有了更为熟练地掌握,也对程序有了更为深入的了解,课堂所学的理论以及一些不清楚的地方在实验中得到了答案。
实验三 P1口输出实验
一.实验目的:
1.掌握P1口输出端口的使用原理及编程方法;
2.加深I/O端口对外部电路驱动原理的理解。
二.实验内容:
P1口做输出,驱动8只发光二极管,编写程序,以1s的时间间隔使得一个发光二极管从左到右循环点亮。
三.实验步骤:
1.理解P1口内部结构,掌握P1口输出高低电平的原理。
2.看懂实验电路,完成接口连线(注意,接线时需要关闭实验箱电源)。
3.编写控制程序,注意延时循环的时间控制在1s
4.进入DEBUG方式,打开I/O口查看工具,监视P1口的输出变化。调试程序并观察发光二极管点亮情况。
。
四.实验参考程序:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: MOV P2,#0FEH
LOOP: ACALL DELAY
MOV A,P2
RL A
MOV P2,A
AJMP LOOP
DELAY:
MOV R3,#100
DELAY2: MOV R4,#100
DELAY3: MOV R5,#100
DELAY1: DJNZ R5,$
DJNZ R4,DELAY3
DJNZ R3,DELAY2
RET
END
;说明:P1口接发光二极管
实验结果:输入代码调试好,通过烧写器可以看见单片机上的二极管呈周期性点亮,改动数据能改变它点亮的时间间隔。实验结果如下图所示:
实验总结:这次实验中花了很多时间去看电路图以及去理解代码,调整代码,对keil uVision软件的使用并不是很熟练,初次使用烧写器没找到要烧入的文件忘记调芯片类型以及波特率,通过这次试验掌握了P1口输出端口的原理,也熟悉了代码程序的编写。
实验四 P口输入实验
一.实验目的:
1.掌握P3口输入端口的使用原理及编程方法;
2.加深I/O端口对外部电路驱动原理的理解。
二.实验内容:
通过手动按键K1-K3,循环读取P3.0-P3.3,并将结果显示在P2.0-P2.3的LED上,按键观察读入的值变化。
三.实验步骤:
1.理解I/O口读取外部电平原理.
2.进入DEBUG方式,打开I/O口查看工具,监视P3口的输出变化。
4.生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。
。
四.实验参考程序:
ORG 0000H
SJMP 0030H
ORG 0030H
START:
LOOP: MOV C,P3.1
MOV P2.0,C ;读按键K1显示在D1
MOV C,P3.0
MOV P2.1,C ;读按键K2显示在D2
MOV C,P3.2
MOV P2.2,C ;读按键K3显示在D3
MOV C,P3.3
MOV P2.3,C ;读按键K4显示在D4
SJMP LOOP
END
;说明:P2口接发光二极管
实验总结:最开始照搬老师的代码发现并无法实现按K1实现D1灯亮,按K2实现D2灯亮,自己仔细分析了一遍找到了两处需要更改的地方,经过更改最后顺利实现了通过手动按键实现相应的LED灯亮起,这次实验也加深了我对I/O口作用的理解。
实验五 外部中断实验
一.实验目的:
1.掌握51单片机中断原理及编程方法;
2.了解中断触发方式及中断优先级的概念。
二.实验内容:
通过手动按键产生负脉冲信号,K3控制输出的负脉冲信号加于INT0,K4控制输出的负脉冲加于INT1.主程序以1秒为间隔循环点亮响铃的两个LED程序,设置INT0为低优先级,当按K3键并释放按键后,发出中断信号,使得8个LED以1秒为间隔“全亮-全灭”方式闪动10秒。
完成上述试验后,设置INT1的触发方式为边沿触发,优先级为高优先级,安东开关K4,产生负脉冲,INT1中断服务为高优先级,按动开关K4,长生负脉冲,INT1响应,以1秒为间隔循环点亮8个LED。
三.实验步骤:
1.理解TCON寄存器中IT0 IT1的设置,IE和EA的正旗设置。
2.理解外部中断的触发原理.
2.进入DEBUG方式,打开I/O口查看工具,监视P3口的输出变化。
4.生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。
。
四.实验参考程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_0
ORG 0013H
LJMP INT_1
ORG 0030H
MAIN:
MOV SP,#07H
MOV A,#0FCH
SETB EA
SETB EX0
SETB EX1
SETB IT1
SETB PX1
LOOP:
MOV P2,A
MOV R2,#30
LCALL DLY
RL A
SJMP LOOP
INT_0:
PUSH ACC
PUSH PSW
SETB RS0
CLR RS1
MOV A,#00H
MOV R3,#10
LOOP1:
MOV P2,A
MOV R2,#49
LCALL DLY
CPL A
DJNZ R3,LOOP1
POP PSW
POP ACC
RETI
INT_1:
PUSH ACC
PUSH PSW
SETB RS1
SETB RS0
MOV A,#07FH
MOV R3,#8
LOOP2:
MOV P2,A
MOV R2,#49
LCALL DLY
RL A
DJNZ R3,LOOP2
POP PSW
POP ACC
RETI
DLY: MOV R0,#100
DLY1: MOV R1,#100
DJNZ R1,$
DJNZ R0,DLY1
DJNZ R2,DLY
RET
END
;说明:P2口接发光二极管
五、实验过程
打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,先编写三个循环程序,一个是主程序以1秒为间隔循环点亮响铃的两个LED程序,一个是8个LED以1秒为间隔“全亮-全灭”方式闪动10秒,一个是以1秒为间隔循环点亮8个LED,再设置好INT_0和INT_1调好他们触发方式以及优先级,让INT_1优先级高于INT_0,从而实现按K3实施INT_0中断服务,K4实施INT_1中断服务(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,按键并观察发光二极管闪烁情况。
六、实验结果
七、实验总结
在老师的指导下通过这次实验我了解了中断原理以及相应的编程,也了解了如何设置中断程序优先级和循环的问题,同时也对汇编语言的操作便有了更多的认识。
实验六 计数器实验
一.实验目的:
1.熟悉MCS-51单片机定时/计数器的外部计数原理;
2.进一步掌握定时/计数器的计数功能的初始化和编程方法。
二.实验内容:
模拟产品包装线上对物品件数的计数,假设每个包装箱10件物品,每个物品经过传送带时,光电传感器将发出一个脉冲信号,利用T0定时计数器对该脉冲进行计数,每计满19个物件,将箱数计数器加1,同时将箱数计数器的值以二进制的形式显示在8个LED发光二级管中。
光电传感器脉冲由实验仪器上的K3按键来模仿。
三.实验步骤:
1.理解TCON寄存器中IF0 IF1的设置,IE的EA和ET0的正确设置。
2.理解定时计数器的外部计数的触发原理.
2.编写汇编程序,并生成HEX文件,烧入实验板。
4.按键并保持100毫秒以上,模拟光电传感器的脉冲,记录按键次数,并观察发光二极管组的显示,验证其代表的计数(二进制形式)正确情况情况。
四.实验参考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#0110B ;T0方式2,计数器方式
MOV TH0,#00F6H ;计数次数为10
MOV TL0,#00F6H
MOV R1,#0H
SETB TR0 ;启动计时器
;---------------------------------
;控制灯亮
LOOP: MOV A,R1
CPL A ;A取反
MOV P2,A ;控制灯亮
MOV C,P3.2
CPL C
MOV P3.4,C ;传递给P3.4
JBC TF0,NEXT ;查询溢出位,10个溢出一次
LJMP LOOP
;---------------------------------
;控制R1数值并在LOOP中令A取反控制灯亮
NEXT:
INC R1
LJMP LOOP
END
;说明:P2口接发光二极管
五、实验过程
打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,计数器方式采用T0方式2,根据计数次数为10计算出2^8-10=246即00F6H,根据要求写好主程序与循环程序(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,持续按动按键K3并观察发光二极管闪烁情况。
六、实验结果:
七、实验总结
通过实验熟悉了单片机定时的外部计数原理以及编程方法,此次实验发现我对定时器中断方式的掌握有所欠缺不足,更倾向于使用查询方式,对单片机定时方式还应该多花时间看看。
实验七 定时器实验
一.实验目的:
1.熟悉MCS-51单片机定时/计数器的定时工作原理及使用方法;
2.进一步掌握定时/计数器的初始化和编程方法。
3.进一步掌握中断程序的调试方法。
二.实验内容:
初始化设置内部定时器T0工作在方式1,即作为16位定时器使用。定时时间为10ms,每10ms T0溢出中断一次,将P1.0~1.7分别接发光二极管L1~L8。编写程序模拟一时序控制装置。开机后第一秒L1,L3亮,第二名L2,L4,亮,第三秒L5,L7亮,第4秒L6,L8亮以后重头开始,一直循环。
三.实验步骤:
1.理解TCON寄存器中TF0 TF1的作用,IE的EA和ET0的正确设置。
2.理解定时/计数器的定时功能的触发原理.
3.编写汇编程序,并生成HEX文件,烧入实验板。
四.实验参考程序:
LJMP INT_T0
ORG 0030H
MAIN:
MOV TMOD,#01H;T0选用定时器方式1
MOV TH0,#0D8H ;设置T0每10ms中断一次
MOV TL0,#0F0H
MOV R0,#00H ;控制R0处内容
MOV R1,#100 ;控制中断次数为100
SETB EA ;总中断
SETB ET0 ;启动定时器中断
SETB TR0 ;启动定时器
SJMP $
;-----------------------------中断程序
INT_T0:
CLR TR0 ;关闭中断
MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0
DJNZ R1,EXIT ;中断次数少于100返回main继续执行 MOV R1,#100
MOV DPTR,#T_DATA
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A ;控制灯亮
INC R0
ANL 00,#03H
EXIT:
RETI ;返回
T_DATA: DB 0FAH,0F5H,0AFH,05FH
END
;说明:P2口接发光二极管
五、实验过程
打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,计数器方式采用T0方式1,根据定时时间为10ms计算出2^16-10000=5536即D8F0H,按照要求计算出各个灯亮对应的编码 0FAH,0F5H,0AFH,05FH,根据要求写好主程序与循环程序(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,观察发光二极管闪烁情况。
六、实验结果
七、实验总结
这次的单片机的定时实验并不是很难,通过实验我了解51单片机定时/计数器的定时工作原理及使用方法,也进一步掌握了中断程序的调试方法,对程序的每一部分都有了更为清楚的掌握。
实验八 数码管实验
一.实验目的:
1.掌握51单片机前后台程序结构及编程方法;
2.了解数码管段码和位码的控制。
二.实验内容:
通过手动按键K3,使得数码管0位从“0”-“f”显示
通过手动按键K4,使得数码管1位从“0”-“f”显示
三.实验步骤:
1.理解共阴极数码管工作原理。
2.理解3-8译码器工作原理.
2.查询按键小兜并使得内存单元加1。
4.依次显示数码管0,1位上变化的数据。
。
四.实验参考程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT_K3
ORG 0013H
LJMP INT_K4
ORG 0030H
MAIN:
SETB EA
SETB IE0
SETB IE1
CLR IT0
CLR IT1
SETB EX0
SETB EX1
MOV DPTR,#TAB
MOV R5,#0
MOV R6,#0
L1:
ACALL LOOP
SJMP L1
;--------------------------------------
INT_K3:
ACALL LOOP
JNB P3.2,INT_K3
INC R5
CJNE R5,#16,EIXT
MOV R5,#0
RETI
;--------------------------------------
INT_K4:
ACALL LOOP
JNB P3.3,INT_K4
INC R6
CJNE R6,#16,EIXT
MOV R6,#0
RETI
;--------------------------------------
LOOP:
MOV A,#11111111B
MOV P2,A
MOV A,R5
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
MOV A,#11111011B
MOV P2,A
MOV A,R6
MOVC A,@A+DPTR
MOV P0,A
ACALL DELAY
RET
;--------------------------------------
EIXT:
RETI
;--------------------------------------
DELAY:
MOV R1,#10
DELY1: MOV R2,#10
DJNZ R2,$
DJNZ R1,DELY1
RET
;--------------------------------------
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
;说明:P0口接数码管端码,3-8译码器选择数码管位码。
五、实验过程
打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,按键k3,k4分别控制数码管0位和1位从0显示到F,据要求编写好代码(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板,按动按键观察数码管显示情况。
六、实验结果
七、实验总结
通过实验了解了共阴极数码管工作原理,也发现了自己前面一些知识的掌握有所不足,还需要多多学习。
实验九 串口实验
一.实验目的:
1.掌握51单片机串口原理及编程方法;
2.了解中断服务的概念。
二.实验内容:
通过编程,实现单片机开机发送“Welcome”,并等待接收串口的数字信息,显示在数码管的第0位。实现波特率115200bps的通信。
三.实验步骤:
1.理解SCON寄存器中SM0,SM1,REN的设置。
2.学习根据fosc计算波特率,并设置定时器的工作方式和参数.
2.按中断接收服务程序的模式,调试运行,打开串口助手,接收和发送单片机的内容。
4.生成HEX文件,烧入实验板,打开并观察数码管显示情况。
。
四.实验参考程序:
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV TMOD,#20H ;定时器1 定时方式 方式2
MOV TH1,#0FDH ;3us
MOV TL1,#0FDH
SETB TR1 ;开启T1定时器
MOV SCON,#52H
MOV DPTR,#T_TAB
;-------------------------------------发送
SEND: CLR A
MOVC A,@A+DPTR
INC DPTR
JZ RECEIVE ;
JNB TI,$ ;TI判断输出一个字符是否完成
CLR TI
MOV SBUF,A ;
SJMP SEND
;-------------------------------------接收
RECEIVE:JNB RI,$ ;RI判断输入一个字符是否完成
CLR RI
MOV A,SBUF ;
MOV B,#48
DIV AB
MOV A,B ;
ACALL DISPLAY
SJMP RECEIVE
;-------------------------------------显示
DISPLAY:MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
RET
;-------------------------------------发送字段
T_TAB: DB 'WELCOME'
DB 0DH,0
;-------------------------------------接收译码字段
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
;说明:串口采用8位异步通信方式2
五、实验过程
打开Keil uvisions软件,做好编译前准备,根据实验要求编写程序,采用定时器1方式2,根据波特率9600计算出9600=11059200/(32*12*(256-N))即N=253,即)0FDH,共阴极0-9对应的编码为3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,根据要求写好各个模块内容(具体程序步骤四)。编译检查程序无误,保存,执行。生成HEX文件,烧入实验板。
六、实验结果
七、实验总结
通过学习了解了根据fosc计算波特率的算法,也再次巩固了定时器的工作方式,同时也初步了解了单片机串口原理以及编程方法。
(实验结果是图复制不过来,就这样)