单片机各个案例,程序的设计方案~~_第1页
单片机各个案例,程序的设计方案~~_第2页
单片机各个案例,程序的设计方案~~_第3页
单片机各个案例,程序的设计方案~~_第4页
单片机各个案例,程序的设计方案~~_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE82第二部份MCS—51单片机设计应用程序实例例1闪烁LED小灯的设计例2数码管时钟电路的设计例38×8点阵LED字符显示器的设计例4八路输入模拟信号的数值显示电路的设计例5单键学习型遥控器的设计例6十五路电器遥控的设计例7自行车里程/速度计的设计例8自动往返行驶小汽车的设计例9遥控小汽车的设计例10汽车行驶信息发送与接收器的设计例11数控调频发射台的设计例12可在线修改程序的单片机W78B516E设计实例例13电子定时器的设计

闪烁LED小灯的设计本设计的闪烁小灯控制器,可使小灯轮流点亮、逐点点亮、间隔闪亮,如要控制交流彩灯可在P1端口加接继电器或可控硅接口电路.可应用在广告彩灯控制器、舞台灯光控制器等领域.1系统硬件电路的设计上图为该控制器的电路原理图,其中单片机采用AT89C2051,P1口作LED发光管输出控制用,P3.0—P3.2口为闪烁方式控制开关K1、K2、K3按键接口,P3。3口的按键作备用,限流电阻为310Ω,发光管工作电流约为10mA,采用12MHz晶振。2系统主要程序的设计(1)主体程序通过扫描P3.0—P3。2端口,判断是否有按键按下,然后在20H内存单元的低三位的对应位置1标志,确定应执行的闪烁功能。当20H.0为1时,发光管轮流点亮;当20H.1为1时,发光管逐点点亮;当20H.2为1时,发光管间隔闪亮.在主程序对20H的低三位进行位值判定后,转入相应的闪烁控制程序。上电初始化时对20H的最低位置1,系统进入轮流点亮方式.(2)键扫描子程序因按键较少,采用直接端口扫描键开关,用软件延时消抖确认后对20H内存单元相应的位置1并把其余位清零。(3)闪烁控制程序闪烁控制程序用来控制P1口的发光管发光变化方式,其中执行功能程序0(FUN0)时的P1口输出值变化为11111110—延时-11111101—延时—11111011—延时—11110111—延时-11101111—延时-11011111—延时—10111111-延时-01111111—延时-结束转主程序。执行功能程序1(FUN1)时的P1口输出变化为11111110-延时—11111100—延时—11111000—延时—11110000—延时—11100000—延时—11000000—延时—10000000—延时—00000000—延时—结束转主程序.执行功能程序2(FUN2)时的P1口输出变化为10101010—延时—01010101—延时—结束转主程序。(4)延时子程序延时子程序有10ms和0.5s两个,用以作键扫描消抖及发光管闪烁延时,发光管闪烁的快慢可由R4寄存器内的初值进行改变.3主程序流程图YYYYNNN开始20H.2=1?20H.1=1?20H.0=1?初始化调用键扫描子程序(KEYWORK)转入功能程序2(FUN2)转入功能程序1(FUN1)转入功能程序0(FUN0)图1-2主程序流程图本控制器在使用中当要改变闪烁的方式时,可按下相应的功能按键,当一个完整的闪烁循环结束后转入新的闪烁方式.由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入,改进的方法是把DL05S延时子程序用键扫描子程序来替代,那么只要一按下按键即可被键扫描程序读入,读者可以试试其区别.以下是LED小灯闪烁控制器完整源程序:;************;;小灯控制程序;;************;;;************;;中断入口程序;;************;;ORG0000H;程序执行开始地址LJMPSTART;跳至START执行ORG0003H;外中断0中断入口地址RETI;中断返回(不开中断)ORG000BH;定时器T0中断入口地址RETI;中断返回(不开中断)ORG0013H;外中断1中断入口地址RETI;中断返回(不开中断)ORG001BH;定时器T1中断入口地址RETI;中断返回(不开中断)ORG0023H;串行口中断入口地址RETI;中断返回(不开中断);;************;;初始化程序;;************;;CLEAR:MOV20H,#00H;20H单元内存清0(闪烁标志清0)SETB00H;20H.0位置1(上电时自动执行闪烁功能1)RET;子程序返回;;************;;主程序;;************;;START:ACALLCLEAR;调用初始化子程序MAIN:LCALLKEYWORK;调用键扫描子程序JB00H,FUN0;20H。0位为1时执行FUN0JB01H,FUN1;20H。1位为1时执行FUN1JB02H,FUN2;20H。2位为1时执行FUN2JB03H,MAIN;备用AJMPMAIN;返回主程序MAIN;;************;;功能程序;;************;;第1种闪烁功能程序FUN0:MOVA,#0FEH;累加器赋初值FUN00:MOVP1,A ;累加器值送至P1口LCALLDL05S;延时JNBACC.7,MAIN;累加器最高位为0时转MAINRLA;累加器A中数据循环左移1位AJMPFUN00;转FUN00循环;;第2种闪烁功能程序FUN1:MOVA,#0FEH;累加器赋初值FUN11:MOVP1,A;累加器值送至P1口LCALLDL05S;延时JZMAIN;A为0转MAINRLA;累加器A中数据循环左移1位ANLA,P1;A同P1口值相与AJMPFUN11;转FUN11循环;;第3种闪烁功能程序FUN2:MOVA,#0AAH;累加器赋初值MOVP1,A;累加器值送至P1口LCALLDL05S;延时CPLA;A中各位取反MOVP1,A;累加器值送至P1口LCALLDL05S;延时AJMPMAIN;转MAIN;************;;扫键程序;;************;;KEYWORK:MOVP3,#0FFH;置P3口为输入状态JNBP3。0,KEY0;读P3.0口,若为0转KEY0JNBP3。1,KEY1;读P3。1口,若为0转KEY1JNBP3.2,KEY2;读P3.2口,若为0转KEY2JNBP3。3,KEY3;读P3.3口,若为0转KEY3RET;子程序返回;;闪烁功能0键处理程序KEY0:LCALLDL10MS;延时10毫秒消抖JBP3。0,OUT0;P3.0为1,子程序返回(干扰)SETB00H;20H。0位置1(执行闪烁功能1标志)CLR01H;20H。1位清0CLR02H;20H。2位清0CLR03H;20H。3位清0OUT0:RET;子程序返回;;闪烁功能1键处理程序KEY1:LCALLDL10MSJBP3。1,OUT1SETB01H;20H。1位置1(执行闪烁功能2标志)CLR00HCLR02HCLR03HOUT1:RET;;闪烁功能2键处理程序KEY2:LCALLDL10MSJBP3。2,OUT2SETB02H;20H。2位置1(执行闪烁功能3标志)CLR01HCLR00HCLR03HOUT2:RET;;闪烁功能(备用)键处理程序KEY3:LCALLDL10MSJBP3。3,OUT3SETB03H;20H。3位置1(执行备用闪烁功能标志)CLR01HCLR02HCLR00HOUT3:RET;;************;;延时程序;;************;;0.5毫秒延时子程序,执行一次时间为513微秒DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RET;;10毫秒延时子程序(调用20次0.5毫秒延时子程序)DL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RET;;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为15×25毫秒)DL05S:MOVR4,#0FHLOOP3:LCALLDL25MSDJNZR4,LOOP3RET;;25毫秒延时子程序,用调用扫键子程序延时,可快速读出功能按键值DL25MS:MOVR5,#0FFHLOOP4:LCALLKEYWORKDJNZR5,LOOP4RETEND;程序结束

例2数码管时钟电路的设计LED数码管时钟电路采用24小时计时方式,时、分、秒用六位数码管显示.采用AT89C2051单片机,可使用3V电池供电,使用一个按键开关,可进入调时、省电(不显示LED数码管)和正常显示三种状态。1时钟电路硬件的设计电路如上图2-1,采用AT89C2051单片机最小化应用设计,LED显示采用动态扫描方式实现,P1口输出段码数据,P3.0—P3。5口作扫描输出,P3。7接按钮开关。为了提供LED数码管的驱动电流,用三极管9012作电源驱动输出。为了提高秒计时的精确性,采用12MHz晶振.2系统主要程序的设计(1)主程序本设计中计时采用定时器T0中断完成,其余状态循环调用显示子程序,当P3。7端口开关按下时,转入调时功能程序。其主程序执行流程见图2-2。(2)显示子程序数码管显示的数据存放在内存单元70H—75H中,其中70H—71H存放秒数据,72H—73H存放分数据,74H—75H存放时数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中,显示时,先取出70H—75H某一地址中的数据,然后查得对应的显示用段码从P1口输出,P3口将对应的数码管选中,就能显示该地址单元的数据值。YYYYYNNNN1秒到?T0中断保护现场秒单元加1秒单元清零,分加1图2—3T0中断服务程序=60秒?=60分?分单元清零,时加1=24时?时单元清零恢复现场,中断返回YYNP3.7=0?开始显示单元清零T0、T1设为16位计数器模式允许T0中断调用显示子程序进入调时程序图2—2主程序流程图(3)定时器T0中断服务程序定时器T0用于时间计时。定时溢出中断周期设为50ms,中断累计20次(即1秒)时对秒计数单元进行加1操作。时间计数单元地址分别在70H-71H(秒)、76H—77H(分)、78H—79H(时),7AH单元内存放“熄灭符"数据(#0AH)。在计数单元中采用十进制BCD码计数,满60进位,T0中断服务程序执行流程见图2—3。(4)T1中断服务程序T1中断服务程序用于指示调整单元数字的亮闪,在时间调整状态下,每过0.3秒,将对应单元的显示数据换成“熄灭符”数据(#0AH).这样在调整时间时,对应调整单元的显示数据会间隔闪亮。(5)调时功能程序调时功能程序的设计方法是:按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,时钟不停),否则进入调分状态,等待操作.此时计时器停止走动。当再按下按钮时,若按下时间小于0.5秒,则时间加1分,若按下时间大于0。5秒,则进入小时调整状态。在小时调整状态下,当按键按下的时间大于0。5秒时退出调整状态,时钟继续走动。以下是LED数码管时钟电路的完整源程序:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AT89C2051时钟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用,;P3。7为调整按钮,P1口为字符输出口,采用共阳显示管。;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断入口程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG0000H;程序执行开始地址LJMPSTART;跳到标号START执行ORG0003H;外中断0中断程序入口RETI;外中断0中断返回ORG000BH;定时器T0中断程序入口 LJMPINTT0;跳至INTTO执行ORG0013H;外中断1中断程序入口 RETI;外中断1中断返回 ORG001BH;定时器T1中断程序入口 LJMPINTT1;跳至INTT1执行 ORG0023H;串行中断程序入口地址 RETI ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START:MOVR0,#70H ;清70H—7AH共11个内存单元MOVR7,#0BH ;CLEARDISP:MOV@R0,#00H ;INCR0;DJNZR7,CLEARDISP;MOV20H,#00H ;清20H(标志用)MOV7AH,#0AH;放入“熄灭符”数据MOV TMOD,#11H;设T0、T1为16位定时器MOVTL0,#0B0H ;50MS定时初值(T0计时用)MOVTH0,#3CH ;50MS定时初值MOVTL1,#0B0H ;50MS定时初值(T1闪烁定时用)MOVTH1,#3CH ;50MS定时初值SETBEA;总中断开放SETBET0;允许T0中断SETBTR0;开启T0定时器MOVR4,#14H;1秒定时用初值(50MS×20)START1:LCALLDISPLAY;调用显示子程序JNB P3。7,SETMM1;P3.7口为0时转时间调整程序SJMPSTART1;P3.7口为1时跳回START1SETMM1:LJMPSETMM;转到时间调整程序SETMM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1秒计时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0:PUSHACC;累加器入栈保护PUSHPSW;状态字入栈保护CLRET0;关T0中断允许CLRTR0;关闭定时器T0MOVA,#0B7H;中断响应时间同步修正ADDA,TL0;低8位初值修正MOVTL0,A;重装初值(低8位修正值)MOVA,#3CH;高8位初值修正ADDCA,TH0;MOVTH0,A;重装初值(高8位修正值)SETBTR0;开启定时器T0DJNZR4,OUTT0;20次中断未到中断退出ADDSS:MOV R4,#14H;20次中断到(1秒)重赋初值MOV R0,#71H;指向秒计时单元(71H-72H)ACALLADD1;调用加1程序(加1秒操作)MOVA,R3;秒数据放入A(R3为2位十进制数组合)CLR C;清进位标志CJNE A,#60H,ADDMM;ADDMM:JC OUTT0;小于60秒时中断退出ACALLCLR0;大于或等于60秒时对秒计时单元清0MOV R0,#77H;指向分计时单元(76H-77H)ACALLADD1;分计时单元加1分钟MOV A,R3;分数据放入ACLRC;清进位标志CJNEA,#60H,ADDHH;ADDHH:JC OUTT0;小于60分时中断退出ACALLCLR0;大于或等于60分时分计时单元清0MOV R0,#79H;指向小时计时单元(78H—79H)ACALLADD1;小时计时单元加1小时MOVA,R3;时数据放入ACLRC;清进位标志CJNEA,#24H,HOUR;HOUR:JCOUTT0;小于24小时中断退出ACALLCLR0;大于或等于24小时小时计时单元清0OUTT0:MOV72H,76H;中断退出时将分、时计时单元数据移MOV73H,77H;入对应显示单元MOV74H,78H;MOV75H,79H;POP PSW;恢复状态字(出栈)POPACC;恢复累加器SETBET0;开放T0中断RETI;中断返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;闪动调时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1:PUSHACC;中断现场保护PUSHPSW;MOVTL1,#0B0H;装定时器T1定时初值MOVTH1,#3CH ;DJNZR2,INTT1OUT ;0。3秒未到退出中断(50MS中断6次)MOVR2,#06H ;重装0。3秒定时用初值CPL02H ;0.3秒定时到对闪烁标志取反JB02H,FLASH1 ;02H位为1时显示单元“熄灭”MOV72H,76H;02H位为0时正常显示MOV73H,77H;MOV74H,78H;MOV75H,79H;INTT1OUT:POPPSW ;恢复现场POPACC;RETI;中断退出FLASH1:JB01H,FLASH2;01H位为1时,转小时熄灭控制MOV72H,7AH;01H位为0时,“熄灭符"数据放入分MOV73H,7AH;显示单元(72H—73H),将不显示分数据MOV74H,78H;MOV75H,79H;AJMPINTT1OUT;转中断退出FLASH2:MOV72H,76H;01H位为1时,“熄灭符”数据放入小时MOV73H,77H;显示单元(74H—75H),小时数据将不显示MOV74H,7AH;MOV75H,7AH;AJMPINTT1OUT;转中断退出;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加1子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1:MOV A,@R0;取当前计时单元数据到ADEC R0;指向前一地址SWAP A;A中数据高四位与低四位交换ORL A,@R0;前一地址中数据放入A中低四位ADD A,#01H;A加1操作DA A;十进制调整MOV R3,A;移入R3寄存器ANL A,#0FH;高四位变0MOV @R0,A;放回前一地址单元MOV A,R3;取回R3中暂存数据INC R0;指向当前地址单元SWAP A;A中数据高四位与低四位交换ANL A,#0FH;高四位变0MOV @R0,A;数据放入当削地址单元中RET;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清零程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;对计时单元复零用CLR0:CLR A;清累加器MOV @R0,A;清当前地址单元DEC R0;指向前一地址MOV @R0,A;前一地址单元清0RET;子程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;时钟调整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM:cLR ET0;关定时器T0中断CLR TR0;关闭定时器T0LCALL DL1S;调用1秒延时程序JB P3.7,CLOSEDIS;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H;进入调时状态,赋闪烁定时初值SETB ET1;允许T1中断SETB TR1;开启定时器T1SET2:JNB P3。7,SET1;P3。7口为0(键未释放),等待SETB 00H;键释放,分调整闪烁标志置1SET4:JB P3.7,SET3;等待键按下LCALL DL05S;有键按下,延时0.5秒JNB P3.7,SETHH;按下时间大于0.5秒转调小时状态MOV R0,#77H;按下时间小于0.5秒加1分钟操作LCALL ADD1;调用加1子程序MOV A,R3;取调整单元数据CLR C;清进位标志CJNE A,#60H,HHH;调整单元数据与60比较HHH:JC SET4;调整单元数据小于60转SET4循环LCALL CLR0;调整单元数据大于或等于60时清0CLR C;清进位标志AJMP SET4;跳转到SET4循环CLOSEDIS:SETB ET0;省电(LED不显示)状态.开T0中断SETB TR0;开启T0定时器(开时钟)CLOSE:JB P3.7,CLOSE;无按键按下,等待。LCALL DISPLAY;有键按下,调显示子程序延时削抖JB P3.7,CLOSE;是干扰返回CLOSE等待WAITH:JNB P3.7,WAITH;等待键释放LJMP START1;返回主程序(LED数据显示亮)SETHH:CLR 00H;分闪烁标志清除(进入调小时状态)SETHH1:JNB P3。7,SET5;等待键释放SETB01H;小时调整标志置1SET6:JB P3.7,SET7;等待按键按下LCALL DL05S;有键按下延时0。5秒JNB P3.7,SETOUT;按下时间大于0。5秒退出时间调整MOV R0,#79H;按下时间小于0。5秒加1小时操作LCALL ADD1;调加1子程序MOV A,R3;CLR C;CJNE A,#24H,HOUU;计时单元数据与24比较HOUU:JC SET6;小于24转SET6循环LCALL CLR0;大于或等于24时清0操作AJMP SET6;跳转到SET6循环SETOUT:JNB P3.7,SETOUT1;调时退出程序.等待键释放LCALL DISPLAY;延时削抖JNB P3。7,SETOUT;是抖动,返回SETOUT再等待CLR 01H;清调小时标志CLR 00H;清调分标志CLR 02H;清闪烁标志CLR TR1;关闭定时器T1CLR ET1;关定时器T1中断SETB TR0;开启定时器T0SETB ET0;开定时器T0中断(计时开始)LJMP START1;跳回主程序SET1:LCALLDISPLAY;键释放等待时调用显示程序(调分)AJMPSET2;防止键按下时无时钟显示SET3:LCALLDISPLAY;等待调分按键时时钟显示用AJMPSET4SET5:LCALLDISPLAY;键释放等待时调用显示程序(调小时)AJMPSETHH1;防止键按下时无时钟显示SET7:LCALLDISPLAY;等待调小时按键时时钟显示用AJMPSET6SETOUT1:LCALLDISPLAY;退出时钟调整时键释放等待AJMPSETOUT;防止键按下时无时钟显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作;扫描控制,每个LED数码管亮1MS时间再逐位循环。DISPLAY:MOV R1,#70H;指向显示数据首址MOV R5,#0FEH;扫描控制字初值PLAY:MOV A,R5;扫描字放入AMOV P3,A;从P3口输出MOV A,@R1;取显示数据到AMOV DPTR,#TAB;取段码表地址MOVC A,@A+DPTR;查显示数据对应段码MOV P1,A;段码放入P1口LCALL DL1MS;显示1MSINC R1;指向下一地址MOV A,R5;扫描控制字放入AJNB ACC.5,ENDOUT;ACC.5=0时一次显示结束RL A;A中数据循环左移MOV R5,A;放回R5内AJMP PLAY;跳回PLAY循环ENDOUT:SETB P3。5;一次显示结束,P3口复位MOV P1,#0FFH;P1口复位RET;子程序返回TAB:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;共阳段码表“0”“1"“2”“3”“4"“5”“6"“7”“8”“9”“不亮”;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1MS延时程序,LED显示程序用DL1MS:MOV R6,#14HDL1:MOV R7,#19HDL2:DJNZ R7,DL2DJNZ R6,DL1RET;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象DS20MS:ACALL DISPLAYACALL DISPLAYACALL DISPLAYRET;延时程序,用作按键时间的长短判断DL1S:LCALLDL05SLCALLDL05SRETDL05S:MOVR3,#20H;8毫秒*32=0。196秒DL05S1:LCALLDISPLAYDJNZR3,DL05S1RET;END;程序结束

例38×8点阵LED字符显示器的设计8×8点阵LED字符显示器能显示“电子设计”四个文字,显示方式可由K1、K2、K3选择,K1为逐字显示,K2为向上滚动显示,K3为向左滚动显示。1系统硬件的设计本字符显示器采用AT89C52单片机作控制器,12MHZ晶振,8*8点阵共阳LED显示器(见图3-1)。其中P0作为字符数据输出口,P2为字符显示扫描输出口,第31脚(EA)接电源,P1.0—P1。2口分别接开关K1、K2、K3,改变电阻(270)的大小可改变显示字符的亮度,驱动用9012三极管.2系统主要程序的设计(1)主程序主程序在刚上电时对系统进行初始化,然后读一次键开关状态,由键标志位值(00H、01H、02H)决定显示的方式(主程序流程图见3—2)。(2)初始化程序在系统初始化时,对四个端口进行复位,将显示用的字符数据从ROM表中装入内存单元50H—6FH中,“电子设计”每个文字占用8个地址单元。图3-2主程序流程图图3-2主程序流程图YYYNNN开始20H.2=1?20H.1=1?20H.0=1?调用键扫描子程序(KEYWORK)转向左滚动显示程序(FUN2)转向上滚动显示程序(FUN1)转逐字显示程序(FUN0)(3)显示程序显示程序由显示主程序和显示子程序组成,显示主程序负责每次显示时的显示地址首址(在B寄存器中)、每个字的显示时间(由30H中的数据决定)、下一个显示地址的间隔(31H中的数据决定)的处理。显示子程序则负责对指定8个地址单元的数据进行输出显示,显示一个完整文字的时间约为8ms.在显示子程序中,1ms延时程序是用调用键扫描子程序的方法实现的。图3—3为逐字显示及向上滚动显示方式时的显示控制程序流程图。NNYYN逐字或上移显示开始(R4)-1=0?寄存器B、R4、R5赋初值调显示子程序(DISPLAY)(B)=#68H?显示首址修改:(B)+(R5)→(B)图3-3逐字显示及向上滚动显示时的程序流程图转START1设1帧显示时间及换帧步距利用键扫描程序代替显示程序中的1ms延时程序,是为了按键的快速响应,又可以提高动态显示的扫描频率,减少文字显示时的闪烁现象,.对于多个文字的大屏幕显示,应该使用输出数据缓冲寄存器,才可以得到很稳定的显示文字。以下是8×8点阵LED字符显示器控制源程序:

;*************************;*电子屏字符显示器*;*“电子设计”*;*2001。10。23*;*************************;四个显示字符数据表放在50H—6FH单元内,字符用8*8点阵,R4(30H)用于;控制显示静止字的时间,R5(31H)静止字显示跳转地址步距,B内放显示首址;;************;;中断入口程序;;************;;ORG0000H;程序执行开始地址LJMPSTART;跳至START执行ORG0003H;外中断0中断入口地址RETI;中断返回(不开中断)ORG000BH;定时器T0中断入口地址RETI;中断返回(不开中断)ORG0013H;外中断1中断入口地址RETI;中断返回(不开中断)ORG001BH;定时器T1中断入口地址RETI;中断返回(不开中断)ORG0023H;串行口中断入口地址RETI;中断返回(不开中断)ORG002BH;定时器T2中断入口地址RETI;中断返回(不开中断);;初始化程序CLEARMEN:MOVA,#0FFH;四端口置1MOVP1,A;MOVP2,A;MOVP3,A;MOVP0,A;MOVDPTR,#TAB;取“电子设计”字符表首址值CLRA;MOV21H,A;21H—24H内存单元清0MOV22H,A;MOV23H,A;MOV24H,A;MOVR3,A;R3寄存器清0MOVR1,#50H;设字符表移入内存单元首址MOVR2,#20H;设查表次数(32次)CLLOOP:MOVCA,@A+DPTR;查表将“电子设计”字符数据移入内存单元MOV@R1,A;MOVA,R3;INCA;MOVR3,A;INCR1;DJNZR2,CLLOOP;查表32次,不到转CLLOOP再查RET;子程序返回;;主体程序START:MOV20H,#00H;20H内存单元清0SETB00H;20H。0位置1START1:LCALLCLEARMEN;调用上电初始化子程序JB00H,FUN0;20H。0位为1,执行FUN0JB01H,FUN1;20H.1位为1,执行FUN1JB02H,FUN2;20H。2位为1,执行FUN2AJMPSTART1;跳回START1循环;;键扫描子程序KEYWORK:MOVP1,#0FFH;置输入状态JNBP1.0,KEY1;P1.0为0(键按下)转KEY1JNBP1.1,KEY2;P1.1为0(键按下)转KEY2JNBP1。2,KEY3;P1.2为0(键按下)转KEY3KEYRET:RET;无键按下,子程序返回;按键1功能处理KEY1:LCALLDL10MS;延时10MS削抖动JBP1。0,KEYRET;是干扰转KEYRET结束SETB00H;置逐字显示方式标志(20H。0=1)CLR01H;CLR02H;RET;子程序返回;按键2功能处理KEY2:LCALLDL10MS;JBP1.1,KEYRET;SETB01H;置上移显示方式标志(20H.1=1)CLR00H;CLR02H;RET;;按键3功能处理KEY3:LCALLDL10MS;JBP1.2,KEYRET;SETB02H;置左移显示方式标志(20H。2=1)CLR01H;CLR00H;RET;;逐字显示功能程序FUN0:MOV30H,#80H;1帧显示时间控制(约1秒)MOV31H,#08H;换帧跳转步距为8LJMPDISP1;转显示子程序DISP1;上移显示功能程序FUN1:MOV30H,#0AH;1帧显示时间控制(约80毫秒)MOV31H,#01H;换帧跳转步距为1LJMPDISP1;转显示子程序DISP1;左移显示功能程序FUN2:LJMPDISP2;;;显示控制程序DISP1:MOVB,#50H;显示数据首址MOVR4,30H;放入1帧显示时间控制数据MOVR5,31H;放入跳转步距控制数据LOOP:LCALLDISPLAY;调用显示子程序一次DJNZR4,LOOP;1帧显示时间未到再转LOOP循环MOVR4,30H;1帧显示时间到,重装初值MOVA,B;CJNEA,#68H,CONT;不是末地址转CONTAJMPSTART1;是末地址,一次显示结束跳回START1CONT:ADDA,R5;次帧扫描首址调整MOVB,A;AJMPLOOP;转LOOP进行次帧扫描;;显示子程序,字符数据从P0口输出,扫描控制字从P2口输出,显示1帧约需8MSDISPLAY:MOVA,#0FFH;MOVP0,A;关显示数据MOVP2,A;关扫描MOVR6,#0FEH;赋扫描字MOVR0,B;赋显示数据首地址MOVR7,#08H;一次扫描8行DISLOOP:MOVA,@R0;取显示数据MOVP0,A;放入P0口MOVP2,R6;扫描输出(显示某一行)LCALLDL1MS;亮1毫秒INCR0;指向下一行数据地址MOVA,R6;扫描字移入ARLA;循环左移一位MOVR6,A;放回R6DJNZR7,DISLOOP;8行扫描未完转DISLOOP继续RET;8行扫描结束;;左移显示控制程序DISP2:MOV R5,#32 ;左移32次DISP22: LCALLDISPP;调用左移显示控制子程序LCALLMOVH;调用高位移出处理子程序MOVHLCALLMOVH1;调用高位移出处理子程序MOVH1 DJNZ R5,DISP22;左移显示32次控制LJMPSTART1;跳回主程序;;左移显示控制子程序DISPP:MOVB,#50H;第一显示字符首址MOVR4,#25H;1帧显示时间控制DISPP1:LCALLDISPLAY;调用显示子程序一次DJNZR4,DISPP1;1帧显示时间不到转DISPP再循环RET;;高位移出处理子程序.将“电子设计”四个字符数据的最高位移出至21H-24H单元内MOVH:MOVR1,#21H;最高位移出存放单元首址MOVR0,#50H;“电子设计”字符数据首址MOVR2,#08H;每“字"移8次MOV1:MOVA,@R0;取“电子设计"字符数据CLRC;清进位CRLCA;带进位循左移MOV@R0,A;放回原单元MOVA,@R1;存放单元数据入ARRCA;带进位循右移MOV@R1,A;放回存放单元INCR0;字符数据地址加1DJNZR2,MOV1;移8次未完转MOV1再移MOVR2,#08H;8次移完赋初值INCR1;存放单元地址加1MOVA,R1;判断地址是否小于25HSUBBA,#25H;JZOUT;等于25H退出AJMPMOV1;小于25H转MOV1继续OUT:RET;子程序结束;;高位移出处理子程序。MOVH1:MOVA,21H;21H与22H、23H、24H单元数据循交换XCHA,24H;21H与24H全交换XCHA,23H;23H与24H全交换XCHA,22H;23H与22H全交换MOV21H,A;22H与21H全交换MOVR1,#21H;以下是重新组成显示字符数据表程序MOVR0,#50H;将21H-24H的各位分别移入50H-6FH的低位MOVR2,#08H;移位次数MOV2:MOVA,@R0;取字符数据RRA;右移MOV@R0,A;放回原单元MOVA,@R1;取原移出最高位存放单元数CLRC;清CRRCA;带进位循环右移MOV@R1,A;放回原单元MOVA,@R0;取字符数据RLCA;带进位循环左移MOV@R0,A;放回字符数据INCR0;字符数据地址加1DJNZR2,MOV2;8次未完转MOV2再继续MOVR2,#08H;8次完赋初值INCR1;原移出最高位存放单元地址加1MOVA,R1;判断地址是否小于25HSUBBA,#25H;JZOUT;等于25H转OUT退出AJMPMOV2;小于25H转MOV2继续;;1毫秒延时子程序,采用调用扫键子程序延时,可快速读出按纽的状态DL1MS:MOVR3,#64H;100*(10+2)usLOOPK:LCALLKEYWORKDJNZR3,LOOPKRET;;0。5毫秒延时子程序DL512:MOVR2,#0FFHLOOP1:DJNZR2,LOOP1RET;;10毫秒延时子程序DL10MS:MOVR3,#14HLOOP2:LCALLDL512DJNZR3,LOOP2RET;;“电子设计”显示用ROM数据表TAB:DB0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H;电DB0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH;子DB0B1H,0B5

温馨提示

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

评论

0/150

提交评论