《给初学51单片机的40个实验汇编语言对应C语言加说明》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1.实验任务1•闪烁灯如图4.1.1所不:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。2.电路原理图OHPU1////////►OPPQQO.OOa1514131211102201011111111PPPPPPPP图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
1如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOVR6,#202个机器周期2DI:MOVR7,#2482个机器周期22+2X248=49820XDJNZR7,$2个机器周期2X248498DJNZR6,D12个机器周期2X20=4010002因此,上面的延时程序时间为10.002ms。由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10msXR5=200ms,则R5=20,延时子程序如下:DELAY:MOVR5,#20DI:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5.D1RET(1).输出控制如图1所示,当PL0端口输出高电平,即PL0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即PL0=0时,发光二极管L1亮;我们可以使用SETBPL0指令使PL0端口输出高电平,使用CLRPL0指令使PL0端口输出低电平。2.程序框图如图4.1.2所
2图4.1.26.汇编源程序ORG0START:CLRP1.0LCALLDELAYSETBP1.0LCALLDELAYLJMPSTARTDELAY:MOVR5,#20;延时子程序,延时0.2秒DI:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5.D1RETEND7.C语言源程序#include
3Ll=l;delay02s();2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。2.电路原理图NDxlX2G8W0ZdSdW9mdsVKZd一一zsmd二V/EZd01/qsdzudutn/esdndPESSsvzzdaxtLgd2v/czdaxwomdN割dTIVcav/nod二d9OV0Od9Idgav/sodEdKrv7qodTldmav/Eod二dZOV720dZIdlavnod二doav/ood0EVCCEARST图4.2.13.系统板上硬件连线(1).把“单片机系统”区域中的PLO端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;(2).把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;4.程序设计内容
4(1).开关状态的检测过程单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JBBIT,REL或者是JNBBIT,REL指令来完成对开关状态的检测即可。(2).输出控制如图3所示,当PLO端口输出高电平,即PL0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当PL0端口输出低电平,即PL0=0时,发光二极管L1亮;我们可以使用SETBP1.0指令使P1.0端口输出高电平,使用CLRPL0指令使PL0端口输出低电平。5.程序框图图4.2.26.汇编源程序ORG00HSTART:JBP3.0,LIGCLRP1.0SJMPSTARTLIG:SETBPl.0SJMPSTARTEND7.C语言源程序#include
5voidmain(void){while(l)(if(Kl==0){Ll=0;〃灯亮}else(Ll=l;〃灯灭3.多路开关状态指示1.实验任务如图4.3.1所示,AT89S51单片机的Pl.0-P1.3接四个发光二极管L1-L4,Pl.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。2.电路原理图
6rNGX64二ZdJLgLodgovsodSOWodOdEcwsodZOVNodIGVJIodOdccVX2■LSd由多。EdEQCdUHl/sndRN一/ZEdaxu-Edaxu/oEd9IdSidqa:二dZId一E图4.3.11.系统板上硬件连线(1.把“单片机系统”区域中的PL0-PL3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;(2.把“单片机系统”区域中的PL4-PL7用导线连接到“四路拨动开关”区域中的K1-K4端口上;2.程序设计内容(1.开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用川Pl.X,REL或JNBPl.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOVA,Pl指令一次把Pl端口的状态全部读入,然后取高4位的状态来指示。
7(2.输出控制根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETBP1.X和CLRP1.X指令来完成,也可以采用MOVPl,#1111XXXXB方法一次指示。1.程序框图读P1□数据到Acc中Acc内容右移4次Acc内容与F0H相或Acc内容送入P1口图4.3.22.方法一(汇编源程序)ORG00HSTART:MOVA,PlANLA,#OFOHRRARRARRARRAORIA,#0F0HMOVPl,ASJMPSTARTEND3.方法一(C语言源程序)
8#include
9P1_O=1;)if(Pl_5==0)(P1_1=O;)else(Pl_l=l;)if(Pl_6==0)(Pl_2=0;)else(Pl_2=l;)if(Pl_7==0)(Pl_3=0;)else(Pl_3=l;))}4.广告灯的左移右移1.实验任务八个发光二极管LI—L8时,发光二极管亮,开始-fPLO亮,重复循环。做单一灯的左移右移,硬件电路如图4.4.1所示,分别接在单片机的PL0-PL7接口上,输出“0”时Pl.OfPLIfPL2-PL3f-->PL7fPL6f•2.电路原理图
10P3OZRXDP31/TXDP324NT0P3o/nrTTP34/TOP3^TT1P36/WRP37/RD18201.2345671111X1A1*11pppppppP220R88APOO/ADOPO1/AD1PO.2/AD2P0.3/AD3PO4/AD4PO5/AD5PO6/AD6PO7/AD7ALEPSENP2.7/A15P2.6/A14P2S/A13P24/AI2P23/A11P22/A1OP21/A9P2.0/A8图4.4.11.系统板上硬件连线把“单片机系统”区域中的Pl.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的示一L8端口上,要求:P1.0对应着LI,Pl.1对应着L2,……,P1.7对应着L8。2.程序设计内容我们可以运用输出端口指令MOVPl,A或MOVPl,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。每次送出的数据是不同,具体的数据如下表1所示:****************说明L8L7L6L5L4L3L2L111111110L1亮11111101L2亮11111011L3亮
1111110111L4亮11101111L5亮11011111L6亮10111111L7亮01111111L8亮表1图4.4.26.汇编源程序ORG0START:MOVR2,#8MOVA,#OFEHSETBCLOOP:MOVPl,ALCALLDELAYRLCADJNZR2,LOOPMOVR2,#8LOOP1:MOVPl,ALCALLDELAYRRCADJNZR2,LOOP1LJMPSTARTDELAY:MOVR5,#20;DI:MOVR6,#20D2:MOVR7,#248DJNZR7,$
12DJNZR6,D2DJNZR5.D1RETEND6.C语言源程序#include
135.广告灯(利用取表方式)1.实验任务利用取表的方法,使端DPI做单一灯的变化:(延时的时间0.2秒)。2.电路原理图左移2次,右移2次,闪烁2次P3O/RXDP3.1/TXDP324NTOP33/INT1P34/TOP3.5/T]P36/WRP37/Rn-戛图4.5.1£。I234S6Ist*t*VA9at*ppppppp氐8APOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO5/ADSPO6/AD6PO.7/AD7ALEPSENP27/A15P2.6/A14P2.5/A13P24/A12P23/AI1P22/A1OP2.1/A9P2OX
143.系统板上硬件连线着L2,,PL7对应着L8。把“单片机系统”区域中的Pl.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L8端口上,要求:P1.0对应着LI,PL1对应4.程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1).利用MOVDPTR,#DATA16的指令来使数据指针寄存器指到表的开头。
15(1).利用MOVCA,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用MOVCA,@A+DPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:3.程序框图图4.5.24.汇编源程序ORG0START:MOVDPTR,#TABLELOOP:CLRAMOVCA,@A+DPTRCJNEA,#01H,LOOP1JMPSTARTLOOP1:MOVPl,AMOVR3,#20LCALLDELAYINCDPTRJMPLOOPDELAY:MOVR4,#20DI:MOVR5,#248
16DJNZR5,$DJNZR4,D1DJNZR3,DELAYRETTABLE:DBOFEH,OFDH,OFBH,OF7HDBOEFH,ODFH,OBFH,O7FHDBOFEH,OFDH,OFBH,OF7HDBOEFH,ODFH,OBFH,O7FHDBO7FH,OBFH,ODFH,OEFHDBOF7H,OFBH,OFDH,OFEHDBO7FH,OBFH,ODFH,OEFHDBOF7H,OFBH,OFDH,OFEHDBOOH,OFFH,OOH,OFFHDBO1HEND3.C语言源程序#include
171++;delay();)else(i=0;6.报警产生器1.实验任务用Pl.0输出IKHz和500Hz的音频信号驱动扬声器,作报警信号,要求IKHz信号响100ms,500Hz信号响200ms,交替进行,PL7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2.电路原理图vsIN+VOUTIN-GAINBYPASSGAINGNDNDxlG2二sOWNZd二SGZdZWZd2WSZdQ1W9Zdn_EsdUJTVL2m£SOVKssGOV有OdZ2Zs【OY:odoov、oOdvccea目,Ed户.二Es号EdLLNSEd0UW7£Gna省o£图4.6.1
181.系统板上硬件连线(1.把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2.在“音频放大模块”区域中的SPKOUT端口上接上一个8欧的或者是16欧的喇叭;(3.把“单片机系统”区域中的PL7/RD端口用导线连接到''四路拨动开关”区域中的K1端口上;2.程序设计内容(1.信号产生的方法500Hz信号周期为2ms,信号电平为每1ms变反1次,IKHz的信号周期为1ms,信号电平每500us变反1次;3.程序框图
19图4.6.21.汇编源程序FLAGBITOOHORGOOHSTART:JBPl.7,STARTJNBFLAG,NEXTMOVR2,#200DV:CPLPl.0LCALLDELY500LCALLDELY500DJNZR2,DVCPLFLAGNEXT:MOVR2,#200DVI:CPLP1.0LCALLDELY500DJNZR2,DVICPLFLAGSJMPSTARTDELY500:MOVR7,#250LOOP:NOPDJNZR7,LOOPRETEND2.C语言源程序#include
20if(Pl_7==0)(for(count=200;count>0;count―)(Pl_0=>l_0;dely500();)for(count=200;count>0;count—)(Pl_0=〜Pl_0;dely500();dely500();7.I/O并行口直接驱动LED显示1.实验任务如图13所示,利用AT89S51单片机的P0端口的PO.0-P0.7连接到一个共阴数码管的a—h的笔段上,数码管的公共端接地。在数码管上循环显示0—9数字,时间间隔0.2秒。2.电路原理图
21GND卜IOuF1OKPl4Pl.51,1GPl.7您P1.0Pl110LLT7ITTTTsTc17P30/RXDP31/TXDP3.2/fNT0P3.3/INT1P34/TOP3.5/T1P3.6/WRP37/RD-PO.O/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4P0.5/AD5P0.6/AD6P0.7/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P2.3/AUP2.2/A10P2.1/A9P20/A8U2LED8.1AT89S5122C2二30pFY16H=:12MH«zJzzC330pFo织自8区以R2220GND图4.7.11.系统板上硬件连线把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a—h端口上;要求:PO.O/ADO与a相连,PO.1/AD1与b相连,PO.2/AD2与c相连,,PO.7/AD7与h相连。2.程序设计内容(1.LED数码显示原理七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED数码管的g〜a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2“0”3FH“8”7FH“],,06H“9”6FH“2”5BH“A”77H
22“3”4FH“b”7CH“4”66H“c”39H“5”6DH“d”5EH“6”7DH“E”79H“7,,07H“F,,71H(2.由于显示的数字0—9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字0—9的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH1.程序框图图4.7.22.汇编源程序ORG0START:MOVRI,#00HNEXT:MOVA,RIMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,ALCALLDELAYINCRICJNERI,#10,NEXTLJMPSTARTDELAY:MOVR5,#20D2:MOVR6,#20DI:MOVR7,#248
23DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序#include
24RIvcc|r—220RIVCCIt220RIvccl"220RIVCC|—(ZZ220GND卜£PI08APOO/ADOPl1PO1/AD1P12.PO2/AD2P1.3PO3/AD3P14PO4/AD4P1-5I'U3AD3P16PO6/AD€P1.7PO7/AX>7ALEPSENP30/RXDP27/A15P31rrxr»P26/A14P32/1NTOP25/A13P33/1NT1P24/A12P34/TOP23/A11P35JT1P22/A1OP36AVRP21/A9P37/RDP2O/A8aD§M0UI39IMJ7至3534~33~32"30亘2827262y242T-77GKD图4.8.11.系统板上硬件连线(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2.把“单片机系统”区域中的PL0—PL4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“LI—L8”端口上;要求,PL0连接到L1,P1.1连接到L2,PL2连接到L3,P1.3连接到L4上。2.程序设计方法(1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,
25图4.8.2要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。(1.对于按键识别的指令,我们依然选择如下指令JBBIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。或者是JNBBIT,REL指令是用来检测BIT是否为低电平,若BIT=O,则程序转向REL处执行程序,否则就继续向下执行程序。
26(2.但对程序设计过程中按键识别过程的框图如右图所示:图4.8.31.程序框图图4.8.42.汇编源程序ORG0START:MOVR1,#OOH;初始化R1为0,表示从0开始计数MOVA,R1;CPLA;取反指令MOVPl,A;送出Pl端口由发光二极管显示
27REL:JNBP3.7,REL;判断SP1是否按下
28LCALLDELAY10MS;若按下,则延时10ms左右JNBP3.7,REL;再判断SP1是否真得按下INCRI;若真得按下,则进行按键处理,使MOVA,R1;计数内容加1,并送出P1端口由CPLA;发光二极管显示MOVPl,A;JNBP3.7,$;等待SP1释放SJMPREL;继续对KI按键扫描DELAY10MS:MOVR6,#20;延时10ms子程序LI:MOVR7,#248DJNZR7,$DJNZR6.L1RETEND1.C语言源程序#include
29Pl=count;while(P3_7==0);9.一键多功能按键识别技术1.实验任务如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89s51单片机的P1端口接有四个发光二极管,上电的时候,L1接在PL0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在PL1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。2.电路原理图近Q12.3.456711111111PPPPPPPP图4.9.1
301.系统板上硬件连线(1.把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2.把“单片机系统”区域中的Pl.0-P1.4端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,PLO连接到LLPL1连接到L2,P1.2连接到L3,PL3连接到L4上。2.程序设计方法(1.设计思想由来在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份(2.设计方法从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=O;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。3.程序框图
31图4.9.21.汇编源程序IDEQU30HSP1BITP3.7LIBITP1.0L2BITPl.1L3BITPl.2L4BITPl.3ORG0MOVID,#00HSTART:JBKI,RELLCALLDELAY1OMSJBKI,RELINCIDMOVA,IDCJNEA,#04,RELMOVID,#00HREL:JNBKI,$MOVA,ID
32CJNEA,#00H,ISOCPLLILCALLDELAYSJMPSTART150:CJNEA,#O1H,IS1CPLL2LCALLDELAYSJMPSTART151:CJNEA,#02H,IS2CPLL3LCALLDELAYSJMPSTART152:CJNEA,#O3H,IS3CPLL4LCALLDELAYSJMPSTART153:LJMPSTARTDELAY1OMS:MOVR6,#20L00P1:MOVR7,#248DJNZR7,$DJNZR6,L00P1RETDELAY:MOVR5,#20L00P2:LCALLDELAY10MSDJNZR5,L00P2RETEND7.C语言源程序#include
33voidmain(void){while(l){if(P3_7==0){delaylOms();if(P3_7==0)(ID++;if(ID==4)(ID=0;)while(P3_7==0);))switch(ID){case0:Pl_0=>l_0;delay02s();break;case1:P1_1=>1_1;delay02s();break;case2:P1_2=>1_2;delay02s();break;case3:P1_3=>1_3;delay02s();break;10.00—99计数器1.实验任务利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阴数码管,作为00—99计数的十位数显示;硬件电路图如图19所示。
341.电路原理图P30/RXDP3I/TXDP32/1KT0P334NTTP34/TOP3,门P36JmP37/RD0123.4567>POO/ADOPOMAD1P02/AD2P03/AD3P04OD4P05/AD5P06/AMP07/AD7ALEp$n 35(3.单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10求余,即可得个位数字,对10整除,即可得到十位数字了。(4.通过查表方式,分别显示出个位和十位数字。1.程序框图图4.10.22.汇编源程序CountEQU30HSP1BITP3.7ORG0START:MOVCount,#00HNEXT:MOVA,CountMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,BMOVCA,@A+DPTRMOVP2,AWT:JNBSP1,WTWAIT:JBSP1,WAITLCALLDELY10MSJBSP1,WAITINCCountMOVA,Count 36CJNEA,#100,NEXTLJMPSTARTDELY10MS:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序#include 3711.00—59秒计时器(利用软件延时)1.实验任务如下图所示,在AT89S51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。2.电路原理图gP10Pl1Pl.2P13Pl4P13Pl.6Pl7P30mXDP3l/TXDP32ANT0P33WTTP34/TOP35n*18APOQ7ADOPO1/AD1P02/AD2P03/AIX3P04/AD4P05/ADSP0ATAD6PO7/AD737363一jj.p-pP27/AI5P26/A14P25/A13P24/A12P23/AHP22/AIOP21/A9P20/A829282726252423rif需崔丞2322II_208*每8x2P37/RD图4.11.13.系统板上硬件连线(1.把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:PO.O/ADO对应着a,PO.1/AD1对应着b,,PO.7/AD7对应着h。(2.把“单片机系统”区域中的P2.0/A8—P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a—h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,,P2.7/A15对应着h。4.程序设计内容 38(1.在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数。(2.对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。(3.在数码上显示,仍通过查表的方式完成。(4.一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。DELY1S:MOVR5,#100D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,DIDJNZR5,D2RET1.程序框图 39图4.11.21.汇编源程序SecondEQU30H0RG0START:MOVSecond,#00HNEXT:MOVA,SecondMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVCA,@A+DPTRMOVP2,ALCALLDELY1SINCSecondMOVA,SecondCJNEA,#60,NEXTLJMPSTARTDELY1S:MOVR5,#100D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND2.C语言源程序#include 40voidmain(void)(Second=0;P0=table[Second/10];P2=table[Second%10];while(l)(delayls();Second++;if(Second==60)(Second=0;)P0=table[Second/10];P2=table[Second%10];12.可预置可逆4位计数器1.实验任务利用AT89S51单片机的Pl.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;用Pl.4—P1.7作为预置数据的输入端,接四个拨动开关KI—K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示2.电路原理图 41VCC卜►Ivcc卜vcc卜Mvcc|vcc|GND卜GHD卜GND卜GNDVCCGNDVCCGNDVCC►I后Pl0Pl1Pl2Pl3Pl4Pl5Pl6Pl.7P3CVRXDP31/TXDP32HNT0P334NTTP3.4/T0P35mP36AVRP37/RD8t>P0O/ADOPO1/AD1P02/AD2PO3/AD3P04/AD4P05/AD5PO6/AD6P07/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P23/A11P22/A10P21/A9P20/A8UI39与37至353433323029282726252423222?aT:- 42(2.预置初值读取的问题(3.LED输出指示1.程序框图图4.12.22.汇编源程序COUNTEQU30HORG00HSTART:MOVA,P3ANLA,#OFHMOVCOUNT,AMOVPl,ASK2:JBP3.6,SKILCALLDELY1OMSJBP3.6,SKIINCCOUNTMOVA,COUNTCJNEA,#16,NEXTMOVA,P3 43ANLA,#OFHMOVCOUNT,ANEXT:MOVPl,AWAIT:JNBP3.6,WAITLJMPSK2SKI:JBP3.7,SK2LCALLDELY1OMSJBP3.7,SK2DECCOUNTMOVA,COUNTCJNEA,#OFFH,NEXMOVA,P3ANLA,#OFHMOVCOUNT,ANEX:MOVPl,AWAIT2:JNBP3.7,WAIT2LJMPSK2DELY1OMS:MOVR6,#20MOVR7,#248DI:DJNZR7,$DJNZR6,D1RETEND7.C语言源程序#include 44delaylOms();if(P3_6==0)(if(curcount>=15)(curcount=15;)else(curcount++;)Pl=curcount;while(P3_6==0);))if(P3_7==0)(delaylOms();if(P3_7==0)(if(curcount<=0)(curcount=0;)else(curcount—;)Pl=~curcount;while(P3_7==0);)}))13.动态数码显示技术1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码 45管的数位选择端,PL7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。1.电路原理图 46ooO▽meG.SZZ-Tco公22OOOfL>|OOJf_,ocsIGNDNNNNorssr, 47动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。(2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。(3.对于显示的字形码数据我们采用查表方法来完成。1.程序框图图4.13.22.汇编源程序ORG00HSTART:JBPl.7.DIR1MOVDPTR,#TABLE1SJMPDIRDIRI:MOVDPTR,#TABLE2DIR:MOVRO,#00HMOVR1,#O1HNEXT:MOVA,ROMOVCA,@A+DPTR 48MOVPO,AMOVA,RIMOVP2,ALCALLDAYINCRORLAMOVRI,ACJNER1,#ODFH,NEXTSJMPSTARTDAY:MOVR6,#4DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE1:DB06H,5BH,4FH,66H,6DHTABLE2:DB78H,79H,38H,38H,3FHEND7.C语言源程序#include 49P2=temp;a=temp«(i+1);b=temp>>(7-i); 50temp=a|b;for(a=4;a>0;a一)for(b=248;b>0;b-);14.4义4矩阵式键盘识别技术1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4X4矩阵键盘,以Pl.0-P1.3作输入线,以PL4—PL7作输出线;在数码管上显示每个按键的“0—F”序号。对应的按键的序号排列如图4.14.1所示0123图4.14.12.硬件电路原理图 51艮田W5因is耳虫uweBiKis一反区£1言S0属因icis日MW9WSg£苟额氏ndKms马K8mid百204T£^rrrrrrH3'.J:11'I,,14,')OfF0Ilf1""l曲AaoDclsc巴巴图4.14.21.系统板上硬件连线(1.把“单片机系统“区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1—C4R1—R4端口上;(2.把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:PO.O/ADO对应着a,PO.1/AD1对应着b,,PO.7/AD7对应着h。2.程序设计内容(1.4X4矩阵键盘识别处理(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 521.程序框图P3=FFH,P3.2=0图4.14.32.汇编源程序KEYBUFEQU30HORG00HSTART:MOVKEYBUF,#2WAIT:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1LCALLDELY1OMS 53MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1MOVA,P3ANLA,#OFHCJNEA,#OEH,NK1MOVKEYBUF,#0LJMPDK1NK1:CJNEA,#ODH,NK2MOVKEYBUF,#1LJMPDK1NK2:CJNEA,#0BH,NK3MOVKEYBUF,#2LJMPDK1NK3:CJNEA,#07H,NK4MOVKEYBUF,#3LJMPDK1NK4:NOPDK1:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,ADK1A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK1ANOKEY1:MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY2LCALLDELY10MSMOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY2MOVA,P3ANLA,#OFHCJNEA,#OEH,NK5 54MOVKEYBUF,#4LJMPDK2NK5:CJNEA,#ODH,NK6MOVKEYBUF,#5LJMPDK2NK6:CJNEA,#OBH,NK7MOVKEYBUF,#6LJMPDK2NK7:CJNEA,#O7H,NK8MOVKEYBUF,#7LJMPDK2NK8:NOPDK2:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK2A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK2ANOKEY2:MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY3LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY3MOVA,P3ANLA,#OFHCJNEA,#OEH,NK9MOVKEYBUF,#8LJMPDK3NK9:CJNEA,#ODH,NK1OMOVKEYBUF,#9 55LJMPDK3NK1O:CJNEA,#OBH,NK11MOVKEYBUF,#10 56LJMPDK3NK11:CJNEA,#07H,NK12MOVKEYBUF,#11LJMPDK3NK12:NOPDK3:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,ADK3A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK3ANOKEY3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY4LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY4MOVA,P3ANLA,#OFHCJNEA,#OEH,NK13MOVKEYBUF,#12LJMPDK4NK13:CJNEA,#ODH,NK14MOVKEYBUF,#13LJMPDK4NK14:CJNEA,#OBH,NK15MOVKEYBUF,#14LJMPDK4NK15:CJNEA,#O7H,NK16MOVKEYBUF,#15LJMPDK4 57NK16:NOPDK4:MOVA,KEYBUF 58MOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK4A:MOVA,P3ANLA,#OFHXRLA,#0FHJNZDK4AN0KEY4:LJMPWAITDELY1OMS:MOVR6,#10DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,O7HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HEND7.C语言源程序#include 59if(temp!=OxOf)(temp=P3;temp=temp&OxOf;switch(temp){caseOxOe:key=7;break;caseOxOd:key=8;break;caseOxOb:key=9;break;case0x07:key=10;break;}temp=P3;P1_O二〜P1_O;PO=table[key];temp=temp&OxOf;while(temp!=OxOf)(temp=P3;temp=temp&OxOf;P3=0xff;P3_5=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i--)for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f)temp=P3; 60temp=temp&OxOf;switch(temp)(caseOxOe:key=4;break;caseOxOd:key=5;break;caseOxOb:key=6;break;case0x07:key=ll;break;)temp=P3;P1_O="P1_O;P0=table[key];temp=temp&OxOf;while(temp!=OxOf)(temp=P3;temp二temp&OxOf;)P3=0xff;P3_6=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f){for(i=50;i>0;i一)for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f)temp=P3;temp=temp&OxOf;switch(temp) 61caseOxOe:key=l;break;caseOxOd:key=2;break;caseOxOb:key=3;break;case0x07:key=12;break;)temp=P3;Pl_0=〜Pl_0;PO二table[key];temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;P3=0xff;P3_7=0:temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i—)for(j=200;j>0;j-);temp=P3;temp=temp&OxOf;if(temp!=0x0f)(temp=P3;temp=temp&OxOf;switch(temp)caseOxOe:key=O;break; 62caseOxOd:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;)temp=P3;Pl_0=>l_0;PO=table[key];temp=temp&OxOf;while(temp!=OxOf){temp=P3;temp=temp&OxOf;15.定时计数器TO作定时应用技术(一)1.实验任务用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示2.电路原理图 63MJ为a通善制图4.15.11.系统板上硬件连线(1.把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:PO.O/ADO对应着a,PO.1/AD1对应着b,,PO.7/AD7对应着h。(2.把“单片机系统”区域中的P2.0/A8—P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a—h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,,P2.7/A15对应着h。2.程序设计内容AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。现在我们选择16位定时工作方式,对于TO来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取TO的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。 64因此,我们设定TM0D=00000001B,BPTM0D=01H下面我们要给TO定时/计数器的THO,TLO装入预置初值,通过下面的公式可以计算出THO=(216-50000)/256TLO=(216-50000)MOD256当TO在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测ICON特殊功能寄存器中的TFO标志位,如果TFO=1表示定时时间已到。1.程序框图图4.15.22.汇编源程序(查询法)SECONDEQU30HTCOUNTEQU31HORG00HSTART:MOVSECOND,#00HMOVTCOUNT,#00H 65MOVTMOD,#O1HMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256SETBTRODISP:MOVA,SECONDMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVCA,@A+DPTRMOVP2,AWAIT:JNBTFO,WAITCLRTFOMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256INCTCOUNTMOVA,TCOUNTCJNEA,#20,NEXTMOVTCOUNT,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXMOVSECOND,#00HNEX:LJMPDISPNEXT:LJMPWAITTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序(查询法)#include 66TLO=(65536-50000)%256; 67TRO=1;tcount=0;second=0;PO=dispcode[second/10];P2=dispcode[second%10];whi1e(1)(if(TFO==l)(tcount++;if(tcount==20){tcount=0;second++;if(second==60)|second=0;)PO=dispcode[second/10];P2=dispcode[second%10];)TFO=O;THO=(65536-50000)/256;TL0=(65536-50000)%256;1.汇编源程序(中断法)SECONDEQU30HTCOUNTEQU31HORGOOHLJMPSTARTORGOBHLJMPINTOXSTART:MOVSECOND,#00HMOVA,SECONDMOVB,#10DIVABMOVDPTR,STABLEMOVCA,©A+DPTRMOVPO,AMOVA,BMOVCA,©A+DPTRMOVP2,A 68MOVTCOUNT,#OOHMOVTMOD,#O1HMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256SETBTROSETBETOSETBEASJMP$INTOX:MOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256INCTCOUNTMOVA,TCOUNTCJNEA,#20,NEXTMOVTCOUNT,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXMOVSECOND,#00HNEX:MOVA,SECONDMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,BMOVCA,@A+DPTRMOVP2,ANEXT:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序(中断法)#include 69TM0D=0x01;THO=(65536-50000)/256;TL0=(65536-50000)%256;TR0=l;ET0=l;EA=1;tcount=0;second=0;P0=dispcode[second/10];P2=dispcode[second%10];while(l);voidtO(void)interrupt1using0(tcount++;if(tcount==20){tcount=0;second++;if(second==60)(second=0;}PO=dispcode[second/10];P2=dispcode[second%10];)TH0=(65536-50000)/256;TL0=(65536-50000)%256;16.定时计数器TO作定时应用技术(二)1.实验任务用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。2.电路原理图 702.34.5.C7Pl.OPl1PlPlPlPlP3O/RXDP3l/TXDP32/INTOP33/INT1P34/TOP3.5/T1P3.6/WRP3.7/RDI含8APOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO5/AD5PO.6/AD6PO7/AD7ALEPSENP2.7/A15P26/A14P2.5/A13P24/A12P23/AllP2.2/A1OP2.1/A9P20/A8口O:C33OpFUI39383736353T33323o292827W~2524~23222fAT89ssi图4.16.11.系统板硬件连线(1.把“单片机系统”区域中的PL0—PL3用导线连接到“八路发光二极管指示模块”区域中的LI—L4上2.程序设计内容(1.由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器TO来说,中断入口地址为OOOBH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:ORG00HLJMPSTARTORGOBH;定时/计数器TO中断入口地址LJMPINT_TOSTART:NOP;主程序开始 71INT_TO:PUSHACC;定时/计数器TO中断服务程序PUSHPSWPOPPSWPOPACCRETI;中断服务程序返回END(2.定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中断开中断。(3.由于每次2秒定时到时,L1—L4要交替闪烁。采用ID来号来识别。当ID=0时,L1在闪烁,当ID=1时,L2在闪烁;当ID=2时,L3在闪烁;当ID=3时,L4在闪烁1.程序框图T0中断服务程序框图主程序框图 72TO中断入口Count2S加1图4.16.21.汇编源程序6.汇编源程序TCOUNT2SEQU30HTCNT02SEQU31HIDEQU32HORG00HLJMPSTARTORGOBH 73LJMPINT_TOSTART:MOVTCOUNT2S,#OOHMOVTCNT02S,#OOHMOVID,#OOHMOVTMOD,#O1HMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256SETBTROSETBETOSETBEASJMP$INT_TO:MOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256INCTC0UNT2SMOVA,TC0UNT2SCJNEA,#40,NEXTMOVTC0UNT2S,#00HINCIDMOVA,IDCJNEA,#04H,NEXTMOVID,#00HNEXT:INCTCNT02SMOVA,TCNT02SCJNEA,#4,DONEMOVTCNT02S,#00HMOVA,IDCJNEA,#00H,SID1CPLPl.0SJMPDONESID1:CJNEA,#01H,SID2CPLPl.1SJMPDONESID2:CJNEA,#02H,SID3CPLPl.2SJMPDONESID3:CJNEA,#03H,SID4CPLPl.3SID4:SJMPDONEDONE:RETIEND6.C语言源程序#include 74unsignedchartcount02s;unsignedcharID;voidmain(void)(TM0D=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TRO=1;ETO=1;EA=1;while(l);)voidtO(void)interrupt1using0(tcount2s++;if(tcount2s==40){tcount2s=0;ID++;if(ID==4)(ID=0;tcount02s++;if(tcount02s==4){tcount02s=0;switch(ID)(case0:Pl_0=>l_0;break;case1:break;case2:Pl_2=〜Pl_2;break;case3:Pl_3=〜Pl_3; 75break;17.99秒马表设计1.实验任务(1.开始时,显示“00”,第1次按下SP1后就开始计时。(2.第2次按SP1后,计时停止。(3.第3次按SP1后,计时归零。2.电路原理图培8>POO/ADOPO1/ADlPO2/AD2P03/AD3P04/AD4PO5/AD5P06/AD6PO7/AD7取Pl0Pl1Pl2Pl3Pl4Pl5Pl6Pl7P30/RXDP31/TXDP32/fS而P33/INTTP3VT0P35/TIP36还P37/RD9P27/A15P2.&JU4P25/A13P24/A12P23/AUP2.2/A10P21/A9P20/A8a.▲T89s51图4.17.13.系统板上硬件连线(1.把“单片机系统”区域中的P0.0/AD0—P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:PO.O/ADO对应着a,PO.1/AD1对应着b,,P0.7/AD7对应着h。 76(2.把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,,P2.7/A15对应着h。(3.把“单片机系统“区域中的P3.5/T1用导线连接到"独立式键盘”区域中的SP1端口上;1.程序框图主程序框图TO中断服务程序框图 77图4.17.21.汇编源程序TCNTAEQU30HTCNTBEQU31HSECEQU32HKEYCNTEQU33HSP1BITP3.5ORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVKEYCNT,#00HMOVSEC,#00HMOVA,SECMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,#TABLE 78MOVCA,@A+DPTRMOVP2,AMOVTMOD,#02HSETBETOSETBEAWT:JBSP1,WTLCALLDELY1OMSJBSP1,WTINCKEYCNTMOVA,KEYCNTCJNEA,#O1H,KN1SETBTROMOVTHO,#06HMOVTLO,#06HMOVTCNTA,#OOHMOVTCNTB,#OOHLJMPDKNKN1:CJNEA,#02H,KN2CLRTROLJMPDKNKN2:CJNEA,#O3H,DKNMOVSEC,#OOHMOVA,SECMOVB,#1ODIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP2,AMOVKEYCNT,#OOHDKN:JNBSP1,$LJMPWTDELY1OMS:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETINT_TO:INCTCNTAMOVA,TCNTA 79CJNEA,#100,NEXTMOVTCNTA,#00HINCTCNTBMOVA,TCNTBCJNEA,#4,NEXTMOVTCNTB,#00HINCSECMOVA,SECCJNEA,#100,DONEMOVSEC,#00HDONE:MOVA,SECMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP2,ANEXT:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序#include 80second=0;P0=dispcode[second/10];P2=dispcode[second%10]; 81whiled)(if(P3_5==0)(for(i=20;i>0;i-)for(j=248;j>0;j—);if(P3_5==0)(keycnt++;switch(keycnt)(case1:TH0=0x06;TL0=0x06;TRO=1;break;case2:TR0=0;break;case3:keycnt=0;second=0;P0=dispcode[second/10];P2=dispcode[second%10];break;)while(P3_5==0);voidtO(void)interrupt1using0(tcnt++;if(tcnt==400)(tcnt=0;second++;if(second==100)(second=0;P0=dispcode[second/10]; 82P2=dispcode[second%10];18.“嘀、嘀、……”报警声1.实验任务用AT89s51单片机产生“嘀、嘀、…”报警声从P1.0端口输出,产生频率为IKHz,根据上面图可知:1KHZ方波从Pl.0输出0.2秒,接着0.2秒从PL0输出电平信号,如此循环下去,就形成我们所需的报警声了。2.电路原理图ESEdEqndE女mdGXlHEdEAN8 831.程序设计方法(1.生活中我们常常到各种各样的报警声,例如“嘀、嘀、…”就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为lKHz,则报警声时序图如下图所示:上述波形信号如何用单片机来产生呢?(2.由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ方波,占用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器T0来完成0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时间了。2.程序框图主程序框图中断服务程序框图 84图4.18.21.汇编源程序T02SAEQU30HT02SBEQU31HFLAGBITOOHORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVT02SA,#00HMOVT02SB,#00HCLRFLAGMOVTMOD,#01HMOVTHO,#(65536-500)/256MOVTLO,#(65536-500)MOD256SETBTROSETBETOSETBEASJMP$INT_TO:MOVTHO,#(65536-500)/256MOVTLO,#(65536-500)MOD256INCT02SA 85MOVA,T02SACJNEA,#100,NEXTINCT02SBMOVA,T02SBCJNEA,#04H,NEXTMOVT02SA,#00HMOVT02SB,#00HCPLFLAGNEXT:JBFLAG,DONECPLPl.0DONE:RETIEND1.C语言源程序#include 8619.“叮咚"门铃1.实验任务当按下开关SP1,AT89s51单片机产生“叮咚”声从PL0端口输出到LM386,经过放大之后送入喇叭。2.电路原理图i£6W二dLdczdnCOVUOd9dodSOVKM寸£gQVKOdKVN£12二odoawi£5TCCEAIdeid95:s【drdrdz-d图Ed氏ndis一INSCdOHiz0X1/二dAis图4.19.13.系统板上硬件连线(1.把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2.在“音频放大模块”区域中的SPKOUT端口上接上一个8欧或者是16欧的喇叭;(3.把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;4.程序设计方法 87(1.我们用单片机实定时7计数器TO来产生700Hz和500HZ的频率,根据定时/计数器T0,我们取定时250us,因此,700Hz的频率要经过3次250us的定时,而500Hz的频率要经过4次250us的定时。(2.在设计过程,只有当按下SP1之后,才启动T0开始工作,当T0工作完毕,回到最初状态。(3.“叮”和“咚”声音各占用0.5秒,因此定时/计数器T0要完成0.5秒的定时,对于以250us为基准定时2000次才可以。1.程序框图主程序框图T0中断服务程序框图 88图4.19.21.汇编源程序T5HZEQU30HT7HZEQU31HT05SAEQU32HT05SBEQU33HFLAGBITOOHSTOPBIT01HSP1BITP3.7ORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVTMOD,#02HMOVTHO,#06HMOVTLO,#06HSETBETOSETBEANSP:JBSPl.NSP 89LCALLDELY10MSJBSPl.NSPSETBTROMOVT5HZ,#OOHMOVT7HZ,#OOHMOVT05SA,#OOHMOVT05SB,#OOHCLRFLAGCLRSTOPJNBSTOP,$LJMPNSPDELY1OMS:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETINT_TO:INCT05SAMOVA,T05SACJNEA,#100,NEXTMOVT05SA,#00HINCT05SBMOVA,T05SBCJNEA,#20,NEXTMOVT05SB,#00HJBFLAG,STPCPLFLAGLJMPNEXTSTP:SETBSTOPCLRTROLJMPDONENEXT:JBFLAG,S5HZINCT7HZMOVA,T7HZCJNEA,#03H,DONEMOVT7HZ,#00HCPLPl.0LJMPDONES5HZ:INCT5HZMOVA,T5HZCJNEA,#04H,DONEMOVT5HZ,#00HCPLPl.0LJMPDONEDONE:RETI 90END1.C语言源程序#include 91if(tcnt==2000){tcnt=O;if(flag==O)(flag=_flag;)else(stop=l;TRO=O;})if(flag==O)(t7hz++;if(t7hz==3)(t7hz=0;P1_O=〜P1_O;))else(t5hz++;if(t5hz==4)(t5hz=0;P1_O=>1_O;)))20.数字钟(★)1.实验任务(1.开机时,显示12:00:00的时间开始计时;(2.P0.0/AD0控制“秒”的调整,每按一次加1秒; 92(3.P0.1/AD1控制“分”的调整,每按一次加1分;(4.P0.2/AD2控制“时”的调整,每按一次加1个小时; 932.电路原理图2?5UILED84S3I3E3DC4uAT89S51U2LED84S寸”ezqsss日日日日3PPUMSy«5•onzqsss日日日日dIBPP(JMS十八9K0O68尔6即axuicdptess05£LIA&iW9£d国LM口后0Q<3£modzavRodmav/Eodbavqod□avKod9dV790dcavsod"V□IwccdwucdEIVKSducduveasVRSd6WIZdgvazdl加XG月禹分区后由为耳周常落舟耕斡附外DCTi|gndt-|vccGNDEA图4.20.13.系统板上硬件连线(1.把“单片机系统”区域中的PLO-PL7端口用8芯排线连接到“动态数码显示"区域中的A—H端口上;(2.把“单片机系统:区域中的P3.0—P3.7端口用8芯排线连接到“动态数码显示“区域中的S1—S8端口上;(3.把“单片机系统”区域中的PO.O/ADO、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;4.相关基本知识 94(1.动态数码显示的方法(2.独立式按键识别过程(3.“时”,“分”,“秒”数据送出显示处理方法3.程序框图 95计数单元清零THO,TLO装入初值开中断,并允许TO中断'”按错识别成功否立〉~►y\SECOND力口1 966.汇编源程序SECONDEQU30HMINITEEQU31HHOUREQU32HHOURKBITPO.0MINITEKBITPO.1SECONDKBITPO.2DISPBUFEQU40HDISPBITEQU48HT2SCNTAEQU49HT2SCNTBEQU4AHTEMPEQU4BHORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVSECOND,#OOHMOVMINITE,#OOHMOVHOUR,#12MOVDISPBIT,#OOHMOVT2SCNTA,#OOHMOVT2SCNTB,#OOHMOVTEMP,#OFEHLCALLDISPMOVTMOD,#O1HMOVTHO,#(65536-2000)/256MOVTLO,#(65536-2000)MOD256SETBTROSETBETOSETBEAWT:JBSECONDK,NK1LCALLDELY10MSJBSECONDK,NK1INCSECONDMOVA,SECONDCJNEA,#60,NS60MOVSECOND,#00HNS60:LCALLDISPJNBSECONDK,$NK1:JBMINITEK,NK2LCALLDELY10MSJBMINITEK,NK2INCMINITE 97MOVA,MINITECJNEA,#60,NM60MOVMINITE,#00HNM60:LCALLDISPJNBMINITEK,$NK2:JBHOURK,NK3LCALLDELY10MSJBHOURK,NK3INCHOURMOVA,HOURCJNEA,#24,NH24MOVHOUR,#00HNH24:LCALLDISPJNBHOURK,$NK3:LJMPWTDELY10MS:MOVR6,#10DI:MOVR7,#248DJNZR7,$DJNZR6.D1RETDISP:MOVA,#DISPBUFADDA,#8DECAMOVRI,AMOVA,HOURMOVB,#10DIVABMOV@R1,ADECRIMOVA,BMOV@R1,ADECRIMOVA,#10MOV@R1,ADECRIMOVA,MINITEMOVB,#10DIVABMOV@R1,ADECRIMOVA,BMOV@R1,A 98DECRIMOVA,#10MOV@R1,ADECRIMOVA,SECONDMOVB,#10DIVABMOV@R1,ADECRIMOVA,BMOV@R1,ADECRIRETINT_TO:MOVTHO,#(65536-2000)/256MOVTLO,#(65536-2000)MOD256MOVA,#DISPBUFADDA,DISPBITMOVRO,AMOVA,@R0MOVDPTR,#TABLEMOVCA,@A+DPTRMOVPl,AMOVA,DISPBITMOVDPTR,STABMOVCA,@A+DPTRMOVP3,AINCDISPBITMOVA,DISPBITCJNEA,#08H,KNAMOVDISPBIT,#00HKNA:INCT2SCNTAMOVA,T2SCNTACJNEA,#100,DONEMOVT2SCNTA,#00HINCT2SCNTBMOVA,T2SCNTBCJNEA,#05H,DONEMOVT2SCNTB,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXTMOVSECOND,#00HINCMINITE 99MOVA,MINITECJNEA,#60,NEXTMOVMINITE,#00HINCHOURMOVA,HOURCJNEA,#24,NEXTMOVHOUR,#00HNEXT:LCALLDISPDONE:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40HTAB:DBOFEH,OFDH,OFBH,0F7H,OEFH,ODFH,OBFH,07FHEND7.C语言源程序^include 100for(i=5;i>0;i—)for(j=248;j>0;j—);if(PO_O==O)彳second++;if(second==60)(second=0;)dispbuf[0]=second%10;dispbuf[l]=second/10;while(P0_0==0);))if(P0_l==0)彳for(i=5;i>0;i—)for(j=248;j>0;j—);if(P0_l==0)彳minite++;if(minite==60)(minite=0;)dispbuf[3]=minite%10;dispbuf[4]=minite/10;while(P0_l==0);))if(P0_2==0)彳for(i=5;i>0;i—)for(j=248;j>0;j—);if(P0_2==0)彳hour++;if(hour==24)(hour=0;dispbuf[6]=hour%10;dispbuf[7]=hour/l0; 101while(P0_2==0);)voidtO(void)interrupt1using0(mstcnt++;if(mstcnt==8){mstcnt=0;Pl=dispcode[dispbuf[^t]];P3=dispbitcode[**t];**t++;if(**t=8)(**t=0;tcnt++;if(tcnt==4000)(tcnt=0;second++;if(second==60)(second=0;minite++;if(minite==60)(minite=0;hour++;if(hour==24)(hour=0;})}dispbuf[0]=second%10dispbuf[1]=second/10dispbuf[3]=minite%10dispbuf[4]=minite/10dispbuf[6]=hour%10;dispbuf[7]=hour/10; 10221.拉幕式数码显示技术1.实验任务用AT89S51单片机的PO.O/ADO-PO.7/AD7端口接数码管的a-h端,8位数码管的S1-S8通过74LS138译码器的Y0-Y7来控制选通每个数码管的位选端。AT89s51单片机的PL0-P1.2控制74LS138的A,B,C端子。在8位数码管上从右向左循环显示“12345678”。能够比较平滑地看到拉幕的效果。2.电路原理图U174LS138B.B.0.0.qm~1也SSs0.0.B,0.£68历U2AT89S51ewmd忙匚一esmd一INWmdndoxtIEd?_'J图4.21.1X23.系统板上硬件连线 103(1.把“单片机系统”区域中的PO.O/ADO-PO.7/AD7用8芯排线连接到“动态数码显示"区域中的a-h端口上;(2.把“三八译码模块”区域中的YO—Y7用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;(3.把“单片机系统”区域中的P1.O-P1.2端口用3根导线连接到“三八译码模块”区域中的A、B、C”端口上;1.程序设计方法(1.动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管显示,因此,要显示8位的数据,必须经过让数码管一*个轮流显示才可以,同时每个数码管显示的时间大约在1ms到4ms之间,所以为了保证正确显示,我必须每隔1ms,就得刷新一个数码管。而这刷新时间我们采用单片机的定时/计数器TO来控制,每定时1ms对数码管刷新一次,TO采用方式2。(2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。2.程序框图主程序框图中断服务程序框图 104图4.21.21.汇编源程序DISPBUFEQU30HDISPCNTEQU38HDISPBITEQU39HT1CNTAEQU3AHT1CNTBEQU3BHCNTEQU3CHORG00HLJMPSTARTORGOBHLJMPINT_TO 105START:MOVDISPCNT,#8MOVA,#10MOVRI,#DISPBUFLP:MOV@R1,AINCRIDJNZDISPCNT,LPMOVDISPBIT,#00HMOVT1CNTA,#00HMOVT1CNTB,#00HMOVCNT,#00HMOVTMOD,#01HMOVTHO,#(65536-1000)/256MOVTLO,#(65536-1000)MOD256SETBTROSETBETOSETBEASJMP$INT_TO:MOVTHO,#(65536-1000)/256MOVTLO,#(65536-1000)MOD256MOVA,DISPBITADDA,#DISPBUFMOVRO,AMOVA,@R0MOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,PlANLA,#0F8HADDA,DISPBITMOVPl,AINCDISPBITMOVA,DISPBITCJNEA,#08H,NEXTMOVDISPBIT,#00HNEXT:INCT1CNTAMOVA,T1CNTACJNEA,#50,LL1MOVT1CNTA,#00HINCT1CNTBMOVA,T1CNTBCJNEA,#8,LL1MOVT1CNTB,#00H 106INCCNTMOVA,CNTCJNEA,#9,LLXMOVCNT,#OOHMOVA,CNTLLX:CJNEA,#O1H,NEX1MOV30H,#8LL1:LJMPDONENEX1:CJNEA,#02H,NEX2MOV31H,#8MOV30H,#8LJMPDONENEX2:CJNEA,#03H,NEX3MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX3:CJNEA,#04H,NEX4MOV33H,#8MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX4:CJNEA,#05H,NEX5MOV34H,#8MOV33H,#8MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX5:CJNEA,#06H,NEX6MOV35H,#8MOV34H,#8MOV33H,#8MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX6:CJNEA,#O7H,NEX7MOV36H,#8MOV35H,#8MOV34H,#8MOV33H,#8MOV32H,#8 107MOV31H,#8MOV30H,#8LJMPDONENEX7:CJNEA,#08H,NEX8MOV37H,#8MOV36H,#8MOV35H,#8MOV34H,#8MOV33H,#8MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX8:CJNEA,#OOH,DONEMOV37H,#10MOV36H,#10MOV35H,#10MOV34H,#10MOV33H,#10MOV32H,#10MOV31H,#10MOV30H,#10LL:LJMPDONEDONE:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,OOHEND7.C语言源程序#include 108TH0=0x06;TL0=0x06;TRO=1;ETO=1;EA=1;while(l);voidtO(void)interrupt1using0(t5mscnt++;if(t5mscnt==4)(t5mscnt=0;PO=dispcode[dispbuf[**t]];Pl=dispbitcode[**t];**t++;if(**t==8)**t=0;))t02scnt++;if(t02scnt==1600)(t02scnt=0;u++;if(u==9)(u=0;)for(i=0;i<8;i++)(dispbuf[i]=16;)for(i=0;i 1091.实验任务(1.由4X4组成16个按钮矩阵,设计成16个音(2.可随意弹奏想要表达的音乐。2.电路原理图那件件件忡件冲卜冲卜0Igls/七Jl_口育。-孑k一孑.is・wsnnisHWC&Irw目「ft目.M20套gsWEecsaxvTK03^a图4.22.1系统板硬件连线1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上; 110(2.把“单片机系统“区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上;4.相关程序内容(1.4X4行列式键盘识别;(2.音乐产生的方法;一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示频率(HZ)简谱码(T值)262636282776373129463835311639283306402134964103370641853926426041564331440644004666446349464524523645805546463358764684622647326596477769864820DO#REA#O#AIo#E#ACORttMFASOLsDoREMFDEFsDRA-寸12R345671234布1245612音低#1低#2低低#低#低#低中#中#中中频率(HZ)简谱码(T值)740648607846489883164934880649689326499498865030104665058110965085117565110124565134131865157139765178148065198156865217166165235176065252186565268196765283#AIoLSS67516«#中#UDo1A高Do11ER2高ER2MF34高高#OASF54#AIoLSS6756#高#高下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据低音0—19之间,中音在20—39之间,高音在40—59之间TABLE:DW0,63628,63835,64021,64103,64260,64400,64524,0,0DW0,63731,63928,0,64185,64331,64463,0,0,0 111DW0,64580,64684,64777,64820,64898,64968,65030,0,0DW0,64633,64732,0,64860,64934,64994,0,0,0DW0,65058,65110,65157,65178,65217,65252,65283,0,0DW0,65085,65134,0,65198,65235,65268,0,0,0DW02、音乐的音拍,一个节拍为单位(C调)曲调值DELAY曲调值DELAY调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125ms对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。下面就用AT89s51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。4.程序框图图4.22.25.汇编源程序KEYBUFEQU30HSTHOEQU31HSTLOEQU32HTEMPEQU33H 112ORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVTMOD,#O1HSETBETOSETBEAWAIT:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1MOVA,P3ANLA,#OFHCJNEA,#OEH,NK1MOVKEYBUF,#0LJMPDK1NK1:CJNEA,#ODH,NK2MOVKEYBUF,#1LJMPDK1NK2:CJNEA,#OBH,NK3MOVKEYBUF,#2LJMPDK1NK3:CJNEA,#07H,NK4MOVKEYBUF,#3LJMPDK1NK4:NOPDK1:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,KEYBUFMOVB,#2 113MULABMOVTEMP,AMOVDPTR,#TABLE1 114MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK1A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK1ACLRTRONOKEY1:MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY2LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY2MOVA,P3ANLA,#OFHCJNEA,#OEH,NK5MOVKEYBUF,#4LJMPDK2NK5:CJNEA,#ODH,NK6MOVKEYBUF,#5LJMPDK2NK6:CJNEA,#OBH,NK7MOVKEYBUF,#6LJMPDK2NK7:CJNEA,#O7H,NK8MOVKEYBUF,#7LJMPDK2NK8:NOPDK2:MOVA,KEYBUF 115MOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,#TABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK2A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK2ACLRTRONOKEY2:MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY3LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY3MOVA,P3ANLA,#OFHCJNEA,#OEH,NK9MOVKEYBUF,#8LJMPDK3NK9:CJNEA,#ODH,NK1OMOVKEYBUF,#9LJMPDK3 116NK10:CJNEA,#OBH,NK11MOVKEYBUF,#10LJMPDK3NK11:CJNEA,#07H,NK12MOVKEYBUF,#11LJMPDK3NK12:NOPDK3:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,#TABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK3A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK3ACLRTRON0KEY3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY4LCALLDELY10MSMOVA,P3 117ANLA,#OFHXRLA,#OFHJZN0KEY4 118MOVA,P3ANLA,#OFHCJNEA,#OEH,NK13MOVKEYBUF,#12LJMPDK4NK13:CJNEA,#ODH,NK14MOVKEYBUF,#13LJMPDK4NK14:CJNEA,#OBH,NK15MOVKEYBUF,#14LJMPDK4NK15:CJNEA,#O7H,NK16MOVKEYBUF,#15LJMPDK4NK16:NOPDK4:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,#TABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK4A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK4ACLRTRON0KEY4: 119LJMPWAITDELY1OMS:MOVR6,#10 120DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETINT_TO:MOVTHO,STHOMOVTLO,STLOCPLPl.0RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,O7HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLEI:DW64021,64103,64260,64400DW64524,64580,64684,64777DW64820,64898,64968,65030DW65058,65110,65157,65178END4.C语言源程序#include 121temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i--)for(j=200;j>0;j-);temp=P3;temp=temp&OxOf;if(temp!=0x0f)(temp=P3;temp二temp&OxOf;switch(temp){caseOxOe:key=0;break;caseOxOd:key=l;break;case0x0b:key=2;break;case0x07:key=3;break;)temp=P3;Pl_0=>l_0;PO=table[key];STHO=tab[key]/256;STL0=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=OxOf){temp=P3;temp=temp&OxOf;)TRO=O;))P3=0xff;P3_5=0; 122temp=P3;temp二temp&OxOf;if(temp!=OxOf)(for(i=50;i>0;i-)for(j=200;j>0;j—);temp=P3;temp二temp&OxOf;if(temp!=0x0f){temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=4;break;caseOxOd:key=5;break;case0x0b:key=6;break;case0x07:key=7;break;)temp=P3;Pl_0=〜Pl_0;PO二table[key];STHO=tab[key]/256;STL0=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f){temp=P3;temp=temp&OxOf;)TRO=O;)P3=0xff; 123P3_6=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i—)for(j=200;j>0;j—):temp=P3;temp=temp&OxOf;if(temp!=0x0f){temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=8;break;caseOxOd:key=9;break;case0x0b:key=10;break;case0x07:key=ll;break;}temp=P3;Pl_0=>l_0;PO=table[key];STHO=tab[key]/256;STL0=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp二temp&OxOf;TRO=O; 124P3=0xff;P3_7=0;temp=P3;temp=temp&OxOf;if(temp!=OxOf)(for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&OxOf;if(temp!=0x0f)(temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=12;break;caseOxOd:key二13;break;case0x0b:key=14;break;case0x07:key=15;break;)temp=P3;Pl_0二〜Pl_0;POtable[key];STH0-tab[key]/256;STLO=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;}TRO=O;)} 125voidtO(void)interrupt1using0TH0=STH0;TLO=STLO;P1_O="P1_O;)23.模拟计算器数字输入及显示1.实验任务(1.开机时,显示“0”(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。2.电路原理图?KWK•WK-aK2*sMK3tOVTMA:MRS&9a£目&&£营£■EEdssamOSa<2M*sMsag>•&s=fq::.日日日日日日日日 126图4.23.11.系统板上硬件连线(1.把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2.把“单片机系统“区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1—C4R1—R4端口上;(3.把“单片机系统”区域中的PO.O—P0.7端口用8芯排线连接到“动态数码显示"区域中的A-H端口上;(4.把“单片机系统:区域中的P2.0—P2.7端口用8芯排线连接到“动态数码显示"区域中的S1-S8端口上;2.相关程序设计内容(1.行列式键盘输入及按键功能设定;(2.动态数码显示;(3.数码显示方式处理;3.汇编源程序(略)4.C语言源程序#include 127count——;voidmain(void)(TM0D=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TRO=1;ETO=1;EA=1;while(l)(P3=0xff;P3_4=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i—)for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f)(temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=7;break;caseOxOd:key=8;break;case0x0b:key=9;break;case0x07:key=10;break; 128if((key>=0)&&(key<10))keypos++:if(keypos<8)(change(dispbuf,keypos);dispbuf[Ol=key;)else{keypos=8;alarmflag=l;))temp=P3;Pl_0=>l_0;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;)alarmflag=O;P3=0xff;P3_5=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=50;i>0;i-)for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f){temp=P3;temp=temp&OxOf;switch(temp)|caseOxOe:key=4; 129break;caseOxOd:key=5;break;caseOxOb:key=6;break;case0x07:key=ll;break;)if((key>=0)&&(key<10)){keypos++;if(keypos<8){change(dispbuf,keypos);dispbuf[0]=key;)else(keypos=8;alarmflag=l;})temp=P3;P1_O='P10;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;)alarmflag=0;))P3=0xff;P3_6=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)for(i=50;i>0;i—) 130for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f)(temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=l;break;caseOxOd:key=2;break;caseOxOb:key=3;break;case0x07:key=12;break;}if((key>-0)&&(key<10))(keypos++;if(keypos<8)(change(dispbuf,keypos);dispbuf[O]=key;)else{keypos=8;alarmflag=l;))temp=P3;Pl_0=>l_0;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;) 131alarmflag=O;))P3=0xff;P3_7=0;temp=P3;temp=temp&OxOf;if(temp!=OxOf)(for(i=50;i>0;i一)for(j=200;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=0x0f){temp=P3;temp=temp&OxOf;switch(temp){caseOxOe:key=O;break;caseOxOd:key=13;break;caseOxOb:key=14;break;case0x07:key=15;break;)if((key>=0)&&(key<10))(keypos++;if(keypos<8){change(dispbuf,keypos);dispbuf[0]=key;)elsekeypos=8; 132alarmflag=l;temp=P3;P1_O="P1_O;temp=temp&OxOf;while(temp!=OxOf)(temp=P3;temp=temp&OxOf;)alarmflag=0;voidtO(void)interrupt1using0(THO=(65536-4000)/256;TLO=(65536-4000)%256;PO=dispcode[dispbuf[dispbitcount]];P2=dispbitcode[dispbitcount];dispbitcount++;if(dispbitcount==8){dispbitcount=0;)if(alarmflag==l)())24.8X8LED点阵显示技术1.实验任务在8X8LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。2.电路原理图 133•KfvccIOKCR41SH0123,4561111111ppppppP87654321CR6CR7CR8;,APOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO5/ADSPO6/AD6P0.7/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P23/A11P22/A1OP21/A9P20/A88P3O/RXDP31/TXDP3.2/INT0P3.3/INT1P34/TOP35/T1P36/WRP37/RD图4.24.11.硬件电路连线(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1—DR8”端口上;(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1—DC8”端口上;4.程序设计内容(1).8X8点阵LED工作原理说明 1348X8点阵LED结构如下图所示图4.24.2从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:一根竖柱:对应的列置1,而行则采用扫描的方法来实现。一根横柱:对应的行置0,而列则采用扫描的方法来实现。5.汇编源程序ORG00HSTART:NOPMOVR3,#3L0P2:MOVR4,#8 135MOVR2,#0LOP1:MOVP1,#OFFHMOVDPTR,#TABAMOVA,R2MOVCA,@A+DPTRMOVP3,AINCR2LCALLDELAYDJNZR4,LOP1DJNZR3,LOP2MOVR3,#3L0P4:MOVR4,#8MOVR2,#7L0P3:MOVP1,#OFFHMOVDPTR,#TABAMOVA,R2MOVCA,@A+DPTRMOVP3,ADECR2LCALLDELAYDJNZR4,LOP3DJNZR3,L0P4MOVR3,#3LOP6:MOVR4,#8MOVR2,#0LOP5:MOVP3,#OOHMOVDPTR,#TABBMOVA,R2MOVCA,@A+DPTRMOVPl,AINCR2LCALLDELAYDJNZR4,LOP5DJNZR3,LOP6MOVR3,#3L0P8:MOVR4,#8MOVR2,#7LOP7:MOVP3,#OOHMOVDPTR,#TABBMOVA,R2MOVCA,@A+DPTR 136MOVPl,ADECR2LCALLDELAYDJNZR4,LOP7DJNZR3,L0P8LJMPSTARTDELAY:MOVR5,#10D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABA:DBOFEH,OFDH,OFBH,OF7H,OEFH,ODFH,OBFH,O7FHTABB:DBO1H,02H,04H,08H,1OH,20H,40H,80HEND5.C语言源程序#include 137voidmain(void)(unsignedchari,j;while(l){for(j=0;j<3;j++){for(i=0;i<8;i++){P3=taba[i];Pl=0xff;delay1();//fromlefttoright3timefor(j=0;j<3;j++){for(i=0;i<8;i++)(P3=taba[7-i];Pl=0xff;delayl();}}for(j=0;j<3;j++){for(i=0;i<8;i++)(P3=0x00;Pl=tabb[7-i];delayl();))for(j=0;j<3;j++)(for(i=0;i<8;i++)(P3=0x00;Pl=tabb[i];delayl();//fromrighttoleft3time//fromtoptobottom3time//frombottomtotop3time 13825.点阵式LED“0—9”数字显示技术1.实验任务利用8X8点阵显示数字0到9的数字。2.电路原理图CR7CR80P10Pl1P12P1.3P14P15P16P1.7P3O/RXDP31/TXDP3.2/INT0P3.3/INT1P34/T0P35/T1P36/WRP3.7/RDats8APC"ADOPO1/AD1PO2/AD2PO3/AD3PO4/AO4PO5/ADSPO6/AD6P0.7/AD7ALEPSENP2.7/A15P26/A14P25/A13P24/A12P23/A11P22/A1OP21/A9P20/A8图4.25.13.硬件系统连线(1).把“单片机系统”区域中的Pl端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上; 139(1).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;1.程序设计内容(1).数字0—9点阵显示代码的形成如下图所示,假设显示数字“0”因此,形成的列代码为OOH,OOH,3EH,41H,41H,3EH,OOH,00H;只要把这些代码分别送到相应的列线上面,即可实现“0”的数字显示。送显示代码过程如下所示送第一列线代码到P3端口,同时置第一行线为“0”,其它行线为“1”,延时2ms左右,送第二列线代码到P3端口,同时置第二行线为“0”,其它行线为“1”,延时2nls左右,如此下去,直到送完最后一列代码,又从头开始送。数字“1”代码建立如下图所示其显示代码为OOH,OOH,OOH,OOH,21H,7FH,01H,00H 140数字“2”代码建立如下图所示OOH,OOH,27H,45H,45H,45H,39H,00H数字“3”代码建立如下图所示OOH,OOH,22H,49H,49H,49H,36H,00H数字“4”代码建立如下图所示OOH,OOH,OCH,14H,24H,7FH,04H,00H 141数字“5”代码建立如下图所示OOH,OOH,72H,51H,51H,51H,4EH,00H数字“6”代码建立如下图所示OOH,OOH,3EH,49H,49H,49H,26H,00H数字“7”代码建立如下图所示OOH,OOH,40H,40H,40H,4FH,70H,00H 142数字“8”代码建立如下图所示OOH,OOH,36H,49H,49H,49H,36H,00H数字“9”代码建立如下图所示OOH,OOH,32H,49H,49H,49H,3EH,00H1.汇编源程序TIMEQU30HCNTAEQU31HCNTBEQU32HORGOOHLJMPSTARTORGOBHLJMPTOXORG30HSTART:MOVTIM,#00HMOVCNTA,#00HMOVCNTB,#00HMOVTMOD,#01H 143MOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEASJMP$TOX:MOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,#TABMOVA,CNTAMOVCA,@A+DPTRMOVP3,AMOVDPTR,#DIGITMOVA,CNTBMOVB,#8MULABADDA,CNTAMOVCA,@A+DPTRMOVPl,AINCCNTAMOVA,CNTACJNEA,#8,NEXTMOVCNTA,#00HNEXT:INCTIMMOVA,TIMCJNEA,#250,NEXMOVTIM,#00HINCCNTBMOVA,CNTBCJNEA,#10,NEXMOVCNTB,#00HNEX:RETITAB:DBOFEH,OFDH,OFBH,0F7H,OEFH,ODFH,OBFH,07FHDIGIT:DBOOH,OOH,3EH,41H,41H,41H,3EH,OOHDBOOH,OOH,OOH,OOH,21H,7FH,01H,OOHDBOOH,OOH,27H,45H,45H,45H,39H,OOHDBOOH,OOH,22H,49H,49H,49H,36H,OOHDBOOH,OOH,OCH,14H,24H,7FH,04H,OOHDBOOH,OOH,72H,51H,51H,51H,4EH,OOHDBOOH,OOH,3EH,49H,49H,49H,26H,OOHDBOOH,OOH,40H,40H,40H,4FH,70H,OOH 144DBOOH,OOH,36H,49H,49H,49H,36H,OOHDBOOH,OOH,32H,49H,49H,49H,3EH,OOHEND1.C语言源程序#include 145Pl=**tb][cnta];cnta++;if(cnta==8)(cnta=O;)timecount++;if(timecount==333)(timecount=0;cntb++;if(cntb==10)(cntb=O;26.点阵式LED简单图形显示技术1.实验任务在8X8点阵式LED显示“★”、和心形图,通过按键来选择要显示的图形。2.电路原理图 146vccU18XBLED539383736353433323029H也OO>P1.0P0.0/AD0P1.1P0.1/AD1P1.2P0.2/AD2P1.3P03/AD3P1.4P0.4/AD4P1.5P0.5/AD5P1.6P0.6/AD6P1.7P0.7/AD7ALEPSENP3.0/RXDP2.7/A15P3.1/TXDP2.6/A14P3.2/INT0P2.5/A13P3.3/INT1P2.4/A12P3.4/T0P23/A11P3.5/T1P2.2/A10P3.6/WRP2.1/A9P3.7/RI>P2.0/A8x><§CR2QQQQQQQQ图4.26.13.硬件系统连线(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1—DR8“端口上;(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1—DC8”端口上;⑶.把“单片机系统”区域中的P2.0/A8端子用导线连接到“独立式键盘”区域中的SP1端子上;程序设计内容(1).“★”在8X8LED点阵上显示图如下图所示 14712345678(1).“•”在8X8LED点阵上显示图如下图所示12345678(2).心形图在8X8LED点阵上显示图如下图所示30H,48H,44H,22H,44H,48H,30H,00H 1485.汇编源程序CNTAEQU30HCOUNTEQU31HORGOOHLJMPSTARTORGOBHLJMPTOXORG30HSTART:MOVCNTA,#00HMOVCOUNT,#00HMOVTMOD,#01HMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEAWT:JBP2.0,WTMOVR6,#5MOVR7,#248DI:DJNZR7,$DJNZR6,D1JBP2.0,WTINCCOUNTMOVA,COUNTCJNEA,#03H,NEXTMOVCOUNT,#00HNEXT:JNBP2.0,$SJMPWTTOX:NOPMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,#TABMOVA,CNTAMOVCA,@A+DPTRMOVP3,AMOVDPTR,#GRAPHMOVA,COUNTMOVB,#8MULABADDA,CNTAMOVCA,@A+DPTRMOVPl,A 149INCCNTAMOVA,CNTACJNEA,#8,NEXMOVCNTA,#00HNEX:RETITAB:DBOFEH,OFDH,OFBH,OF7H,OEFH,ODFH,OBFH,O7FHGRAPH:DB12H,14H,3CH,48H,3CH,14H,12H,OOHDBOOH,OOH,38H,44H,44H,44H,38H,OOHDB30H,48H,44H,22H,44H,48H,30H,OOHEND5.C语言源程序#include 150count++;if(count==3)(count=0;)while(P2_0==0);voidtO(void)interrupt1using0(TH0=(65536-4000)/256;TL0=(65536-4000)%256;P3=**ta];Pl=graph[count][cnta];cnta++;if(cnta==8)(cnta=0;})27.ADC0809A/D转换器基本应用技术1.基本知识ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。(1).ADC0809的内部逻辑结构 1511IN3IN2IN4IN1IN5nsroIN6AIN7BSTCEOCALED307OED6CLKD5VCCD4VREF4-DOGNDVREF-DID2282273264255246237228219201O191118121713161415moINIIN2IN3IN4IN5IN6IN7BCALEEOC由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当0E端为高电平时,才可以从三态输出锁存器取走转换完的数据。(1).引脚结构INO-IN7:8条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是0—5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通INO—IN7上的一路模拟量输入。通道选择表如下表所示。cBA选择的通道000INO001INI010IN2011IN3100l\l101IN5110IN6 152111IN7数字量输出及控制线:11条ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。0E为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;0E=0,输出数据线呈高阻状态。D7—DO为数字量输出线。CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(+),VREF(-)为参考电压输入。2.ADC0809应用说明(1).ADC0809内部带有输出锁存器,可以与AT89s51单片机直接相连。(2).初始化时,使ST和0E信号全为低电平。(3).送要转换的哪一通道的地址到A,B,C端口上。(4).在ST端给出一个至少有100ns宽的正脉冲信号。(5).是否转换完毕,我们根据EOC信号来判断。(6).当EOC变为高电平时,这时给0E为高电平,转换的数据就输出给单片机了。3.实验任务如下图所示,从ADC0809的通道IN3输入0—5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809的VREF接+5V电压。4.电路原理图 153ore卜47K■jvccWJCiA012346«£5432I0多gIsr_S4ottuEmEE一.■'”;sszbEmEE・44FCtcsl图1.27.15.系统板上硬件连线(1).把“单片机系统板”区域中的P1端口的P1.0-PL7用8芯排线连接到“动态数码显示"区域中的ABCDEFGH端口上,作为数码管的笔段驱动。(2).把“单片机系统板”区域中的P2端口的P2.0-P2.7用8芯排线连接到“动态数码显示"区域中的SIS2S3S4S5S6S7S8端口上,作为数码管的位段选择。(3).把“单片机系统板”区域中的P0端口的PO.0—P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端口上,A/D转换完毕的数据输入到单片机的P0端口(4).把“模数转换模块”区域中的VREF端子用导线连接到“电源模块”区域中的VCC端子上;(5).把“模数转换模块”区域中的A2A1A0端子用导线连接到“单片机系统”区域中的P3.4P3.5P3.6端子上;(6).把“模数转换模块”区域中的ST端子用导线连接到“单片机系统”区域中的P3.0端子上; 154(1).把“模数转换模块”区域中的0E端子用导线连接到“单片机系统”区域中的P3.1端子上;(2).把“模数转换模块”区域中的EOC端子用导线连接到“单片机系统”区域中的P3.2端子上;(3).把“模数转换模块”区域中的CLK端子用导线连接到“分频模块”区域中的/4端子上;(4).把“分频模块”区域中的CKIN端子用导线连接到“单片机系统”区域中的ALE端子上;(5).把“模数转换模块”区域中的IN3端子用导线连接到“三路可调压模块”区域中的VR1端子上;5.程序设计内容(1).进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。(2).进行A/D转换之前,要启动转换的方法:ABC=U0选择第三通道ST=0,ST=1,ST=0产生启动转换的正脉冲信号6.汇编源程序CHEQU30HDPCNTEQU31HDPBUFEQU33HGDATAEQU32HSTBITP3.00EBITP3.1EOCBITP3.2ORGOOHLJMPSTARTORGOBHLJMPTOXORG30HSTART:MOVCH,#OBCHMOVDPCNT,#00HMOVR1,#DPCNTMOVR7,#5 155MOVA,#10MOVRO,#DPBUFLOP:MOV©RO,AINCRODJNZR7,LOPMOV@R0,#00HINCROMOV@R0,#00HINCROMOV@R0,#00HMOVTMOD,#01HMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEAWT:CLRSTSETBSTCLRSTWAIT:JNBEOC,WAITSETBOEMOVGDATA,POCLROEMOVA,GDATAMOVB,#100DIVABMOV33H,AMOVA,BMOVB,#10DIVABMOV34H,AMOV35H,BSJMPWTTOX:NOPMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,#DPCDMOVA,DPCNTADDA,#DPBUFMOVRO,AMOVA,@R0 156MOVCA,@A+DPTRMOVPl,AMOVDPTR,#DPBT 157MOVA,DPCNTMOVCA,@A+DPTRMOVP2,AINCDPCNTMOVA,DPCNTCJNEA,#8,NEXTMOVDPCNT,#OOHNEXT:RETIDPCD:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,O7H,7FH,6FH,OOHDPBT:DBOFEH,OFDH,OFBH,OF7HDBOEFH,ODFH,OBFH,O7FHEND5.C语言源程序#include 158ST=O;while(EOC==O);OE=1;getdata=PO;0E=0;dispbuf[2]=getdata/100;getdata=getdata%10;dispbuf[l]=getdata/10;dispbuf[0]=getdata%10;voidtO(void)interrupt1using0(TH0=(65536-4000)/256;TL0=(65536-4000)%256;Pl=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount==8){dispcount=0;))28.数字电压表1.实验任务利用单片机AT89S51与ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。2.电路原理图 159IN3IN2INIINSINOIN6AIN7BSTCEOCALED3D7OED6CLKD5VCCD4VREF*DOGHDVREF.DID2P3O/RXDP31/TXDP3而丽0123456.7ptplplplplplplplD3EOC12CLK13后8APOO/ADOPO1/AD1P02/AD2P03/AD3P04/AD4P05/AD5PO&AD6P07/AD7ALEP^NP27/A15P26/A14P25/A13P24/A12P23/AUP2.2/A10P21/A9P20/A8P34/T0P35fTlP36^P37/RDSI:apdeHHmmba$3fjs4至W色frrs图1.28.11.系统板上硬件连线a)把“单片机系统”区域中的PLO—PL7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。b)把“单片机系统”区域中的P2.0—P2.7与“动态数码显示"区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的0E端子用导线相连接。e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。 160f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。g)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。h)把“模数转换模块”区域中的INO端子用导线连接到“三路可调电压模块”区域中的VR1端子上。i)把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。1.程序设计内容i.由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。ii.由于ADC0809的参考电压VREF=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值(D/256*VREF)2.汇编源程序(略)3.C语言源程序#include 161ST=O;OE=0;ETO=1;ET1=1;EA=1;TM0D=0xl2;TH0=216;TL0=216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TR0=l;ST=1;ST=0;while(l){if(EOC==l){OE=1;getdata=P0;OE=0;tenip=getdata*235;temp=temp/128;i=5;dispbuf[0]=10;dispbuf[l]=10;dispbuf[2]=10;dispbuf[3]=10;dispbuf[4]=10;dispbuf[5]=0;dispbuf[6]=0;dispbuf[7]=0;while(temp/10){dispbuf[i]=temp%10;temp=temp/10;i++;)dispbuf[i]=temp;ST=1;ST=0;) 162voidtO(void)interrupt1using0(CLK=~CLK;}voidtl(void)interrupt3using0(TH1=(65536-4000)/256;TL1=(65536-4000)%256;Pl=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];if(dispcount==7)(P1=P1|0x80;)dispcount++;if(dispcount==8)(dispcount=0;29.两点间温度控制1.实验任务用可调电阻调节电压值作为模拟温度的输入量,当温度低于30C时,发出长嘀报警声和光报警,当温度高于60℃时,发出短嘀报警声和光报警。测量的温度范围在0—99℃。2.电路原理图 163KEfl■kGNDL1D8网8)VOUIGAINGAINBYPASgGNDn20Ol^FC7ii12D1TiTitIT*6MFD7\温0GHDDIVKEFD2b£2s£a部P3J0/LXDP31/TXDP33而ITP34/T0P3.J/W.P3.7AD工]G『10*C3Ht-Lojo+t^fFVJOZKIJOP01/RD1P02/KD2P03/MBP0.4ZKIMP0JZKD5PO.C/KDCP0.7/XD7P2.7/M5P2.4/M4P2J/M3P2gm2P23mlP2JZK10P21/K9P2J0/X8g38572£3T5F5T5F亘亘至27更亘}T2727a"DO亘巨EGdTD7ALI图4.29.11.系统板上硬件连线a)把“单片机系统”区域中的P1.0—P1.7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。b)把“单片机系统”区域中的P2.0—P2.7与“动态数码显示"区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。 164d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的0E端子用导线相连接。e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。g)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。h)把“模数转换模块”区域中的INO端子用导线连接到“三路可调电压模块”区域中的VR1端子上。i)把“单片机系统”区域中的PO.O—P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。j)把“单片机系统”区域中的P3.6、P3.7用导线分别连接到“八路发光二极管指示模块”区域中的LI、L2上。k)把“单片机系统”区域中的P3.5用导线连接到“音频放大模块”区域中的SPKIN端口上。1)把“音频放大模块“区域中的SPKOUT插入音频喇叭。1.汇编源程序(略)2.C语言源程序#include 165sbitLED1=P3*6;sbitLED2=P3";sbitSPK=P35bitlowflag;bithighflag;unsigned**ta;unsigned**tb;bitalarmflag;voidmain(void)(ST=0;0E=0;TM0D=0xl2;TH0=0x216;TL0=0x216;TH1=(65536-500)/256;TL1=(65536-500)%256;TR1=1;TRO=1;ETO=1;ET1=1;EA=1;ST=1;ST=0;while(l)(if((lowflag==l)&&(highflag==0))(LED1=O;LED2=1;)elseif((highflag==l)&&(lowflag==0))(LED1=1;LED2=0;)else(LED1=1;LED2=1; 166voidtO(void)interrupt1using0(CLK—CLK;voidtl(void)interrupt3using0TH1=(65536-500)/256;TL1=(65536-500)%256;if(EOC==l)(OE=1;getdata=P0;0E=0;temp=getdata*25;temp=temp/64;i=6;dispbuf[0]=10;dispbuf[l]=10;dispbuf[2]=10;dispbuf[3]=10;dispbuf[4]=10;dispbuf[5]=10;dispbuf[6]=0;dispbuf[7]=0;while(temp/10)(dispbuf[i]=temp%10;temp=temp/10;i++;)dispbuf[i]=temp;if(getdata<77)(lowflag=l;highflag=0;)elseif(getdata>153)lowflag=0; 167highflag=l;)else(lowflag=0;highflag=O;)ST=1;ST=O;}Pl=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount==8)(dispcount=0;)if((lowflag==l)&&(highflag==0))(cnta++;if(cnta==800)(cnta=0;a1armf1ag=~a1armf1ag;)if(alarmflag==l)(SPK=~SPK;)}elseif((lowflag==0)&&(highflag==l))(cntb++;if(cntb==400)(cntb=0;alarmflag=^a1armf1ag;)if(alarmflag==l){SPK="SPK; 168else(alarmflag=O;cnta=O;cntb=O;))30.四位数数字温度计1.温度传感器AD590基本知识AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V—30V,检测的温度范围为-55℃—+150℃,它有非常好的线性输出性能,温度每增加1℃,其电流增加luA。AD590温度与电流的关系如下表所示摄氏温度AD590电流经10KQ电压0℃**uA**10℃**uA**v20℃**uA**V30℃**uA**V40℃**uA**v50℃**uA**v60℃**uA**V100℃**uA**V 169AD590引脚图1.实验任务利用AD590温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换的结果进行温度值变换之后送入数码管显示。2.电路原理图4.EOC78OE910叫咄GND|~~容IN3IH2IN4INIINSIHOIN6AIH7BSTCEOCALED3D7OED6CLKDSVCCD4VREF*DOGNDVREF-DID2C5C4一C8C3C7SIS4;s3S2b♦d^»cKslLED84s0-1234367PPPPPPPP口GNCl_c2c3c4c5ogc7一C8P3WRXDP31/TXDP324NT0P33/INT1P34/T0P3VT1P36^P3.7而G8>PO.O/ADOP0.1/AD1P0.2/AD2P03/AD3P04/AD4P05/AD5P06/AD6P07/AD7ALEP5BTP27/A15P2MU4P25/AI3P24/AI2P2aHiP22/A10P21/A9P2O/A88一7图4.30.1系统板上硬件连线(1).把“单片机系统”区域中的PL0—PL7与“动态数码显不”区域中的ABCDEFGH端口用8芯排线连接。(2).把“单片机系统”区域中的P2.0-P2.7与“动态数码显示“区域中的SIS2s3s4s5s6s7s8端口用8芯排线连接。 170(1).把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。(2).把“单片机系统”区域中的P3.1与“模数转换模块”区域中的0E端子用导线相连接。(3).把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。(4).把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。(5).把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。(6).把“模数转换模块”区域中的INO端子用导线连接到自制的AD590电路上。(7).把“单片机系统”区域中的PO.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。5.程序设计内容(1).ADC0809的CLK信号由单片机的P3.3管脚提供(2).由于AD590的温度变化范围在-55℃—+150℃之间,经过10KQ之后采样到的电压变化在2.182V-4.232V之间,不超过5V电压所表示的范围,因此参考电压取电源电压VCC,(实测VCC=4.70V)。由此可计算出经过A/D转换之后的摄氏温度显示的数据为:如果(D+2350/128)<2732,则显示的温度值为一(2732-(D*2350/128))如果(D*2350/128)22732,则显示的温度值为+((D*2350/128)-2732)6.汇编源程序(略)7.C语言源程序#include 1710x6d,Ox7d,0x07,0x7f,0x6f,0x00,0x40};unsignedchardispbuf[8]={10,10,10,10,10,10,0,0};unsignedchardispcount;unsignedchargetdata;unsignedlongtemp;unsignedchari;bitsflag;sbitST=P3"0;sbit0E=P3'l;sbitEOC=P3'2;sbitCLK=P3*3;sbitLED1=P3-6;sbitLED2=P3c7;sbitSPK=P3'5;voidmain(void)(ST=0;0E=0;TM0D=0xl2;TH0=0x216;TL0=0x216;TH1=(65536-4000)/256;TL1=(65536-4000)%256;TR1=1;TRO=1;ETO=1;ET1=1;EA=1;ST=1;ST=0;getdata=148;while(l)voidtO(void)interrupt1using0(CLK=~CLK; 172voidtl(void)interrupt3using0TH1=(65536-4000)/256;TL1=(65536-4000)%256;if(EOC==l)(OE=1;getdata=P0;0E=0;temp=(getdata*2350);temp=temp/128;if(temp<2732)(temp=2732-temp;sflag=l;)else(temp=temp-2732;sflag=0;)i=3;dispbuf[0]=10;dispbuf[l]=10;dispbuf[2]=10;if(sflag==l)(dispbuf[7]=11;)else(dispbuf[7]=10;)dispbuf[3]=0;dispbuf[4]=0;dispbuf[5]=0;dispbuf[6]=0;while(temp/10)(dispbuf[i]=temp%10;temp=temp/10; 173i++;}dispbuf[i]=temp;ST=1;ST=O;}P1=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount==8)(dispcount=0;31.6位数显频率计数器1.实验任务利用AT89S51单片机的TO、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。2.电路原理图 174vcc氐8QuE>Pl0POO/ADOPl1POLAD]Pl2PO2/AD2Pl3PO3/AD3Pl4P0.4/AD4Pl-5P03/AD5Pl6PO6/AD6Pl7PO7/AD7ALEKENP30/RXDP27/A15P31/TXDP26/A14P324NT0P25/A13P33/fNTTP24/A12P34/TOP2.3/AUP35/T1P22/A10P36WRP21/A9P37/RDP2.O/A8-g文OC5C4C8C3C7S52345-6C5C4C8C3C7STddpS4jab理lmeddpcGsl图4.31.11.系统板上硬件连线(1).把“单片机系统”区域中的P0.0—P0.7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。(2).把“单片机系统”区域中的P2.0-P2.7与“动态数码显示"区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。(3).把“单片机系统”区域中的P3.4(TO)端子用导线连接到“频率产生器”区域中的WAVE端子上。2.程序设计内容(1).定时/计数器TO和T1的工作方式设置,由图可知,TO是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的TO,最大计数值为fOSC/24,由于fOSC=12MHz,因此:TO的最大计数频率为250KHzo对于频率的概念就是在一秒只数脉冲的个数,即为频率值。 175所以T1工作在定时状态下,每定时1秒中到,就停止TO的计数,而从TO的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。(1).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。1.C语言源程序#include 176i=0;while(x/10)(temp[i]=x%10;x=x/10;i++;)temp[i]=x;for(i=0;i<6;i++)(dispbuf[i]=temp[i];)timecount=0;T0count=0;TH0=0;TL0=0;TRO=1;voidtO(void)interrupt1using0(T0count++;voidtl(void)interrupt3using0(TH1=(65536-4000)/256;TL1=(65536-4000)%256;timecount++;if(timecount==250)(TR0=0;timecount=0;flag=l;)P0=dispcode[dispbuf[dispcount]];P2=dispbit[dispcount];dispcount++;if(dispcount==8)dispcount=0;
此文档下载收益归作者所有