返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 进入论坛

 单片机教程 栏目导航   第一页..单片机入门教程    第二页..单片机c语言   第三页..红外遥控和步进电机    第四页..单片机问答

 

3.主程序流程图---51系列单片机设计实例教程

主程序流程图如图6.2所示。

                                            图6.2 主程序流程图

本控制器在使用中,如要改变闪烁的方式,可按下相应的功能按键。当一个完整的闪烁循环结束后,即可转入新的闪烁方式。由于键扫描是在闪烁循环结束时进行,因此,功能开关按下的时间应较长才能被读入。改进的方法是把DL05S延时子程序用键扫描子程序来替代,这样,只要按下按键即可被键扫描程序读入。

以下是LED小灯闪烁控制器的完整源程序:

;* * * * * * * * * * * *;

;     小灯控制程序      ;

;* * * * * * * * * * * *;

;* * * * * * * * * * * *;

;     中断入口程序      ;

;* * * * * * * * * * * *;

ORG   OOOOH;程序执行开始地址

LJMP  START;跳至START执行

ORG   OOO3H;外中断0中断入口地址

RETI;       中断返回(不开中断)

ORG   OOOBH;定时器TO中断入口地址

RETI;       中断返回(不开中断)

ORG   OO13H;外中断1中断入口地址

RETI;       中断返回(不开中断)

ORG  001BH;定时器T1中断入口地址

RETI;       中断返回(不开中断)

ORG  0023H;串行口中断入口地址

RETI;       中断返回(不开中断)

;* * * * * * * * * * * *;

;     初始化程序        ;

;* * * * * * * * * * * *;

CLEAR: MOV   20H,#00H;20H单元内存清0(闪烁标志清0)

        SETB   00H;      20H.0位置1(上电时,自动执行闪烁功能1)

        RET;             子程序返回

;* * * * * * * * * * * *;

;        主程序         ;

;* * * * * * * * * * * *;

START:  ACALL CLEAR;    调用初始化子程序

MAIN:   LCALL  KEYWORK;  调用键扫描子程序

         JB     OOH,FUNO;20H.0位为1时执行FUNO

         JB     01H,FUN1;20H.1位为1时执行FUN1

         JB     02H,FUN2;20H.2位为1时执行FUN2

         JB     03H,MAIN;备用

         AJMP   MAIN;     返回主程序MAIN

;* * * * * * * * * * * *;

;      功能程序         ;

;* * * * * * * * * * * *;

;第1种闪烁功能程序

FUNO:   MOV     A,OFEH;   累加器赋初值

FUNOO:  MOV    P1,A;     累加器值送至P1口

         LCALL  DL05S;     延时

         JNB    ACC.7.MAIN;累加器最高位为0时转MAIN

         RL     A;         累加器A中数据循环左移1位

         AJMP   FUNOO;     转FUNOO循环

;第2种闪烁功能程序

FUN1:   MOV   A,#OFEH;   累加器赋初值

FUN11:  MOV   P1,A;      累加器值送至P1口

         LCALL DLO5S;      延时

         CPL   A;          A中各位取反

         MOV   P1,A;      累加器值送至P1口

         LCALL DL05S;      延时

         AJMP  MAIN;       转MAIN

;* * * * * * * * * * * *;

;      扫键程序         ;

;* * * * * * * * * * * *;

KEYWORK:MOV   P3#OFFH;   置P3口为输入状态

         JNB   P3.0,KEYO;读P3.0口,若为0转KEYO

         JNB   P3.1,KEY1;读P3.1口,若为0转KEY1

         JNB   P3.2,KEY2;读P3.2口,若为0转KEY2

         JNB   P3.3,KEY3;读P3.3口,若为0转KEY3

         RET;             子程序返回

;闪烁功能0键处理程序

KEYO:   LCALL   DL10MS;    延时10ms消抖

         JB      P3.0,OUTO;P3.0为1,子程序返回(干扰)

         SETB    OOH;       20H.0位置1(执行闪烁功能1标志)

         CLR     01H;       20H.1位清0

         CLR     02H;       20H.2位清0

OUTO:   RET;               子程序返回

;闪烁功能1键处理程序

KEY1:  LCALL   PL10MS

        JB      P3.1,OUT1

        SETB    01H;       20H.1位置1(执行闪烁功能2标志)

        CLR     00H

        CLR     02H

        CLR     03H

OUT2:  RET

;闪烁功能(备用)键处理程序

KEY3:  LCALL   DL10MS

        JB      P3.2,OUT2

        SETB    02H;       20H.2位置1(执行闪烁功能3标志)

        CLR     01H

        CLR     00H

        CLR     03H

OUT2:  RET

;闪烁功能(备用)键处理程序

KEY3:  LCALL   DL10MS

        JB      P3.3,OUT3

        SETB    03H;       20H.3位置1(执行闪烁功能3标志)

        CLR     01H

        CLR     02H

        CLR     00H

OUT3:  RET

;* * * * * * * * * * * *;

;      延时程序         ;

;* * * * * * * * * * * *;

;延时子程序,执行一次时间为513us

DL512: MOV    R2,#OFFH

LOOP1: DJNZ   R2,LOOP1

        RET

;10ms延时子程序(调用20次0.5ms延时子程序)

DL10MS:MOV   R3,#14H

LOOP2: LCALL  DL512

        DJNZ   R3,LOOP2

        RET

;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)

DL05s: MOV   R4,#OFH

LOOP3: LCALL DL25MS

        DJNZ  R4,LOOP3

        RET

;延时子程序,改变R4寄存器初值可改变闪烁的快慢(时间为25msX15)

DL05S: MOV   R4,#OFH

LOOP3: LCALL DL25MS

        DJNZ  R4,LOOP3

        RET

;25ms延时子程序,调用扫键子程序延时,可快速读出功能按键值

DL25MS:MOV   R5,#OFFH

LOOP4: LCALL KEYWORK

        DJNZ  R5,LOOP4

        RET

END;                  程序结束

12个经典单片机程序设计实例:

闪烁LED小灯主程序图

数码管时钟电路的主程序

单键学习型遥控器的设计

15路电器遥控器的设计

自行车里程/速度计的设计

自动往返行驶小汽车的设计

遥控小汽车的设计

数码管时钟电路的设计

8*8点阵LED字符显示器的设计

8路输入模拟信号数值显示电路的设计

8路输入模拟信号数值显示电路程序

单键学习型遥控器的程序

如果对本文有疑问,请到论坛提问 编辑:51单片机学习网 @ 2009-10-20校对 中国开发板最佳品牌  版权:部分由编辑摘引,权利属原著作人