还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
单片微型计算机原理摘要单片机,__C51,动态扫描显示接口,键盘接口我们应首先了解何谓单片机一台能够工作的计算机要有这样几个部份构成CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如串行口、并行输出口等)在个人计算机上这些部份被分成若干块芯片,__一个称之为主板的印刷线路板上而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!再说这块芯片也得非常大了不,__并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚___会这样呢?功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以__就低了既然如此,单片机的功能肯定不强,干吗要生产它呢?话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿2吗?应用的关键是看是否够用,是否有很好的性能__比所以8051出来十多年,依然没有被淘汰,还在不断的发展中MCS51单片机和
8051、
8031、89C51等的关系我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系MCS51是指由美国INTEL公司生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司__生产的所以我们将用__C51来做几个实例首先我们知道动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一其接口电路是把所有显示器的8个笔划段a-h同名端连在一起,而每一个显示器的公共极COM是各自__地受I/O线控制CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以我们就可以自行决定何时显示哪一位了而所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感下面就是动态扫描接口由89C51的P0口能灌入较大的电流,所以我们采用共阳的数码管,并且不用限流电阻,而只是用两只1N4004进行降压后给数码管供电,这里仅用了两只,实际上还可以扩充它们的公共端则由PNP型三极管8550控制,显然,如果8550导通,则相应的数码管就可以亮,而如果8550截止,则对应的数码管就不可能亮,8550是由P27,P26控制的这样我们就可以通过控制P
27、P26达到控制某个数码管亮或灭的目的下面的这个程序,就是用实验板上的数码管显示0和1FIRSTEQUP
2.7;第一位数码管的位控制SECONDEQUP
2.6;第二位数码管的位控制DISPBUFFEQU5AH;显示缓冲区为5AH和5BHORG0000HAJMPSTARTORG30HSTART:MOVSP#5FH;设置堆栈MOVP1#0FFHMOVP0#0FFHMOVP2#0FFH;初始化,所显示器,LED灭MOVDISPBUFF#0;第一位显示0MOVDISPBUFF+1#1;第二握显示1LOOP:LCALLDISP;调用显示程序AJMPLOOP;主程序到此结束DISP:PUSHACC;ACC入栈PUSHPSW;PSW入栈MOVADISPBUFF;取第一个待显示数MOVDPTR#DISPTAB;字形表首地址MOVCA@A+DPTR;取字形码MOVP0A;将字形码送P0位(段口)CLRFIRST;开第一位显示器位口LCALLDELAY;延时1毫秒SETBFIRST;关闭第一位显示器(开始准备第二位的数据)MOVADISPBUFF+1;取显示缓冲区的第二位MOVDPTR#DISPTABMOVCA@A+DPTRMOVP0A;将第二个字形码送P0口CLRSECOND;开第二位显示器LCALLDELAY;延时SETBSECOND;关第二位显示POPPSWPOPACCRETDELAY:;延时1毫秒PUSHPSWSETBRS0MOVR7#50D1:MOVR6#10D2:DJNZR6$DJNZR7D1POPPSWRETDISPTAB:DB28H7EH0a4H64H72H61H21H7CH20H60HEND从上面的例子中可以看出,动态扫描显示必须由CPU不断地调用显示程序,才能保证持续不断的显示上面的这个程序可以实现数字的显示,这里仅是显示两个数字,并没有做其他的工作,因此,两个数码管轮流显示1毫秒,实际的工作中,当然不可能只显示两个数字,还是要做其他的事情的,这样在二次调用显示程序之间的时间间隔就不一不定了,如果时间间隔比较长,就会使显示不连续而实际工作中是很难保证所有工作都能在很短时间内完成的况且这个显示程序也有点“浪费”,每个数码管显示都要占用1个毫秒的时间,这在很多合是不允许的,怎么办呢?我们可以借助于定时器,定时时间一到,产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到,而不用调用延时程序了,这段时间可以留给主程序干其他的事到下一次定时时间到则显示下一个数码管,这样就很少浪费了CounterEQU59H;计数器,显示程序通过它得知现正显示哪个数码管FIRSTEQUP
2.7;第一位数码管的位控制SECONDEQUP
2.6;第二位数码管的位控制DISPBUFFEQU5AH;显示缓冲区为5AH和5BHORG0000HAJMPSTARTORG000BH;定时器T0的入口AJMPDISP;显示程序ORG30HSTART:MOVSP#5FH;设置堆栈MOVP1#0FFHMOVP0#0FFHMOVP2#0FFH;初始化,所显示器,LED灭MOVTMOD#00000001B;定时器T0工作于模式1(16位定时/计数模式)MOVTH0#HIGH65536-2000MOVTL0#LOW65536-2000SETBTR0SETBEASETBET0MOVCounter#0;计数器初始化MOVDISPBUFF#0;第一位始终显示0MOVA#0LOOP:MOVDISPBUFF+1A;第二位轮流显示0-9INCALCALLDELAYCJNEA#10LOOPMOVA#0AJMPLOOP;在此中间可以按排任意程序,这里仅作示范;主程序到此结束DISP:;定时器T0的中断响应程序PUSHACC;ACC入栈PUSHPSW;PSW入栈MOVTH0#HIGH65536-2000;定时时间为2000个周期MOVTL0#LOW65536-2000SETBFIRSTSETBSECOND;关显示MOVA#DISPBUFF;显示缓冲区首地址ADDA,CounterMOVR0AMOVA@R0;根据计数器的值取相应的显示缓冲区的值MOVDPTR#DISPTAB;字形表首地址MOVCA@A+DPTR;取字形码MOVP0A;将字形码送P0位MOVA,Counter;取计数器的值JZDISPFIRST;如果是0则显示第一位CLRSECOND;否则显示第二位AJMPDISPNEXTDISPFIRST:CLRFIRST;显示第一位DISPNEXT:INCCounter;计数器加1MOVA,CounterDECA;如果计数器计到2,则让它回0DECAJZRSTCOUNTAJMPDISPEXITRSTCOUNT:MOVCounter#0;计数器的值只能是0或1DISPEXIT:POPPSWPOPACCRETIDELAY:;延时130毫秒PUSHPSWSETBRS0MOVR7#255D1:MOVR6#255D2:NOPNOPNOPNOPDJNZR6D2DJNZR7D1POPPSWRETDISPTAB:DB28H7EH0a4H64H72H61H21H7CH20H60HEND从上面的程序可以看出,和静态显示相比,动态扫描的程序稍有点复杂,不过,这是值得的这个程序有一定的通用性,只要改变端口的值及计数器的值就可以显示更多位数了下面给出显示程序的流程图键盘是由若干按键组成的开关矩阵,它是微型计算机最常用的输入设备,用户可以通过键盘向计算机输入指令、地址和数据一般单片机系统中采和非编码键盘,非编码键盘是由软件来识别键盘上的闭合键,它具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统按键开关的抖动问题组成键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的在下图中,当开图1图2关S未被按下时,P10输入为高电平,S闭合后,P10输入为低电平由于按键是机械触点,当机械触点断开、闭合时,会有抖动动,P10输入端的波形如图2所示这种抖动对于人来说是感觉不到的,但对计算机来说,则是完全可以感应到的,因为计算机处理的速度是在微秒级,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个“漫长”的时间了前面我们讲到中断时曾有个问题,就是说按键有时灵,有时不灵,其实就是这个原因,你只按了一次按键,可是计算机却已执行了多次中断的过程,如果执行的次数正好是奇数次,那么结果正如你所料,如果执行的次数是偶数次,那就不对了为使CPU能正确地读出P1口的状态,对每一次按键只作一次响应,就必须考虑如何去除抖动,常用的去抖动的方法有两种硬件方法和软件方法单片机中常用软件法,因此,对于硬件方法我们不介绍软件法其实很简单,就是在单片机获得P10口为低的信息后,不是立即认定S1已被按下,而是延时10毫秒或更长一些时间后再次检测P10口,如果仍为低,说明S1的确按下了,这实际上是避开了按键按下时的抖动时间而在检测到按键释放后(P10为高)再延时5-10个毫秒,消除后沿的抖动,然后再对键值处理不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足一定的要求当然,实际应用中,对按键的要求也是千差万别,要根据不同的需要来编制处理程序,但以上是消除键抖动的原则键盘与单片机的连接图3图4通过1/0口连接将每个按键的一端接到单片机的I/O口,另一端接地,这是最简单的方法,如图3所示是实验板上按键的接法,四个按键分别接到P
3.
2、P
3.
3、P
3.4和P
3.5对于这种键各程序可以采用不断查询的方法,功能就是检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的键处理下面给出一个例程其功能很简单,四个键定义如下P
3.2开始,按此键则灯开始流动(由上而下)P
3.3停止,按此键则停止流动,所有灯为暗P
3.4上,按此键则灯由上向下流动P
3.5下,按此键则灯由下向上流动UpDownEQU00H;上下行标志StartEndEQU01H;起动及停止标志LAMPCODEEQU21H;存放流动的数据代码ORG0000HAJMP__INORG30H__IN:MOVSP#5FHMOVP1#0FFHCLRUpDown;启动时处于向上的状态CLRStartEnd;启动时处于停止状态MOVLAMPCODE#0FEH;单灯流动的代码LOOP:ACALLKEY;调用键盘程序JNBF0LNEXT;如果无键按下,则继续ACALLKEYPROC;否则调用键盘处理程序LNEXT:ACALLLAMP;调用灯显示程序AJMPLOOP;反复循环,主程序到此结束DELAY:MOVR7#100D1:MOVR6#100DJNZR6$DJNZR7D1RET;----------------------------------------延时程序,键盘处理中调用KEYPROC:MOVAB;从B寄存器中获取键值JBACC.2KeyStart;分析键的代码,某位被按下,则该位为1(因为在键盘程序中已取反)JBACC.3KeyOverJBACC.4KeyUpJBACC.5KeyDownAJMPKEY_RETKeyStart:SETBStartEnd;第一个键按下后的处理AJMPKEY_RETKeyOver:CLRStartEnd;第二个键按下后的处理AJMPKEY_RETKeyUp:SETBUpDown;第三个键按下后的处理AJMPKEY_RETKeyDown:CLRUpDown;第四个键按下后的处理KEY_RET:RETKEY:CLRF0;清F0,表示无键按下ORLP3#00111100B;将P3口的接有键的四位置1MOVAP3;取P3的值ORLA#1_____11B;将其余4位置1CPLA;取反JZK_RET;如果为0则一定无键按下ACALLDELAY;否则延时去键抖ORLP3#00111100BMOVAP3ORLA#1_____11BCPLAJZK_RETMOVBA;确实有键按下,将键值存入B中SETBF0;设置有键按下的标志K_RET:ORLP3#00111100B;此处循环等待键的释放MOVAP3ORLA#1_____11BCPLAJZK_RET1;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回AJMPK_RETK_RET1:RETD500MS:;流水灯的延迟时间PUSHPSWSETBRS0MOVR7#200D51:MOVR6#250D52:NOPNOPNOPNOPDJNZR6D52DJNZR7D51POPPSWRETLAMP:JBStartEndLampStart;如果StartEnd=1,则启动MOVP1#0FFHAJMPLAMPRET;否则关闭所有显示,返回LampStart:JBUpDownLAMPUP;如果UpDown=1,则向上流动MOVALAMPCODERLA;实际就是左移位而已MOVLAMPCODEAMOVP1ALCALLD500MSAJMPLAMPRETLAMPUP:MOVALAMPCODERRA;向下流动实际就是右移MOVLAMPCODEAMOVP1ALCALLD500MSLAMPRET:RETEND以上程序功能很简单,但它演示了一个键盘处理程序的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用灯的循环程序,会造成按键反应“迟钝”,而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,等等,我们可以仔细考虑一下这些问题,再进行程序扩展采用中断方式如图4所示各个按键都接到一个与非上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询,如果有键按下,单片机再去做相应的处理在两个例子中我们学会了__C51单片机的部分功能,也让我们对单片机的运用有了更深层次的了解。