《2023年单片机原理及其应用实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年单片机原理及其应用实验报告.pdf(55页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、北航单片机原理及其应用实验报告班级:1 1 0 3 23姓名:赵敏杰学号:1103 1 064同组者:郑硕学号:1 1 03 1 105实验一单片机开发环境以及I/O使用实验一.实验目的1 .熟悉M C S 5 1系列单片机开发软件的使用2 .掌握单片机I/O 口的使用3 .学习延时子程序的编写和使用二.实验内容1.验证性实验(1)实验内容:I/O 口做输出口,1/0 口接一个LED发光二极管,使其闪烁。有关说明:根 据L E D的单向导通性,可以用单片机的P l.0(也可以是其他I/0 )作为L E D 的控制端。当P 1.0输出为低电平时,L E D灭,反之,LED亮。本实验系统晶振为1
2、1.0 592 M H z ,则一个机器周期为1 2/11 .0592 u s=l.085u s,为方便编写延时函数,认为一个机器周期为1 U So硬件连接:用导线将实验箱中的P 1.0与L1相连。I O a -|vc c程序:C语言程序#i n elu d e /89S 5 2 寄存器定义头文献/*-延时子程序(有参函数),t=n*1 0m s-*/vo i d d ela y(u n s i gn ed c h a r n)(u n s i gn ed c h a r i ,j ,k ;fo r (i=0;i n;i+)fo r (j =0;j 1 4;j +)fo r (k=0;k 2
3、3 7 ;k+);)/*-主函数-*/vo i d m a i n()w h i le(l)(P l_ 0=0;/P 1.0 赋值为 0,LED 灭d ela y (1 00);调用延时子程序,t=1 0 0*1 0m sP l_ 0=l;/P l.0 赋值为 1,L E D 亮d el a y (1 0 0);汇编语言程序ORG 0 OHA J M P STA RT;在首地址处放置跳转指令;以免主程序占用中断入口地址ORG 3 0HSTA R T:C L R P 1.0;P 1.0 赋值为 0,L E D 灭M OV R0,#1 00;R 0的值决定延时时间长短t=R 0*1 0m sL C
4、 A L L D E L A Y ;调用延时函数SE TB P l.0;P 1.0 赋值为 1 ,L E D 亮M OV RO,#1 0 03L C A L L D E L A Y ;调用延时函数A J M P STA RT;无条件跳转至S T A R T,继续循环执行/*-延时子程序,t=R 0*1 0m s */D E L A Y:D 1:M OV RI,#2 0D 2 :M 0V R2,#2 4 8D J N Z R2,$D J N Z R1,D 2DJN Z RO,D 1RETEND实验现象:可 以 看 到 LED1大体亮I s 后灭1 s,如此循环。(2)实验内容:I/O 口做输入口
5、,一个I/O 口接一个拨动开关,另一个I/O 口接一个LED发光二极管,单片机读取开关的状态并通过L E D 显示出来。有关说明:P0 口是一组漏极开路型双向I/O 口,也即地址/数据总线复用口。对端口写“1”可作为高阻抗输入端用。硬件连接:用导线将实验箱中的 P 1 .0与 LED 发光二极管L 1相连,P0.0 与拨动开关K1相连。程序:C 语言程序ttincl ude /8 9 S52 寄存器定义头文献void ma i n()whi 1 e(1)PO=O xf f ;/对端口写1 ,作为高阻抗输入端用if (P0 _0)/判断P 0.0是否为高电平P 1 _0=0;e l s e 假如
6、P 0.0 不是高电平,则执行后面的语句Pl _0 =1 ;)汇编语言参考程序O RG 0 0 HL J M P M A I NO RG 3 0 HM A I N J B P0.0,D E L ;辨认按键是否闭合SE TB P1.0L J M P M A I ND E L:C L R Pl.0L J M P M A INE N D实验现象:可以看到L E D 1 的状态和开关1的状态一致。2.设计性实验实验内容:模拟舞台灯光控制实验具体规定:P 0.0和P 0.1 口连接两路拨动开关,P1 口连接8路LED。不同的开光状态控制LED进行流水灯、闪烁等,从而达成模拟舞台炫耀灯光控制的目的。当 P
7、 0.1和P 0.0的状态为0 0时,8路L E D从右至左流水点亮,具体循环顺序为:LI L2 L 3 L4 L5 L6 L7 L8L1,如此反复循环;当P 0.1和P0.0的状态为0 1时,8路L E D从左至右流水点亮,具体循环顺序为:L8 L7 L 6 L5 L4 L3 L2 L I L8,如此反复循环;当P 0.1和P0.0的状态为1 0时,8路L E D交替闪烁,具体循环顺序为:LI、L3、L5、L7 L2、L4、L 6、L8 L I、L3、L5、L 7,如此反复循环下去;当P0.0和P 0.1的状态为1 1时 一,8路LED 一起闪烁,具体循环顺序为:全灭 全亮 全灭,如此反复下
8、去。硬件连接:用导线将实验箱中的P 0.0与开关K 1相连,P 0.1与开关K 2相连,P 1.0 P1.7分别与LED发光二极管L1L 8相连。程序:C语言程序#include /89 S 5 2 寄存器定义头文献v o i d d e la y (un s ig n ed c har n)unsign e d c h a r i,j,k;for(i=0;i n;i+)f or(j=0;j14;j+)f o r (k=0;k 2 37;k+);)void main()(un s igned c h a r i;P0=0 xff;whi 1 e(1)oif(P0_l=0&P0_0=0)(Fl=
9、0 x 0 1;ofor(i=l;i=8;i+)de 1 a y(1 0 0);P1=P l l;if(P 0 l!=0|P0_0!=0)brea k;6)i f (P O _ 1 =0&P0 _0=l)(F l=0 x 8 0;f o r (i=l;i=8;i +)d e 1 a y(1 0 0 );P 1 =P 1 1 ;g i f (P0 _l !=0|P0 0!=l)br e a k ;if(PO l=l&P0 _0=0)Pl=0 x0 1;o f o r (i=l;i =4 ;i+)M d e l a y(1 0 0);P 1=P 1 2;if (P0 _l!=1 I P 0 _ 0
10、 !=0 )g b r e a k;Pl =0 x0 2;。f o r (i=1 ;i=4 ;i+)o d e 1 a y(1 0 0);P1=P 1 2;o if (P0 _l!=l|P0 0!=0)o br e a k;)6。i f (P0 _l=l&P0 _0=1 )Pl =0 xf f;。d e l a y(1 0 0);。P 1 =0 xO 0 ;d e l a y(1 0 0);。i f (P0 _ 1 !=1|PO _O!=1)br e a k;s 三.实验分析与感想本次实验的内容是单片机的开发环境以及I/O 的使用,重要规定我们熟悉M CS-5 1 系列单片机开发软件的使用,掌
11、握单片机I/0 口和延时子程序的使用。第一次接触编写程序的软件有些不纯熟,慢慢摸索之后逐渐掌握了编写和倒入单片机的过程,但是由于电脑串口的问题,经常出现串口被占用的情况,多次检查之后仍然不能排除错误,最后重启电脑之后可以继续完毕实验,但一两次使用之后又出现串口的情况,十分奇怪,最近不得不换电脑才干完毕实验。本次实验基本完毕了老师规定的内容,但由于串口被占用的情况,被浪费太多时间,以至于最后一个实验没有完全完毕,但整体思想及程序上已没有问题。第二次实验二 单片机中断及定期器使用实验一.实验目的1.学习外部中断技术的基本使用方法及中断解决的编程方法。2.学习单片机定期器的基本使用方法及其编程方法。
12、二.实验内容1.验证性实验(1)实验内容:外部中断的实验,8 路 L E D 做流水灯,当接受到外部中断后,LE D 所有点亮一段时间,之后恢复到流水灯状态。有关说明:采用外部中断0 负边沿产生中断信号,中断响应函数应尽量简洁。硬件连接:用导线将实验箱中的Pl.O-P1.7分别与L E D 发光二极管L1L 8 相连。INTO与负脉冲相连(硬件在实验箱的具体位置可以参照文档最后面的附图)。4-|vccor-piT oI PL4:OE z n x-omr-or n-n-or-pix oL8 INTO-o o-程序:c语言程序#i n cl u d e u n s i g n e d ch a r
13、 S T A T E;u n s i g n e d c h a r s O;/*-延时子程序(有参函数),t=n*l 0 m s-*/v o i d d e l a y (u n s i g n e d ch a r n)u n s i g n e d ch a r i,j,k ;f o r (i=0 ;i n ;i +)f o r (j=0 ;j 1 4 ;j+)f o r(k=0 ;k 2 3 7;k+);v o i d m a i n ()E A=1 ;/C P U 开中断E X O=1;开外部中断0I T O=1;/边沿触发方式s00 x 0 1;w h i l e(1)(i f (
14、!S T A T E)假如标志位STATE为 0,则做流水灯 P l=s 0;s 0=s 0 1,7分 别 与L E D发光二极管L 1 L 8相连。程序:C语言程序#i n c l u d e i n t t i m e;v o i d m a i n()T M 0 D=0 x 0 1 ;/定期器0工作方式1T H0=646 1 4/2 56;/计算初值T L 0=64 6 1 4%2 5 6;EA =1;/CP U 开中断ET O=1;/开定期器中断0T R O=1;/启动定期器0并开始工作w h i l e(l);/等待中断/*-一定期器0中断服务函数*/v o i d t i m e
15、O()i n t e r r u p t 1 t i m e+;每 1 m s,t i m e 加 1i f (t i m e=50 0)/t i m e 加满 5 0 0 次后,0.5s 时间到 t i m e=0;/t i m e清零,重新计数P 1+;T H0 =6461 4/2 56;重新装载定期器初值T L 0=646 1 4%2 56;汇编语言参考程序O R G 0 0 0 0 HJ M P S T A R T ;在首地址处放置跳转指令;以免主程序占用中断入口地址0 R G 0 0 0 B H;定期器0 程序入口地址J M P ET 0 PO R G 0 0 3 0 HS T A
16、R T :M 0 V T M O D,#0 1 H;定期器 0,工作方式 1M O V T HO,#4CH;定期器装载初值,50 m s 中断一次M O V T L 0,#0 0 H;这里需要注意,前面的c程序定期时间为;1 m s,这里汇编定期时间为50 m s,由于汇编;数据长度只支持到8 位,假如定期时间为1 m s,;50 0 m s 需要中断50 0 次,汇编无法支持,所以;定期时间改为50 m sS ET B EA ;CP U 开中断S ET B ET O ;开定期器中断S ET B T R O ;定期器开始工作M O V A,#0 A HCA L L L O O PL O O P
17、:CJ N E A,#0 0 H,L O O P ;A 不等于零,跳转 L O O PI N C B ;B 加 1 1M O V P l,BM O V A,#O A HJ M P L O O P ;/*-一定期器0 中断程序-*/E T O P:DEC A ;A 减 1M O V T HO,#4CHM O V T L O,#0 O HR ET IEN D实验现象:可以看到用 P l 口所接的8 路 LE D 表达的二进制数每隔0.5s 加 1。2.设计性实验实验内容:模拟救护车优先的交通灯控制实验具体规定:具体规定为用两组不同颜色的LED分别模仿两个路口的“红灯”、“绿灯”、“黄灯”。平时两组
18、交通灯按规律点亮,具体规律为:南北路口:绿灯(5 s)黄灯(2 s)红 灯(5s)黄灯(2 s)绿灯(5 s).东西路口:红 灯(5 s)黄 灯(2 s)绿 灯(5 s)黄 灯(2 s)红灯灯s)当救护车来时(用负脉冲触发外部中断表达救护车到来),两个路口立即都变成红灯让救护车优先通过,红灯保持3 s,待救护车通过以后,两个路口的交通灯恢复正常的工作状态。实验中的交通灯点亮的时间需要用定期器精拟定期,不能使用延时函数。硬件连接:INTO与负脉冲相连,LED与单片机的连接没有固定规定,下图只是提供一种参考接法。程序:#i n c 1 ud e un si g n e d c h a r S T
19、A T E;u n s i g n e d c h a r s 0;/*-延时子程序(有参函数),t=n*1 0 m s-*/v o i d d e l a y(u n s i g n e d c h a r n)un s i g n e d c h a r i,j ,k;f o r(i=0;i n;i+)f o r(j=0;j 14;j+)f o r(k=0 ;k 2 37;k+);)v o i d m a i n()E A=1;/C P U 开中断E X O=1;开外部中断0I T 0=1;边沿触发方式s0=0 x 0 1;w h i 1 e(l)i f (!ST A T E)/假如标志位
20、S TATE为0,则做流水灯 P 1=s 0;S0=S0 1;i f (s 0=0 x 0 0 )s 0 =0 x 0 1;d e 1 a y (3 0 );e l se 假如标志位S TATE为1,贝I J L E D全亮 ST A T E=0;P l=0 x f f ;d e 1 a y (1 0 0);)/*中断服务函数-*/v o i d i n t 0 ()i n t e r r up t 0 S T A T E=1;)标志位S T A T E 置 1#i n c l u d e i n t ti m e ,i;u n s i g n e d c h a r ST A T E;un
21、s i g n e d c h a r m;v o i d d e l a y (un s i g n e d c h a r n)(u n s i g n e d c h a r i ,j,k;f o r(i=0;i n;i+)f o r (j=0;j l 4;j+)f o r(k=0;k 2 37;k+);v o i d m a i n ()T M 0 D=0 x 0 1;/定期器0 工作方式1T H 0=6461 4/2 5 6;/计算初值T L 0=6 4614%2 5 6;E A=1;/C P U 开中断E T O=1;/开定期器中断0T R O=1;启动定期器0并开始工作E X O
22、=1;/开外部中断0I T O=1 ;边沿触发方式w h i l e (1);)/*定期器0中断服务函数-*/void ti m e O ()i n t e rrup t 1 t i m e +;/每 1m s,ti m e 力 口 1i f(t i m e =5 0 0 0&ti m e =70 0 0&ti m e =12 0 2 3&ti m e 1 40 0 0 )t i m e=0;T H 0=6 46 1 4/2 5 6;/重新装载定期器初值T L 0=646 1 4%2 5 6;v o i d i n t 0 ()i n t e rrup t 0(P l=0 x 2 4;E T
23、1=1;T R 1=1;T H 1=64 6 14/2 5 6;/重新装载定期器初值T L 1=64614%2 5 6;w h i l e (m =3 0 0 0);ET 1=0;TR1=O;)vo i d t 1()inte r ru p t 3(m+;TH1=64 6 14/2 5 6;/重新装载定期器初值TL1=64614%256;三.实验分析与感想本次实验是单片机中断及定期器使用实验,规定我们学习外部中断技术的基本使用方法及中断解决的编程方法,学习单片机定期器的基本使用方法及其编程方法。前两个小实验都比较顺利,分别运用了中断和定期器的功能。只要注意一下实验使用的LED灯是共阳的还是共阴
24、的,应当就可以较顺利完毕。第三个设计性实验综合了前两个实验的内容,并且规定中出现了三个时间,但 是5 1单片机没有三个定期器,故要运用软件的辅助才干完毕。但是始终没有结果,调试将近半节课还是不行,在老师的帮助下再次调试,发现单片机出现了问题。这让我领悟到:出现问题不要一味埋头找程序错误或者硬件连接错误,应当灵活的判断器件是否出现了故障。这会让我们节约很多时间,少走一些弯路。实验三单片机串口使用实验一.实验目的1 .学习单片机与上位机串行通信的基本使用方法。2.学习动态数码管显示的基本使用方法。二.实验内容1.验证性实验(1)实验内容:单片机串行接受数据实验:6位数码管通过动态扫描作为显示模块,
25、上位机通过串口调试助手以十六进制形式向单片机发送0 0 -f f,范围内的数据,波 特 率 为96 0 0,单片机接受到数据以后,在数码管的最后两位显示出来,数码管其它位熄灭。有关说明:LED数码管显示是单片机应用系统中最常用、最基本的输出设备,用户可以运用显示器件显示各种需要输出的视觉信息,实现人机对话。单片机对数码管的显示方式可分为静态显示与动态显示两种。静态显示中每一个数码管需要一个独立的输出口控制,静态显示的特点是显示程序简朴、亮度高、稳定性好、占用C PU时间少,但占用的I/O 口较多,所以静态显示常用在显示器数目较少的应用系统中。当显示位数较多时,可以采用动态显示。动态显示是指数码
26、管轮流地显示各自的字符,每位数码管都在显示和熄灭两个状态中循环,同一时间只有一位数码管处在显示状态。动态显示的特点是线路简朴、硬件成本相对较低,但需要不断刷新、扫 描 I/O 口,占用C P U 时间较多。动态数码管控制原理:采用各位数码管循环轮流显示的方法,当循环显示频率较高时,由于人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完毕字型码的输出(字形选择),另一接口完毕各数码管的轮流点亮(数位选择)。AT89S52有 UART可编程的全双工串行口用于串行通信,由 TXD发送数据,RXD接受外部输入的数据。具有两个缓冲器SBUF,一个作发送缓冲器,另一个作接受缓冲器,它们拥有相同的名
27、字和地址空间,但不会出现冲突,由于一个只能读出数据,一个只能写入数据。硬件连接:一方面将实验箱上的LDOLD5 与 SOS 5 之间的短路冒所有拔去,ah 与 B0B3、A 0 A 3 之间的短路帽也所有拔去,将短路帽插到双排插针中的一根针上,防止丢失,做完实验再重新插回去。之后将LD0L D 5 与 P2_0P2_5用导线相连,ah与 P l _ 0 Pl _ 7用导线相连,最后还需要将串口插到电脑上,串口线的另一端与实验箱的J 1 3 相连,注意引脚排列顺序。175452:卜砰H,9卜桶H?mm 9)452 75452程序:C语言程序#i n clu d e#d e f ine uchar
28、 u n s ign e d char/变量类型定义u char cod e tablet=0 x3 f,Ox 0 6,Ox 5 b,0 x4f,0 x66,0 x 6d,Ox 7 d,0 x 07,/七段码 0 70 x7f,Ox 6 f,0 x77,0 x7 c,Ox 3 9,Ox 5 e,0 x 79,0 x71,Ox 0 0;七段码8-f ,最后一码Ox 0 0作用为熄灭数码管u c har segment 6;/段选uc h ar byt e 6;/位选uchar p 1 a y 6=0,0,0,0,0,0);/要显示的数字uchar k;uchar d;v o i d D i s
29、p 1 a y _I n i t ();/数码管显示初始化v o i d U a r t _I n i t ();串口初始化v o i d D i s p l a y ();/数码管显示函数/*数码管显示初始化-*/v o i d D i s p l a y _ I n i t ()初始化,通过定期器,按固定频率扫描数码管(T M 0 D =T M 0 D|0 x01;定期器0,工作方式1T H 0 =O x f c ;/计算初值,定期时间为1 m sT L 0 =O x 6 6 ;E A =1;/C P U 开中断E T O =1;开定期器中断0T R O =1;/启动定期器0并开始工作5/
30、*-一串口初始化-一*/v o i d U a r t _I n i t ()(T M O D =T M O D|0 x 2 0;定期器1,工作方式2T H 1 =O x f d ;波特率为 9 6 0 0T L 1 =O x f d ;S C O N =0 x 5 0;设立定期器工作方式P C O N =0;E A =1;/C P U 开中断E S =1;/允许串口中断T R I =1;/定期器1开始工作/*-一扫描数码管数据显示函数-一*/v o i d D i s p l a y ()(u c h a r n=0 ;u c h a r m=0 x 0 1;f o r (n=0;n 0 x
31、 0 f)s e g m e n t n =0 x l 0;显示的数据大于0 x O f,则该位熄灭e I s es e g m e n t n =p l a y n ;b y t e n =m;m =m l;/*-主函数-*/v o i d m a i n (v o i d)U a r t _ I n i t ();D i s p 1 a y _ I n i t ();p 1 a y 0 =0 x 0 0;p l a y l =0 x 0 0;play 2 =0 x f f;p l a y 3=0 x f f ;p 1 a y 4 =0 x f f;p l a y 5 =0 x f f;w
32、h i l e (1 )6(D i s p l a y ();)/*-定 期 器0中断服务函数*/v o i d t i m e O()i n t e r r u p t 1(P l =t a b l e s e g m e n t k J ;P 2 =b y t e k ;k+;i f(k =6)k=0 ;T H O =O x f c;/重新装载初值T L 0=0 x 6 6;v o i d u a r t ()i n t e r r u p t 4i f (R I)/接受标志位(d =S B U F;/读取串口发来的数据p l a y 1 =d/O x l 0 ;p l a y 0 =d%
33、0 x l 0 ;R I =0 ;/清除接受标志位)实验现象:单片机复位以后,最后两位数码管显示 0 0 ,其它位数码管则熄灭,当上位机通过串口发送数据时,数码管的后两位显示数据。(2 )实验内容:单片机串行发送数据实验,波特率为9 6 0 0,外部中断INTO与负脉冲相连,对脉冲个数进行计数,将计数结果以字符形式通过串口发送到上位机。上位机通过串口调试助手以字符形式显示计数结果。有关说明:以字符形式发送不同于十六进制形式发送,发送计数结果时一,百位、十位、个位要分别发送,发送的时候要转换成相应的ASCH码。硬件连接:用导线将实验箱中负脉冲与外部中断INTO相连。程序:C 语言程序ftincl
34、 u d e#define u ch a r unsig n ed ch a r/变量类型定义u c h ar d;uchar S ENT;void I nt 0 _I n it();void Uart_Init();/串口初始化v o id IntO_ I nit()(EA=1 ;/CPU 开中断EXO=1;开外部中断0IT 0=1;/边沿触发方式/*串口初始化-*/v o i d U a rt _ I n i t()(T M O D =0 x 2 0;定期器1,工作方式2T H 1 =O x f d;波特率为 9 6 0 0T L 1 =O x f d;S C O N =0 x 50;/设
35、立定期器工作方式P C O N =0 ;T R I =1;定期器1开始工作/*-主函数-*/v o i d m a i n (v o i d)(I n t O _ I n i t ();U a r t _ I n i t ();w h i 1 e (1 )i f(S E N T=l)(S B U F=(d/1 0 0+0 x 30);w h i l e(T I =0);T I=0;S B U F=(d%l 0 0 /1 0 +0 x 3 0 );w h i l e(T I=0);T I=O;8S B U F=(d%l 0 +0 x 30);w h i l e(T I=0);T I=0;S B
36、U F =,w h i 1 e (T I =0);T I=0;E X 0=l;/重新开外部中断S E N T=0;)/*-一定期器0中断服务函数-一*/v o i d I n t 0 ()i n t e r ru p t 0(d +;i f (d=0 x f f)d=0;S E N T=1;E X 0=0 ;关外部中断,防止按键抖动引起干扰实验现象:每按一下脉冲按钮,串口调试助手接受到的计数值增lo2.设计性实验实验内容:模拟上位机控制云台实验具体规定:监控行业通信协议应用最广的协议就是美国PELCO-P、PEL C0-D 协议,PELCO主控与前端解码器是通过R S422R S485通信格式
37、传输,P E L C O协议内容涉及云台控制命令,摄像机控制命令,辅助控制命令,预置位设立和调用命令。现在我们通过用R S 2 3 2通信格式传输命令,模拟控制云台,云台控制协议选用PELCO-D协议。PELCO-D协议数据格式:1位起始位、8位数据、1位停止位,无效验位。波特率:240 0 B/S命令格式如下:1.该协议中所有数值都为十六进制数2.同步字节始终为FFH3.地址码为云台的逻辑地址号,地址范围:0 0H-FFH4.指令码表达不同的动作5.数 据 码1、2分别表达水平、垂直方向速度(00-3FH),FFH 表达“turbo”速度6.校 验 码=(字 节 2+字 节 3+字 节 4+
38、字 节 5+字节 6)/I 0 0H本次实验的具体规定为根据云台控制的P ELCO-D通讯协议,上位机通过串口调试软件以P ELC0-D的格式向下发送指令,发送指令应以十六进制格式发送。由于是模拟云台控制,所以只需要模拟其中几条常用的命令,命令具体如下:云台向上运动:0 x f f,0 x0 1,0 x00,0 x0 8 ,0 x0 0,O xf f,0 x08 ,云台向下运动:O xf f ,0 x01,0 x0 0,0 xl O,0 x00,O xf f,0 x10,云台向左运动:O xf f,0 x 0 1,0 x00,0 x0 4,O x f f,0 x00,0 x04,云台向右运动:
39、O xf f,0 x 0 1 ,0 x 0 0,0 x02,O x f f ,O x 00,0 x02,通过串口调试助手发送的时候只需以1 6 进制形式连续发送以下字符就可以了:上:f f O 1 000 8 00f f 0 8下:f f 010 0 l O O O f f 1 0左:f f 010004 f f O O 0 4右:f f 0 10002 f f 0 002单片机对接受到的命令进行解析,假如是以上四条命令中的一条,则单片机通过用最低位数码管相应显示A,、B J,C、D 其它位数码管熄灭,假如接受到的命令不符合上面四条命令,则单片机向上位机发送“e”代 表 e r r o r 的
40、意思,同时用数码管最低位显示字母Eo硬件连接:硬件连接与验证性实验的第一个实验的连线相同O程序:#i n c l u d e#i n c l ud e 储存器分派宏定义#d e f i n e D A T X BY T E O x 1 B 30 数据口地址#d e f i n e C O M X BY T E 0 xl B31 /命令/状态口地址#d e f i n e u c h a r un s i g n e d c h a r 变量类型定义u c h a r c o d e ta b l e =0 x3f,O x 0 6,O x 5 b ,0 x4 f ,0 x 66,0 x 6 d,
41、0 x7 d ,0 x 07,/七段码 0 一7O x 7 f,0 x6f,0 x7 7 ,O x 7 c,0 x39,0 x5e,0 x7 9,0 x7 1,0 x 00 ;/七段码8一f,最后一码0 x 0 0作用为熄灭数码管uc h a r c o d e a 7 =0 xf f,0 x 0 1,0 x00,O x 0 8,0 x0 0,O x f f,0 x08 ;u c h a r c o d e b 7 =0 xf f ,0 x01,O x 0 0,0 xl O,0 xO O,0 x ff,O x 10;u c h a r c o d e c 7 =0 xf f,O x 0 1,0
42、 x00,0 x04,O xf f ,0 x00,0 xO4;u c h a r c o d e d 7 =0 x f f,0 x01,O x 0 0,0 x 02,0 x f f ,O x 00,0 x02 ;uc h a r e 7 =0,0,0,0,0,0,0;u c h a r k;u c h a r x;vo i d U a r t_ I n i t();/串口初始化vo i d I n i t 8 2 7 9 ();o /8 2 7 9 初始化vo i d Di s p l a y (u c h a r a);/数码管显示函数/*一一串口初始化-一*/v o i d U a r t
43、_ I n i t()T M O D=TMO D|0 x2 0;T H 1=0 xf 4;T L1=0 xf 4;S CO N =0 x5 0;P C O N =0;EA=1;ES =1;定 期 器1,工作方式2/波特率为2 4 00/设立定期器工作方式/C PU开中断/允许串口中断T R 1=1;定期器1开始工作/*8 2 79初始化函数*/vo i d I n i t 8 2 7 9 (v o i d)(u c h a r r e g l;CO M=O xd 1;/1 10 1 0 001B,总清除命令d or e g 1=C0M;/读状态字,D U=1时,表达清除命令正在执行w h i
44、l e (r e g l&Ox 8 0);/10 0 0 0 0 0 0 B,等待清除结束,D U=0,相与为0,清除结束C 0 M=0;/0 0 0 0 0 0 0 0 B,设 立8 2 7 9工作方式,8位字符,左端输入编码键盘扫描,两键封锁C 0 M=0 x 32;/0 0 110 0 1 0 B,时钟频率 18 分频 10 0。1 0 B=1 8 D/*数码管显示函数*/v o i d D i s p l a y (u c h a r a)(u c h a r r o w d a t a;/行数寄存器u c h a r l i n e d a t a;列数寄存器uchar b;a=a&
45、0 x3f;/O O I 1 11 1 IB,屏蔽高两位数/键的编码格式CNTL SHIFT 扫描行序号(3 位)(硬件的列号),回馈线列信号(3 位)(硬件的行号)1 i n eda t a=a&0 xO 7;/获得列数值,0 0 0 0 0 1 1 IB;rowd a ta=a&0 x 3 8;获得行数值,0011100 0 B;rowdata=(r o wdata3);变量的第三位表达行号与列号b=0 x 85;C0M=b;向控制口写显示RAM命令,1 0 00 0 0 00B,AI=0(不自增),写到RAM中 1 6 个地址中的0 号地址;A4A3A2A 1=01010 00 0(6
46、个地址)if(row d a t a=1)行数为1 的代码为0 7,其列数也为0 7(DAT=tabl e 1 i nedata;/把 07 写到数据口e Ise if(r o wda t a=0)行数为0 的代码为8,9,a f,其列号为07D A T=ta b 1 e 1 i n ed a ta+8;把 8,9,af 写到数据口e l s e /行数为2的代码为G M P R WXYS,其列号为0 7;不执行操作/*-主函数-*/v o i d m a i n (v o i d)(Ua r t _In i t ();In i t 8 2 7 9 ();I T 0=l;/外部中断。下降沿触发
47、E X0=1;开外部中断0E A=1;/打开中断总开关w h i 1 e (1)/*键盘中断服务程序*/v o i d K e y I n ()i n t e r r u p t 0(u c h a r k e y d a t a;定义键盘数据寄存器C 0 M=0 x 4 0 ;/0 10 0 0 0 0 0 B,读 F IF O R A M 命令,AI =0,从堆栈顶读键值k e y d a t a=D A T;/读取键盘数据D i s p l a y (k e y d a t a);/调用显示函数v o i d u a r t ()i n t e r r u p t 4i n t i;i
48、f (R I)接受标志位x =S B UF;/读取串口发来的数据e i =x;i+;i f (i =7)i=0;e 6 =(e l+e 2+e 3+e 4+e 5 )/2 5 6 ;o i f (e 6 =a 6)s D i s p 1 a y (1 0);。e l s e i f (e 6 =b 6 )M i s p l a y (11);o e Is e i f (e 6=c 6)o D i s p 1 a y (1 2);e l s e i f (e 6 =d 6)Mi s p l a y(13);o /*i f(e 0=a 0&e l=a 1&e 2=a 2&e 3=a3&e 4 =a
49、 4&e 5 =a 5&e 6=a 6 )D i s p l a y (10);e l s e i f (e 0 =b=bl&e 2=b 2&e 3=b 3&e 4=b 4&e 5=b5&e 6 =b 6 )。D i s p l a y (1 1);e l s e i f (e 0 =c 0&e 1 =c l&e 2=c 2&e 3 =c 3&e 4 =c 4&e 5 =c 5&e 6=c 6)D i s p l a y (12);。e l s e i f (e 0=d 0&e l=d l&e 2=d 2&e 3=d 3&e 4 =d 4&e 5=d 5&e 6 =d 6 )D i s p l
50、 a y (13);*/g e I s e0 o D i s p 1 a y (1 4);。S B UF=(6 9);/e 的 A S C II 码H WR,13程序:c语言程序#in c 1 u d e#in c lud e#d e f i n e uc ha r un si g n ed c ha r 变量类型定义uc h a r IN;模拟量输入通道#d e f i n e D AT XB Y TE Ox lB 2 0+IN /数据口地址vo id In t 0 _ I n it();vo id I n tO_ In it()(E A=1;/C PU 开中断E XO=1;开外部中断0IT