单片机原理及应用实验指导书.docx
《单片机原理及应用实验指导书.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用实验指导书.docx(43页珍藏版)》请在冰豆网上搜索。
![单片机原理及应用实验指导书.docx](https://file1.bdocx.com/fileroot1/2022-11/20/4802801e-7f3b-4939-bdc1-2da826c78247/4802801e-7f3b-4939-bdc1-2da826c782471.gif)
单片机原理及应用实验指导书
《单片机原理及应用》
实验指导书
信息学院
2010年3月
目录
实验一熟悉单片机软件开发环境1
实验二MCS-51单片机I/O实验4
实验三七段数码管动态显示实验7
实验四键盘扫描及显示实验12
实验五MCS-51单片机中断实验15
实验六定时器计数器实验19
实验七单片机AD转换及串行异步通信23
实验八单片机软件实现IIC存储接口29
实验九单片机综合应用设计实验33
实验一熟悉单片机软件开发环境
一、实验目的
1、了解单片机软件开发环境的主要软件PROTEUS和KEIL;
2、掌握软件的安装、使用、程序的调试方法,包括跟踪、单步运行和断点设置等;
3、熟悉51单片机的指令系统,掌握汇编语言程序的设计方法。
二、实验仪器
P4电脑一台,软件PROTEUS6.7、KEILUV2以上版本。
三、实验内容
1、PROTEUS、KEIL软件的安装。
2、PROTEUS和KEIL软件联合调试的设置。
3、简单程序调试
(1)传送指令
设置内部RAM的值,(30H)=40H,(40H)=10H,单步执行下列程序,检查结果。
MOV30H,#40H
MOV40H,#10H
MOVR0,#30H
MOVA,@R0
MOVR1,A
MOVB,@R1
SJMP$
执行后:
(R0)=,(R1)=,(A)=,(B)=,(30H)=,(40H)=。
(2)运算指令
单步
执行
MOVA,#0BFH
MOV20H,#85H
SETBC
ADDA,20H
MOVA,#0BFH
MOV20H,#85H
SETBC
ADDCA,20H
MOVA,#0BFH
MOV20H,#85H
SETBC
SUBBA,20H
MOVA,#0BFH
MOVB,#85H
MULAB
SJMP$
结果
标志
(A)=
CY=AC=
OV=P=
(A)=
CY=AC=
OV=P=
(A)=
CY=AC=
OV=P=
(A)=(B)=
CY=AC=
OV=P=
4、多字节十进制数加法
被加数
加数
结果
低位
20H
67
30H
65
20H
21H
45
31H
72
21H
22H
23
32H
98
22H
23H
01
33H
89
23H
高位
图1-24字节十进制数相加
两个4字节十进制数1234567和89987265相加,将其8421-BCD码按低位到高位存放在地址为20-23H、30-33H的RAM中,运算结果存放在20-23H的地址中,如上图示。
运算程序如下,ADD_BCD为多字节十进制数加法子程序的首地址。
分别按“跟踪”、“单步”和“全速”方式调试程序。
检查运算结果,区别“跟踪”、“单步”调试方式的不同。
在“ADD_BCD子程序”的指令“DAA”处设置断点,再用“全速”方式运行,到达断点后,观察“A”的值,然后用“单步”运行,观察指令“DAA”的功能。
同时理解“断点”方式调试程序的特点。
;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;
MOVR0,#20H;置被加数首地址
MOVR1,#30H;置加数首地址
MOVR2,#04H;置被加数和加数的长度(字节数)
ACALLADD_BCD;调用多字节十进制数加法子程序ADD_BCD
STOP:
SJMPSTOP;停止
;;;;;;;;;;多字节十进制数加法子程序;;;;;;;;;;
;入口:
R0、R1为被加数和加数的首地址,按低位到高位存放
;出口:
R0为运算结果的首地址,也按低位到高位存放
ADD_BCD:
CLRC;进位清零
LOOP:
MOVA,@R0;一字节的被加数→A
ADDCA,@R1;一字节加
DAA;十进制数调整
MOV@R0,A;存一字节的运算结果
INCR0;被加数指向下一字节
INCR1;加数指向下一字节
DJNZR2,LOOP;循环控制
RET;子程序返回
END
四、预习要求
1、读懂各程序;
2、预先给出运算结果,以便和实验结果比较;
3、回忆“跟踪”、“单步”和“断点”调试方式的特点。
五、思考题
1、为什么程序结束用“STOP:
SJMPSTOP”指令?
用没有其他的停止方式?
51单片机启动后,是否一直不断地在执行指令?
2、比较“跟踪”、“单步”和“断点”调试方式的特点。
实验二MCS-51单片机I/O实验
一、实验目的
1、掌握单片机基本I/O口的使用特点,了解扩展I/O口的方法;
2、了解LED动态显示电路结构,掌握LED动态显示方法;
3、掌握程序延时的计算及应用;
二、实验仪器
P4电脑一台,软件PROTEUS6.7、KEILUV2以上版本。
三、实验内容
1、P1口输出
在PROTEUS中绘制仿真原理图,P1口做输出口,P1口连接8只发光二极管,如图2-1所示,编写程序,使发光二极管指示灯循环点亮,并进行仿真。
图2-1P1口输出
CPUAT89C51的振荡频率为12MHz,发光二极管循环点亮需要一个延时子程序DELAY1S。
延时时间为((14+2)×250+2)×250=1.0005(秒)。
参考程序
ORG0000H
LJMPSTART
ORG0100H
START:
MOVA,#1;循环点亮LED初值,假定P1.0灯先亮
LOOP:
MOVP1,A;向P1端口输出亮灯信号
MOVR0,#250;延时程序初始化
MOVR1,#250
ACALLDELAY1S;延时程序调用
RLA;前一盏灯亮完后,让亮灯信号向下一盏灯移动
;同学们可以将此指令换成RLC,观察仿真结果有无变化
AJMPLOOP
DELAY1S:
DEL1:
NOP;对于12M晶振,14个NOP有14us,1个DJNZ2us16us*250=4ms
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR0,DEL1;实际延时4002*250=1.0005s
DJNZR1,DEL1
RET
END
2、P1口输入
P1做输入口,连接至DIP开关,P2口输出连接至8只发光二极管,如图2-2所示。
编写程序,使DIP开关的电平通过发光二极管指示灯显示出来。
图2-2P1口输出
由于51单片机的I/O口特点,输入口读入数据前要求先置1,使口上的下拉管截止,为外部数据的输入做准备。
参考程序
ORG0000H
LJMPSTART
ORG0040H
START:
MOVP1,#0FFH;P1口置1
MOVA,P1;读入P1口的DIP电平
MOVP2,A;P2口输出至指示灯
SJMPSTART
四、预习要求
1、读懂教材相应章节内容,掌握51单片机的并行I/O口逻辑结构和使用特点;
2、掌握LED动态显示原理;
3、编写出各个实验内容的相应程序。
五、思考题
1、修改2-1程序,使指示灯两两右循环;
2、修改2-1程序,使指示灯右循环间隔为0.1秒;
3、对2-2实验,仿真时将拨码开关换成按键,再调整其开关时间属性,看看有什么效果。
实验三七段数码管动态显示实验
一、实验目的
1、进一步掌握单片机I/O口的使用;
2、了解7段数码管动态显示电路原理及结构特点,掌握LED动态显示方法;
3、进一步掌握程序延时的计算及应用。
二、实验仪器
P4电脑一台,软件PROTEUS6.7、KEILUV2以上版本。
三、实验内容
1、七段LED动态显示输出
AT89C51控制多只LED七段数码管显示常采用动态方式显示,本实验的4只LED显示器采用动态方式显示,参见图3-1。
图3-1动态LED显示器电路
4只LED七段显示器的4个共阴极1234分别连接8位寄存器(U3)74LS374的Q0-Q3上,8位寄存器(U2)74LS374的Q0-Q7分别连接到上七段显示器的ABCDEFG和DP上。
因此U2寄存器输出LED显示的字形,U3寄存器输出控制显示的灯位,如:
(U2)=00111111,(U3)=11111110,1号灯显示“0”,其余灯不亮;(U2)=00000110,(U3)=11110011,3号灯和4号灯显示“1”,其余灯不亮。
其中“00111111”和“00000110”为和字形“0”和“1”的段码,表2-1为字段码和字形对应表。
(U3)的低4位控制显示的4个灯位,低电平显示,高电平不显示,显示的字形由(U2)输出值决定,可参见表2-1字段码和字形对应表。
所谓的动态显示,就是4只LED显示器不能同时显示,一次只能点亮一只LED显示器,4只LED显示器轮流点亮,利用人眼的视觉暂留和LED显示器余辉,就可看到4只LED显示器同时点亮,但亮度有所下降。
可见,动态显示也需要合适延时,才会有较好的显示效果。
实验要求1:
编写程序,从左到右显示“1”、“2”、“3”、“4”,调整延时时间,观察显示效果。
实验要求2:
编写程序,让显示的数值按秒递增或递减。
表3-1字段码和字形对应表
字段码
字形
字段码
字形
DpGFEDCBA
十六进制码
DpGFEDCBA
十六进制码
00111111
3FH
01111111
7FH
00000110
06H
01101111
6FH
01011011
5BH
01110111
77H
01001111
4FH
01111100
7CH
01100110
66H
00111001
39H
01101101
6DH
01011110
5EH
01111101
7DH
01111001
79H
00000111
07H
01110001
71H
参考程序
;从左到右显示“1”、“2”、“3”、“4”
ORG0000H
LJMPSTART
ORG0040H
START:
MOVR7,#04H;灯数
MOVR6,#0FEH;起始灯位,1号灯
MOVDPTR,#TAB;
LOOP:
MOVA,R7;
MOVCA,@A+DPTR;读字段码
MOVP0,A;输出字段码
MOVP2,#40H;字段码地址
MOVA,R6
MOVP0,A;输出灯位控制
MOVP2,#80H;灯位控制地址
RLA;灯位右移
MOVR6,A
LCALLDELAY;延时
DJNZR7,LOOP;灯数计数
SJMPSTART
DELAY:
MOVR0,#3;延时程序初始化(R0,R1调整到250约延时一秒)
MOVR1,#3
DEL1:
NOP;对于12M晶振,14个NOP有14us,1个DJNZ2us16us*250=4ms
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR0,DEL1;实际延时4002*250=1.0005s
DJNZR1,DEL1
RET
TAB:
DB00H,66H,4FH,5BH,06H;“空”,“4”,“3”,“2”,“1”的字段码
END
2、以外部RAM扩展方式连接时要增加一定的硬件电路,但可以帮助我们了解外部RAM的扩展,电路如图3-2:
图3-2以外部RAM扩展方式连接的电路图
程序如下:
;从左到右显示“1”、“2”、“3”、“4”
ORG0000H
LJMPSTART
ORG0040H
START:
MOVR7,#04H;灯数
MOVR6,#0FEH;起始灯位,1号灯
MOVDPTR,#TAB;
LOOP:
MOVA,R7;
MOVCA,@A+DPTR;读字段码
;MOVP0,A;此指令将被下面的movx@r0,a替代;;输出字段码
MOVP2,#40H;字段码地址
MOVX@R0,A;输出字段码,替代了上面的MOVP0,A指令
MOVA,R6
;MOVP0,A;此指令将被下面的movx@r0,a替代;;输出灯位控制
MOVP2,#80H;灯位控制地址
MOVX@R0,A;输出灯位控制
RLA;灯位右移
MOVR6,A
LCALLDELAY;延时
DJNZR7,LOOP;灯数计数
SJMPSTART
DELAY:
MOVR0,#250;延时程序初始化
MOVR1,#250
DEL1:
NOP;对于12M晶振,14个NOP有14us,1个DJNZ2us16us*250=4ms
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR0,DEL1;实际延时4002*250=1.0005s
DJNZR1,DEL1
RET
TAB:
DB00H,66H,4FH,5BH,06H;“空”,“4”,“3”,“2”,“1”的字段码
END
四、预习要求
1、读懂教材相应章节内容,掌握51单片机的I/O口逻辑结构和使用特点;
2、查阅参考文献,掌握七段LED动态显示原理;
3、编写出各个实验内容的相应程序。
五、思考题
1、如设置30H-33H为显示缓冲区,要显示的字段码送入显示缓冲区,反复调用显示子程序即可,试编写该显示子程序;(电路与3-2相同,程序自编,参考3-3.asm)
2、能否显示“H”、“L”、“P”、“U”的字形,试写出它们的字段码。
实验四键盘扫描及显示实验
一、实验目的
1、了解键盘和扫描电路结构,了解键盘的分类及各种键盘的特点和适用场合;
2、掌握键盘接口的工作原理、键盘扫描方法,了解按键的软件去抖动方法;
3、学习并掌握常用的几种键盘接口编程方法。
二、实验仪器
P4电脑一台,软件PROTEUS6.7、KEILUV2以上版本。
三、实验内容
1、键盘输入概述
对于单片机,我们希望对其运行进行控制,而键盘是最重要和有效的控制输入方式之一。
键盘接口的应用非常灵活,主要分独立式按键接口和行列式键盘接口。
独立式按键接口各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可很容易判断哪个键被按下,适于键数较少或操作速度较高的场合。
行列式键盘接口用于按键数目较多的场合,由行线和列线组成,按键位于行、列的交叉点上。
对于按键数目较多的场合,行列式键盘与独立式键盘相比,要节省很多的I/O口线。
单片机在忙于各项工作任务时,如何兼顾键盘的输入,取决于键盘的工作方式。
原则是既要保证能及时响应按键操作,又不要过多占用CPU的工作时间。
通常,键盘工作方式有3种,即编程扫描、定时扫描和中断扫描。
键盘工作层次如图4-1所示。
图4-1键盘工作层次
2、独立式按键
对于图4-2所示独立式键盘,试以编程扫描或定时扫描的方式编写键盘处理程序。
要求KEY1打开流水灯显示,KEY2关闭显示,KEY3控制灯向上流水显示,KEY4控制灯向下流水显示。
图4-2独立式键盘系统电路图
编程扫描参考程序见exp4-1.asm。
自己编写定时扫描程序,并对两种方式进行比较。
启动初始化
列线送低电平,行线送高电平
N
检查各列电平状态,有高电平出现?
Y
调用键识别程序并显示
延时一秒
图4-3键盘扫描程序算法
3、阵列式键盘
对于图4-4所示3*3的键盘阵列,试编写键盘扫描程序实现按键的识别,即按下任一按键,在数码管上显示所按下的键号。
识别键盘有无键被按下的方法,分两步进行,第1步识别键盘有无键按下:
把所有列线置0,检查各行线电平是否有变化,如有变化,说明有键按下,如无变化,则无键按下。
第2步如有键被按下,识别出具体的按键:
先把某一列置低电平,其余各列为高电平,检查各行线电平的变化,如果某行线电平为低,可确定此行列交叉点处的按键被按下。
本例算法如图4-3(先自主编写程序,如果实在无法写出正确的程序再参考exp4-2.asm程序,并找出自已程序的问题所在)。
参考程序见exp4-2.asm。
图4-43*3键盘电路
4(选做):
编写一个时钟程序(包含显示及按键输入)。
四、预习要求
1、读懂教材第十章第二节,掌握键盘电路结构、键盘扫描原理及软件去抖动方法;
2、复习并掌握七段LED动态显示原理及显示程序;
3、自主编写出各个实验内容的相应程序。
五、思考题
1、独立式按键和阵列式键盘有什么区别?
编程上有什么不同?
2、利用编程扫描和定时扫描方式扫描键盘有什么区别?
3、试使用线反转法编写图4-3所示电路的程序。
实验五MCS-51单片机中断实验
一、实验目的
1、掌握单片机中断的工作原理,体会中断的使用特点;
2、掌握中断的技术编程方法和特点;进一步掌握汇编语言程序设计;
3、将定时器中断和键盘定时扫描结合,复习键盘输入编程;
4、将外中断和键盘中断扫描结合,复习键盘输入编程;
二、实验仪器
P4电脑一台,软件PROTEUS6.7、KEILUV2以上版本。
三、实验内容
1、键盘定时扫描程序(定时中断)
利用单片机内的定时器,产生10ms的定时中断,对键盘进行扫描。
与编程扫描相比,更能快速响应键盘事件,不会错过任何一次按键(请试着在图4-2所示实验中,快速按下和松开按键,看看能不能响应键盘事件,想想为什么?
)
本实验仍以图4-2所示电路为硬件电路,首先请大家自主编程以定时扫描的方式改进实验4-2的缺点。
参考程序见exp5-1.asm。
2、键盘中断处理
图5-1单片机键盘中断处理工作方式原理图
充分利用中断来接受用户键盘事件可以大大提高单片机的效率。
在没有键盘事件时,单片机可以专注于运算和控制,不需要随时扫描键盘,而当有键盘事件发生时,利用中断可以最快地响应用户键盘事件,键盘处理完成后又可以回到其它主的工作。
键盘的中断处理方式适合于单片机有大量运算、控制等其它重要事务,而用户按键次数不多的场合。
请同学们根据实验四中阵列式键盘的原理,参考exp4-2.asm,并结合中断编写键盘识别程序。
单片机键盘中断处理工作方式对应的硬件原理图如图5-1。
除参考exp4-2.asm外,大家还可以参考图5-2所示的扫描方式,键码值见表5-1。
将键盘4根行线和4根列线(1-8)连接至P1口的P1.0-P1.7,试编写键盘扫描程序,将键盘码显示在LED数码管。
图5-2键盘分布图
表5-1键码表
返回码
扫描码
7H
0111
BH
1011
DH
1101
EH
1110
7H
0111
(77H)
7
(B7H)
8
(D7H)
9
(E7H)
D
BH
1011
(7BH)
4
(BBH)
5
(DBH)
6
(EBH)
C
DH
1101
(7DH)
1
(BDH)
2
(DDH)
3
(EDH)
B
EH
1110
(7EH)
F
(BEH)
0
(DEH)
E
(EEH)
A
汇编参考程序
MOVA,0FFH;清显示器
MOVP2,80H
MOVX@R0,A
REP:
MOVA,#0FEH;扫描
MOVR7,#4
LOOP:
MOVP1,A
MOVB,P1;返回码
CJNEA,B,DITH;有键
RLA;有键
DJNZR7,LOOP
SJMPREP
DITH:
LCALLDELAY;延时5ms,去抖动
MOVA,P1;返回码
CJNEA,B,REP;无效键
LCALLSCAN_TO_KEY;返回扫描码->键码
MOVDPTR,#TAB;显示
MOVCA,@A+DPTR
MOVP2,#60H
MOVX@R0,A
MOVA,#0FEH
MOVP2,#80H
MOVX@R0,A
SJMPREP
TAB:
DB3fH,06H,5bH,4fH,66H,6dH,7dH,07H
DB7fH,6fH,77H,7cH,39H,5eH,79H,71H,00H
SCAN_TO_KEY:
;返回扫描码->键码
MOVB,A
CLRA
MOVR6,A
MOVDPTR,#SCAN_KEY
NEXT1:
MOVA,R6
MOVCA,@A+DPTR
CJNEA,B,NEXT
MOVA,R6
ADDA,#16
MOVCA,@A+DPTR
RET
NEXT:
INCR6
CJNER6,#16,NEXT1
MOVA,#010H;无效键
RET
SCAN_KEY:
DB77H,0B7H,0D7H,0E7H,7BH,0BBH,0DBH,0EBH
DB7DH,0BDH,0DDH,0EDH,7EH,0BEH,0DEH,0EEH
DB7H,8H,9H,0DH,4H,5H,6H,0CH
DB1H,2H,3H,0BH,0FH,00H,0EH,0AH
DELAY:
MOVA,R6;延时5ms
PUSHACC
MOVA,R7
PUSHACC
MOVR6,#014H
DELAY1:
MOVR7,#0E5H
DJNZR7,$
DJNZR6,DELAY1
POPACC
MOVR7,A
POPACC
MOVR6,A
RET
END
四、预习要求
1、复习中断及响应的过程;
2、读懂教材相应章节的内容,复习掌握键盘电路结构、键盘扫描原理;
3、复习并掌握七段LED动态显示原理及显示程序;
4、编写出各个实验内容的相应程序。
五、思考题
1、利用中断方式扫描键盘,是否有提高CPU的效率,LED显示是否增亮?
2、除处理键盘外,中断还有什么用途?
请列举几个例子。
实验六定时器计数器实验
一、实验目的
1、掌握单片机定时器/计数器的工作原理,体会定时器/计数器的使用特点;
2、进一步掌握中断的技术编程方法