最新51单片机定时汇编程序Word格式.docx
《最新51单片机定时汇编程序Word格式.docx》由会员分享,可在线阅读,更多相关《最新51单片机定时汇编程序Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
低两位显示方式(LOW-PLAY-MOD)
HPLMODBIT3AH;
高两位显示方式(HIGH-PLAY-MOD)
BRIGHTBIT3BH;
DISPLAY子程序参数:
亮灭指示位
TCOUNTEQU3CH;
时间计数器(TIME-COUNT)
ADDRESEQU3DH;
加1子程序参数
MAXEQU3EH;
IFDECBIT20H;
BCD加法子程序参数
R_MODEQU3FH;
响铃方式参数
LED4BIT30H;
发光管状态位
BELLBITP1.7;
蜂鸣器
SWITCHBITP3.7;
继电器
FKEYBITP3.0;
功能键(S1)
MKEYBITP3.1;
修改键(S2)
WORKINBIT38H;
工作状态指示位
中断入口;
ORG0000H
START:
LJMPMAIN;
0000H引向主程序
LJMPERR;
0003H
NOP
LJMPERR;
引向出错处理程序
LJMPPGT0;
000BH引向中断处理程序PGT0
0013HINT1
LJMPERR
001BHT1
0023H
LJMPERR
LJMPERR;
002BH
************
主程序;
;
MAIN:
MOVIE,#00H;
关中断
MOVSP,#57H;
设置堆栈指针
MOVPSW,#00H;
选用寄存器组0
MOVTMOD,#11H;
设定中断工作方式为T0和T1
MOVA,56H
CJNEA,#0AAH,CSTART;
判上电复位标志,无标志转冷启动
MOVA,57H
CJNEA,#55H,CSTART;
无标志转冷启动
AJMPHSTART;
有上电复位标志转热启动
NOP
LJMPERR;
软件陷阱,引向出错处理程序
CSTART:
MOVP1,#0FFH;
冷启动,全面初始化
MOVP3,#0FFH
MOVTCON,#00H;
计时停止
MOVTL0,#0B0H;
赋中断T0初值
MOVTH0,#3CH
MOVTCOUNT,#0AH;
赋定时器初值
MOVR5,#00H;
R5为一空单元(备用)
MOVR4,#00H;
R4为工作模式选择寄存器
MOVSL,#00H;
定时单元清零
MOVSH,#00H;
秒
MOVML,#00H;
MOVMH,#00H;
分
MOVHL,#00H;
MOVHH,#00H;
时
MOVPLYTS,#64H;
赋显示次数初值为100次
MOVDSPLYP,#L0;
显示指针指向显存单元
MOVL0,#0AH;
送显示数据"
-----"
MOVL1,#0AH
MOVL2,#0AH
MOVL3,#04H
SETBLED4;
LED4为数码管之间的发光二极管
SETBLPLMOD;
设定显示方式为闪烁
SETBHPLMOD;
SETBBRIGHT;
允许显示
CLRWORKIN;
清工作标志,待命
AJMPSETUP;
转开始工作
软件陷阱
HSTART:
MOVSCON,#00H;
有上电标志,热启动,清串行口控制寄存器
MOVIP,#00H;
清中断优先控制寄存器
SETBFKEY;
重设按键
SETBMKEY
SETBEA;
开中断
AJMPBEGIN;
转向继续工作
LJMPERR;
SETUP:
MAIN1:
ACALLDISPLY;
调用显示
JBFKEY,JUDGE;
按键扫描
ACALLKEYDLY;
延时消抖动
无键按下转向判断是否到点
CLRET0;
功能键被按下,则
CLRTR0;
暂停计时
ACALLMENU;
调用菜单设置程序
BEGIN:
SETBWORKIN;
置工作标志位,开始工作
SETBET0;
SETBTR0;
开始计时
MOVA,R4;
移入工作模式选择
RLA;
指针放大
MOVDPTR,#M_TAB
JMP@A+DPTR;
根据工作模式跳转到相应程序段
M_TAB:
AJMPWORK1
AJMPWORK2
AJMPWORK3
AJMPWORK4
NOP
LJMPERR;
WORK1:
WORK2:
CLRSWITCH;
工作方式1和2:
开继电器
AJMPMAIN2
WORK3:
WORK4:
SETBSWITCH;
工作方式3和4:
不开继电器
MAIN2:
CLRBELL;
蜂鸣器短鸣一声,以示开始工作
ACALLDL05S
SETBBELL
JUDGE:
JNBWORKIN,MAIN1;
判断是否在定时之中
MOVA,SL;
判断秒是否为零
JNZMAIN1
MOVA,SH;
MOVA,ML;
判断分是否为零
MOVA,MH;
MOVA,HL;
判断时是否为零
MOVA,HH;
JNZMAIN1;
若时分秒全为零则
CLRET0;
停止计时
CLRTR0;
ACALLACTION;
调用到点工作子程序
AJMPMAIN;
返回
倒计时程序;
PGT0:
CLREA;
PUSHACC;
保护现场
PUSHPSW
PUSHDPL
PUSHDPH
MOVPSW,#08H;
选用寄存器组1
CLRTR0;
MOVA,#0B7H;
中断同步修正
ADDA,TL0
MOVTL0,A
MOVA,#3CH
ADDA,TH0
MOVTH0,A
SETBTR0;
恢复计时
DECTCOUNT;
定时器T0每50000毫秒溢出一次,则
MOVA,TCOUNT;
溢出10次为0.5秒
JNZOUTT0;
判断是否到半秒
MOVTCOUNT,#0AH;
CPLLED4;
若到半秒LED取反
JNBLED4,OUTT0;
LED每闪烁一次是一秒
MOVR0,#SH;
移入秒位的地址
SETBIFDEC;
BCD子程序参数,使其做减法
ACALLADDBCD;
调用BCD子程序,秒减1
CJNER3,#99H,OUTT0;
判断秒要否借位
MOVSH,#05H;
要借位则
MOVSL,#09H;
送数据59(否则显示99)
MOVR0,#MH;
移入分位的地址
分减1
判断分要否借位
MOVMH,#05H
MOVML,#09H
MOVR0,#HH
ACALLADDBCD
OUTT0:
POPDPH;
恢复现场
POPDPL
POPPSW
POPACC
SETBEA
RETI;
中断返回
**************************
BCD子程序(加1或减1);
ADDBCD:
MOVA,@R0;
移入被操作数的高位
DECR0;
指针减一
SWAPA
ORLA,@R0;
移入被操作数的低位
MOVB,#01H;
B寄存器送立即数#01H
MOVC,IFDEC;
若减法标志位为1,则
MOVB.3,C;
MOVB.4,C;
B寄存器的值被改为#99H
MOVB.7,C;
ADDA,B;
对一个压缩的BCD码加#99H等于对其减一
DAA;
BCD码调整
MOVR3,A;
暂存结果
ANLA,#0FH;
取低位码
MOV@R0,A;
存数
MOVA,R3;
取回结果
INCR0;
指针加一
SWAPA;
交换
取结果数的高位
RET
**************
加1程序;
ADDONE:
MOVR0,ADDRES;
移入被加数单元的地址
CLRIFDEC;
设定BCD子程序做加法
调用BCD子