51系列微控制器实验及实践教程_第1页
51系列微控制器实验及实践教程_第2页
51系列微控制器实验及实践教程_第3页
51系列微控制器实验及实践教程_第4页
51系列微控制器实验及实践教程_第5页
已阅读5页,还剩260页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51系列微控制器实验及实践教程PAGEPAGE351系列微控制器实验及实践教程目录实验及实践课题┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅281.闪烁灯┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅282.模拟开关灯┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅313.多路开关状态指示┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅334.广告灯的左移右移┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅375.广告灯(利用取表方式)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅406.报警产生器┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅437.I/O并行口直接驱动LED显示┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅468.按键识别方法之一┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅499.一键多功能按键识别技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅5310.00-99计数器┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅5711.00-59秒计时器(利用软件延时)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅6012.可预置可逆4位计数器┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅6313.动态数码显示技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅6714.4×4矩阵式键盘识别技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅7015.定时计数器T0作定时应用技术(一)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅7916.定时计数器T0作定时应用技术(二)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅8417.99秒马表设计┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅8918.“嘀、嘀、……”报警声┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅9519.“叮咚”门铃┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅9920.数字钟(★)┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅10521.拉幕式数码显示技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅11422.电子琴┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅12123.模拟计算器数字输入及显示┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅13424.8×8LED点阵显示技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅14125.点阵LED“0-9”数字显示技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅26.点阵式LED简单图形显示技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅15327.ADC0809A/D转换器基本应用技术┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅15728.数字电压表┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅16329.两点间温度控制┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅16730.四位数数字温度计┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅17231.6位数显频率计数器┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅17732.电子密码锁设计┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅18033.4×4键盘及8位数码管显示构成的电子密码锁┅┅┅┅┅┅┅┅┅┅┅18634.带有存储器功能的数字温度计-DS1624技术应用┅┅┅┅┅┅┅┅┅┅19935.DS18B20数字温度计使用┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅211单片机学习准备工作在你决定学习单片机之前,请做好如下准备工作:硬件准备:计算机一台。编程器一只、89C51一片,实验板一块,再准备一只仿真机,其它常规工具。如果你想学单片机,而又不愿做这些投资,我劝你最好还是放弃,否则可能只会挫伤你学习的积极性和浪费你的时间。好在这些投资并不算多。

学习方案:编程器+仿真器+试验板编程器:商品化的一般至少伍、六百以上。但现在网上有好多朋友都提供编程器的资料,如果你身边有高手,不妨请他们帮助你做一个吧!不过几十元的代价。如果没有这个条件,我推荐你用可以串行烧写芯片(即芯片具有ISP功能),如STC系列的单片机,价格便宜(不大于10元)。前言:单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统,数据采集系统、智能化仪器仪表,及通讯设备、日常消费类产品、玩具等。并且已经深入到工业生产的各个环节以及人民生活的各层次中,如车间流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等,无不含有CPU控制器,即单片机。为适应目前人才紧缺的状态、各大、中专院校、高职、技校等纷纷增加及扩大的单片机教学的需要,着眼于培养单片机人才、单片机工程师。传统的单片机教学,均是以单片机的结构为主线,先讲单片机的硬件结构,然后是指令,然后是软件编程,然后是单片机系统的扩展和各种外围器件的应用,最后再讲一些实例。按照此种教学结构,按照这种结构,学生普遍感到难学。试想,一个从未接触过计算机结构的人,甚至数字电路也是刚刚接触的人,要他去理解单片机内部结构,这实在不是个容易的事,至于很多书一开始就提出的总线、地址等概念,更是初学者难以理解的——不管用什么巧妙的比方都不容易理解。于是糊里糊涂地学完了第一部份,第二部份一开始就是寻址方式,更抽象,好多人直到学完单片机还不能理解寻址方式究竟是什么意思,为什么需要这么多寻址方式,刚开始学当然更不懂了。然后是指令,111条指令,又不分个重点,反正全是要记住的,等到指令全部学完,大部份人已对单片机望尔生畏,开始打退堂鼓了。第三部份是编程,如果说前面的东西不能理解,还能靠记忆来获得知识的话,这部份就纯是理解和掌握了,如果以前没学过编程,短时间内很难掌握编程的有关知识,更不必说编程技巧了。可是教材上明明规定,要编出这样、那样的程序,学的人编不出来,当然只会认为,教材的要求当然是合理的,应该做到的,我做不到就是我没学好,于是很多人长叹一声:单片机太难学了!放弃吧。可是到这里还根本不知道一个单片机开发的完整过程是什么,什么是编程器还不知道。后面的就不说了,总之,现在教材,基本都是以单片机为蓝本来学习计算机原理,而不纯为学习单片机技术,在教材、教学过程的安排上又没有考虑人的接受能力,使得学习的过程是一个充满不断挫折的过程,于是很多人认为单片机入门难。基于以上情况,以任务为教学单元,打破原有界限,不管硬件结构、指令、编程的先后顺序,将各部份知识分解成一个个知识点,为了完成一个任务抽取每个部份的不同知识点,加以组合,完成第一个任务就能清楚单片机的开发过程,完成第二、三个任务,就能自已模仿性地编出自已的程序,使得学习过程是一个不断成功地完成任务的过程。当所有任务全部完成,知识点就全学完了。即便只完成部份任务,也可以去做一些程序了。事实并没有必要学完全部知识才可以去做开发的,我在大三时找了一个家电子产品开发公司,当时我还不知道如何将编好的程序写到单片机中,对51单片机的定时器怎么用,中断到底在什么时候用都不清楚。51单片机的编程器是什么样,仿真器还是马老师借给我一台启东单片机公司开发的很老的仿真器,程序要自己转成机器码,通过手动输入到仿真器的RAM中,然后运行,太难玩了!对51还不是很了解,公司就要好在1 5天内把MSP430相关的资料看明白!如果能开发就留下,否则就离开!在这种压力下我开始了我的单片机开发之路!第一章常用的电子元件介绍电阻的分类和作用一.电阻的种类:1、线绕电阻器:通用线绕电阻器、精密线绕电阻器、大功率线绕电阻器、高频线绕电阻器。

2、薄膜电阻器:碳膜电阻器、合成碳膜电阻器、金属膜电阻器、金属氧化膜电阻器、化学沉积膜电阻器、玻璃釉膜电阻器、金属氮化膜电阻器。

3、实心电阻器:无机合成实心碳质电阻器、有机合成实心碳质电阻器。

4、敏感电阻器:压敏电阻器、热敏电阻器、光敏电阻器、力敏电阻器、气敏电阻器、湿敏电阻器。

二、主要特性参数

1、标称阻值:电阻器上面所标示的阻值。

2、允许误差:标称阻值与实际阻值的差值跟标称阻值之比的百分数称阻值偏差,它表示电阻器的精度。允许误差与精度等级对应关系如下:±0.5%-0.05、±1%-0.1(或00)、±2%-0.2(或0)、±5%-Ⅰ级、±10%-Ⅱ级、±20%-Ⅲ级

3、额定功率:在正常的大气压力90-106.6KPa及环境温度为-55℃~+70℃的条件下,电阻器长期工作所允许耗散的最大功率。

线绕电阻器额定功率系列为(W):1/20、1/8、1/4、1/2、1、2、4、8、10、16、25、40、50、75、100、150、250、500

非线绕电阻器额定功率系列为(W):1/20、1/8、1/4、1/2、1、2、5、10、25、50、100

4、额定电压:由阻值和额定功率换算出的电压。

5、最高工作电压:允许的最大连续工作电压。在低气压工作时,最高工作电压较低。

6、温度系数:温度每变化1℃电容的分类和作用

一.电容的分类

电容,由两个金属极,中间夹有绝缘材料(介质)构成。由于绝缘材料的不同,所构成的电容器的种类也有所不同:

按结构可分为:固定电容,可变电容

按介质材料可分为:空气电容、液体电容、无机固体电容、有机固体电容、电解电容。

按极性分为:有极性电容和无极性电容。

电容在电路中具有隔断直流电,通过交流电的作用,因此常用于级间耦合、滤波、去耦、旁路及信号调谐

二、电容的符号

电容的符号同样分为国内标表示法和国际电子符号表示法,但电容符号在国内和国际表示都差不多,唯一的区别就是在有极性电容上,国内的是一个空筐下面一根横线,而国际的就是普通电容加一个"+"符号代表正极。(见下图)

三、电容的单位

电阻的基本单位是:F(法),此外还有μF(微法)、pF(皮法),另外还有一个用的比较少的单位,那就是:nF(纳法)。电容F的容量很大,我们看到的一般都是μF、nF、pF的单位,而不是F的单位。

它们之间的具体换算关系如下:

1F=1000000μF

1μF=1000nF

1nF=1000pF

四、电容的耐压单位:V(伏特)

每一个电容都有它的耐压值,这是电容的重要参数之一。普通无极性电容的标称耐压值有:63V、100V、160V、250V、400V、600V、1000V等,有极性电容的耐压值相对要比无极性电容的耐压要低,一般的标称耐压值有:4V、6.3V、10V、16V、25V、35V、50V、63V、80V、100V、220V、400V等。

五、电容的种类

电容的种类可以从原理上分为:无极性可变电容、无极性固定电容、有极性电容等,从材料上可以分为:CBB电容(聚乙烯),涤纶电容、瓷片电容、云母电容、独石电容、电解电容、钽电容等。

各种电容的优缺点及用途

无极性可变电容

制作工艺:1、可旋转动片为陶瓷片表面镀金属薄膜,定片为镀有金属膜的陶瓷底座;动片为同轴金属片,定片为有机薄膜片作介质

优点:容易生产,技术含量低。

缺点:体积大,容量小

用途:改变震荡及谐振频率电路。调频、调幅、发射/接收电路

无极性无感CBB电容

制作工艺:2层聚丙乙烯塑料和2层金属箔交替夹杂然后捆绑而成。

优点:无感,高频特性好,体积较小

缺点:不适合做大容量,价格比较高,耐热性能较差。

用途:耦合/震荡,音响,模拟/数字电路,高频电源滤波/退耦

无极性CBB电容

制作工艺:2层聚乙烯塑料和2层金属箔交替夹杂然后捆绑而成。

优点:有感,高频特性好,体积较小

缺点:不适合做大容量,价格比较高,耐热性能较差。

用途:耦合/震荡,模拟/数字电路,电源滤波/退耦

无极性瓷片电容

制作工艺:薄瓷片两面渡金属膜银而成。

优点:体积小,耐压高,价格低,频率高(有一种是高频电容)

缺点:易碎!容量低

用途:高频震荡、谐振、退耦、音响

无极性云母电容

制作工艺:云母片上镀两层金属薄膜

优点:容易生产,技术含量低。

缺点:体积大,容量小

用途:震荡、谐振、退耦及要求不高的电路

无极性独石电容

体积比CBB更小,其他同CBB,有感

用途:模拟/数字电路信号旁路/滤波,音响

有极性电解电容

制作工艺:两片铝带和两层绝缘膜相互层叠,转捆后浸在电解液中。

优点:容量大。

缺点:高频特性不好。

用途:低频级间耦合、旁路、退耦、电源滤波、音响

钽电容

制作工艺:用金属钽作为正极,在电解质外喷上金属作为负极。

优点:稳定性好,容量大,高频特性好。

缺点:造价高。

用途:高精度电源滤波、信号级间耦合、高频电路、音响电路

六、电容的标称及识别方法

1.由于电容体积要比电阻大,所以一般都使用直接标称法。如果数字是0.001,那它代表的是0.001uF=1nF,如果是10n,那么就是10nF,同样100p就是100pF。

2.不标单位的直接表示法:用1~4位数字表示,容量单位为pF,如350为350pF,3为3pF,0.5为0.5pF

3.色码表示法:沿电容引线方向,用不同的颜色表示不同的数字,第一,

二种环表示电容量,第三种颜色表示有效数字后零的个数(单位为pF)

颜色意义:黑=0、棕=1、红=2、橙=3、黄=4、绿=5、蓝=6、紫=7、灰=8、白=9。

有极性电容的识别:看它上面的标称,一般有标出容量和正负极,也有用引脚长短来区别正负极长脚为正,短脚为负。七、电容特点列表极性名称制作优点缺点无无感CBB电容2层聚丙乙烯塑料和2层金属箔交替夹杂然后捆绑而成。无感,高频特性好,体积较小不适合做大容量,价格比较高,耐热性能较差。无CBB电容2层聚乙烯塑料和2层金属箔交替夹杂然后捆绑而成。有感,其他同上。无瓷片电容薄瓷片两面渡金属膜银而成。体积小,耐压高,价格低,频率高(有一种是高频电容)易碎!容量低无云母电容云母片上镀两层金属薄膜容易生产,技术含量低。体积大,容量小,(几乎没有用了)无独石电容体积比CBB更小,其他同CBB,有感有电解电容两片铝带和两层绝缘膜相互层叠,转捆后浸泡在电解液(含酸性的合成溶液)中。容量大。高频特性不好。有钽电容用金属钽作为正极,在电解质外喷上金属作为负极。稳定性好,容量大,高频特性好。造价高。(一般用于关键地方)第二章烙铁正确的使用使用可调式的衡温烙铁较好;1.助焊剂,用25%的松香溶解在75%的酒精(重量比)中作为助焊剂。2.电烙铁使用前要上锡,必须让烙铁嘴“吃锡”,具体方法是:将电烙铁烧热,待刚刚能熔化焊锡时,涂上助焊剂,再用焊锡均匀地涂在烙铁头上,使烙铁头均匀的吃上一层锡。;3.平时不用烙铁的时候,要让烙铁嘴上保持有一定量的锡,不可把烙铁嘴在海棉上清洁后存放于烙铁架上;4.海棉需保持有一定量水份,至使海棉一整天湿润;5.拿起烙铁开始使用时,需清洁烙铁嘴,但在使用过程中无需将烙铁嘴拿到海棉上清洁,只需将烙铁嘴上的锡搁入集锡硬纸盒内,这样保持烙铁嘴之温度不会急速下降,若IC上尚有锡提取困难,再加一些锡上去(因锡丝中含有助焊剂),就可以轻松地提取多的锡下来了;6.烙铁温度在340~380度之间为正常情况,若部分敏感元件只可接受240~280度的焊接温度;7.烙铁嘴发赫,不可用刀片之类的金属器件处理,而是要用松香或锡丝来解决;8.每天用完后,先清洁,再加足锡,然后马上切断电源9.焊接方法,用烙铁头沾取适量焊锡,接触焊点,待焊点上的焊锡全部熔化并浸没元件引线头后,电烙铁头沿着元器件的引脚轻轻往上一提离开焊点。如果把焊盘和元件的引脚用细砂纸打磨干净,涂上助焊剂。

10、焊接时间不宜过长,否则容易烫坏元件,必要时可用镊子夹住管脚帮助散热。

11、焊点应呈正弦波峰形状,表面应光亮圆滑,无锡刺,锡量适中。

12、焊接完成后,要用酒精把线路板上残余的助焊剂清洗干净,以防炭化后的助焊剂影响电路正常工作。

13、集成电路应最后焊接,电烙铁要可靠接地,或断电后利用余热焊接。或者使用集成电路专用插座,焊好插座后再把集成电路插上去。

14、电烙铁应放在烙铁架上。第二章KeilC软件使用KeilC51软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM语言和C语言的程序设计,界面友好,易学易用。下面介绍KeilC51软件的使用方法进入KeilC51后,屏幕如下图所示。几秒钟后出现编辑界启动KeilC51时的屏幕进入KeilC51后的编辑界面简单程序的调试学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习KeilC51软件的基本使用方法和基本的调试技巧。1)建立一个新工程单击Project菜单,在弹出的下拉菜单中选中NewProject选项2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51如下图所示,然后点击保存.3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keilc51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定.4)完成上一步骤后,屏幕如下图所示到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项新建文件后屏幕如下图所示此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名必须为(.asm)。然后,单击“保存”按钮。6)回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上单击右键,弹出如下菜单然后单击“AddFiletoGroup‘SourceGroup1’”屏幕如下图所示选中Test.c,然后单击“Add”屏幕好下图所示注意到“SourceGroup1”文件夹中多了一个子项“Text1.c”了吗?子项的多少与所增加的源程序的多少相同7)现在,请输入如下的C语言源程序:#include<reg52.h>//包含文件#include<stdio.h>voidmain(void)//主函数{SCON=0x52;TMOD=0x20;TH1=0xf3;TR1=1;//此行及以上3行为PRINTF函数所必须printf(“HelloIamKEIL.\n”);//打印程序执行的信息printf(“Iwillbeyourfriend.\n”);while(1);}在输入上述程序时,读者已经看到了事先保存待编辑的文件的好处了吧,即Keilc51会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。程序输入完毕后,如下图所示8)在上图中,单击“Project”菜单,再在下拉菜单中单击“BuiltTarget”选项(或者使用快捷键F7),编译成功后,再单击“Project”菜单,在下拉菜单中单击“Start/StopDebugSession”(或者使用快捷键Ctrl+F5),屏幕如下所示9)调试程序:在上图中,单击“Debug”菜单,在下拉菜单中单击“Go”选项,(或者使用快捷键F5),然后再单击“Debug”菜单,在下拉菜单中单击“StopRunning”选项(或者使用快捷键Esc);再单击“View”菜单,再在下拉菜单中单击“SerialWindows#1”选项,就可以看到程序运行后的结果,其结果如下图所示至此,我们在KeilC51上做了一个完整工程的全过程。但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢?10)单击“Project”菜单,再在下拉菜单中单击“”在下图中,单击“Output”中单击“CreateHEXFile”选项,使程序编译后产生HEX代码,供下载器软件使用。把程序下载到AT89S51单片机中。第四章实验及实践课题1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。2.电路原理图图4.1.13.硬件连线4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒因此,上面的延时程序时间为10.002ms。由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY:MOVR5,#20D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETBP1.0指令使P1.0端口输出高电平,使用CLRP1.0指令使P1.0端口输出低电平。5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG0START:CLRP1.0LCALLDELAYSETBP1.0LCALLDELAYLJMPSTARTDELAY:MOVR5,#20;延时子程序,延时0.2秒D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND7.C语言源程序#include<AT89X51.H>sbitL1=P1^0;voiddelay02s(void)//延时0.2秒子程序{unsignedchari,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}voidmain(void){while(1){L1=0;delay02s();L1=1;delay02s();}}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。2.电路原理图3.系统板上硬件连线4.程序设计内容(1).开关状态的检测过程单片机对开关状态的检测相对于单片机来说,是从单片机的P3.0端口输入信号,而输入的信号只有高电平和低电平两种,当拨开开关K1拨上去,即输入高电平,相当开关断开,当拨动开关K1拨下去,即输入低电平,相当开关闭合。单片机可以采用JBBIT,REL或者是JNBBIT,REL指令来完成对开关状态的检测即可。(2).输出控制如图3所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETBP1.0指令使P1.0端口输出高电平,使用CLRP1.0指令使P1.0端口输出低电平。5.程序框图开始K1开关闭合了吗?L1亮L1灭图4.2.26.汇编源程序ORG00HSTART:JBP3.0,LIGCLRP1.0SJMPSTARTLIG:SETBP1.0SJMPSTARTEND7.C语言源程序#include<AT89X51.H>sbitK1=P3^0;sbitL1=P1^0;voidmain(void){while(1){if(K1==0){L1=0;//灯亮}else{L1=1;//灯灭}}}3.多路开关状态指示1.实验任务如图4.3.1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。2.电路原理图图4.3.13.系统板上硬件连线4.程序设计内容(1.开关状态检测对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JBP1.X,REL或JNBP1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOVA,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。(2.输出控制根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETBP1.X和CLRP1.X指令来完成,也可以采用MOVP1,#1111XXXXB方法一次指示。5.程序框图6.方法一(汇编源程序)ORG00HSTART:MOVA,P1ANLA,#0F0HRRARRARRARRAXORA,#0F0HMOVP1,ASJMPSTARTEND7.方法一(C语言源程序)#include<AT89X51.H>unsignedchartemp;voidmain(void){while(1){temp=P1>>4;temp=temp|0xf0;P1=temp;}}8.方法二(汇编源程序)ORG00HSTART:JBP1.4,NEXT1CLRP1.0SJMPNEX1NEXT1:SETBP1.0NEX1:JBP1.5,NEXT2CLRP1.1SJMPNEX2NEXT2:SETBP1.1NEX2:JBP1.6,NEXT3CLRP1.2SJMPNEX3开始读P1口数据到ACCACC内容右移4次ACC内容与F0H相或ACC内容送入P1口NEXT3:SETBP1.2NEX3:JBP1.7,NEXT4CLRP1.3SJMPNEX4NEXT4:SETBP1.3NEX4:SJMPSTARTEND9.方法二(C语言源程序)#include<AT89X51.H>voidmain(void){while(1){if(P1_4==0){P1_0=0;}else{P1_0=1;}if(P1_5==0){P1_1=0;}else{P1_1=1;}if(P1_6==0){P1_2=0;}else{P1_2=1;}if(P1_7==0){P1_3=0;}else{P1_3=1;}}}4.广告灯的左移右移1.实验任务做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。2.电路原理图图4.4.13.系统板上硬件连线4.程序设计内容我们可以运用输出端口指令MOVP1,A或MOVP1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。每次送出的数据是不同,具体的数据如下表1所示5.程序框图图4.4.26.汇编源程序ORG0START:MOVR2,#8MOVA,#0FEHSETBCLOOP:MOVP1,ALCALLDELAYRLCADJNZR2,LOOPMOVR2,#8LOOP1:MOVP1,ALCALLDELAYRRCADJNZR2,LOOP1LJMPSTARTDELAY:MOVR5,#20;D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1RETEND7.C语言源程序#include<AT89X51.H>unsignedchari;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--);}voidmain(void){while(1){temp=0xfe;P1=temp;delay();for(i=1;i<8;i++){a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++){a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}5.广告灯(利用取表方式)1.实验任务利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)。2.电路原理图图4.5.13.系统板上硬件连线4.程序设计内容在用表格进行程序设计的时候,要用以下的指令来完成(1).利用MOVDPTR,#DATA16的指令来使数据指针寄存器指到表的开头。(2).利用MOVCA,@A+DPTR的指令,根据累加器的值再加上DPTR的值,就可以使程序计数器PC指到表格内所要取出的数据。因此,只要把控制码建成一个表,而利用MOVC工,@A+DPTR做取码的操作,就可方便地处理一些复杂的控制动作,取表过程如下图所示:5.程序框图图4.5.26.汇编源程序ORG0START:MOVDPTR,#TABLELOOP:CLRAMOVCA,@A+DPTRCJNEA,#01H,LOOP1JMPSTARTLOOP1:MOVP1,AMOVR3,#20LCALLDELAYINCDPTRJMPLOOPDELAY:MOVR4,#20D1:MOVR5,#248DJNZR5,$DJNZR4,D1DJNZR3,DELAYRETTABLE:DB0FEH,0FDH,0FBH,0FDB0EFH,0DFH,0BFH,07FHDB0FEH,0FDH,0FBH,0F7HDB0EFH,0DFH,0BFH,07FHDB07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB07FH,0BFH,0DFH,0EFHDB0F7H,0FBH,0FDH,0FEHDB00H,0FFH,00H,0FFHDB01HEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,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--);}voidmain(void){while(1){if(table[i]!=0x01){P1=table[i];i++;delay();}else{i=0;}}}6.报警产生器1.实验任务用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。2.电路原理图图4.6.13.系统板上硬件连线4.程序设计内容(1.信号产生的方法500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次;5.程序框图图4.6.26.汇编源程序FLAGBIT00HORG00HSTART:JBP1.7,STARTJNBFLAG,NEXTMOVR2,#200DV:CPLP1.0LCALLDELY500LCALLDELY500DJNZR2,DVCPLFLAGNEXT:MOVR2,#200DV1:CPLP1.0LCALLDELY500DJNZR2,DV1CPLFLAGSJMPSTARTDELY500:MOVR7,#250LOOP:NOPDJNZR7,LOOPRETEND7.C语言源程序#include<AT89X51.H>#include<INTRINS.H>bitflag;unsignedcharcount;voiddely500(void){unsignedchari;for(i=250;i>0;i--){_nop_();}}voidmain(void){while(1){if(P1_7==0){for(count=200;count>0;count--){P1_0=~P1_0;dely500();}for(count=200;count>0;count--){P1_0=~P1_0;dely500();dely500();}}}}7.I/O并行口直接驱动LED显示1.实验任务如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔0.2秒。2.电路原理图图4.7.13.系统板上硬件连线把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个数码管的a-h端口上;要求:P0.0/AD0与a相连,P0.1/AD1与b相连,P0.2/AD2与c相连,……,P0.7/AD7与h相连。4.程序设计内容(1.LED数码显示原理七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2“0”3FH“8”7FH“1”06H“9”6FH“2”5BH“A”77H“3”4FH“b”7CH“4”66H“C”39H“5”6DH“d”5EH“6”7DH“E”79H“7”07H“F”71H(2.由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH5.程序框图图4.7.26.汇编源程序ORG0START:MOVR1,#00HNEXT:MOVA,R1MOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ALCALLDELAYINCR1CJNER1,#10,NEXTLJMPSTARTDELAY:MOVR5,#20D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedchardispcount;voiddelay02s(void){unsignedchari,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}voidmain(void){while(1){for(dispcount=0;dispcount<10;dispcount++){P0=table[dispcount];delay02s();}}}8.按键识别方法之一1.实验任务每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。2.电路原理图图4.8.13.系统板上硬件连线4.程序设计方法(1.其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,图4.8.2要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如上图所示:从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。(2.对于按键识别的指令,我们依然选择如下指令JBBIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。或者是JNBBIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL处执行程序,否则就继续向下执行程序。(3.但对程序设计过程中按键识别过程的框图如右图所示:图4.8.35.程序框图图4.8.46.汇编源程序ORG0START:MOVR1,#00H;初始化R7为0,表示从0开始计数MOVA,R1;CPLA;取反指令MOVP1,A;送出P1端口由发光二极管显示REL:JNBP3.7,REL;判断SP1是否按下LCALLDELAY10MS;若按下,则延时10ms左右JNBP3.7,REL;再判断SP1是否真得按下INCR7;若真得按下,则进行按键处理,使MOVA,R7;计数内容加1,并送出P1端口由CPLA;发光二极管显示MOVP1,A;JNBP3.7,$;等待SP1释放SJMPREL;继续对K1按键扫描DELAY10MS:MOVR6,#20;延时10ms子程序L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETEND7.C语言源程序#include<AT89X51.H>unsignedcharcount;voiddelay10ms(void){unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}voidmain(void){while(1){if(P3_7==0){delay10ms();if(P3_7==0){count++;if(count==16){count=0;}P1=~count;while(P3_7==0);}}9.一键多功能按键识别技术1.实验任务如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。2.电路原理图图4.9.13.系统板上硬件连线4.程序设计方法(1.设计思想由来在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。(2.设计方法从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;当L2在闪烁时,ID=1;当L3在闪烁时,ID=2;当L4在闪烁时,ID=3;很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。下面给出有关程序设计的框图。5.程序框图图4.9.26.汇编源程序IDEQU30HSP1BITP3.7L1BITP1.0L2BITP1.1L3BITP1.2L4BITP1.3ORG0MOVID,#00HSTART:JBK1,RELLCALLDELAY10MSJBK1,RELINCIDMOVA,IDCJNEA,#04,RELMOVID,#00HREL:JNBK1,$MOVA,IDCJNEA,#00H,IS0CPLL1LCALLDELAYSJMPSTARTIS0:CJNEA,#01H,IS1CPLL2LCALLDELAYSJMPSTARTIS1:CJNEA,#02H,IS2CPLL3LCALLDELAYSJMPSTARTIS2:CJNEA,#03H,IS3CPLL4LCALLDELAYSJMPSTARTIS3:LJMPSTARTDELAY10MS:MOVR6,#20LOOP1:MOVR7,#248DJNZR7,$DJNZR6,LOOP1RETDELAY:MOVR5,#20LOOP2:LCALLDELAY10MSDJNZR5,LOOP2RETEND7.C语言源程序#include<AT89X51.H>unsignedcharID;voiddelay10ms(void){unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}voiddelay02s(void){unsignedchari;for(i=20;i>0;i--){delay10ms();}}voidmain(void){while(1){if(P3_7==0){delay10ms();if(P3_7==0){ID++;if(ID==4){ID=0;}while(P3_7==0);}}switch(ID){case0:P1_0=~P1_0;delay02s();break;case1:P1_1=~P1_1;delay02s();break;case2:P1_2=~P1_2;delay02s();break;case3:P1_3=~P1_3;delay02s();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.13.系统板上硬件连线4.程序设计内容(1.单片机对按键的识别的过程处理(2.单片机对正确识别的按键进行计数,计数满时,又从零开始计数;(3.单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,我们要把十位和个位拆开分别送出这样的十位和个位数值到对应的数码管上显示。如何拆开十位和个位我们可以把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了。(4.通过查表方式,分别显示出个位和十位数字。5.程序框图图4.10.26.汇编源程序CountEQU30HSP1BITP3.7ORG0START:MOVCount,#00HNEXT:MOVA,CountMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,BMOVCA,@A+DPTRMOVP2,AWT:JNBSP1,WTWAIT:JBSP1,WAITLCALLDELY10MSJBSP1,WAITINCCountMOVA,CountCJNEA,#100,NEXTLJMPSTARTDELY10MS:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharCount;voiddelay10ms(void){unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}voidmain(void){Count=0;P0=table[Count/10];P2=table[Count%10];while(1){if(P3_7==0){delay10ms();if(P3_7==0){Count++;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.电路原理图图4.11.13.系统板上硬件连线4.程序设计内容(1.在设计过程中我们用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,从新秒计数。(2.对于秒计数单元中的数据要把它十位数和个数分开,方法仍采用对10整除和对10求余。(3.在数码上显示,仍通过查表的方式完成。(4.一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。DELY1S:MOVR5,#100D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RET5.程序框图图4.11.26.汇编源程序SecondEQU30HORG0START:MOVSecond,#00HNEXT:MOVA,SecondMOVB,#10DIVABMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,AMOVA,BMOVCA,@A+DPTRMOVP2,ALCALLDELY1SINCSecondMOVA,SecondCJNEA,#60,NEXTLJMPSTARTDELY1S:MOVR5,#100D2:MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1DJNZR5,D2RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharSecond;voiddelay1s(void){unsignedchari,j,k;for(k=100;k>0;k--)for(i=20;i>0;i--)for(j=248;j>0;j--);}voidmain(void){Second=0;P0=table[Second/10];P2=table[Second%10];while(1){delay1s();Second++;if(Second==60){Second=0;}P0=table[Second/10];P2=table[Second%10];}}12.可预置可逆4位计数器1.实验任务利用AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;用P1.4-P1.7作为预置数据的输入端,接四个拨动开关K1-K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示2.电路原理图图4.12.13.系统板上硬件连线4.程序设计内容(1.两个独立式按键识别的处理过程;(2.预置初值读取的问题(3.LED输出指示5.程序框图图4.12.26.汇编源程序COUNTEQU30HORG00HSTART:MOVA,P3ANLA,#0FHMOVCOUNT,AMOVP1,ASK2:JBP3.6,SK1LCALLDELY10MSJBP3.6,SK1INCCOUNTMOVA,COUNTCJNEA,#16,NEXTMOVA,P3ANLA,#0FHMOVCOUNT,ANEXT:MOVP1,AWAIT:JNBP3.6,WAITLJMPSK2SK1:JBP3.7,SK2LCALLDELY10MSJBP3.7,SK2DECCOUNTMOVA,COUNTCJNEA,#0FFH,NEXMOVA,P3ANLA,#0FHMOVCOUNT,ANEX:MOVP1,AWAIT2:JNBP3.7,WAIT2LJMPSK2DELY10MS:MOVR6,#20MOVR7,#248D1:DJNZR7,$DJNZR6,D1RETEND7.C语言源程序#include<AT89X51.H>unsignedcharcurcount;voiddelay10ms(void){unsignedchari,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}voidmain(void){curcount=P3&0x0f;P1=~curcount;while(1){if(P3_6==0){delay10ms();if(P3_6==0){if(curcount>=15){curcount=15;}else{curcount++;}P1=~curcount;while(P3_6==0);}}if(P3_7==0){delay10ms();if(P3_7==0){if(curcount<=0){curcount=0;}else{curcount--;}P1=~curcount;while(P3_7==0);}}}}13.动态数码显示技术1.实验任务如图4.13.1所示,P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“12345”字样;当开关接低电平时,显示“HELLO”字样。2.电路原理图图4.13.13.系统板上硬件连线4.程序设计内容(1.动态扫描方法动态接口采用各数码管循环轮流显示的方法,当循环显示频率较高时,利用人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字形码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。(2.在进行数码显示的时候,要对显示单元开辟8个显示缓冲区,每个显示缓冲区装有显示的不同数据即可。(3.对于显示的字形码数据我们采用查表方法来完成。5.程序框图图4.13.26.汇编源程序ORG00HSTART:JBP1.7,DIR1MOVDPTR,#TABLE1SJMPDIRDIR1:MOVDPTR,#TABLE2DIR:MOVR0,#00HMOVR1,#01HNEXT:MOVA,R0MOVCA,@A+DPTRMOVP0,AMOVA,R1开始K1按键识别成功否?置显示“12345”字形码首地址置显示“HELLO”字形码首地址置字形码偏移量和位选代码查表并送出显示延时2ms,并指向下一个偏移量5个数码管显示完否?MOVP2,ALCALLDAYINCR0RLAMOVR1,ACJNER1,#0DFH,NEXTSJMPSTARTDAY:MOVR6,#4D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE1:DB06H,5BH,4FH,66H,6DHTABLE2:DB78H,79H,38H,38H,3FHEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable1[]={0x06,0x5b,0x4f,0x66,0x6d};unsignedcharcodetable2[]={0x78,0x79,0x38,0x38,0x3f};unsignedchari;unsignedchara,b;unsignedchartemp;voidmain(void){while(1){temp=0xfe;for(i=0;i<5;i++){if(P1_7==1){P0=table1[i];}else{P0=table2[i];}P2=temp;a=temp<<(i+1);b=temp>>(7-i);temp=a|b;for(a=4;a>0;a--)for(b=248;b>0;b--);}}}14.4×4矩阵式键盘识别技术1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图4.14.1所示图4.14.12.硬件电路原理图图4.14.23.系统板上硬件连线4.程序设计内容(1.4×4矩阵键盘识别处理(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。5.程序框图图4.14.36.汇编源程序KEYBUFEQU30HORG00HSTART:MOVKEYBUF,#2WAIT:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY1LCALLDELY10MSMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY1MOVA,P3ANLA,#0FHCJNEA,#0EH,NK1MOVKEYBUF,#0LJMPDK1NK1:CJNEA,#0DH,NK2MOVKEYBUF,#1LJMPDK1NK2:CJNEA,#0BH,NK3MOVKEYBUF,#2LJMPDK1NK3:CJNEA,#07H,NK4MOVKEYBUF,#3LJMPDK1NK4:NOPDK1:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK1A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK1ANOKEY1:MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY2LCALLDELY10MSMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY2MOVA,P3ANLA,#0FHCJNEA,#0EH,NK5MOVKEYBUF,#4LJMPDK2NK5:CJNEA,#0DH,NK6MOVKEYBUF,#5LJMPDK2NK6:CJNEA,#0BH,NK7MOVKEYBUF,#6LJMPDK2NK7:CJNEA,#07H,NK8MOVKEYBUF,#7LJMPDK2NK8:NOPDK2:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK2A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK2ANOKEY2:MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3LCALLDELY10MSMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3MOVA,P3ANLA,#0FHCJNEA,#0EH,NK9MOVKEYBUF,#8LJMPDK3NK9:CJNEA,#0DH,NK10MOVKEYBUF,#9LJMPDK3NK10:CJNEA,#0BH,NK11MOVKEYBUF,#10LJMPDK3NK11:CJNEA,#07H,NK12MOVKEYBUF,#11LJMPDK3NK12:NOPDK3:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK3A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK3ANOKEY3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4LCALLDELY10MSMOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4MOVA,P3ANLA,#0FHCJNEA,#0EH,NK13MOVKEYBUF,#12LJMPDK4NK13:CJNEA,#0DH,NK14MOVKEYBUF,#13LJMPDK4NK14:CJNEA,#0BH,NK15MOVKEYBUF,#14LJMPDK4NK15:CJNEA,#07H,NK16MOVKEYBUF,#15LJMPDK4NK16:NOPDK4:MOVA,KEYBUFMOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK4A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK4ANOKEY4:LJMPWAITDELY10MS:MOVR6,#10D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsignedchartemp;unsignedcharkey;unsignedchari,j;voidmain(void){while(1){P3=0xff;P3_4=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=7;break;case0x0d:key=8;break;case0x0b:key=9;break;case0x07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;P3_5=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;P3_6=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=1;break;case0x0d:key=2;break;case0x0b:key=3;break;case0x07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp&0x0f;while(temp!=0x0f){temp=P3;temp=temp&0x0f;}}}P3=0xff;P3_7=0;temp=P3;temp=temp&0x0f;if(temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp&0x0f;if(temp!=0x0f){temp=P3;temp=temp&0x0f;switch(temp){case0x0e:key=0;break;case0x0d:key=13;break;case0x0b:key=14;break;case0x07:key=15;break;}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论