单片机C语言例程

单片机C语言例程

ID:83046083

大小:4.08 MB

页数:200页

时间:2023-09-20

上传者:无敌小子
单片机C语言例程_第1页
单片机C语言例程_第2页
单片机C语言例程_第3页
单片机C语言例程_第4页
单片机C语言例程_第5页
单片机C语言例程_第6页
单片机C语言例程_第7页
单片机C语言例程_第8页
单片机C语言例程_第9页
单片机C语言例程_第10页
资源描述:

《单片机C语言例程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

目录第一章AT89S51单片机实验及实践系统板简介2第二章KeilC软件使用12第三章实验及实践课题1901.闪烁灯1902.模拟开关灯2203.多路开关状态指示2304.广告灯的左移右移2705.广告灯(利用取表方式)2906.报警产生器3207.I/O并行口直接驱动LED显示3408.按键识别方法之一3718.“嘀、嘀、”报警声7919.“叮咚”门铃8320.数字钟(★)8621.拉幕式数码显示技术939923.模拟计算器数字输入及显示11124.8X8LED点阵显示技术11826.£阵式LED简单图形显示技术12813228.数字电压表13829.两点间温度控制14130.四位数数字温度计14631.6位数显频率计数器14932.电子密码锁设计15233.4X4健盘及8位数码管显示构成的电子密码锁15834.带有存储器功能的数字温度计一DS1624技术应用17035.DS18B20数字温度计使用182

1第一章AT89S51单片机实验及实践系统板简介AT89s51单片机实验及实践系统板(以后简介系统板)集成多个硬件资源模块,每个模块各自可以成为独立的单元,也可以相互组合,因此,可以为不同阶层的单片机爱好者及单片机开发者提供不同的开发环境。每个硬件模块介绍如下:1.继电器控制模块系统板上提供了2路继电器控制模块,分布在系统板的最左上端区域中,输入信号由Realyin1和Realyin2端口输入分别控制两路继电器,继电器控制的信号分别由最上端的两个插针输入和输出。分别称为"comlopenlshort1v,“com2open2short2”,由于这个两个继电器是单刀单掷控制,当继电器不吸合时,“coml”和“shortl”相通,“com2”和“short2”相通;当继电器吸合时,“coml”和“openl”相通,“com2"和"open2"相通。其电路原理图1.1所示。GNDGHD图1.12.参考电压源模块在系统板上写有“参考电压源”区域中,是由TL431来完成参考电压的调节,调节范围在0—2.50V之间;主要为是系统板上需要参考电压芯片或是为外部设备提供参考电压,由VarVrefOut端口输出。其电路原理图如图1.2所示。图1.2图1.33.三路可调电压模块此模块主要是用于提供0—5V之间的可变的模拟电压值,即可以作为参考电压源也可以作为模拟电压信号。这三路是相互独立的。分别对应着由VR1,VR2,VR3端口输出。具体的电路原理图如图1.3所/J\O4.电源模块

2电源模块为系统板上其它模块提供+5V电源,电源输入有两种方式,一种为交直流电源从电源插座输入,输入的电压要求,直流输入应大于7.5V,交流输入应大于5V,通过7805三端稳压器得到5V的直流电源供给系统其它模块工作,另一种为从USB接口获取+5V电源,只要用相应配套的USB线从电脑主机获取+5V直流电源,在电源模块中加有保护电路,即电路中有短路,不会对7805三端稳压器及电脑主机电源有损害!其电路原理图如图L4所示。图L41.程序下载模块该模块完成源程序代码下载到AT89s51或者是AT89s52芯片中,它需要和微机上的ISP下载器软件配合使用来完成这样的功能。具体的电路原理图如图1.5所示。Cl11,0592MHzPl.5Pl.4X2XIT□亡―*-C14RSTVCCP3.0/RXP1.7P3.irrxpi.64TTRXC2TXC3SOpF3OpF89"ioGNDP3.2/IT0P1.3・P3.3/TT1PL2\P3.4?TOPl.lzP3.5mP1.0GNDP3.72051C15VCC|111GND104IN4148R454.7KR44VCC22T19可1615U-IETz~~T1"图L52.232电平转换模块232电平转换采用MAX232芯片把TTL电平转换成RS—232电平格式,可以用于单片机与微机通信,以及单片机与单片机之间的通信,在该系统板上提供了两个DB9的接口,其中一个用ISP下载器模块的程序下载接口,称为“ISPInterface”,另一个接口为单片机与其它具有RS232接口的通信端口,称为“CommonPort”。具体的电路原理图如图L6所示。

3J66ISPInlcrfucc附网GNDJ65TXDRXDR21NT2OvccGNDT1ORUNRIOT1INT2INR2O图1.6cVCCC瓦R“]VCC/GND1.频率产生器模块该模块采用555芯片产生一些连续频率的方波信号,由“WAVEGND”端口输出,其稳定可调的频率范围在5KHz—lOOKHz之间变化。电路原理图如图L7所示:VCCTRIGFREQ3CVoh0OluFGNDWAVEGNDgndH1.音频放大模块该音频放大模块采用LM386芯片作为音频的功率放大,音频信号由“SPKIN”端口输入,信号的输出由“SPKOUT”端口输出,只要在“SPKOUT”接一个喇叭即可。具体的电路原理图如图1.8所示:2.模数转换模块系统板上的模数转换模块采用ADC0809芯片,组成8路8位的A/D转换,8路模拟电压的输入由IN0一IN7的端口输入,控制ADC0809芯片工作的控制信号由“CLKOEEOCSTA2AlA0”端口输入,转换的数据从DO—D7的端口输出。具体的电路原理图如图L9所示:

4•|—ISJ3807D60504D3D2DIDO234N-N.N.-l2-,■11A.'I71'13AECD4XADCUM[3AX。214ADCDl17ADTT»OE'■'-A-B.Cd>d>dDodaaa56N-N.IN-7QNDALEVCCre£(E)NABLESTARTreff♦PLOCK

5J24J26abcdcfshJ27abcdcfgh图1.111.8X8点阵模块该系统板上提供了8X8点阵模块,用于理解单片机是如何控制点阵数码管的工作过程,它有两个输入控制端口,对于点阵数码管有行和列之分,这两个端口分别控制它们的行和列,“DR1—DR8”为8X8点阵模块的行信号控制端口,“DC1—DC8”为8X8点阵模块的列信号控制端口。具体的电路原理图如图1.12所示。xS-Stt-jp-sirw-2~arw.F7Ff.r'-r-->1Utf8X8LEDVUUR.13nr二二I>一J18vccKEIKB2KE4KEr,KI”,KB73URRRRRRRR*R1>J2O0123^567BBBD3EBB户KI3工3KB2"AKKK1UKB16KHUI1KRW1与KB7・1uKEUL>K.lOR2金5£,R4]K7阳DR?VDU|>OIK.ONO74LS2451L234L5167L8图1.122.八路发光二极管指示模块该模块采用8个发光二极管作为指示信号作用,即可以用排线来控制,也可以单个地控制每个发光二极管的亮灭,当控制信号为低电平时,发光二极管亮,为高电平时,发光二极熄灭;控制电平的输入由“L1-L8”输入。电路原理图如图1.13o3.三八译码模块在系统板上提供了三八译码模块,控制译码器译码信号由“CBA”端口输入,译出的控制信号由“YO—Y7”输出。电路原理图如图1.14。4.串并转换模块该系统板上采用了四个74LS164(移位寄存器)作为串并转换模块,这四路串并转换模块已经级连起来。串行数据从“RXDTXD”端口输入;具体的电路原理图如图1.15所示。

6图1.13J73CBAU29UF1GZDUF2UF301234567VYVYYYYY123ABCEEE15FF114FF213FF312FF411FF5IOFF69FF77FF8Y05Y2Y3Y4Y5Y6Y77212345678图1.14JUJ29J30J31图1.151.数模转换模块系统板上的数模转换模块采用了8位的D/A转换芯片DAC0832来完成数模转换过程,DAC0832是电流输出型D/A转换芯片,因此,后面接有集成运放LM358来完成电流到电压的转换。其中的数字信号的输入从“DO—D7”端口输入,控制DAC0832工作的控制信号由“WRCS”端口输入,模拟量的输出从“AOU「‘

7端口输出,由于LM358工作在双电源条件下,因此要给LM358加入±12V电压,从“+12VGND-12V”端口加入。具体的电路原理图如图L16所示:图1.161.四路拨动开关模块开关控制信号由“KIK2K3K4”端口输出,具体的电路原理图如图1.17所示:J23图1.172.单片机系统该系统板上的单片机系统把全部的I/O端口资源提供出来,因此,在实际应用的时候,可以灵活地组合成不同的单片机应用系统,该单片机采用12MHz晶振,具体的电路原理图如图1.18所示。3.分频模块该系统板上的分频电路采用2片74LS74来完成最大16分频,输入的时钟信号由“CKIN”端口输入,经过2片74LS74分频后的信号分别由“/I/2/4/8/16”端口输出,分别表示未分频,2分频,4分频,8分频,16分频;具体的电路原理图如图1.19所示

8s§gaiQcCi•4・•4・*

9图1.191.四路单总线模块为了适应新技术的需要,增加l—Wire总线接口,在本系统板上提供了四路l-Wire总线接口,数据传输通过“DQ1DQ2DQ3DQ4”端口来完成;具体的电路原理图如图1.20所示:4HQTJ4D——ONL>图1.202.二线总线模块(re总线)为了适应新技术的需要,增加了2路12c总线接口,适用8脚的12c总线芯片,左边的“PIN1PIN2PIN3PIN4PIN5PIN6”与上面的接口连接,右边的“PIN1PIN2PIN3PIN4PIN5PIN6”与下面的接口连接;具体的电路原理图如图1.21所示:J49PIN1PIN2PIN3PIN4PIN5PIN6PNPIN2PIN3P24PIN5PIN6图1.213.独立式键盘模块键盘是人机通信不可缺少的部件,独立式键盘是最基本的一•种键盘方式,在本系统中提供了四个独立式按键;具体的电路原理图如图L22所示:

10J221.4X4行列式键盘模块行列式键盘也即矩阵式键盘,它由行和列组成,在每个行列的交叉点上放置一个按键,这样4义4行列式键盘共需要16个键盘组成;具体的电路原理图如图1.23所示:图1.232.32KB数据存储器模块为了适应大容量的数据处理的需要,在系统板上加入了32KB数据存储器(RAM),数据总线从“DO一D7”的端口输入,高8位地址总线从“A8—A15”端口输入,控制数据存储器的读写控制信号从“ALECSWRRD”端口输入,具体的电路原理图如图1.24所示:

11J698765A321GNDU27OCCJ71ALECSWRRDRAMDO2RAMD13RAMD24RAMD35RAMD46RAMD57RAMD68RAMD79RAMALE11ID2D3D4D5D6D7D8DIQ2Q3Q4Q5Q6QRAMCS20八RAMWR27P19ADRO10°18ADRI917ADR2816ADR3715ADR4614A:1513二R•-412ADR73C0N874HC578765A321ADR825ADR924ADR1021ADRU23ADR122ADR1326ADR141RAMRD22c>CEQ0>WEQiAOQ2AlQ3A2Q4A3Q5A4Q6A5Q7A6A7A8A9A10AllA12A13A14三11RAMDO12RAMD113RAMD215RAMD316RAMM17RAMD518RAMD6)RAWRAMCSA15A14A13A12Al1A10A9A8图1.24以上是“AT89s51单片机实验及实践系统板”的所有硬件资源简介,通过这24个模块之间的相互组合,可以设计出从基本的单片机系统到复杂的单片机应用控制系统的设计,是初学者对单片机入门和开发不可缺少的过程。ttincludesbitKl=P3^0;sbitLl=PrO;voidmain(void)(while(l)(if(Kl==0)(Ll=0;〃灯亮elseLl=l;〃灯灭

12#includesbitL1=POAO;sbitkl=P3A0;voidmian(void){while(1){if(kl==O)(Ll=0;}else

13{Ll=l;}

14}第二章KeilC软件使用KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。下面介绍KeilC51软件的使用方法进入KeilC51后,屏幕如下图所示。几秒钟后出现编辑界0Y日」幺SOFTWARETPueIntegration『VISION目IDEforMicrocontrollerThisprogramisprotectedbyU.S.andinternationalcopyrightlaws.启动KeilC51时的屏幕进入KeilC51后的编辑界面简单程序的调试学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习KeilC51软件的基本使用方法和基本的调试技巧。1)建立一个新工程单击Project菜单,在弹出的下拉菜单中选中NewProject选项

152)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51如下图所示,然后点击保存.3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.CFVV«n4orD«v»“AT89C52«CS-5IR,Q・“,•「U««K»t«£r»pta«(«BOBIb»««4FullStaticCSQSc«M

16到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项新建文件后屏幕如下图所示此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。6)回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如下菜单■C\mrD0TS33op\C51\Tsll.・SelectDeviceforTarget'Target.1OptioxlmforGroupfSourceGroup1,Op»nFilvOgil.P7©]季…’i_,];Li:-A4dFilasGroup,SourceGroup1[Groups,Fil«sGroup'SoursGroup1*andat'sFil«s

17然后单击“AddFiletoGroup'SourceGroup1'”屏幕如下图所示选中Test.c,然后单击“Add”屏幕好下图所示注意到“SourceGroup1”文件夹中多了一个子项“Textl.c”了吗?子项的多少与所增加的源程序的多少相同7)现在,请输入如下的C语言源程序:#include〃包含文件#includevoidmain(void)〃主函数{SC0N=0x52;TM0D=0x20;THl=0xf3:TR1=1;〃此行及以上3行为PRINTF函数所必须printf(HHelloIamKEIL.

18");〃打印程序执行的信息printf(uIwillbeyourfriend.

19M);

20whiled);)在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keilc51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。程序输入完毕后,如下图所示8)在上图中,单击“Project”菜单,再在下拉菜单中单击“BuiltTarget”选项(或者使用快捷键F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/StopDebugSessionn(或者使用快捷键Ctrl+F5),屏幕如下所示9)调试程序:在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“StopRunning”选项(或者使用快捷键Esc);再单击

21“View”菜单,再在下拉菜单中单击“SerialWindows#1”选项,就可以看到程序运行后的结果,其结果如下图所示至此,我们在KeilC51上做了一个完整工程的全过程。但这只是纯软件的开发过程,如何使用程OptionsforTarget,Target1'序下载器看一看程序运行的结果呢?在下图中,10)单击“Project”菜单,再在下拉菜单中单击“单击“Output”中单击“CreateHEXFile"选项,使程序编译后产生HEX代码,供下载器软件使用。把程序下载到AT89S51单片机中。第三章实验及实践课题01.闪烁灯1.实验任务如图4.1.1所示:在PL0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭

22的时间间隔为0.2秒。1.电路原理图

23ONDlvccooY1o>J口三UN===l2MW-4—ATS9s31Ln.apppppppp图4.1.11.系统板上硬件连线把“单片机系统”区域中的PL0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。2.程序设计内容(1)延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOVR6,#202个2DI:MOVR7,#2482个22+2X248=49820XDJNZR7,$2个2X248(498DJNZR6,DI2个2X20=4010002因此,上面的延时程序时间为10.002mso由以上可知,当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(2)输出控制如图4.LI所示,当PL0端口输出高电平,即PL0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当PL0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETBPL0指令使PL0端口输出高电平,使用CLRPL0指令使PL0端口输出低电平。3.程序框图

24如图4.1.2所示图4.1.2ORG0START:CLRP1.0LCALLDELAYSETBPl.0LCALLDELAYLJMPSTARTDELAY:MOVR5,#20DI:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND6.汇编源程序7.C语言源程序^includesbitLI=P0"0;;延时子程序,延时0.2秒voiddelay02s(void)(unsignedchari,j,k:for(i=20;i>0;i—)for(j=20;j>0;j—)for(k=248;k>0;k—);〃延时0.2秒子程序voidmain(void)

258WONd2VRZd二V/£ZdZMQNd2VKZdwvzZdswczd乙at97VL2F0d9OVQ0d□ov/sodKIVGOdmov/£Odzav#ododoov/oodcVCX2DNLi/5gdosmdLLhn?c*sdPI」日力£OX1HsoxwomdGND图4.2.1L1=O;while(l)L1=O;delay02s();Ll=l;delay02s();02.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。2.电路原理图600r9cpgZivcc""40肯I于lOuFR210K3.系统板上硬件连线(1)把“单片机系统”区域中的PL0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上;(2)把“单片机系统”区域中的P3.0端口用导线连接到“四路拨动开关”区域中的K1端口上;4.程序设计内容(1)开关状态的检测过程对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JBBIT,REL或者是JNBBIT,REL指令来完成对开关状态的检测即可。(2)输出控制如图3所示,当PL0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮:我们可以使用SETBPL0指令使PL0端口输出高电平,使用CLRP1.0指令使PL0端口输出低电平。

261.程序框图图4.2.22.汇编源程序ORG00HSTART:JBP3.0,LIGCLRP1.0SJMPSTARTLIG:SETBP1.0SJMPSTARTEND3.C语言源程序#includesbitK1=P3*O;sbitL1=P10;voidmain(void)(while(l)(if(Kl==0){Ll=0;〃灯亮)else(Ll=l;〃灯灭)03.多路开关状态指示1.实验任务

27如图4.3.1所示,AT89s51单片机的PL0—PL3接四个发光二极管L1-L4,PL4—PL7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)2.电路原理图ZZzzcsiZddddddddL2LsCid90VqOd9IdSuSidKvsDaIdECWGodEldZOVNodZldnod「Idoov、ood0【dc*Trcx囱V-ERX2遑一Sd2承9Ed"EDSGdox/〉GaLUU/CndFN1/ZSdaxuimdaxM/oEdXI图4.3.13.系统板上硬件连线(1)把“单片机系统”区域中的PLO-PL3用导线连接到“八路发光二极管指示模块”区域中的L1-L4端口上;(2)把“单片机系统”区域中的P1.4—P1.7用导线连接到“四路拨动开关”区域中的K1—K4端口上;4.程序设计内容(1)开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JBPl.X,REL或JNBPl.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOVA,Pl指令一次把Pl端口的状态全部读入,然后取高4位的状态来指示。(2)输出控制根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETBP1.X和CLRPLX指令来完成,也可以采用MOVPl,#1111XXXXB方法一次指示。5.程序框图

28I开:)读Pl口数提到Acc(Age内容右移4次)Ac。内容与F0H相或Acc内容送入Pl□图4.3・23.方法一(汇编源程序)ORG00HSTART:MOVA,PlANLA,#OFOHRRARRARRARRAXORA,#OFOHMOVPl,ASJMPSTARTEND4.方法一(C语言源程序)#includeunsignedchartemp;voidmain(void)(while(l)(temp=Pl>>4;temp=temp|OxfO;Pl=temp;))5.方法二(汇编源程序)ORGOOHSTART:JBPl.4,NEXT1CLRP1.0SJMPNEX1NEXT1:SETBPl.0NEX1:JBPl.5.NEXT2CLRPl.1SJMPNEX2NEXT2:SETBPl.1NEX2:JBPl.6.NEXT3CLRPl.2SJMPNEX3NEXT3:SETBPl.2NEX3:JBPl.7,NEXT4CLRPl.3SJMPNEX4NEXT4:SETBPl.3NEX4:SJMPSTARTEND6.方法二(C语言源程序)^includevoidmain(void)(while(l)(if(Pl_4==0)(

29Pl_0=0;)else(}if(Pl5==0)(Pl1=0;)else()if(Pl_6==0){Pl_2=0;)else{Pl_2=l;)if(Pl_7==0)(Pl_3=0;)else(Pl_3=l;

3004.广告灯的左移右移1・实验任务做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1—L8分别接在单片机的PL0-PL7接口上,输出"0"时,发光二极管亮,开始时PLOfPl.l-PL2fpi.3*P1.7-*Pl.6-*—fPLO亮,重复循环。2.电路原理图JOKcoP3.O/RXDP31/TXDP32/fHTOP33/INT1P34/TOP35TT1P36AVRP3.7/RD-VCC3OpF

3111111101L2亮11111011L3亮11110111L4亮11]01111L5亮11011111L6亮10111111L7亮01111111L8亮

322.程序框图如图4.4.2所示3.汇编源程序ORG0START:MOVR2,#8MOVA,#OFEHSETBC图4.4.2LOOP:MOVPl,ALCALLDELAYRLCADJNZR2,LOOPMOVR2,#8LOOP1:MOVPl,ALCALLDELAYRRCADJNZR2,LOOP1LJMPSTARTDELAY:MOVR5,#20DI:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,DIRETEND7.C语言源程序#includeunsignedchari;unsignedchartemp;unsignedchara,b;voiddelay(void)unsignedcharm,n,s;for(m=20;m>0;m--)for(n=20;n>0;n-)for(s=248;s>0;s-);)

33voidmain(void)(while(l)(temp=0xfe;Pl=temp;delay();for(i=l;i<8;i++)(a=temp<>(8-i);Pl=a|b;delay();)for(i=l;i<8;i++){a=temp>>i;b=temp<<(8-i);Pl=a|b;delay();05.广告灯(利用取表方式)1.实验任务利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。2.电路原理图电路如图4.5.1所示。3.系统板上硬件连线Pl.0-P1.7用8芯排线连接到“八路发光二极管指示模块”区域中的L1—L8端口上,要求:P1.0对应着LI,P1.1对应着L2,,P1.7对应着L8。4.程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1)利用MOVDPTR,#DATA16的指令来使数据指针寄存器指到表的开头。(2)利用MOVCA,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用MOVC工,@A+DPTR做取码的操

34作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:(仃问题20050930)开始so—11pP234.S67pppppP5.程序框图数据指针DPTR指到TABLE(衰)的开头根据DPTR到表内取码熟堀蜩最结束码将驱出蒯没摭出至P1格数据指针加1延时0.2秒图4.5.26.汇编源程序0RG0START:MOVDPTR,STABLELOOP:CLRAMOVCA,©A+DPTRCJNEA,#O1H,LOOP1JMPSTARTL00P1:MOVPl,A

35MOVR3,#20LCALLDELAYINCDPTRJMPLOOPDELAY:MOVR4,#20DI:MOVR5,#248DJNZR5,$DJNZR4,DIDJNZR3,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,OFFHDBO1HEND6.C语言源程序ftincludeunsignedcharcodetable[37]={0xfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f,Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f,Ox7f,Oxbf,Oxdf,Oxef,0xf7,Oxfb,Oxfd,Oxfe,0x7f,Oxbf,Oxdf,Oxef,Oxf7,Oxfb,Oxfd,Oxfe,OxOO,Oxff,0x00,Oxff,0x01};unsignedchari;voiddelay(void)(unsignedcharm,n,s;for(m=20;m>0;m-)for(n=20;n>0;n-)for(s=248;s>0;s—);((2*248*1)*20*1)*20voidmain(void)while(l)

36Pl=table[i];i++;delay();)else{i=0;06.报警产生器1.实验任务用Pl.0输出IKHz和500Hz的音频信号驱动扬声器,作报警信号,要求IKHz信号响100ms,500Hz信号响200ms,交替进行,PL7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2.电路原理图二:,X2nEd盲9EdE£营GaUNUESollnuzndQKC-£o茗0sS3rd6VHzd2WZZd二WEZdZMIdGMSZd*S9snU11YL2RssSOWsOd『ovaOdZOVNs-ov=odoov'oscVC3.系统板上硬件连线(1)把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2)在“音频放大模块”区域中的SPKOUT端口上接上一个8欧的或者是16欧的喇叭;(3)把“单片机系统”区域中的PL7/RD端口用导线连接到“四路拨动开关”区域中的K1端口上;4.程序设计内容(有问题20050930)

37500Hz信号周期为2ms,信号电平为每1ms变反1次,IKHz的信号周期为1ms,信号电平每500us变反1次;1.程序框图图4.6.2START:DV:NEXT:DVI:2.汇编源程序FLAGBITOOHORGOOHJBPl.7,STARTJNBFLAG,NEXTMOVR2,#200CPLPl.0LCALLDELY500LCALLDELY500DJNZR2,DVCPLFLAGMOVR2,#200CPLP1.0LCALLDELY500DJNZR2,DVICPLFLAGSJMPSTARTDELY500:MOVR7,#250LOOP:NOPDJNZR7,LOOPRETEND3.C语言源程序Sinclude#includebitflag;unsignedcharcount;voiddely500(void)(unsignedchari;for(i=250;i>0;i--)(_nop_();voidmain(void)

38(while(l)(if(Pl_7==O){for(count=200;count>0;count―)(P1_O='P1_O;dely500();)for(count=200;count>0;count—)(Pl_0=>l_0;dely500();dely500();07.I/O并行□直接驱动LED显示1.实验任务如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0—9数字,时间间隔0.2秒。2.电路原理图电路如图4.7.1所示。3.系统板上硬件连线把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:P0.O/ADO与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,,P0.7/AD7与h相连。4.程序设计内容

39(1)LED数码显示原理七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。lOuF67P30/RXDP31/TXDP32/fNTOP33/INTTP3.4/T0P3.5/T1P3.6/WRP37/RD*£P1.0Pl1Pl2Pl3Pl4Pl5Pl6Pl.78APO.O/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4P0.5/AD5PO6/AD6PO7/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P2.3/AUP2.2/A10P2.1/A9P20/A8AT89s51ooGND丫16T口匚:12MH

40图4.7.21.汇编源程序ORG0START:MOVR1,#OOHNEXT:MOVA,RIMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,ALCALLDELAYINCRICJNERI,#10,NEXTLJMPSTARTDELAY:MOVR5,#20D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND2.C语言源程序#includeunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardispeount;voiddelay02s(void)(unsignedchari,j,k;for(i=20;i>0;i—)for(j=20;j>0;j—)for(k=248;k>0;k-);

41voidmain(void)while(l)(for(dispcount=0;dispcount<10;dispcount++)(P0=table[dispcount];delay02s();08.按键识别方法之一1.实验任务每按下一次开关SP1,计数值加1,通过AT89s51单片机的P1端口的PL0到PL3显示出其的二进制计数值。2.电路原理图vcc|-VCC卜VCC卜VCC卜P3CVRXDP31/TXDP32/INTOP33/INT1P34/TOP35/T1P3.6/^EP37/RD毋PloC2--12MH3OpFooPl.3Pl4Pl58APOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO.5/AD5PO6/ADtfPO7/AD7ALEPSENP27/A15P26/A14P2.5/A13P24/A12P23/A11P22/A10P21/A9P2O/A8GND图4.8.13.系统板上硬件连线(1)把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2)把“单片机系统”区域中的P1.0-PL3端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,PL0连接到LI,PL1连接到L2,PL2连接到L3,PL3连接到L4上。4.程序设计方法(1)其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦

42有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图4.8.2所示。从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。干扰信联〕^J4msS]5«s之间1图4.8.2(2)对于按键识别的指令,我们依然选择如下指令JBBIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。或者是JNBBIT,REL指令是用来检测BIT是否为低电平,若BIT=O,则程序转向REL处执行程序,否则就继续向下执行程序。(3)但对程序设计过程中按键识别过程的框图如右图所示。图4.8.31.程序框图

43图4.8.46.汇编源程序ORG0START:MOVR1,#OOH;初始化R7为0,表示从0开始计数MOVA,RIfCPLA;取反指令MOVPl,A;送出P1端口由发光二极管显示REL:JNBP3.7,REL;判断SP1是否按下LCALLDELAY1OMS;若按下,则延时10ms左右JNBP3.7,REL;再判断SP1是否真得按下INCR7;若真得按下,则进行按键处理,使MOVA,R7;计数内容加1,并送出P1端口由CPLA;发光二极管显示MOVPl,AJNBP3.7,$;等待SP1释放SJMPREL;继续对K1按键扫描DELAY1OMS:MOVR6,#20;延时10ms子程序LI:MOVR7,#248DJNZR7,$DJNZR6,L1RETEND7.C语言源程序Sincludeunsignedcharcount;voiddelaylOms(void)unsignedchari,j;for(i=20;i>0;i—)for(j=248;j>0;j—);voidmain(void)

44{while(l)(if(P3_7==0){delay10ms();if(P3_7==0){count++;if(count==16)(count=0;)Pl=~count;〃count二进制数值取反赋给Plwhile(P37—0);09.一键多功能按键识别技术1.实验任务如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89s51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在PL1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在PL2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在PL3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。2.电路原理图

45Q12.3,4567PPPPPPPPCND图4.9.11.系统板上硬件连线(1)把“单片机系统”区域中的P3.7/RD端口连接到“独立式键盘”区域中的SP1端口上;(2)把“单片机系统”区域中的PL0—P1.3端口用8芯排线连接到“八路发光二极管指示模块”区域中的“L1-L8”端口上;要求,PLO连接到LI,P1.1连接到L2,PL2连接到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.程序框图

46图4.9.26.汇编源程序IDEQU30HSP1BITP3.7LIBITP1.0L2BITPl.1L3BITPl.2L4BITPl.3ORG0MOVID,#00HSTART:JBKI,RELLCALLDELAY1OMSJBKI,RELINCIDMOVA,IDCJNEA,#04,RELMOVID,#00HREL:JNBKl,$MOVA,IDCJNEA,#00H,ISOCPLLILCALLDELAYSJMPSTARTISO:CJNEA,#01H,IS1CPLL2LCALLDELAYSJMPSTARTIS1:CJNEA,#02H,IS2CPLL3LCALLDELAYSJMPSTARTIS2:CJNEA,#03H,IS3CPLL4LCALLDELAYSJMPSTARTIS3:LJMPSTARTDELAY10MS:MOVR6,#20

47L00P1:MOVR7,#248DJNZR7,$DJNZR6,L00P1RETDELAY:L00P2:MOVR5,#20LCALLDELAY10MSDJNZR5,L00P2RETEND7.C语言源程序ttincludeunsignedcharID;voiddelaylOms(void)(unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j—);)voiddelay02s(void){unsignedchari;for(i=20;i>0;i-){delaylOms();))voidmain(void){while(l)if(P3_7==0)delaylOms();if(P3_7==0)ID++;if(ID==4)(ID-0;)while(P3_7==0);1Jswitch(ID){case0:Pl_0="Pl_0;delay02s();break;case1:P1_1="P1_1;delay02s();break;case2:P1_2=>1_2;delay02s();break;case3:P1_3=>1_3;

48delay02s();break;10.00-99计数器1.实验任务利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0—P2.7接一个共阴数码管,作为00—99计数的个位数显示,用单片机的P0.0—P0.7接一个共阴数码管,作为00—99计数的十位数显示;硬件电路图如图19所示。2.电路原理图电路如图4.10.1所示。3.系统板上硬件连线(1)把“单片机系统”区域中的P0.0/AD0—P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。(2)把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a—h端口上;(3)把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;4.程序设计内容(1)单片机对按键的识别的过程处理(2)单片机对正确识别的按键进行计数,计数满时,又从零开始计数;

49(3)单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了。(4)通过查表方式,分别显示出个位和十位数字。P304UCDP)l/TXDP3疝丽P3jmP0WAD0PO1/AD1PO2/AD2P03ZAD3P04/AD4P0WAD5F06/AMP07/A£>7ALgpsn

50MOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVCA,©A+DPTRMOVP2,AWT:JNBSP1,WTWAIT:JBSPl.WAITLCALLDELY1OMSJBSP1,WAITINCCountMOVA,CountCJNEA,#100,NEXTLJMPSTARTDELY10MS:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,DIRETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序#includeunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharCount;voiddelaylOms(void)(unsignedchari,j;for(i=20;i>0;i-)for(j=248;j>O;j");voidmain(void)(Count=0;P0=table[Count/10];P2=table[Count%10];while(l)(if(P3_7==0)(delaylOms();if(P3_7==0)

51Count++;if(Count==100)Count=0;)P0=table[Count/10];P2=table[Count%10];while(P3_7==0);11.00—59秒计时器(利用软件延时)1.实验任务如下图所示,在AT89s51单片机的P0和P2端口分别接有两个共阴数码管,P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。2.电路原理图gP1OPl1P1JPl3PI4P】,Pl-6Pl7paomxDP3l/TXDP32AMT0P334NTTP34/TOP35fTIP36AVKP37/RDts8APOO/ADOPO1/AD1P0.2TAD2PO3/AD3PO4/AP4P05/ADSP06/AD6PO7/AD7P27/AISP26/A14P2S/A13P24/A12P23/A11P22/AIOP21/A9P20/A8GHD图4.11.13.系统板上硬件连线(1)把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a—h端口上;要求:模.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.程序设计内容(1)在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,从新秒计数。

52(2)对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。(3)在数码上显示,仍通过查表的方式完成。(4)一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。DELY1S:MOVR5,#100D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RET1.程序框图图4.11.26.汇编源程序SecondEQU30HORG0START:MOVSecond,#0011NEXT:MOVA,SecondMOVB,#10DIVABMOVDPTR,STABLEMOVCA,©A+DPTRMOVPO,AMOVA,BMOVCA,©A+DPTRMOVP2,ALCALLDELY1SINCSecondMOVA,SecondCJNEA,#60,NEXTLJMPSTART

53DELY1S:MOVR5,#100D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C语言源程序#includeunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharSecond;voiddelayls(void)(unsignedchari,j,k;for(k=100;k>O;k--)for(i=20;i>0;i-)for(j=248;j>0;j-);voidmain(void)(Second=0;P0=tab1e[Second/10];P2=table[Second%10];while(l)(delaylsO;Second++;if(Second==60)(Second=0;P0=table[Second/10];P2=table[Second%10];

5412.可预置可逆4位计数器1.实验任务利用AT89s51单片机的PL0—P1.3接四个发光二极管L1—L4,用来指示当前计数的数据;用P3。0-P3.3作为预置数据的输入端,接四个拨动开关K1-K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示2.电路原理图PI3P14P15P16P1.7P3CVRXDP3.1/TXDP32AKT0P33nNTTP3.4/T0P35/T1P36f^P37/RDGHDOOU1281.01.112ppPK8APOO/ADOPO1/AD1P02/AD2P03/AD3PO4/AD4PO5/AD5P06/AD6P07/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P23/A11P2.2/A10P21/A9P20/A83837363534333230292827262524232221KGND图4.12.13.系统板上硬件连线(1)把“单片机系统”区域中的PLO—P1.3端口用8芯排线连接到“八路发光二极管指示模块”区域中的L1—L4上;要求:PL0对应着LI,PL1对应着L2,P1.2对应着L3,PL3对应着L4;(2)把“单片机系统”区域中的P3.0/RXD,P3.1/TXD,P3.2/INTO,P3.3/INT1用导线连接到“四路拨动开关”区域中的K1—K4上;(3)把“单片机系统”区域中的P3.6/WR,P3.7/RD用导线连接到“独立式键盘”区域中的SP1和SP2上;4.程序设计内容(1)两个独立式按键识别的处理过程;(2)预置初值读取的问题(3)LED输出指示

555.程序框图电路如图4.12.2所示。6.汇编源程序COUNTEQU30HORGOOHSTART:MOVA,P3ANLA,#OFHMOVCOUNT,AMOVPl,ASK2:JBP3.6,SKILCALLDELY1OMSJBP3.6,SKIINCCOUNTMOVA,COUNTCJNEA,#16,NEXTMOVA,P3ANLA,#OFHMOVCOUNT,ANEXT:WAIT:MOVPl,AJNBP3.6,WAITLJMPSK2SKI:JBP3.7,SK2LCALLDELY1OMSJBP3.7,SK2DECCOUNTMOVA,COUNTCJNEA,#OFFH,NEXMOVA,P3ANLA,#OFHMOVCOUNT,ANEX:WAIT2:MOVPl,AJNBP3.7,WAIT2LJMPSK2DELY1OMS:MOVR6,#20MOVR7,#248DI:DJNZR7,$DJNZR6,DIRETEND

56图4.12.27.C语言源程序#includeunsignedcharcurcount;voiddelaylOms(void)(unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j—);voidmain(void)(//把高四位变成零为了满足curcount<=15curcount=P3&OxOf(0x01);Pl=~curcount;while(l)(if(P3_6==0){delaylOms();if(P3_6==0){if(curcount>=15)

57curcount=15;

58elsecurcount++;〃在curcount数值基础上进行加减Pl=~curcount;while(P3_6==0);〃带按键的要加此行if(P3_7==0){delay10ms();if(P3_7==0){if(curcount<=0)(curcount=0;)else(curcount——;)Pl=〜curcount;while(P3_7==0);13.动态数码显示技术1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接

59一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。1.电路原理图

60GOr—9J•'_,二,-4-J,寸「,c-i-•_CMLED2gs9004ss--vccttOKAT89S51OND图4.13.1C3"OND30pFnodgawQodSOVKodKV至odEawmodzawrod-awlodoawodvcc_2XINXGgV/OZddw-zd2WZZd二WEZdnEWK£SW9sSia苣rdX2艮md二KEdOLGgdIltUZfSd01NI/ZcndaxlnndAis1.系统板上硬件连线(1)把“单片机系统”区域中的PO.O/ADO-PO.7/AD7用8芯排线连接到“动态数码显示"区域中的a—h端口上;(2)把“单片机系统”区域中的P2.0/A8—P2.7/A15用8芯排线连接到“动态数码显示"区域中的S1-S8端口上;(3)把“单片机系统”区域中的PL7端口用导线连接到“独立式键盘”区域中的SP1端口上;2.程序设计内容(1)动态扫描方法动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。(2)在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。(3)对于显示的字形码数据我们采用查表方法来完成。3.程序框图

61图4.13.21.汇编源程序ORG00HSTART:JBPl.7.DIR1MOVDPTR,STABLE1SJMPDIRDIRI:MOVDPTR,8TABLE2DIR:MOVRO,#00HMOVR1,#O1HNEXT:MOVA,ROMOVCA,©A+DPTRMOVPO,AMOVA,RIMOVP2,ALCALLDAYINCRORLAMOVRI,ACJNER1,#ODFH,NEXTSJMPSTARTDAY:MOVR6,#4DI:MOVR7,#248DJNZR7,$DJNZR6,DIRETTABLE1:DB06H,5BH,4FH,66H,6DH

62TABLE1:DB78H,79H,38H,38H,3FH

63END7.C语言源程序#includeunsignedcharcodetablel[]={0x06,0x5b,0x4f,0x66,0x6d};//12345unsignedcharcodetable2[]={0x76,0x79,0x38,0x38,0x3f};//HELLOunsignedchari;unsignedchara,b;unsignedchartemp;unsignedcharm,n;voidmain(void)(while(l)(temp=0xfe;for(i=0;i<5;i++){if(Pl_7==l)(P0-tablel[i];}else(P0=table2[i];}P2二temp;temp=0xfe;a=temp<<(i+1);b=temp>>(7-i);temp=a|b;for(m=4;m>0;m--)for(n=248;n>0;n-);〃以下两功能无先后顺序〃实现数码显示〃实现闪烁显示〃延时两毫秒14.4X4矩阵式键盘识别技术1.实验任务如图4.14.2所示,用AT89s51的并行口P1接4X4矩阵键盘,以PL0-P1.3作输入线,以P1.4—PL7作输出线;在数码管上显示每个按键的“0一F”序号。对应的按键的序号排列如图4.14.1所示。

64图4.14.11.硬件电路原理图:"电区一wfsiKtmsI旨因总is3iGWNOirid苟KMsMwts.IdsMwssI0WT8:5图4.14.22.系统板上硬件连线(1)把“单片机系统”区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上:(2)把“单片机系统”区域中的PO.O/ADO—PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:模.O/ADO对应着a,模.1/A区对应着b,,PO.7/AD7对应着h。3.程序设计内容(1)4X4矩阵键盘识别处理(2)每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接V©而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。4.程序框图

65P3=FFH,P3,2=0图4.14.36.汇编源程序KEYBUFEQU30HORGOOHSTART:MOVKEYBUF,#2WAIT:MOVP3,#OFFHCLRP3.4MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1MOVA,P3ANLA,#OFHCJNEA,#OEH,NK1

66MOVKEYBUF,#0LJMPDK1NK1:CJNEA,#ODH,NK2MOVKEYBUF,#1LJMPDK1NK2:CJNEA,#OBH,NK3MOVKEYBUF,#2LJMPDK1NK3:CJNEA,#07H,NK4MOVKEYBUF,#3LJMPDK1NK4:NOPDK1:MOVA,KEYBUFMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,ADK1A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK1ANOKEY1:MOVP3,#OFFHCLRP3.5MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY2LCALLDELY10MSMOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY2MOVA,P3ANLA,#OFHCJNEA,#OEH,NK5MOVKEYBUF,#4LJMPDK2NK5:CJNEA,#ODH,NK6MOVKEYBUF,#5LJMPDK2NK6:CJNEA,#OBH,NK7MOVKEYBUF,#6LJMPDK2NK7:CJNEA,#07H,NK8MOVKEYBUF,#7

67LJMPDK2NK8:NOPDK2:MOVA,KEYBUFMOVDPTR,STABLEMOVCA,©A+DPTRMOVPO,ADK2A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK2AN0KEY2:MOVP3,#OFFHCLRP3.6MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY3LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY3MOVA,P3ANLA,#OFHCJNEA,#OEH,NK9MOVKEYBUF,#8LJMPDK3NK9:CJNEA,#ODH,NK1OMOVKEYBUF,#9LJMPDK3NK10:CJNEA,#OBH,NK11MOVKEYBUF,#10LJMPDK3NK11:CJNEA,#07H,NK12MOVKEYBUF,#11LJMPDK3NK12:NOPDK3:MOVA,KEYBUFMOVDPTR,STABLEMOVCA,@A+DPTRMOVP0,ADK3A:MOVA,P3ANLA,#OFH

68XRLA,#OFHJNZDK3AN0KEY3:MOVP3,#OFFHCLRP3.7MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY4LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY4MOVA,P3ANLA,#OFHCJNEA,#OEH,NK13MOVKEYBUF,#12LJMPDK4NK13:CJNEA,#ODH,NK14MOVKEYBUF,#13LJMPDK4NK14:CJNEA,#0BH,NK15MOVKEYBUF,#14LJMPDK4NK15:CJNEA,#07H,NK16MOVKEYBUF,#15LJMPDK4NK16:DK4:NOPMOVA,KEYBUFMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,ADK4A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK4AN0KEY4:LJMPWAITDELY10MS:MOVR6,#10DI:MOVR7,#248DJNZR7,$DJNZR6,D1RET

69TABLE:DB3FH,06H,5BII,4FH,66H,6DII,7DI1,07HDB7FH,6FH,77H,7CH,39H,5EI1,79H,71HEND7.C语言源程序#includeunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchartemp;unsignedcharkey;unsignedchari,j;voidmain(void)(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;temp=P3;

70P1_O二〜P1_O;PO=table[key];temp=temp&OxOf;while(temp!=0x0f){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;temp=temp&OxOf;switch(temp){caseOxOe:key=4;break;caseOxOd:key=5;break;caseOxOb:key=6;break;case0x07:key=ll;break;)temp=P3;Pl0="P1_O;PO=table[key];temp=temp&OxOf;while(temp!=OxOf)temp=P3;temp=temp&OxOf;}

71}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)(caseOxOe: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!=OxOf)(temp=P3;temp=temp&OxOf;

72P3=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;caseOxOd:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;)temp=P3;P1_O="P1_O;P0=table[key];temp=temp&OxOf;while(temp!=OxOf)(temp=P3;temp=temp&OxOf;)}))15.定时计数器TO作定时应用技术(一)1.实验任务

73用AT89s51单片机的定时/计数器TO产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示1.电路原理图电路如图4.15.1所示。2.系统板上硬件连线(1)把“单片机系统”区域中的PO.O/ADO-PO.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上:要求:PO.O/ADO对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着ho(2)把“单片机系统”区域中的P2.0/A8—P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a—h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,,P2.7/A15对应着hoP03口二PJOmXDP3i/TXDP32AMT0P33dinTP34/TOP35/TIP37/RD8APOO/ADOPO1/AD1P02/AD2P03/AD3P04/AD4P05/AD5P06/AD6PO7/AD7P27/AI5P26/A14P2S/A13P24/A12P23/A11P22/AIOP21/A9P20/A8图4.15.13.程序设计内容AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。因此,我们设定TM0D=00000001B,即TM0D=01H下面我们要给TO定时/计数器的THO,TLO装入预置初值,通过下面的公式可以计算出THO=(216-50000)/256TLO=(2l6-50000)MOD256当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TFO标志位,如果TFO=1表示定时时间已到。4.程序框图电路如图4.15.2所示。5.汇编源程序(查询法)

74SECONDTCOUNTSTART:EQU30HEQU31HORGOOHMOVSECOND,#OOHMOVTCOUNT,#OOHMOVTMOD,#O1HMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256SETBTRO图4.15.2DISP:WAIT:MOVA,SECONDMOVB,#10DIVABMOVDPTR,STABLEMOVCA,©A+DPTRMOVPO,AMOVA,BMOVCA,@A+DPTRMOVP2,AJNBTFO,WAITCLRTFOMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256INCTCOUNT

75MOVA,TCOUNTCJNEA,#20,NEXTMOVTCOUNT,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXMOVSECOND,#00HNEX:LJMPDISPNEXT:LJMPWAITTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND1.C语言源程序(查询法)ftincludeunsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00);unsignedcharsecond;unsignedchartcount;voidmain(void)(TM0D=0x01;THO=(65536-50000)/256;TLO=(65536-50000)%256;TRO=1;tcount=0;second=0;P0=dispcode[second/10];P2=dispcode[second%10];while(l)(if(TF0==l)(tcount++;if(tcount==20){tcount=0;second++;if(second==60)(second=0;)PO=dispcode[second/10];

76P2=dispcode[second%10];TF0=0;

77THO=(65536-50000)/256;TL0=(65536-50000)%256;)8.汇编源程序(中断法)SECONDTCOUNTEQU30HEQU31HORGOOHLJMPSTARTORGOBHLJMPINTOXSTART:MOVSECOND,#00HMOVA,SECONDMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVCA,@A+DPTRMOVP2,AMOVTCOUNT,#00HMOVTMOD,#01HMOVTHO,#(65536-50000)/256MOVTLO,#(65536-50000)MOD256SETBTROSETBETOSETBEASJMP$INTOX:MOVTHO,tt(65536-50000)/256MOVTLO,tt(65536-50000)MOD256INCTCOUNTMOVA,TCOUNTCJNEA,#20,NEXTMOVTCOUNT,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXMOVSECOND,#00HNEX:MOVA,SECONDMOVB,#10DIVABMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,A

78MOVA,BMOVCA,©A+DPTRMOVP2,ANEXT:TABLE:RETIDB3FH,0611,5BH,4FH,66H,6DI1,7DII,07H,7FH,6FHEND9.C语言源程序(中断法)#includeunsignedcharcodedispeode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedcharsecond;unsignedchartcount;voidmain(void)TM0D=0x01;THO-(65536-50000)/256;TLO=(65536-50000)%256;TRO=1;ETO=1;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;P0=dispcode[second/10];P2=dispeode[second%10];THO-(65536-50000)/256;

79TLO=(65536-50000)%256;16.定时计数器TO作定时应用技术(二)1.实验任务用AT89s51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。0.2秒的闪烁速率也由定时/计数器T0来完成。2.电路原理图GNDVCCTPl4Pl.5Pl.6Pl.7P3O/RXDP31/TXDP32/INTOP33/IHT1P3.4/T0P3,5/TlP3.6AVRP3.7/RD36353433gPl.O3OpFOAPOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO5/AD5PO.6/AD6PO7/AD7ALEPSENP2.7/A15P26/A14P2S/A13P24/A12P2.3/A11P2.2/A10P21/A9P2O/A8*:C33OpFGND图4.16.13.系统板硬件连线把“单片机系统”区域中的P1.0—P1.3用导线连接到“八路发光二极管指示模块”区域中的L1-L4±

80(有问题否20050930)1.程序设计内容(1)由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器T0来说,中断入口地址为OOOBH,因此在中断入口地方加入长跳转指令来执行中断服务程序。书写汇编源程序格式如下所示:ORG00HLJMPSTARTORGOBH;定时/计数器TO中断入口地址LJMPINT_TO

81START:NOP;主程序开始INT_TO:PUSHACC;定时/计数器TO中断服务程序PUSHPSWPOPPSWPOPACCRETI;中断服务程序返回END(2)定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50nls产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。对于中断程序,在主程序中要对中断开中断。(3)由于每次2秒定时到时,L1-L4要交替闪烁。采用ID来号来识别。当ID=0时,L1在闪烁,当ID=1时,L2在闪烁;当ID=2时,L3在闪烁;当ID=3时,L4在闪烁5.程序框图T0中断服务程序框图:生程序框图6.汇编源程序图4.16.2

82TC0UNT2SEQU30HTCNT02SEQU31HIDEQU32HORGOOHLJMPSTARTORGOBHLJMPINT_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,SID1CPLP1.0SJMPDONESID1:CJNEA,#01H,SID2CPLPl.1SJMPDONESID2:CJNEA,#02H,SID3CPLPl.2SJMPDONES1D3:CJNEA,#03H,SID4CPLPl.3SID4:SJMPDONEDONE:RETIEND7.C语言源程序

83#includeunsignedchartcount2s;unsignedchartcount02s;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:P1_O="P1_O;break;case1:P1_1="P1_1;break;case2:Pl_2=〜Pl_2;break;case3:P1_3=_P1_3;

84break;17.99秒马表设计1.实验任务(1)开始时,显示“00”,第1次按下SP1后就开始计时。(2)第2次按SP1后,计时停止。(3)第3次按SP1后,计时归零。2.电路原理图PI0Pl1P12P13P14P15P16PI7P30/RXDP31/TXDP321S7JP33/WTIP34/T0P35fTlP36速P37/RDVCCP01/ADIP02/AD2P0WAD3PO4/AD4PO5/AD5P06/AD6PO7/AD7ALEPSINP27/A15P2.6/A14P2S/A13P24/A12P23/AIIP2.2/A10P21/A9P20U88>P0Q/AD09窗窗盖S修11®39302928O趣自8X£图4.17.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对应着ho(3)把“单片机系统“区域中的P3.5/T1用导线连接到"独立式键盘”区域中的SP1端口上;4.程序框图TO中断服务程序框图

85图4.17.25.汇编源程序TCNTAEQU30HTCNTBEQU31HSECEQU32HKEYCNTEQU33HSP1BITP3.5ORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVKEYCNT,#00HMOVSEC,#OOHMOVA,SECMOVB,#10DIVABMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,STABLEMOVCA,@A+DPTRMOVP2,AMOVTMOD,#02HSETBETOSETBEAWT:JBSP1,WTLCALLDELY1OMSJBSP1,WTINCKEYCNTMOVA,KEYCNTCJNEA,#O1H,KN1SETBTROMOVTHO,#06HMOVTLO,#06HMOVTCNTA,#OOHMOVTCNTB,#OOHLJMPDKNKN1:CJNEA,#02H,KN2CLRTROLJMPDKNKN2:CJNEA,#03H,DKNMOVSEC,#OOHMOVA,SECMOVB,#1ODIVABMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,STABLEMOVCA,@A+DPTRMOVP2,AMOVKEYCNT,#OOHDKN:JNBSP1,$LJMPWTDELY1OMS:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETINT_TO:INCTCNTAMOVA,TCNTACJNEA,#100,NEXTMOVTCNTA,#00HINCTCNTBMOVA,TCNTBCJNEA,#4,NEXTMOVTCNTB,#00H

86INCSECMOVA,SECCJNEA,#100,DONEMOVSEC,#00HDONE:MOVA,SECMOVB,#10DIVABMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,BMOVDPTR,STABLEMOVCA,@A+DPTRMOVP2,ANEXT:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,O7H,7FH,6FHEND6.C语言源程序Sincludeunsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00);unsignedcharsecond;unsignedcharkeyent;unsignedinttent;voidmain(void)(unsignedchari,j;TM0D=0x02;ETO=1;EA=1;second=0;P0=dispcodeLsecond/10];P2=dispcode[second%10];while(l)(if(P3_5==0){for(i=20;i>0;i―)for(j=248;j>0;j—);if(P3_5==0){keycnt++;switch(keyent)

87(case1:TH0=0x06;?TL0=0x06;TRO-1;break;case2:TRO=O;break;case3:keycnt=O;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];P2=dispcode[second%10];})18.“嘀、嘀、”报警声1.实验任务用AT89s51单片机产生“嘀、嘀、…”报警声从PL0端口输出,产生频率为IKHz,根据上面图可知:1KHZ方波从P1.0输出0.2秒,接着0.2秒从P1.0输出电平信号,如此循环下去,就形成我们所需的报警声了。2.电路原理图

88一EAsvxrd二WUd2WEd□w5£ndnL2LOdgowod»AavKodKIWxrodeovRod一aw-odoav/oodvoc一ESEdEMdImEdolHEEd一.:・「QisDN图4.18.11.系统板硬件连线(1)把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上。(2)在“音频放大模块”区域中的SPKOUT端口上接上一个8欧或者是16欧的喇叭;2.程序设计方法(1)生活中我们常常听到各种各样的报警声,例如“嘀、嘀、…”就是常见的一种声音报警声,但对于这种报警声,嘀0.2秒钟,然后断0.2秒钟,如此循环下去,假设嘀声的频率为IKHz,则报警声时序图如卜图所不:1KHZ波形电平信号上述波形信号如何用单片机来产生呢?(2)由于要产生上面的信号,我们把上面的信号分成两部分,一部分为1KHZ方波,占用时间为0.2秒;另一部分为电平,也是占用0.2秒;因此,我们利用单片机的定时/计数器T0作为定时,可以定时0.2秒;同时,也要用单片机产生1KHZ的方波,对于1KHZ的方波信号周期为1ms,高电平占用0.5ms,低电平占用0.5ms,因此也采用定时器TO来完成0.5ms的定时;最后,可以选定定时/计数器T0的定时时间为0.5ms,而要定时0.2秒则是0.5ms的400倍,也就是说以0.5ms定时400次就达到0.2秒的定时时间了。3.程序框图主程序框图

89中断服务程序框图图4.18.21.汇编源程序T02SAEQU30HT02SBEQU31HFLAGBITOOHORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVT02SA,#00HMOVT02SB,#00HCLRFLAGMOVTMOD,#01HMOVTHO,#(65536-500)/256MOVTLO,#(65536-500)MOD256SETBTROSETBETO

90SETBEASJMP$INT_TO:MOVTHO,#(65536-500)/256MOVTLO,#(65536-500)MOD256INCT02SAMOVA,T02SACJNEA,#100,NEXTINCT02SBMOVA,T02SBCJNEA,#04H,NEXTMOVT02SA,#00HMOVT02SB,#00HCPLFLAGNEXT:JBFLAG,DONECPLP1.0DONE:RETIEND1.C语言源程序#includeunsignedintt02s;unsignedchart05ms;bitflag;voidmain(void)(TM0D=0x01;TH0=(65536-500)/256;TLO=(65536-500)%256:TRO=1;ETO=1;EA=1;while(l);voidtO(void)interrupt1using0(THO-(65536-500)/256:〃为什么此处一定要加???TLO=(65536-500)%256;t02s++;if(t02s==400)(tO2s=0;

91flag=~flag;)if(flag==0)

92P1_O=P1_O;19.“叮咚”门铃1.实验任务当按下开关SPl,AT89s51单片机产生“叮咚”声从PL0端口输出到LM386,经过放大之后送入喇叭。2.电路原理图skhk小卜卜性卜什卜\\TNDX1Gi£6W二dOWRZd二VKZdKd二VKZdHvzzd二VMZdenodsov/ssKIWI-OdgovKod一GWod0270Odvcc_隹Ed氏Edis-1N_KCdgigaxl/-£023£4阵阵阵SP1oo|:nirvcc卜产10K图4.19.13.系统板上硬件连线(1)把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2)在“音频放大模块”区域中的SPKOUT端口上接上一个8欧或者是16欧的喇叭;(3)把“单片机系统”区域中的P3.7/RD端口用导线连接到“独立式键盘”区域中的SP1端口上;4.程序设计方法(1)我们用单片机的定时/计数器TO来产生700Hz和500Hz的频率,根据定时/计数器T0,我们取定时250us,因此,700Hz的频率要经过3次250us的定时,而500Hz的频率要经过4次250us的定时。(2)在设计过程,只有当按下SP1之后,才启动T0开始工作,当T0工作完毕,回到最初状态。(3)“叮”和“咚”声音各占用0.5秒,因此定时/计数器T0要完成0.5秒的定时,对于以250us为基准定时2000次才可以。6.汇编源程序T5HZEQU30HT7HZEQU31HT05SAEQU32H

93T05SBFLAGSTOPSP1START:NSP:DELY1OMS:DI:INT_TO:STP:NEXT:EQU33HBITOOHBITO1HBITP3.7ORGOOHLJMPSTARTORGOBHLJMPINT_TOMOVTMOD,#02HMOVTHO,#06HMOVTLO,#06HSETBETOSETBEAJBSPl.NSPLCALLDELY1OMSJBSPl.NSPSETBTROMOVT5HZ,#OOHMOVT7HZ,#OOHMOVT05SA,#OOHMOVT05SB,#0011CLRFLAGCLRSTOPJNBSTOP,$LJMPNSPMOVR6,#20MOVR7,#248DJNZR7,$DJNZR6,DIRETINCT05SAMOVA,T05SACJNEA,#100,NEXTMOVT05SA,#00HINCT05SBMOVA,T05SBCJNEA,#20,NEXTMOVT05SB,#00HJBFLAG,STPCPLFLAGLJMPNEXTSETBSTOPCLRTROLJMPDONEJBFLAG,S5HZINCT7HZMOVA,T7HZ

94CJNEA,#03H,DONEMOVT7HZ,#OOHCPLP1.0LJMPDONES5HZ:INCT5HZMOVA,T5HZCJNEA,#04H,DONEMOVT5HZ,#OOHCPLP1.0LJMPDONEDONE:RETIEND6.C语言源程序ttincludeunsignedchart5hz;unsignedchart7hz;unsignedinttent;bitstop;bitflag;voidmain(void)(unsignedchari,j;TM0D=0x02;TH0=0x06;TL0=0x06;ETO=1;EA=1;while(l)(if(P3_7==O)(for(i=10;i>0;i-)for(j=248;j>0;j—);if(P3_7==0){t5hz=0;t7hz=0;tcnt=0;

95flag=0;stop=0;TRO=1;while(stop=0);〃实现按键的死循环voidtO(void)interrupt1using0tcnt++;if(tcnt==2000)(tcnt=0;if(flag==0)(flag=~flag;)else(stop=l;〃二者无先后顺序TRO=O;if(flag==0)(t7hz++;if(t7hz==3)(t7hz=0;Pl_0=>l_0;else{t5hz++;if(t5hz==4){t5hz=0;P1_O=~P1_O;

9620.数字钟(★)i.实验任务(1)开机时,显示12:00:00的时间开始计时;(2)P0.0/AD0控制“秒”的调整,每按一次加1秒;(3)P0.1/AD1控制“分”的调整,每按一次加1分;(4)P0.2/AD2控制''时”的调整,每按一次加1个小时;

972.电路原理图—寸19丫17'八口用WuQ,,ddddddddPgTUISS000000■J:口38jrHIU2LED84Sd3PPCJMSd3PPU2s3QC2;.jgndH~~||EAvccoavdodlawl.odNavRodmay品ods^sSaVKOd9av®0dnawcod02dnlwcsdEvesdmIVKZduzdIIV/TZdsVRCd6WIZd84azdAT89s51图4.20.13.系统板上硬件连线(1)把“单片机系统”区域中的PL0-PL7端口用8芯排线连接到“动态数码显示"区域中的A一H端口上;(2)把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示"区域中的S1一S8端口上;(3)把“单片机系统”区域中的P0.0/AD0、P0.1/AD1,P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;4.相关基本知识(1)动态数码显示的方法(2)独立式按键识别过程(3)“时”,“分”,“秒”数据送出显示处理方法5.程序框图(有问题否20050930)6.汇编源程序SECONDEQU30HMINITEEQU31HHOUREQU32H

98HOURKMINITEKSECONDKDISPBUFDISPBITT2SCNTAT2SCNTBTEMPBITPO.OBITPO.1BITP0.2EQU40HEQU48HEQU49HEQU4AHEQU4BHORGOOHLJMPSTARTORGOBHLJMPINT_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,NK2INCMINITEMOVA,MINITECJNEA,#60,NM60MOVMINITE,#00HNM60:LCALLDISPJNBMINITEK,$NK2:JBHOURK,NK3LCALLDELY10MS

99JBHOURK,NK3INCHOURMOVA,HOURCJNEA,#24,NH24MOVHOUR,#OOHNH24:LCALLDISPJNBHOURK,$NK3:LJMPWTDELY1OMS: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,ADECRIMOVA,#10MOV@R1,ADECRIMOVA,SECONDMOVB,#10DIVABMOV@R1,ADECRIMOVA,BMOV@R1,ADECRIRETINT_TO:MOVTHO,#(65536-2000)/256MOVTLO,#(65536-2000)MOD256MOVA,#DISPBUFADDA,DISPBITMOVRO,AMOVA,@R0MOVDPTR,STABLEMOVCA,©A+DPTRMOVPl,AMOVA,DISPBITMOVDPTR,#TABMOVCA,©A+DPTRMOVP3,AINCDISPBITMOVA,DISPBITCJNEA,#08H,KNAMOVDISPBIT,#00HKNA:INCT2SCNTAMOVA,T2SCNTACJNEA,#100,DONEMOVT2SCNTA,#00HINCT2SCNTBMOVA,T2SCNTBCJNEA,#05H,DONEMOVT2SCNTB,#00HINCSECONDMOVA,SECONDCJNEA,#60,NEXTMOVSECOND,#00HINCMINITEMOVA,MINITECJNEA,#60,NEXTMOVMINITE,#0011INCHOURMOVA,HOURCJNEA,#24,NEXTMOVHOUR,#00HNEXT:LCALLDISPDONE:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40HTAB:DBOFEH,OFDH,OFBH,0F7H,OEFH,ODFH,OBFH,07FHEND3.C语言源程序#includeunsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedchardispbitcode[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedchardispbuf[8]={0,0,16,0,0,16,0,0};unsignedchardispbitcnt;unsignedcharsecond;unsignedcharminite;unsignedcharhour;unsignedinttent;unsignedcharmstent;

100unsignedchari,j;voidmain(void)(TM0D=0x02;TH0=0x06;TL0=0x06;TRO=1;ETO=1;EA=1;while(l)(if(PO_O==O){for(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(PO_l==O)

101for(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/10;while(P0_2==0);voidtO(void)interrupt1using0(mstcnt++;if(mstcnt==8)(mstcnt=0;Pl=dispcode[dispbuf[dispbitent]];P3=dispbitcode[dispbitent];dispbitcnt++;if(dispbitcnt==8)(dispbitcnt=O;

102tcnt++;if(tcnt==4000)(tcnt=O;second++;if(second==60)|second=0;minite++;if(minite==60){minite=O;hour++;if(hour==24)(hour=0;dispbuf[0]=second%10;dispbuf[l]=second/10;dispbuf[3]=minite%10;dispbuf[4]=minite/10;dispbuf[6]=hour%10;dispbuf[7]=hour/10;21.拉幕式数码显示技术1.实验任务用AT89S51单片机的P0.0/AD0-P0.7/AD7端口接数码管的a-h端,8位数码管的S1-S8通过74LS138译码器的Y0-Y7来控制选通每个数码管的位选端。AT89s51单片机的Pl.0-P1.2控制74LS138的A,B,C端子。在8位数码管上从右向左循环显示“12345678”。能够比较平滑地看到拉幕的效果。2.电路原理图如图4.21.1所示3.系统板上硬件连线(1)把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示"区域中的a-h端口上;(2)把“三八译码模块”区域中的Y0—Y7用8芯排线连接到“动态数码显示"区域中的S1—S8端口上;(3)把“单片机系统”区域中的P1.0—P1.2端口用3根导线连接到“三八译码模块”区域中的A、B、C“端口上;4.程序设计方法(1)动态数码显示技术;如何进行动态扫描,由于一次只能让一个数码管显示,因此,要显示8位的数据,必须经过让数码管一个一个轮流显示才可以,同W每个数码管显示的时间大约在1ms到4ms之间,

103所以为了保证正确显示,我们必须每隔1ms,就得刷新一个数码管。而这刷新时间我们采用单片机的定时/计数器TO来控制,每定时1ms对数码管刷新一次,TO采用方式2。(2)在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。图4.21.15.程序框图主程序框图P07P06P05P04P03P02POTPOOPIO1Pli2P123GNDH-jVCC|-0El-0E2-E374LS138YOY1S7XgJ3Poq。0.0.B,0.用石材防B.0.0.0.qm11也SSsU4LED区总总KRW需宿送W缺1•:工2X■WEd一eCEdPS2一INI/TmdOLNSEdOXLHEdQi2D1版XSV/OZd6VnZd2

1046.汇编源程序DISPBUFEQU30HDISPCNTEQU38HDISPBITEQU39HT1CNTAEQU3AHT1CNTBEQU3BHCNTEQU3CHORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVDISPCNT,#8MOVA,#10MOVRI,ttDISPBUFLP:MOV@R1,AINCRIDJNZDISPCNT,LPMOVDISPBIT,#OOHMOVT1CNTA,#OOHMOVT1CNTB,#OOHMOVCNT,#OOHMOVTMOD,#O1HMOVTHO,#(65536-1000)/256

105MOVTLO,#(65536-1000)MOD256SETBTROSETBETOSETBEASJMP$INT_TO:MOVTHO,#(65536-1000)/256MOVTLO,#(65536-1000)MOD256MOVA.DISPBITADDA,#DISPBUFMOVRO,AMOVA,©ROMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,PlANLA,#0F8HADDA.DISPBITMOVPl,AINCDISPBITMOVA,DISPBITCJNEA,#08H,NEXTMOVDISPBIT,#00HNEXT:INCT1CNTAMOVA.T1CNTACJNEA,#50,LL1MOVT1CNTA,#00HINCT1CNTBMOVA.T1CNTBCJNEA,#8,LL1MOVT1CNTB,#00HINCCNTMOVA,CNTCJNEA,#9,LLXMOVCNT,#00HMOVA,CNTLLX:CJNEA,#O1H,NEX1MOV30H,#8LL1:LJMPDONENEX1:CJNEA,#02H,NEX2MOV31H,#8MOV30H,#8LJMPDONENEX2:CJNEA,#03H,NEX3MOV32H,#8MOV31H,#8

106MOV30H,#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,#8MOV31H,#8MOV30H,#8LJMPDONENEX7:CJNEA,#08H,NEX8MOV37H,#8MOV36H,#8MOV35H,#8MOV34H,#8MOV33H,#8MOV32H,#8MOV31H,#8MOV30H,#8LJMPDONENEX8:CJNEA,#OOH,DONEMOV37H,#10MOV36H,#10MOV35H,#10MOV34H,#10

107MOV33H,#10MOV32H,#10MOV31H,#10MOV30H,#10LL:LJMPDONEDONE:RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,OOHEND7.C语言源程序ftincludeunsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00);unsignedchardispbitcode[]={0xf8,0xf9,Oxfa,Oxfb,Oxfc,Oxfd,Oxfe,Oxff);〃怎样编的码unsignedchardispbuf[8]={16,16,16,16,16,16,16,16);unsignedchardispbitcnt;unsignedintt04scnt;unsignedchartlmscnt;unsignedcharu;unsignedchari;voidmain(void){TM0D=0x02;TH0=0x06;TL0=0x06;TRO=1;ETO=1;EA=1;while(l);voidtO(void)interrupt1using0(tlmscnt++;if(tlmscnt-4)(tlmscnt=0;PO=dispcode[dispbuf[dispbitcnt]];Pl=dispbitcode[7-dispbitcnt];〃如何实现Pl-0,PIT,Pl-2的dispbitcnt++;if(dispbitcnt==8)(

108dispbitcnt=O;t04scnt++;if(t04scnt==1600)t04scnt=0;u++;if(u==9){u=0;)for(i=0;i<8;i++)〃实现刷新功能(dispbuf[i]=16;)for(i=l;i<=u:i++)〃实现数据输入功能(dispbuf[u-i]=i;))22.电子琴1.实验任务(1)由4X4组成16个按钮矩阵,设计成16个音。(2)可随意弹奏想要表达的音乐。2.电路原理图电路如图4.22.1所示。3.系统板硬件连线(1)把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2)把“单片机系统“区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4R1-R4端口上;4.相关程序内容(1)4X4行列式键盘识别;(2)音乐产生的方法;一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器TO来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数TO相关的计数值如下表所示音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1DO26263628#4FA#74064860#1DO#27763731中5so78464898低2RE29463835#5SO#83164934#2RE#31163928中6LA88064968

109低3M33064021#693264994低4FA34964103中7sl98865030#4FA#37064185高1DO104665058低5SO39264260#1DO#110965085#5SO#41564331高2RE117565110低6LA44064400#2RE#124565134#646664463高3M131865157低7SI49464524高4FA139765178中1DO52364580#4FA#148065198#1DO#55464633高5so156865217中2RE58764684#5SO#166165235#2RE#62264732ihj6LA176065252中3M65964777tt6186565268中4FA69864820高7sl196765283艮&g£W.总后C6后Eoxvrs旦目mzs2QM•TWI&nwfKvs♦mscm二一二图4.22.10-19下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据低音之间,中音在20—39之间,高音在40—59之间TABLE:DW0,63628,63835,64021,64103,64260,64400,64524,0,0

110DW0,63731,63928,0,64185,64331,64463,0,0,0DW0,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,0DW0音乐的音拍,一个节拍为单位(C调)曲调值DELAY曲调值DELAY调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125ms对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。下面就用AT89s51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。5.程序框图

111图4.22.26.汇编源程序KEYBUFSTHOSTLOTEMPEQU30HEQU31HEQU32HEQU33HORGOOHLJMPSTARTORGOBHLJMPINT_TOSTART:MOVTMOD,#O1HSETBETOSETBEAWAIT:MOVP3,#OFFHCLRP3.4MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY1MOVA,P3ANLA,#OFHCJNEA,#OEH,NK1MOVKEYBUF,#0LJMPDK1NK1:CJNEA,#ODH,NK2MOVKEYBUF,#1LJMPDK1NK2:CJNEA,#OBH,NK3MOVKEYBUF,#2LJMPDK1NK3:CJNEA,#07H,NK4MOVKEYBUF,#3LJMPDK1NK4:DK1:NOPMOVA,KEYBUFMOVDPTR,#TABLEMOVCA,©A+DPTRMOVP0,AMOVA,KEYBUFMOVB,#2

112MULABMOVTEMP,AMOVDPTR,STABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK1A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK1ACLRTRONOKEY1:MOVP3,#OFFHCLRP3.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

113MOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,STABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,©A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK2A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK2ACLRTRON0KEY2:MOVP3,#OFFHCLRP3.6MOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY3LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY3MOVA,P3ANLA,#OFHCJNEA,#OEH,NK9MOVKEYBUF,#8LJMPDK3NK9:CJNEA,#ODH,NK1OMOVKEYBUF,#9LJMPDK3NK10:CJNEA,#OBH,NK11MOVKEYBUF,#10LJMPDK3

114NK11:CJNEA,#07H,NK12MOVKEYBUF,#11LJMPDK3NK12:DK3:NOPMOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVPO,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,STABLEIMOVCA,©A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK3A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK3ACLRTRON0KEY3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#OFHXRLA,#OFHJZN0KEY4LCALLDELY1OMSMOVA,P3ANLA,#OFHXRLA,#OFHJZNOKEY4MOVA,P3ANLA,#OFHCJNEA,#OEH,NK13MOVKEYBUF,#12LJMPDK4NK13:CJNEA,#ODH,NK14

115MOVKEYBUF,#13LJMPDK4NK14:CJNEA,#OBH,NK15MOVKEYBUF,#14LJMPDK4NK15:CJNEA,#07H,NK16MOVKEYBUF,#15LJMPDK4NK16:DK4:NOPMOVA,KEYBUFMOVDPTR,STABLEMOVCA,@A+DPTRMOVPO,AMOVA,KEYBUFMOVB,#2MULABMOVTEMP,AMOVDPTR,STABLE1MOVCA,@A+DPTRMOVSTHO,AMOVTHO,AINCTEMPMOVA,TEMPMOVCA,@A+DPTRMOVSTLO,AMOVTLO,ASETBTRODK4A:MOVA,P3ANLA,#OFHXRLA,#OFHJNZDK4ACLRTRON0KEY4:LJMPWAITDELY10MS:MOVR6,#10DI:MOVR7,#248DJNZR7,$DJNZR6,D1RETINT_TO:MOVTHO,STHOMOVTLO,STLOCPLP1.0RETI

116TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HTABLEI:DW64021,64103,64260,64400DW64524,64580,64684,64777DW64820,64898,64968,65030DW65058,65110,65157,65178END7.C语言源程序ftincludeunsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchartemp;unsignedcharkey;unsignedchari,j;unsignedcharSTHO;unsignedcharSTLO;unsignedintcodetab[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178);voidmain(void)(TM0D=0x01;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:

117temp=temp&OxOf;switch(temp)caseOxOe:key=O;break;caseOxOd:key=1;break;caseOxOb:key=2;break;case0x07:key=3;break;)temp=P3;P1_O^P1_O;PO=table[key];STHO=tab[key]/256;STLO=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f){temp=P3;temp=temp&OxOf;)TRO-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)

118caseOxOe:key=4;break;caseOxOd:key=5;break;case0x0b:key=6;break;case0x07:key=7;break;)temp=P3;P1_O="P1_O;PO=table[key];STH0=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_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)

119caseOxOe:key=8;break;

120caseOxOd:key=9;break;caseOxOb:key=10;break;case0x07:key=ll;break;)temp=P3;Pl_0=>l_0;PO=table[key];STH0=tab[key]/256;STLO=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f){temp=P3;temp=temp&OxOf;)TRO=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=12;break;caseOxOd:key=13;break;caseOxOb:key=14;break;case0x07:key=15;break;)temp=P3;Pl_0=>l_0;

121PO=table[key];STH0=tab[key]/256;STL0=tab[key]%256;TRO=1;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;)TRO=O;voidtO(void)interrupt1using0(THO二STHO;TLO=STLO;Pl_0=>l_0;23.模拟计算器数字输入及显示1.实验任务(1)开机时,显示“0”(2)第一次按下时,显示“D1”:第二次按下时,显示“D1D2”;第三次按下时,显示“D1D2D3”,8个全显示完毕,再按下按键时,给出“嘀”提示音。2.电路原理图

122.,••**日日日日•,拿・wC图4.23.1日日日日•wCFMsa♦&5..jer.?Kissss^sowfKis3amft9IWT&KTCTT&1.系统板上硬件连线(1)把“单片机系统”区域中的PLO端口用导线连接到“音频放大模块”区域中的SPKIN端口上;(2)把“单片机系统“区域中的P3.0—P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1一C4R1-R4端口上;(3)把“单片机系统”区域中的PO.O-PO.7端口用8芯排线连接到“动态数码显示"区域中的A-H端口上;(4)把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示"区域中的S1-S8端口上;2.相关程序设计内容(1)行列式键盘输入及按键功能设定;(2)动态数码显示;(3)数码显示方式处理;3.汇编源程序(略)4.C语言源程序#includeunsignedcharcodedispcodeLJ-{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedchardispbitcode[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedchardispbuf[8]={0,16,16,16,16,16,16,16);unsignedchardispbitcount;unsignedchartemp;unsignedchari,j;unsignedcharkey;unsignedcharkeypos;bitalarmflag;

123voidchange(unsignedchar*p,unsignedcharcount){while(count>0)(*(p+count)(p+count-1);count——;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;caseOxOb:key=9;break;case0x07:key=10;break;)if((key>=0)&&(key<10))(keypos++;if(keypos<8){change(dispbuf,keypos);dispbuf[0]=key;}else(

124keypos=8;alarmflag=l;})temp=P3;Pl0=、Pl_0;temp=temp&OxOf;while(temp!=0x0f){temp=P3;temp=temp&OxOf;)alarmflag=0;)}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;break;caseOxOd:key=5;break;caseOxOb:key=6;break;case0x07:key=ll;break;)if((key>=0)&&(key<10))(

125keypos++;if(keypos<8)(change(dispbuf,keypos);dispbuf[O]=key;)else(keypos=8;alarmflag=l;})temp=P3;P1_O="P1_O;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!=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=l;break;caseOxOd:key=2;break;case0x0b:key=3;break;

126case0x07: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;P1_O="P1_O;temp=temp&OxOf;while(temp!=0x0f)(temp=P3;temp=temp&OxOf;)alarmflag=O;)}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;caseOxOd:key=13;break;case0x0b:key=14;break;

127case0x07:key=15;break;)if((key>=0)&&(key<10))(keypos++;if(keypos<8)(change(dispbuf,keypos);dispbuf[O]=key;)else(keypos=8;alarmflag=l;temp=P3;P1_O="P1_O;temp=temp&OxOf;while(temp!=0x0f)(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){P1_1="P1_1;))

12824.8X8LED点阵显示技术1.实验任务在8X8LED点阵上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。2.电路原理图

129Pl0Pl1Pl.2Pl.3Pl4Pl5Pl6Pl?P30/RXDP3l/TXDP32/fNTOP3.3/fNTTP3.4/T0P35/T1P36/WRP37/RDG8APOO/ADOPO1/AD1PO2/AD2P03/AD3PO4/AD4PO5/AD5P06/AD6PO7/AD7ALEPSENP2.7/A15P26/A14P25/A13P24/A12P23/AilP22/A10P21/A9P20/A8▲T89S518Y16J□二12MHzC2=4=C3GND图4.24.11.硬件电路连线⑴把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1—DR8”端口上;⑵把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1—DC8”端口上;2.程序设计内容8X8点阵LED工作原理说明:8X8点阵LED结构如图4.24.2所示。从图4.24.2中可以看出,8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:一根竖柱:对应的列置1,而行则采用扫描的方法来实现。一根横柱:对应的行置0,而列则采用扫描的方法来实现。3.汇编源程序ORG00HSTART:NOPMOVR3,#3L0P2:MOVR4,#8MOVR2,#0

130、、「一-、、一一、二工工工工工N工工一T!一ggg)、一-gg=、_L0P1:MOVP1,#OFFHMOVDPTR,#TABAMOVA,R2MOVCA,@A+DPTRMOVP3,AINCR2LCALLDELAYDJNZR4,LOP1DJNZR3,LOP2MOVR3,#3L0P4:MOVR4,#8MOVR2,#7LOP3:MOVP1,#OFFHMOVDPTR,#TABAMOVA,R2MOVCA,@A+DPTRMOVP3,ADECR2LCALLDELAYDJNZR4,LOP3DJNZR3,LOP4MOVR3,#3LOP6:MOVR4,#8MOVR2,#0LOP5:MOVP3,#OOHMOVDPTR,ttTABBMOVA,R2MOVCA,@A+DPTRMOVPl,AINCR2LCALLDELAYDJNZR4,LOP5DJNZR3,L0P6MOVR3,#3L0P8:MOVR4,#8MOVR2,#7

131LOP7:MOVP3,#OOHMOVDPTR,#TABBMOVA,R2MOVCA,©A+DPTRMOVPl,ADECR2LCALLDELAYDJNZR4,LOP7DJNZR3,LOP8LJMPSTARTDELAY:MOVR5,#10D2:MOVR6,#20DI:MOVR7,#248DJNZR7,$DJNZR6,DIDJNZR5,D2RETTABA:DBOFEH,OFDH,OFBH,0F7H,OEFH,ODFH,OBFH,07FHTABB:DB01H,02H,04H,08H,10H,20H,40H,80HEND1.C语言源程序ftincludeunsignedcharcodetaba[]={0xfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodetabb[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80);voiddelay(void)(unsignedchari,j;for(i=10;i>0;i-)

132for(j=248;j>0;j-);voiddelayl(void)(unsignedchari,j,k;for(k=10;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j—);voidmain(void)(unsignedchari,j;while(l)(for(j=0;j<3;j++)//from(for(i=0;i<8;i++)(P3=taba[i];Pl=0xff;delayl();})for(j-0;j<3;j++)//from(for(i=0;i<8;i++)(P3=taba[7~i];Pl=Oxff;delayl();})for(j=0;j<3;j++)//fromtop(for(i=0;i<8;i++)(P3=0x00;Pl=tabb[7-i]:delayl();lefttoright3timerighttoleft3timetobottom3time

133)//frombottomtotop3timefor(j=0;j<3;j++)(for(i=0;i<8;i++)(P3=0x00;Pl=tabb[i];delayl();25.点阵式LED“0—9”数字显示技术1.实验任务利用8X8点阵显示0到9的数字。2.电路原理图R1.34.56.711111ppppPPlQP3O/RXDP31/TXDP3.24NT0-irrijPOO/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4PO5/AD5PO6/AD6PO7/AD7ALEPSENP27/A15P26/A14P23/A13P24/A12P2.3/A11P22/A1OP21/A9P20/A8.§

1344.程序设计内容(1)数字0—9点阵显示代码的形成如下图所示,假设显示数字“0”12345678因此,形成的列代码为OOH,OOH,3EH,41H,41H,3EH,OOH,00H;只要把这些代码分别送到相应的列线上面,即可实现“0”的数字显示。送显示代码过程如下所示:送第一列线代码到P3端口,同时置第一行线为“0”,其它行线为“1”,延时2ms左右,送第二列线代码到P3端口,同时置第二行线为“0”,其它行线为“1”,延时2ms左右,如此下去,直到送完最后一列代码,又从头开始送。数字“1”代码建立如下图所示其显示代码为:OOH,OOH,00H,数字“2”代码建立如下图所示OOH,21H,7FH,01H,00HOOH,OOH,27H,45H,45H,45H,数字“3”代码建立如下图所示39H,00H12345678

135其显示代码为:OOH,OOH,22H,数字“4”代码建立如下图所示49H,49H,49H,36H,00H1234567其显示代码为:OOH,OOH,OCH,数字“5”代码建立如下图所示14H,24H,7FH,04H,00H123456751H,51H,4EH,00H其显示代码为:OOH,OOH,72H,51H,数字“6”代码建立如下图所示12345678其显示代码为:OOH,OOH,3EH,49H,49H,49H,26H,00H数字“7”代码建立如下图所示12345678其显示代码为:OOH,OOH,40H,40H,40H,4FH,70H,00H

136数字“8”代码建立如下图所示

13712345678其显示代码为:OOH,OOH,36H,49H,49H,49H,36H,00H数字“9”代码建立如下图所示12345678其显示代码为:OOH,OOH,32H,5.汇编源程序49H,49H,49H,3EH,0011TIMCNTACNTBEQUEQUEQU30H31H32HORG00HLJMPSTARTORGOBHLJMPTOXORG30HSTART:MOVTIM,#00HMOVCNTA,#00HMOVCNTB,#00HMOVTMOD,#01HMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEASJMP$TOX:MOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,#TABMOVA,CNTAMOVCA,©A+DPTRMOVP3,AMOVDPTR,ttDIGITMOVA,CNTBMOVB,#8MULABADDA,CNTAMOVCA,@A+DPTRMOVPl,AINCCNTAMOVA,CNTACJNEA,#8,NEXTMOVCNTA,#OOHNEXT: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,OOHDBOOH,OOH,36H,49H,49H,49H,36H,OOHDBOOH,OOH,32H,49H,49H,49H,3EH,OOHEND6.C语言源程序ftincludeunsignedcharcodetab[]={0xfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedigittab[10][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//O{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//I{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//2

138{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00},//3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00},//4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00),//5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00),//6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00},//7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00),//8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00}//9);unsignedinttimecount;unsignedcharcnta;unsignedcharcntb;voidmain(void)(TM0D=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TRO=1;ETO=1;EA=1;while(l){;voidtO(void)interrupt1using0(TH0=(65536-3000)/256;TL0=(65536-3000)%256;P3=tab[cnta];Pl=digittab[cntb][cnta];cnta++;if(cnta==8){cnta=0;)timecount++;if(timecount==333)(timecount=0;cntb++;if(cntb==10)(cntb=0;

13926.点阵式LED简单图形显示技术1.实验任务在8X8点阵式LED显示“★”、“•”和心形图,通过按键来选择要显示的图形。

1401.电路原理图电路如图4.26.1所示。2.硬件系统连线(1)把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1—DR8”端口上;(2)把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;(3)把“单片机系统”区域中的P2.0/A8端子用导线连接到“独立式键盘”区域中的SP1端子上;VCC1K口最AT89s5100Pl.5Pl.6Pl.7CllOuF14151617101112GNDP3.0/RXDP3.1/TXDP3.2/PTT0P33/SmP3.4/T0P3.5/T1P3.6/WP3.7/RDPO.O/ADOP0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7ALEPSENP2.7/A15P2.6/A14P2.5/A13P2.4/A12P23/A11P2.2/A10P2.17A912MHz:C2:30P:C330P图4.26.14.程序设计内容(1)”★”在8X8LED点阵上显示图如下图所示1234567其显示代码为:12H,14H,3CH,48H,3CH,14H,12H,00H(2)“•”在8X8LED点阵上显示图如下图所示12345678

141其显示代码为:OOH,OOH,38H,44H,44H,44H,38H,00H(3)心形图在8X8LED点阵上显示图如下图所示12345678其显示代码为:30H,48H,44H,22H,44H,48H,30H,00H5.汇编源程序CNTAEQU30HCOUNTEQU31HORG00HLJMPSTARTORGOBHLJMPTOXORG30HSTART:MOVCNTA,#00HMOVCOUNT,#00HMOVTMOD,#01HMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEAWT:JBP2.0,WTMOVR6,#5MOVR7,#248DI:DJNZR7,$DJNZR6,DIJBP2.0,WTINCCOUNTMOVA,COUNTCJNEA,#03H,NEXTMOVCOUNT,#OOHNEXT:JNBP2.0,$SJMPWTTOX:NOPMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,STABMOVA,CNTAMOVCA,@A+DPTRMOVP3,AMOVDPTR,#GRAPHMOVA,COUNTMOVB,#8MULABADDA,CNTAMOVCA,@A+DPTRMOVPl,AINCCNTAMOVA,CNTACJNEA,#8,NEXMOVCNTA,#00HNEX:RETITAB:DBOFEH,OFDH,OFBH,0F7H,OEFH,ODFH,OBFH,07FHGRAPH:DB12H,14H,3CH,48H,3CH,14H,12H,OOHDBOOH,OOH,38H,44H,44H,44H,38H,OOHDB30H,48H,44H,22H,44H,48H,30H,OOHEND6.C语言源程序ftincludeunsignedcharcodetab[]={0xfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodegraph[3][8]={{0x12,0x14,0x3c,0x48,0x3c,0x14,0x12,0x00),(0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00),(0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00)unsignedcharcount;unsignedcharenta;voidmain(void)

142unsignedchari,j;TM0D=0x01;THO=(65536-4000)/256;TL0=(65536-4000)%256;TR0=l;ET0=l;EA=1;while(l){if(P2_0==0)(for(i=5;i>0;i")for(j=248;j>0;j—);if(P2_0==0)(count++;if(count==3)(count=0;)while(P2_0==0);}))voidtO(void)interrupt1using0(TH0=(65536-4000)/256;TLO=(65536-4000)%256;P3=tab[cnta];Pl=graph[count][cnta];cnta++;if(cnta==8)(cnta=0;))27.ADC0809A/D转换器基本应用技术1.基本知识ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。

143(1)ADC0809的内部逻辑结构

1448路模拟吊开关EOC地址锁存与深码器INOIN1STCLK三态输出锁存器DOD1D2D3D4DJD<5D7由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁存器用于锁存A/D转换完的数字量,当0E端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2)引脚结构1IN3IN2IN4IN1IN5INOIN6ADST7BSTCEOCALED3D7OED6CLKD5VCCD4VREF+DOGNDVREF-DID2282273264255246237228219201O191118121713161415IN0-IN7:8条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路.地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量通过转换器进行转换。A,B和C为地址输入线,用于选通IN0—IN7上的一路模拟量输入。通道选择如下表所示。cBA选择的通道000INO001INI010IN2011IN3I00IN4101IN5110IN61I1IN7

145数字重轴出及控制线: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)(2)ADC0809内部带有输出锁存器,可以与AT89s51单片机直接相连。初始化时,使ST和0E信号全为低电平。送要转换的哪一通道的地址到A,B,C端口上。(4)(5)(6)在ST端给出一个至少有100ns宽的正脉冲信号。是否转换完毕,我们根据EOC信号来判断。当EOC变为高电平时,这时给0E为高电平,转换的数据就输出给单片机了。3.实验任务如下图所示,从ADC0809的通道IN3输入0—5V之间的模拟量,通过ADC0809转换成数字量在数码GWD卜7^管上以十进制形成显示出来。ADC0809的VREF接+5V电压。4.电路原理图PODMkDOP01/AD1Pta--P03OD3P083ALEKO的加USF24/AI4P2J/A13P24/A12P22/A1OP23gFOCMMCDF31/TXDninrnW34RTIm/T】力道T-二,3S8亘二201?78ATVK31S4*f00bEmE,m・44VV4S1图1.27.15.系统板上硬件连线(1)把“单片机系统板”区域中的P1端口的P1.0—PL7用8芯排线连接到“动态数码显示"区域中的ABCDEFGH端口上,作为数码管的笔段驱动。(2)把“单片机系统板”区域中的P2端口的P2.0—P2.7用8芯排线连接到“动态数码显示"区域中的SIS2S3S4S5S6S7S8端口上,作为数码管的位段选择。(3)把“单片机系统板”区域中的P0端口的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端口上,A/D转换完毕的数据输入到单片机的P0端口(4)把“模数转换模块”区域中的VREF端子用导线连接到“电源模块”区域中的VCC端子上;(5)把“模数转换模块”区域中的A2A1A0端子用导线连接到“单片机系统”区域中的P3.4P3.5P3.6端子上;(6)把“模数转换模块”区域中的ST端子用导线连接到“单片机系统”区域中的P3.0端子上;

146(7)把“模数转换模块”区域中的0E端子用导线连接到“单片机系统”区域中的P3.1端子上;(8)把“模数转换模块”区域中的EOC端子用导线连接到“单片机系统”区域中的P3.2端子上;(9)把“模数转换模块”区域中的CLK端子用导线连接到“分频模块”区域中的P3.3端子上;(10)把“分频模块”区域中的CKIN端子用导线连接到“单片机系统”区域中的ALE端子上;(11)把“模数转换模块”区域中的IN3端子用导线连接到“三路可调压模块”区域中的VR1端子上;5.程序设计内容(1)进行A/D转换时,采用查询E0C的标志信号来检测A/D转换是否完毕,若完毕则把数据通过P0端□读入,经过数据处理之后在数码管上显示。(2)进行A/D转换之前,要启动转换的方法:ABC=110选择第三通道ST=0,ST=1,ST=0产生启动转换的正脉冲信号7.汇编源程序CHEQU30HDPCNTEQU31HDPBUFEQU33HGDATAEQU32HSTBITP3.00EBITP3.1EOCBITP3.2ORGOOHLJMPSTARTORG0BHLJMPTOXORG30HSTART:MOVCH,#OBCHMOVDPCNT,#00HMOVR1,#DPCNTMOVR7,#5MOVA,#10MOVRO,#DPBUFLOP:MOV@R0,AINCRODJNZR7,LOPMOV©RO,#00HINCROMOV©RO,#00HINCROMOV@R0,#00HMOVTMOD,#01HMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256SETBTROSETBETOSETBEAWT:CLRSTSETBSTCLRSTWAIT:JNBEOC,WAITSETBOEMOVGDATA,POCLROEMOVA,GDATAMOVB,#1OODIVAB

147MOV33H,AMOVA,BMOVB,#10DIVABMOV34H,AMOV35H,BSJMPWTTOX:NOPMOVTHO,#(65536-4000)/256MOVTLO,#(65536-4000)MOD256MOVDPTR,#DPCDMOVA,DPCNTADDA,#DPBUFMOVRO,AMOVA,@R0MOVCA,@A+DPTRMOVPl,AMOVDPTR,#DPBTMOVA,DPCNTMOVCA,@A+DPTRMOVP2,AINCDPCNTMOVA,DPCNTCJNEA,#8,NEXTMOVDPCNT,#00HNEXT:RETIDPCD:DB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FH,OOHDPBT:DBOFEH,OFDH,OFBH,0F7HDBOEFH,ODFH,OBFH,07FHEND8.C语言源程序ftincludeunsignedcharcodedispbitcode[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,Ox7f,0x6f,0x00};unsignedchardispbuf[8]={10,10,10,10,10,0,0,0);unsignedchardispcount;sbitST=P3'0;sbitOE=P31;sbitE0C=P3~2;unsignedcharchannel=0xbc;10111100//IN3unsignedchargetdata;voidmain(void)(

148TM0D=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;TRO=1;ETO=1;EA=1;P3=channel;while(l)(STR;ST=1;ST-O;while(EOC==1);OE=1;getdata=P0;0E=0;dispbuf[2]=getdata/100;getdata=getdata%100;dispbufLl]=getdata/10;dispbuf[0]=getdata%10;voidtO(void)interrupt1using0(TH0=(65536-4000)/256;TLO=(65536-4000)%256;Pl=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount-8)dispcount=0;

14928.数字电压表1.实验任务利用单片机AT89s51与ADC0809设计一个数字电压表,能够测量0—5V之间的直流电压值,四位数码显示,但要求使用的元器件数目最少。2.电路原理图电路如图4.28.1所示。3.系统板上硬件连线a)把“单片机系统”区域中的Pl.0-P1.7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。b)把“单片机系统”区域中的P2.0—P2.7与“动态数码显示"区域中的SIS2s3s4s5s6s7s8端口用8芯排线连接。c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的0E端子用导线相连接。e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。g)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。h)把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。i)把“单片机系统”区域中的PO.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。U4ba$3f・$41273豆83豆GGHD58>POO/ADOPO1/AD1P02/AD2P05/AD3P04/AD4P05/AD5P06/AD6PO7/AD7▲LEKENP27/AI5P26/A14P2MU3P24/A12P23/AUP2.2/A10P21/A9P2O/A8QH§图1.28.14.程序设计内容i.由于ADC0809在进行A/D转换时需要有CLK信号,而此时的ADC0809的CLK是接在AT89S51单片机的

150P3.3端口上,也就是要求从P3.3输出CLK信号供ADC0809使用。因此产生CLK信号的方法就得用软件来产生了。i.由于ADC0809的参考电压Vref=VCC,所以转换之后的数据要经过数据处理,在数码管上显示出电压值。实际显示的电压值(D/256和呻)1.汇编源程序(略)2.C语言源程序#includeunsignedcharcodedispbitcode[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsignedchardispbuf[8]={10,10,10,10,10,0,0,0);unsignedchardispcount;unsignedchargetdata;unsignedinttemp;unsignedchari;sbitST=P3*0;sbitOE=P3'1;sbitE0C=P3"2;sbitCLK=P3*3;voidmain(void)(STR;0E=0;ETO-1;ET1=1;EA=1;TM0D=0xl2;TH0=0x06;TL0=0x06;TH1-(65536-4000)/256;TL1=(65536-4000)%256;TR1-1;TRO=1;ST=1;ST=O;while(l)if(EOC==l)OE=1;

151getdata=PO;0E=0;temp=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;1++;)dispbuf[i]=temp;ST=1;ST-0;voidtO(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=P10x80;dispcount++;if(dispcount==8)dispcount=0;

15229.两点间温度控制1.实验任务用可调电阻调节电压值作为模拟温度的输入量,当温度低于30c时,发出长嘀报警声和光报警,当温度高于60℃时,发出短嘀报警声和光报警。测量的温度范围在0—99℃。2.电路原理图电路如图4.29.1所示。3.系统板上硬件连线a)把“单片机系统”区域中的PL0-PL7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。b)把“单片机系统”区域中的P2.0—P2.7与“动态数码显示"区域中的SIS2s3s4s5s6s7s8端口用8芯排线连接。c)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。d)把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。e)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的E0C端子用导线相连接。f)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。g)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。h)把“模数转换模块”区域中的IN0端子用导线连接到“三路可调电压模块”区域中的VR1端子上。i)把“单片机系统”区域中的P0.0—P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。j)把“单片机系统”区域中的P3.6、P3.7用导线分别连接到“八路发光二极管指示模块”区域中的LI、L2±ok)把“单片机系统”区域中的P3.5用导线连接到“音频放大模块”区域中的SPKIN端口上。1)把“音频放大模块“区域中的SPKOUT插入音频喇叭。

153gnd|久1”舞1.三;3Qp130PL0■|gndONDLM38(m(8)VOUIGAINGAINPYPkfSGNDVKEFrDOGNDVKEFOlnFC7OMTxiFQK5c12ei^bB亘it38Dl37m3,EQ3JD»34D533D,32D730AU~29~HZ无一券23B22naa-GHD10uFC3EOC78OE-§IFflccu-a•HHHmbcsfa»|gnd21D72。DC19D518D»17DO13~teFPlJOmiP12DlP3J0/KXDP31AXDP33^NfTP34/Z0P3J/T1_P3.,皿P37ADPOjO»MDOP01/XD1POM皿P03/MBP0.4/KIXP0J/XD5PO.C/KDCPOJZKinMJpmiP2.7/M5P2.4/M*P2J/M3P24g2P23glP22goP212P2J0/K86□n4.汇编源程序(略)5.C语言源程序Sincludeunsignedcharunsignedchar图4.29.1unsignedunsignedunsignedunsignedunsignedcharcharcharcodedispbitcode[]={Oxfe,Oxfd,Oxfb,Oxf7,Oxef,Oxdf,Oxbf,0x7f};codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};dispbuf[8]={10,10,10,10,10,10,0,0};dispcount;getdata;inttemp;chari;sbitST=P30;sbitOE=P3'1;

154sbitE0C=P3*2;sbitCLK=P3*3;sbitLED1=P3c6;sbitLED2=P3c7;sbitSPK=P3*5;bitlowflag;bithighflag;unsignedintcnta;unsignedintcntb;bitalarmflag;voidmain(void)(STR;0E=0;TM0D=0xl2;TH0=216;TL0=216;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;voidtO(void)interrupt1using0CLK—CLK;voidt1(void)interrupt3using0

155TH1=(65536-500)/256;TL1=(65536-500)%256;if(EOC==1)(0E=l;getdata=PO;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;highflag=l;else

156lowflag=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;alarmflag二、alarmflag;)if(alarmflag=l){SPK="SPK;)}elseif((lowflag==0)&&(highflag-l)){cntb++;if(cntb==400)(cntb=0;alarmflag=^alarmflag;)if(alarmflag==l)(SPK-SPK;)}else

157{alarmflag=0;cnta=0;cntb=0;

15830.四位数数字温度计1.温度传感器AD590基本知识AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V—30V,检测的温度范围为-55℃—+150℃,它有非常好的线性输出性能,温度每增加1C,其电流增加luA。AD590温度与电流的关系如下表所示摄氏温度AD590电流经10KQ电压0℃273.2uA2.732V10℃283.2uA2.832V20℃293.2uA2.932V30℃303.2uA3.032V40℃313.2uA3.132V50℃323.2uA3.232V60℃333.2uA3.332V100℃373.2uA3.732VAD590引脚图(有问题否20050930)2.实验任务利用AD590温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换的结果进行温度值变换之后送入数码管显示。3.电路原理图AD590C1C2C3C4C5一;SC7C8■W"10uFC5c4c?oc7sr123456S4;s3S2bmmmm♦dPl0POO/ADOPl1PO1/ADlPl2P02/AD2P13P03/AD3Pl4PO4/AD4Pl3PO5/ADSPl6P06/AD6Pl7PO7/AD7ALEFhTP3MUCDP27/AI5P31/TXDP26/AI4P32/IHT0P25/AI3P33/INTTP24/AI2P3VT0P23/A11P35/T1P22/A10P36/^P21/A9P37/RDP2aA8QP三orrrDGH图4.30.14.系统板上硬件连线

159(1)把“单片机系统”区域中的PL0—PL7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。(2)把“单片机系统”区域中的P2.0—P2.7与“动态数码显示"区域中的SIS2s3s4s5s6s7s8端口用8芯排线连接。(3)把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。(4)把“单片机系统”区域中的P3.1与''模数转换模块”区域中的0E端子用导线相连接。(5)把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。(6)把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。(7)把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。(8)把“模数转换模块”区域中的INO端子用导线连接到自制的AD590电路上。(9)把“单片机系统”区域中的PO.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。1.程序设计内容(1)ADC0809的CLK信号由单片机的P3.3管脚提供(2)由于AD590的温度变化范围在一55℃一+150c之间,经过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)2.汇编源程序(略)3.C语言源程序ftincludeSincludeunsignedcharcodedispbitcode[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsignedchardispbuf[8]={10,10,10,0,0,0,0,10);unsignedchardispcount;unsignedchargetdata;unsignedlongtemp;unsignedchari;bitsflag;sbitST=P3P;sbit0E=P3」;sbitE0C=P3^2;sbitCLK=P3A3;sbitLED1=P3*6;sbitLED2=P37;sbitSPK=P3c5;voidmain(void)ST=O;0E=0;

160TM0D=0xl2;TH0=0x216;TL0=0x216;TH1-(65536-4000)/256;TL1-(65536-4000)%256;TR1=1;TR0=l;ET0=l;ET1=1;EA=1;ST=1;STR;getdata=148;while(l)voidtO(void)interrupt1using0(CLK=~CLK;voidtl(void)interrupt3using0TH1=(65536-4000)/256;TL1=(65536-4000)%256;if(E0C==l)(0E=l;getdata=P0;0E=0;temp=(getdata*2350);temp=temp/128;if(temp<2732)(temp=2732-temp;sflag=l;elsetemp=temp-2732;sflag=O;)i=3;dispbuf[0]=10;dispbuf[l]=10;dispbuf[2]=10:if(sflag==l)

161{dispbuf[7]=ll;)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;i++;)dispbuf[i]=temp;ST=1;ST-0;)Pl=dispcode[dispbuf[dispcount]];P2=dispbitcode[dispcount];dispcount++;if(dispcount==8)(dispcount=0;31.6位数显频率计数器1.实验任务利用AT89s51单片机的TO、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。2.电路原理图

1620P3O/RXDP31/TXDP324NT0P334NTIP34/TOP3yriP36/WRP37/RDvccISmmmJI12MHNGND图4.31.1]12S411ClRST―■■lOxF8E*PO.O/ADOPO1/AD1PO2/AD2P03/AD3P0.4/AD4P0.5/AD5P06/AD6PO7/AD7ALEPSENP27/A15P26/A14P25/A13P24/A12P23/AUP22/A10P21/A9P2.0/A8on-r9joo61-•G厂cisI-32C83029LED84s28S8U427S7mddp1.系统板上硬件连线(1)把“单片机系统”区域中的PO.O-PO.7与“动态数码显示"区域中的ABCDEFGH端口用8芯排线连接。(2)把“单片机系统”区域中的P2.0-P2.7与“动态数码显示"区域中的SIS2s3s4s5s6s7s8端口用8芯排线连接。(3)把“单片机系统”区域中的P3.4(TO)端子用导线连接到“频率产生器”区域中的WAVE端子上。2.程序设计内容(1)定时/计数器TO和T1的工作方式设置,由图可知,TO是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的TO,最大计数值为fosc/24,由于£皎=12配2,因此:TO的最大计数频率为250KHZ。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止TO的计数,而从TO的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。(2)T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。5.C语言源程序#includeunsignedunsignedcharcharcodedispbit[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsignedchardispbuf[8]={0,0,0,0,0,0,10,10);unsignedchartemp[8];unsignedchardispcount;unsignedcharTOcount;unsignedchartimecount;bitflag;unsignedlongx;

163voidmain(void){unsignedchari;TM0D=0xl2;TH0=0;TL0=0;TH1=(65536-4000)/256;TL1-(65536-4000)%256;TR1=1;TRO=1;ETO=1;ET1=1;EA=1;while(l)(if(flag==l)(flag=0;x=T0count*65536+TH0*256+TL0;for(i=0;i<8;i++)(tempLi]=0;i=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

164T0count++;)void11(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;32.电子密码锁设计1.实验任务根据设定好的密码,采用二个按键实现密码的输入功能,当密码输入正确之后,锁就打开,如果输入的三次的密码不正确,就锁定按键3秒钟,同时发现报警声,直到没有按键按下3种后,才打开按键锁定功能;否则在3秒钟内仍有按键按下,就重新锁定按键3秒时间并报警。2.电路原理图电路如图4.32.1所示。3.系统板上硬件连线(1)把“单片机系统”区域中的P0.0/AD0用导线连接到“音频放大模块”区域中的SPKIN端子上;(2)把“音频放大模块”区域中的SPKOUT端子接喇叭和;(3)把“单片机系统”区域中的P2.0/A8—P2.7/A15用8芯排线连接到“四路静态数码显示"区域中的任一个ABCDEFGH端子上;(4)把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L1端子上;(5)把“单片机系统”区域中的P3.6/WR、P3.7/RD用导线连接到“独立式键盘”区域中的SP1和SP2端子上:4.程序设计内容(1)密码的设定,在此程序中密码是固定在程序存储器ROM中,假设预设的密码为“12345”共5位密码。

165(2)密码的输入问题:由于采用两个按键来完成密码的输入,那么其中一个按键为功能键,另一个按键为数字键。在输入过程中,首先输入密码的长度,接着根据密码的长度输入密码的位数,直到所有长度的密码都已经输入完毕;或者输入确认功能键之后,才能完成密码的输入过程。进入密码的判断比较处理状态并给出相应的处理过程。(3)按键禁止功能:初始化时,是允许按键输入密码,当有按键按下并开始进入按键识别状态时,按键禁止功能被激活,但启动的状态在3次密码输入不正确的情况下发生的。图4.32.1嗣二3;二;又二K3一XHESdOXJ/在0i£o耨S88后Sasnrws▼TvzrdH2ullvs<3£SOVN复IOVnOd8unsignedcharcodeps[]={1,2,3,4,5};unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};unsignedcharpslen=9;unsignedchartemplen;unsignedchardigit;unsignedcharfuncount;unsignedchardigitcount;unsignedcharpsbuf[9];bitcmpflag;bithibitflag;biterrorflag;bitrightflag;unsignedintsecond3;unsignedintaa;unsignedintbb;bitalarmflag;bitexchangeflag;unsignedintcc;unsignedintdd;bitokflag;unsignedcharoka;

166unsignedcharokb;voidmain(void)(unsignedchari,j;P2=dispcode[digitcount];TM0D=0x01;THO二(65536-500)/256;TL0=(65536-500)%256;TRO=1;ETO-1;EA=1;while(l)(if(cmpflag==0)(if(P3_6==0)//functionkey(for(i=10;i>0;i-)for(j=248;j>0;j-);if(P3_6==0){if(hibitflag==0)(funcount++;if(funcount-pslen+2)(funcount=0;cmpflag=l;)Pl=dispcode[funcount];}else(second3=0;}while(P3_6=0);if(P3_7=0)//digitkey(for(i=10;i>0;i一一)for(j=248;j>0;j—);if(P3_7==0)(if(hibitflag==0)(digitcount++;if(digitcount==10)(digitcount=0;)

167P2=dispcode[digitcount];if(funcount==l)(pslen=digitcount;templen=pslen;)elseif(funcount>l)(psbuf[funcount-2]=digitcount;))else(second3=0;)while(P3_7==0);else(cmpflag=0;for(i=0;i

168bb=O;alarmflag=^alarmflag;)if(alarmflag==l)(P0_0=〜P0_0;aa++;if(aa==800)(aa=0;P0_l="P0_l;)second3++;if(second3=6400)(second3=0;hibitflag=O;errorflag=0;rightflag=0;cmpflag=0;P0_l=l;alarmflag=0;bb=O;aa=O;if((errorflag==0)&&(rightflag==l))(P0」=0;cc++;if(cc<1000){okflag=l;)elseif(cc<2000)(okflag=0;)else{errorflag=0;rightflag=0;hibitflag=O;cmpflag=0;P0」=l;cc=0;

169oka=0;okb=0;okflag=0;P0_0=l;)if(okflag==l)(oka++;if(oka==2)(oka=0;P0_0=~P0_0;))else(okb++;if(okb==3)(okb=0;P0_0=~P0_0;

17033.4X4键盘及8位数码管显示构成的电子密码锁1.实验任务用4X4组成0—9数字键及确认键。用8位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出“叮咚”声;若密码不正确,禁止按键输入3秒,同时发出“嘀、嘀”报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。2.电路原理图日日日日•—69wCS•FL日日日日-T令33a0K0苍SSKOMSK篇一K2S3Kisnd*arfcsssm=&图4.33.13.系统板上硬件连线(1)把“单片机系统”区域中的P0.0—P0.7用8芯排线连接到“动态数码显示"区域中的ABCDEFGH端子上。(2)把“单片机系统“区域中的P2.0—P2.7用8芯排线连接到“动态数码显示"区域中的S1S2S3S4S5S6S7S8端子上。(3)把“单片机系统”区域中的P3.0—P3.7用8芯排线连接到“4X4行列式键盘”区域中的R1R2R3R4C1C2C3C4端子上。(4)把“单片机系统”区域中的P1.0用导线连接到“八路发光二极管模块”区域中的L2端子上。

171(5)把“单片机系统”区域中的PL7用导线连接到“音频放大模块”区域中的SPKIN端子上。(6)把“音频放大模块”区域中的SPKOUT接到喇叭上。1.程序设计内容(1)4X4行列式键盘识别技术:有关这方面内容前面已经讨论过,这里不再重复。(2)8位数码显示,初始化时,显示“P”,接着输入最大6位数的密码,当密码输入完后,按下确认键,进行密码比较,然后给出相应的信息。在输入密码过程中,显示器只显示“8.”。当数字输入超过6个时,给出报警信息。在密码输入过程中,若输入错误,可以利用“DEL”键删除刚才输入的错误的数字。(3)4X4行列式键盘的按键功能分布图如图4.33.2所示:DelEnter图4.33.22.C语言源程序#includeunsignedcharps[]={l,2,3,4,5};unsignedcharunsignedcharcodedispbit[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};codedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40,0x73,Oxff};unsignedchardispbuf[8]={18,16,16,16,16,16,16,16);unsignedchardispcount;unsignedcharflashcount;unsignedchartemp;unsignedcharkey;unsignedcharkeycount;unsignedcharpslen=5;unsignedchargetps[6];bitkeyoverflag;biterrorflag;bitrightflag;unsignedintsecond3;unsignedintaa,bb;unsignedintcc;bitokflag;bitalarmflag;bithibitflag;unsignedcharoka,okb;

172voidmain(void)(unsignedchari,j;TM0D=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;TRO=1;ETO=1;EA=1;while(l)(P3=0xff;P3_4=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=10;i>0;i一)for(j=248;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;temp=P3;P1_1=>1_1;ifI(key>=0)&&(key<10))(if(keycount<6)(getps[keycount]=key;dispbuf[keycount+2]=19;)keycount++;if(keycount==6)

173(keycount=6;)elseif(keycount>6)(keycount=6;keyoverflag=l;//keyoverflow))elseif(key==12)//deletekey(if(keycount>0)(keycount一一;getpsLkeycount]=0;dispbuf[keycount+2]=16;}else(keyoverflag=l;}}elseif(key==15)//enterkey(if(keycount!=pslen)(errorflag=1;rightflag=0;second3=0;)else(for(i=0;i

174)temp=temp&OxOf;while(temp!=0x0f){temp=P3;temp=temp&OxOf;)keyoverflag=0;//?????????))P3=0xff;P3_5=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=10;i>0;i—)for(j=248;j>0;j—);temp=P3;temp=temp&OxOf;if(temp!=OxOf)(temp=P3;temp=temp&OxOf;switch(temp)(caseOxOe:key=4;break;caseOxOd:key=5;break;case0x0b:key=6;break;case0x07:key=ll;break;)temp=P3;P1_1=>1_1:if((key>=0)&&(key<10))if(keycount<6){

175getps[keycount]=key;dispbuf[keycount+2]=19;)keycount++;if(keycount==6)(keycount=6;)elseif(keycount>6)(keycount=6;keyoverflag=l;//keyoverflow))elseif(key==12)//deletekey(if(keycount>0)(keycount一一;getps[keycount]=0;dispbuf[keycount+2]=16;)else(keyoverflag=l;))elseif(key==15)//enterkey(if(keycount!=pslen)(errorflag=l;rightflag=0;second3=0;elsefor(i=0;i

176temp=P3;temp=temp&OxOf;)keyoverflag=0;//?????????))P3=0xff;P3_6=0;temp=P3;temp=temp&OxOf;if(temp!=0x0f)(for(i=10;i>0;i-)for(j=248;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;)temp=P3;P1_1="P1_1;if((key>=0)&&(key<10))(if(keycount<6)(getps[keycount]=key;dispbuf[keycount+2]=19;)keycount++;if(keycount==6)(

177keycount=6;Jelseif(keycount>6)(keycount=6;keyoverflag=l;//keyoverflow))elseif(key==12)//deletekey(if(keycount>0)(keycount―;getps[keycount]=0;dispbuf[keycount+2]=16;else(keyoverflag=l;))elseif(key==15)//enterkey(if(keycount!=pslen)(errorflag=l;rightflag=0;second3=0;else{for(i=0;i

178if(temp!=0x0f){for(i=10;i>0;i-)for(j=248;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;case0x0b:key=14;break;case0x07:key=15;break;)temp=P3;P1_1=>1_1;if((key>=0)&&(key<10))(if(keycount<6)(getps[keycount]=key;dispbuf[keycount+2]=19;}keycount++;if(keycount==6)(keycount=6;)elseif(keycount>6)(keycount=6;keyoverflag=l;//keyoverflow})elseif(key==12)//deletekey(

179if(keycount>0)(keycount—;getps[keycount]=0;dispbuf[keycount+2]=16;)else(keyoverflag=l;)}elseif(key==15)//enterkeyif(keycount!=pslen)(errorflag=l;rightflag=0;second3=0;)else(for(i=0;i

180TLO=(65536-500)%256;flashcount++;if(flashcount==8)(flashcount=0;PO=dispcode[dispbuf[dispcount]];P2=dispbit[dispcount];dispcount++;if(dispcount=8)(dispcount=0;))if((errorflag==l)&&(rightflag==0)){bb++;if(bb==800)(bb=O;alarmflag=^alarmflag;)if(alarmflag=l)//soundalarmsignal(P1_7=>1_7;)aa++;if(aa==800)//Iightalarmsignal(aa=0;Pl_0=>l_0;)second3++;if(second3==6400){second3=0;errorflag=0;rightflag=0;alarmflag=0;bb=O;aa=0;)

181)elseif((errorflag==0)&&(rightflag==l))(Pl_0-0;cc++;if(cc<1000){okflag=l;)elseif(cc<2000)okflag=0;)else(errorflag=0;rightflag=O;Pl_7=l;cc=O;oka=0;okb=0;okflag=0;P1_O=1;)if(okflag==l)(oka++;if(oka=2)(oka=0;Pl_7=〜Pl_7;))else{okb++;if(okb==3)(okb=0;Pl_7=〜Pl_7;if(keyoverflag==l)

182(P1_7=_P1_7;34.带有存储器功能的数字温度计一DS1624技术应用1.DS1624基本原理DS1624是美国DALLAS公司生产的集成了测量系统和存储器于一体的芯片。数字接口电路简单,与12c总线兼容,且可以使用一片控制器控制多达8片的DS1624。其数字温度输出达13位,精度为0.03125℃oDS1624可工作在最低2.7V电压下,适用于低功耗应用系统。(1)DS1624基本特性♦无需外围元件即可测量温度

183♦测量范围为-55℃〜+125C,精度为0.03125c♦测量温度的结果以13位数字量(两字节传输)给出♦测量温度的典型转换时间为1秒♦集成了256字节的E2PR0M非易性存储器♦数据的读出和写入通过一个2—线(/C)串行接口完成♦用8脚DIP或S0IC封装,如图2.34.1所示。(2)引脚描述及功能方框图其引脚描述如表1所示:SDASCI.NCGND弓脚•符号/描述QSDA~2-妓(PC)串行数据输入膈出“2aSCL«2-蛀(PC)串行时钟端。3~NO未连接•4-GND<(地.,52A2p会选地址输入A2c6“Ab方选地址输入A1.7~AO.B选地址输入AOp8“Vdd〃电源端(+27V〜+55V)•表1DS16乂弓图2.34.1DS1624的功能结构图如图4.34.2所示:状态寄存器及拴制逻辑•SOA0」E2PROM存储器(256字节)A1三A2-gne1W2DS1624内播结构图~图4.34.2(3)DS1624工作原理温度测量图4.34.3是温度测量的原理结构图

184图4.34.3温度测量的原理结构图DS1624在测量温度时使用了独有的在线温度测量技术。它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度。DS1624在计数器中预置了一个初值,它相当于一55℃。如果计数周期结束之前计数器达到0,已预置了此初值的温度寄存器中的数字就会增加,从而表明温度高于一55℃。与此同时,计数器斜坡累加电路被重新预置一个值,然后计数器重新对时钟计数,直到计数值为0。通过改变增加的每1℃内的计数器的计数,斜坡累加电路可以补偿振荡器的非线性误差,以提高精度,任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。DS1624通过这些计算可以得到0.03125c的精度,温度输出为13位,在发出读温度值请求后还会输出两位补偿值。表2给出了所测的温度和输出数据的关系。这些数据可通过2线制串行口连续输出,MSB在前,LSB在后。表2温度与输出数据关系表温度数字量输出(二进制)数字量输出(十六进制)+125℃0111,1101,0000,00007D00H+25.0625℃0001,1001,0001,00001910H+0.5℃0000,0000,1000,00000080H+0℃0000,0000,0000,00000000H-0.5℃1111,1111,1000,0000FF80H-25.0625℃1110,0110,1111,0000E6F0H-55℃1100,1001,0000,0000C900H由于数据在总线上传输时MSB在前,所以DS1624读出的数据可以是一个字节(分辨率为1C),也可以是两个字节,第二个字节包含的最低位为0.03125C。表2是13位温度寄存器中存储温度值的数据格式►<►<高八位字节低个位字节S|B14|B13]B12]Bll]BIO|B9|B8||B7|B6|B5|B4|B3|0|0|0禹薇宿的数据存储格式其中S—为符号位,当S=0时,表示当前的测量的温度为正的温度;当S=1时,表示当前的测量的温度为负的温度。B14-B3为当前测量的温度值。最低三位被设置为0。DS1624工作方式DS1621的工作方式是由片上的配置/状态寄存器来决定的,如表4,该寄存器的定义如下:表4配置/状态寄存器格式DONE1001011SH0T其中DONE为转换完成位,温度转换结束时置1,正在进行转换时为0;1SHOT为温度转换模式选择。1SH0T

185为1时为单次转换模式,DS1624在收到启动温度转换命令EEH后进行一次温度转换。1SH0T为0时为连续转换模式,此时DS1624将连续进行温度转换,并将最近一次的结果保存在温度寄存器中。该位为非易失性的。片内256字节存储器操作控制器对DS1624的存储器编程有两种模式:一种是字节编程模式,另一种是页编程模式。在字节编程模式中,主控制器发送地址和一个字节的数据到DS1624o在主器件发出开始(START)信号以后,主器件发送写控制字节即lOOlMiAoO(其中R/W控制位为低电平"0”)o指示从接收器被寻址,DS1624接收后应答,再由主器件发送访问存储器指令(17H)后,DS1624接收后应答,接着由主器件发送的下一个字节字地址将被写入到DS1624的地址指针。主器件接收到来自DS1624的另一个确认信号以后,发送数据字节,并写入到寻址的存储地址。DS1624再次发出确认信号,同时主器件产生停止条件STOP,启动内部写周期。在内部写周期DS1624将不产生确认信号。在页编程模式中,如同字节写方式,先将控制字节、访问存储器指令(17H)、字地址发送到DS1624,接着发N个数据字节,其中以8个字节为一个页面。主器件发送不多于一个页面字节的数据字节到DS1624,这些数据字节暂存在片内页面缓存器中,在主器件发送停止信号以后写入到存储器。接收每一个字节以后,低位顺序地址指针在内部加1。高位顺序字地址保持为常数。如果主器件在产生停止条件以前要发送多于一页字的数据,地址计数器将会循环,并且先接收到的数据将被覆盖。像字节写操作一样,一旦停止条件被接收到,则内部写周期将开始。存储器的读操作在这种模式下,主器件可以从DS1624的EEPROM中读取数据。主器件在发送开始信号之后,主器件首先发送写控制字节IOOIAzAAO,主器件接收到DS1624应答之后,发送访问存储器的指令(17H),收到DS1624的应答之后,接着发送字地址将被被写入到DS1624的地址指针。这时DS1624发送应答信号之后,主器件并没有发送停止信号,而是重新发送START开始信号,接着又发送读控制字节1001A2AA1,主器件接收到DS1624应答之后,开始接收DS1624送出来的数据,主器件每接收完一个字节的数据之后,都要发送一个应答信号给DS1624,直到主器件发送一个非应答信号或停止条件来结束DS1624的数据发送过程。DS1624的指令集数据和控制信息的写入读出是以表5和表6所示的方式进行的。在写入信息时,主器件输出从器件(即DS1624)的地址,同时R/W位置0。接收到响应位后,总线上的主器件发出一个命令地址,DS1624接收此地址后,产生响应位,主器件就向它发送数据。如果要对它进行读操作,主器件除了发出命令地址外,还要产生一个重复的启动条件和命令字节,此时R/W位为1,读操作开始。下面对它们的命令进行说明。访问存储器指令[17H]:该指令是对DS1624的EEPROM进行访问,发送该指令之后,下一个字节就是被访问存储器的字地址数据。访问设置寄存器指令[ACH]:如果R/W位置0,将写入数据到设置寄存器。发出请求后,接下来的一个字节被写入。如果R/W位置1,将读出存在寄存器中的值。读温度值指令[AAH]:即读出最后一个测温结果。DS1624产生两个字节,即为寄存器内的结果。开始测温指令[EEH]:此命令将开始一次温度的测量,不需再输入数据。在单次测量模式下,可在进行转换的同时使DS1624保持闲置状态。在连续模式下,将启动连续测温。停止测温指令[22H]:该命令将停止温度的测量,不需再输入数据。此命令可用来停止连续测温模式。发出请求后,当前温度测量结束,然后DS1624保持闲置状态。直到下一个开始测温的请求发出才继续进行连续测量。表5主机对DS1624写操作通信格式12c通信开主器件发送控制字节(DS162DS1624应答主器件发送访问DS1624DS1624应答主器件发送的数据字节DS1624应答I2C通信

186始4地址和写操作)的指令止表6主机对DS1624读操作通信格式FC通信开始主器件发送控制字节(DS1624地址和写操作)DS1624成答主器件发送访问DS1624的指令DS1624应答I2C通信开始主器件发送控制字节(DS1624地址和读操作)DS1624应答数据字节0主机应答数据字i'j1机非应答12c通信停止2.实验任务用一片DS1624完成本地数字温度的测量,并通过8位数码管显示出测量的温度值。其硬件电路图如图4.34.4所示3.电路原理图电路图如图4.34.4所示4.系统板上硬件连线(1)把“单片机系统”区域中的P0.0—P0.7用8芯排线连接到“动态数码显示"区域中的ABCDEFGH端子上。(2)把“单片机系统”区域中的P2.0—P2.7用8芯排线连接到“动态数码显示"区域中的S1S2S3S4S5S6S7S8端子上。(3)把DS1624芯片插入到“二线总线模块”区域中的8脚集成座上,注意芯片不插反。(4)把“二线总线模块”区域中的PIN1PIN2分别用导线连接到“单片机系统”区域中的PL6和PL7端子上。(5)把“二线总线模块”区域中的PIN4PIN5PIN6分别用导线连接到“电源模块”区域中的GND端子上。5.程序设计内容(1)由于DS1624是12c总线结构的串行数据传送,它只需要SDA和SCL两根线完成数据的传送过程。因此,我们在进行程序设计的时候,也得按着12c协议来对DS1624芯片数据访问。有关12c协议参看有关资料,这里不详述。对于AT89s51单片机本身没有12c硬件资源,所以必须用软件来模拟12c协议过程。(2)要从DS1624中读取温度值,首先启动DS1624的内部温度A/D开始转换,对应着有相应的命令用来启动开始温度转换,有关DS1624的指令集参考前面的叙述。一般情况下,DS1624经过一次温度的变换,需要经过1秒钟左右的时间,所以等待1秒钟后,即可读取内部的温度值,对于读取的温度值,仍然通过DS1624的指令集来完成温度的读取。但所有有数据的传送过程必须遵循I2C协议。

187£o123a.5.6711111111pppppppppaO/RXDP31/TXDPl2/TNTOr33/TNT】P34/TOSDAVDDSULAONCAlONDA2宿8APO.O/ADOPO1/AD1PO2/AD2PO3/AD3PO4/AD4P0.5/AD5PO6/AD6P0.7/AD7ALEPSENP27/A15P2K,A14I,-1,A13P24/A12P23/A11P22/A10P21/A9P2.0/A8灸OZISiCI71:fr।«*pL,..lavcc7r"r~isiS3□zi:□Zlr~m•FT1*6.C语言源程序#include#includeunsignedcharcodedisplaybit[]={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedisplaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedcharcodedotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};sbitSDA=Pr6;sbitSCL=P17unsignedchardisplaybuffer[8]={0,1,2,3,4,5,6,7};unsignedunsignedcharchareepromdata[8];temperdata[2];unsignedunsignedcharchartimecount;displaycount;bitsecondflag=0;

188unsignedcharsecondcount=0;unsignedcharretn;unsignedintresult;unsignedcharx;unsignedintk;unsignedintks;voiddelay(void);voiddelaylOms(void);voidi_start(void);voidi_stop(void);voidiinit(void);voidiack(void);biti_clock(void);biti_send(unsignedchari_data);unsignedchari_receive(void);bitstart_temperature_T(void);bitread_temperature_T(unsignedchar*p);voiddelay(void)(_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();)voiddelaylOms(void)(unsignedinti;for(i=0;i<1000;i++)(delay();voidi_start(void)(SOI;delayO;SDA=0;

189delay();SOO;delayO;voidistop(void)(SDA=0;delayO;SOI;delayO;SDA-1;delayO;SOO;delayO;)voidi_init(void)(SCL=O;i_stop();)voidiack(void)(SDA=0;i_clock();SDA=1;)biti_clock(void)(bitsample;SCL=1;delayO;sample=SDA;_nop_();_nop_();SOO;delayO;return(sample);bitisend(unsignedcharidata)unsignedchari;for(i=0;i<8;i++)

190(SDA=(bit)(i_data&0x80);i_data=i_data<<1;i_clock();)SDA=1;return(iclock());)unsignedcharireceive(void)(unsignedchari_data=0;unsignedchari;for(i=0;i<8;i++)(i_data*=2;if(iclockO)i_data++;)return(idata);)bitstart_temperature_T(void){i_start();if(i_send(0x90)){-if(isend(Oxee)){-i_stop();delay();return(l);)else(i_stop();delay();return(0);))else(i_stop();delayO;

191return(0);bitread_temperature_T(unsignedchar*p)(i_start();if(i_send(0x90)){一if(i_send(Oxaa)){一i_start();if(i_send(0x91))*(p+l)=i_receive();i_ack();*p=i_receive();i_stop();delayO;return(1);)else(i_stop();delay();return(0);else(i_stop();delayO;return(0);else(i_stop();delayO;return(0);voidmain(void)Pl=Oxff;

192timecount=0;displaycount=O;TM0D=0x21;THl=0x06;TLl=0x06;TR1=1;ET1=1;ETO=1;EA=1;if(starttemperature_T())〃向DS1624发送启动A/D温度转换命令,成功则启动TO定时secondflag=0;secondcount-O;TH0=55536/256;TL0=55536%256;TRO=1;while(l)(if(secondflag==l)(secondflag=0;TRO=O;if(read_temperature_T(temperdata))//TO定时Is时间到,读取DS1624的温度值{for(x=0;x<8;x++)(displaybuffer[x]=16;)x=2;result=temperdataLl];〃将读取的温度值进行数据处理,并送到显示缓冲区while(result/10)(displaybuffer[x]=resuIt%10;result=result/10;x++;)displaybuffer[x]=result;result=temperdata[O]:result=result»3;

193displaybuffer[0]=(dotcode[result])%10;

194displaybuffer[1]=(dotcode[result])/10;if(start_temperature_T())〃温度值数据处理完毕,重新启动DS1624开始温度转secondflag=0;secondcount=0TH0=55536/256TL0=55536%256TRO=1;//TO用于定时Is时间到voidtO(void)interrupt1using0(secondcount++;if(secondcount==100)(secondcount=0;secondflag=l;)TH0=55536/256;TL0=55536%256;void11(void)interrupt3using0{timecount++;if(timecount==4)(timecount=0;if(displaycount==5)//Tl定时1ms用数码管的动态刷新〃T1定时1ms到P0=(displaycode[displaybuffer[7-displaycount]]|0x80);〃在该位同时还要显示小数点else{PO=displaycode[displaybuffer[7-displaycount]];P2=displaybit[displaycount];displaycount++;if(displaycount==8)displaycount=0;

19535.DS18B20数字温度计使用1.DS18B20基本知识DS18B20数字温度计是DALLAS公司生产的1—Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。DS18B20产品的特点(a)只要求一个端口即可实现通信。(b)在DS18B20中的每个器件上都有独一无二的序列号。(c)实际应用中不需要外部任何元器件即可实现测温。(d)测量温度范围在-55c到+125,C之间。(e)数字温度计的分辨率用户可以从9位到12位选择。(f)内部有温度上、下限告警设置。2、DS18B20的引脚介绍T0—92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。图1(底视图)表1DS18B20详细引脚功能描述序号名称引脚功能描述1GND地信号2DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。3.DS18B20的使用方法由于DS18B20采用的是l-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89s51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20的复位时序

196VEDGNDa主机发出复位脉冲一~主机褛收历高短嵬时间15s[<-DS18B20发附・,—►应答脉冲一:<'.I;最小值,480us最大值;960usDS18B20的复位时序图,DS18B20的读时序对于DS18B20的读时序分为读0时序和读1时序两个过程。对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。DS18B20的写时序对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样10总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。3.实验任务用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在一20度到+100度之间,用8位数码管显示出来。4.电路原理图

197P30/RXDP3.1/TXDP32/INTOP33/INTTP3.4/T0P3.5/T1P3.6/WRP3.7/RD01234567111111^4ppppppppLU.U/AUUP0.1/AD1P0.2/AD2PO.3/AD3P04/AD4PO5/AD5P06/AD6P0.7/AD7ALEPSENP2.7/A15P26/A14P25/A13P24/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8-gXoGNDDQbI—1—1siS3m::匚口d:7b1—1—1SI绘HI:S4me6。859S94£0Z.S103£09011280IO12128S£0LED84SU33.系统板上硬件连线(1)把“单片机系统”区域中的PO.O-PO.7用8芯排线连接到“动态数码显示"区域中的ABCDEFGH端子上。(2)把“单片机系统”区域中的P2.0—P2.7用8芯排线连接到“动态数码显示"区域中的S1S2S3S4S5S6S7S8端子上。(3)把DS18B20芯片插入“四路单总线”区域中的任一个插座中,注意电源与地信号不要接反。(4)把“四路单总线”区域中的对应的DQ端子连接到“单片机系统”区域中的P3.7/RD端子上。4.C语言源程序^include#includeunsignedcharcodedisplaybitLJ={Oxfe,Oxfd,Oxfb,0xf7,Oxef,Oxdf,Oxbf,0x7f};unsignedcharcodedisplaycode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40);unsignedcharcodedotcode[32]={0,3,6,9,12,16,19,22,25,28,31,34,38,41,44,48,50,53,56,59,63,66,69,72,75,78,81,84,88,91,94,97};unsignedchardisplaycount;unsignedchardisplaybuf[8]={16,16,16,16,16,16,16,16);unsignedchartimecount;unsignedcharreaddata[8];sbitDQ=P3,;bitsflag;

198bitresetpulse(void)(unsignedchari;DQ=0;for(i=255;i>0;i--);DQ=1;for(i=60;i>0;i-);return(DQ);for(i=200;i>0;i--);)voidwritecommandtodsl8b20(unsignedcharcommand)(unsignedchari;unsignedcharj;for(i=0;i<8;i++)(if((command&0x01)==0)(DQ=O;for(j=35;j>0;j—);DQ=1;)else(DQ=O;for(j=2;j>0;j-);DQ=1;for(j=33;j>0;j-);)command=_cror__(command,1);unsignedcharreaddatafromdsl8b20(void)(unsignedchari;unsignedcharj;unsignedchartemp;temp=0;for(i=0;i<8;i++)temp=_cror_(temp,1);

199DQ=O;_nop_();_nop_();DQ=1;for(j=10;j>0;j—);if(DQ==l)!temp=temp|0x80;)else(temp=temp|0x00;)for(j=200;j>0;j—);)return(temp);)voidmain(void)(TM0D=0x01;TH0=(65536-4000)/256;TL0=(65536-4000)%256;ETO=1;EA=1;while(resetpulse());writecommandtodsl8b20(Oxcc);writecommandtodsl8b20(0x44);TRO=1;while(l)voidtO(void)interrupt1using0(unsignedcharx;unsignedintresult:THO=(65536-4000)/256;TLO=(65536-4000)%256:if(displaycount==2)PO=displaycode[displaybuf[displaycount]]0x80;)else(P0=displaycode[displaybuf[displaycount]];)P2=displaybit[displaycount];displaycount++;if(displaycount==8)(displaycount=0;)timecount++;

200if(timecount==150)(timecount=0;while(resetpulse());writecommandtodsl8b20(Oxcc);writecommandtodsl8b20(Oxbe);readdata[0]=readdatafromds18b20();readdata[1]=readdatafromds18b20();for(x=0;x<8;x++){displaybuf[x]=16;)sflag=0;if((readdata[1]&0xf8)!=0x00){sflag=l;readdata[l]=^readdataLl];readdata[0]=^readdata[0];result=readdataL0]+l;readdata[0]=result;if(result>255)(readdata[1]++;}}readdata[1]=readdata[1]<<4;readdata[1]=readdata[1]&0x70;x二readdata[0];x=x»4;x=x&OxOf;readdata[1]=readdata[1]x;x=2;result=readdata[1];while(result/10){displaybuf[x]=result%10;result二resuIt/10;x++;)displaybuf[x]=result;if(sflag==l){displaybuf[x+1]=17;)x=readdata[0]&OxOf;x=x«l;displaybuf[0]=(dotcode[x])%10;displaybuf[l]=(dotcode[x])/10;while(resetpulse());

201writecommandtodsl8b20(Oxcc);writecommandtodsl8b20(0x44);}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭