您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机应用技术-汇编+C51项目教程
书名:单片机应用技术——汇编+C51项目教程ISBN:978-7-111-50040-7作者:姚存治出版社:机械工业出版社本书配有电子课件项目3可以调控的走马灯设计与制作走在大街上,看到五彩斑斓的走马灯,你是不是也想自己一试伸手,亲自做一个出来?本项目就将设计一个带按键控制的非常漂亮的走马灯效果。本项目涉及到的知识点有键盘接口、中断系统、定时器定时、C51编程。任务3.1学习键盘接口技术任务3.2可以调控的走马灯的设计与仿真下一页任务3.1学习键盘接口技术键盘接口是单片机系统的一个非常常见、实用的接口。用于实现人机交互中指令的输入。常见的键盘接口有独立式按键和行列式(也叫矩阵式)键盘。3.1.1独立式键盘应用3.1.2按键的消抖处理3.1.3矩阵式键盘应用上一页下一页返回3.1.1独立式键盘应用一、独立式按键结构如图所示。上一页下一页返回独立式按键的结构特点:每个按键单独占有一根I/O口线,按键的两个端子一端接地,另外一端接到一个单独的I/O口线,同时通过上拉电阻接到+5v电源端。每个按键的工作不会影响其它I/O口线的状态。在此电路中,按键输入为低电平有效,上拉电阻保证了按键断开时,I/O口线有确定的高电平。当I/O口线内部有上拉电阻时,外电路可以不配置上拉电阻。上一页下一页返回二、独立式按键的软件设计按上图的电路,设计出独立式键盘程序如下,此程序中Keyfun1~Keyfun8分别为每个按键对应的功能子程序标号(可根据实际需要编写),按键去除抖动采用软件延时,按键的接口选用P1端口。汇编源程序清单如下:START:MOVA,P1;读入键盘状态MOV30H,A;保存键盘状态值LCALLDL10ms;延时10ms消抖MOVA,P1;再读键盘状态CJNEA,30H,RETURN;再次结果不同。说明是抖动引起,返回CJNEA,#0FFH,KEY-1;确认是否有键按下LJMPRETURN上一页下一页返回KEY-1:CJNEA,#0FEH,KEY-2;K1键未按下,转KEY-2LJMPKeyfun1;是Kl键按下,转KEY1对应的功能子程序KEY-2:CJNEA,#0FDH,KEY-3;K2键未按下,转KEY-3LJMPKeyfun2;K2键按下,转Keyfun2处理KEY-3:CJNEA,#0FBH,KEY-4;K3键未按下,转KEY-4LJMPKeyfun3;K3键按下,转Keyfun3处理KEY-4:CJNEA,#0F7H,KEY-5LJMPKeyfun4KEY-5:CJNEA,#0EFH,KEY-6LJMPKeyfun5KEY-6:CJNEA,#0DFH,KEY-7LJMPKeyfun6KEY-7:CJNEA,#0BFH,KEY-8LJMPKeyfun7KEY-8:CJNEA,#7FH,RETURN;K8未按下,返回LJMPKeyfun8;K8键按下,转Keyfun8处理RETURN:RET;重键或无键按下,不处理返回DL10ms:MOVR7,#12H;三循环延时程序,大约10ms。D0:MOVR5,#10HD1:MOVR4,#10HD2:DJNZR4,$D3:DJNZR5,D1DJNZR7,D0RET上一页下一页返回对应的C51程序为:#includeAT89X51.Hvoiddelay(){unsignedinti;for(i=0;i2000;i++);}voidmain(){unsignedcharkey;while(1){key=P1;if(key!=0xFF)delay();if(key!=0xFF)key=P1;while(P1!=0xFF);上一页下一页返回switch(key){case0xFE:Keyfun1();break;case0xFD:Keyfun2();break;case0xFB:Keyfun3();break;case0xF7:Keyfun4();break;case0xEF:Keyfun5();break;case0xDF:Keyfun6();break;case0xBF:Keyfun7();break;case0x7F:Keyfun8();break;}}}3.1.2按键的消抖处理在单片机应用系统中所用的键盘按键是一种机械开关,其机械触点在闭合或断开瞬间,会出现电压抖动现象,如图所示。为了保证按键识别的准确性,可采用硬件消抖和软件消抖两种方式进行消抖处理。硬件方法可采用RS触发器等消抖电路。软件方法则是采用时间延迟,由于键的前沿抖动时间大约为10ms左右,因此可在延时10ms后待按键稳定闭合时再判别键盘的状态,若仍有按键闭合,则确认有键按下,否则认为是按键的抖动。上一页下一页返回例3-1:如图所示,实现如下功能,按下某个键,在单个数码管上显示出键号。上一页下一页返回本题中,按键全部为独立式按键,读取P1口的状态即可判断按下的是哪个键,读取相应的键的编码送入P1口即可。C51源程序如下:#includeAT89X51.Hunsignedcharled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8};voiddelay(){unsignedinti;for(i=0;i2000;i++);}voidmain(){unsignedcharkey;while(1){key=P2;if(key!=0xFF)delay();上一页下一页返回if(P2!=0xFF)key=P2;while(P2!=0xFF);switch(key){case0xFE:P1=led[0];break;case0xFD:P1=led[1];break;case0xFB:P1=led[2];break;case0xF7:P1=led[3];break;case0xEF:P1=led[4];break;case0xDF:P1=led[5];break;case0xBF:P1=led[6];break;case0x7F:P1=led[7];break;}}}上一页下一页返回3.1.3行列式键盘应用一、行列式键盘结构上一页下一页返回二、行列式键盘按键识别如上图所示AT89S51与4×4键盘的接口电路,按键识别时通过P1.0~P1.3(X0~X3)分别输出低电平,检测P1.4~P1.7(Y0~Y3)的状态是否为低电平来确定是否有键按下,通常把X3~X0称为行扫描输出线,Y0~Y3称为列检测输入线。具体识别过程如下:①判别键盘上有无键闭合。其方法为扫描口X0~X3输出全“0”,读Y0~Y3的状态,若为全“1”(键盘上列线全为高电平)则键盘上没有闭合键,若Y0~Y3不为全“1”则有键处于闭合状态。②去除键的机械抖动。其方法为判别到键盘上有键闭合后,可采用软件延迟一段时间(一般为10ms)再判别键盘的状态,若仍为有键闭合状态,则认为键盘上有一个确定的键被按下,否则认为是键的抖动。上一页下一页返回③判别闭合键的键号。方法为对X0~X3每位依次分别输出低电平,其它三位为高电平,对键盘的列线进行检测。即相应的顺次读Y0~Y3的状态,若Y0~Y3为全“1”,则行线为0的这一行上没有键闭合,否则这一行上有键闭合。闭合键的键号等于为低电平的列号加上为低电平行的首键号。例如:X0~X3输出为1101时,读出Y0~Y3为1101,则第2行与第2列相交的键处于闭合状态,第2行的首键号为8,列号为2,闭合键的键号为:N=为低电平的行首键号+为低电平的列号=8+2=10④使CPU对键的一次闭合仅作一次处理。闭合键一次仅进行一次键功能操作,采用的方法为等待闭合键释放以后再把键值送入A中,然后执行键功能操作。上一页下一页返回三、行列式键盘软件编程方式单片机应用系统中键盘扫描只是CPU工作的内容之一。CPU在忙于各项工作任务时,如何兼顾键盘扫描,既保证不失时机的响应键操作,又不过多占用CPU时间。因此要根据应用系统中CPU的忙、闲情况选择好键盘的工作方式。键盘的工作方式有编程扫描方式、中断扫描方式。①编程扫描工作方式编程扫描工作方式是利用CPU在完成其他工作的空余时间,调用键盘扫描子程序来响应键输入要求。在执行键功能程序时,CPU不再响应键输入要求。②中断扫描方式中断扫描方式又分为两种:定时器中断扫描方式和键盘按键中断扫描方式。。上一页下一页返回定时器中断扫描方式是利用单片机内部定时器产生定时中断(例如100ms),CPU响应中断请求时,对键盘进行扫描和键值识别。定时中断扫描方式的键盘接口电路与程序扫描法的接口电路相同。定时器中断键盘扫描程序,实际上作为定时器中断服务程序。这种方式虽然可以改善程序结构,但是多数扫描仍然可能为“空扫描”,CPU效率提高不大。另外一种中断扫描方式是键盘按键中断扫描方式。下图是按键中断扫描方式的AT89S51与键盘的接口电路任务3.2可以调控的走马灯的设计与仿真3.2.1硬件电路设计3.2.2程序编制3.2.3综合仿真调试上一页下一页返回3.2.1硬件电路设计本项目在P2和P0口连接16个共阳极的发光二极管,在P1口在第0、1、2设置3个独立式按键,在P3口连接一只公阳极的7段数码管。要实现的功能如下:模式键K1设置走马灯的模式,共有8种模式可设置,每种模式对应的16只二极管的走动模式。选择某种模式后可在数码管上显示出模式号。加速键K2用来实现走马灯的速度加速。减速键则用来实现走马灯的速度减速。上一页下一页返回上一页下一页返回3.2.2程序编制本项目对应的C51源程序如下:#includeAT89X51.h#defineu8unsignedchar#defineu16unsignedintu8ModeNo;//模式编号u8MovingBit=0;//移动位数u8Tdx;//速度索引u8TCounter=0;//延时计数器u16Speed;//二极管移动速度bitDirection=1;//滚动方向u8codeModeDisplay[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8};u16code上一页下一页返回SpeedCommon[]={0,2,4,6,8,10,15,30,45,80,120,160,200,240,280};//速度常数//延时函数voidDelay(u16x){u8i;while(x--)for(i=0;i120;i++);}//三按键识别函数u8GetKey(){u8K;if(P1==0xFF)return0;//如果没有键按下,则返回0。Delay(10);switch(P1)//确认有键按下,判断是哪个键。{上一页下一页返回case0xFE:K=1;break;case0xFD:K=2;break;case0xFB:K=3;break;default:K=0;}while(P1!=0xFF);//等待按键释放再返回键值。returnK;}//按键处理voidKeyProcess(u8Key){switch(Key){case1:Direction=1;MovingBit=0;ModeNo=(ModeNo+1)%8;P3=ModeDisplay[ModeNo];break;case2:if(Tdx1)Speed=SpeedCommon[--Tdx];break;case3:if(Tdx14)Speed=SpeedCommon[++Tdx];上一页下一页返回}}//点亮16位LEDvoidLedLight(u16Led16bits){P2=Led16bits&0x00FF;//点亮前8个P0=Led16bits8;//点亮后8个
本文标题:单片机应用技术-汇编+C51项目教程
链接地址:https://www.777doc.com/doc-4012369 .html