最新51单片机定时汇编程序汇总.docx
- 文档编号:20112319
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:26
- 大小:21.32KB
最新51单片机定时汇编程序汇总.docx
《最新51单片机定时汇编程序汇总.docx》由会员分享,可在线阅读,更多相关《最新51单片机定时汇编程序汇总.docx(26页珍藏版)》请在冰豆网上搜索。
最新51单片机定时汇编程序汇总
51单片机定时汇编程序
;******************;
;定时器程序;
;采用89c51;
;2001.10;
;******************;
;
;******************
;伪定义;
;******************
SLEQU30H;SL存放秒的个位数
SHEQU31H;SH存放秒的十位数
MLEQU32H;ML存放分的个位数
MHEQU33H;MH存放分的十位数
HLEQU34H;HL存放时的个位数
HHEQU35H;HH存放时的十位数
;
L0EQU36H;L0~L3:
显示数据存储器
L1EQU37H
L2EQU38H
L3EQU39H
DSPLYPEQU3AH;显示数据指针(DISPLAY-POINT)
PLYTSEQU3BH;显示次数计数器(DISPLAY-TIMES)
;
LPLMODBIT39H;低两位显示方式(LOW-PLAY-MOD)
HPLMODBIT3AH;高两位显示方式(HIGH-PLAY-MOD)
BRIGHTBIT3BH;DISPLAY子程序参数:
亮灭指示位
;
TCOUNTEQU3CH;时间计数器(TIME-COUNT)
;
ADDRESEQU3DH;加1子程序参数
MAXEQU3EH;加1子程序参数
IFDECBIT20H;BCD加法子程序参数
;
R_MODEQU3FH;响铃方式参数
;
LED4BIT30H;发光管状态位
BELLBITP1.7;蜂鸣器
SWITCHBITP3.7;继电器
FKEYBITP3.0;功能键(S1)
MKEYBITP3.1;修改键(S2)
;
WORKINBIT38H;工作状态指示位
;
;******************
;中断入口;
;******************
ORG0000H
START:
LJMPMAIN;0000H引向主程序
LJMPERR;0003H
NOP
NOP
LJMPERR;引向出错处理程序
LJMPPGT0;000BH引向中断处理程序PGT0
NOP
NOP
LJMPERR;引向出错处理程序
LJMPERR;0013HINT1
NOP
NOP
LJMPERR
LJMPERR;001BHT1
NOP
NOP
LJMPERR
LJMPERR;0023H
NOP
NOP
LJMPERR
LJMPERR;002BH
NOP
NOP
;
;************
;主程序;
;************
MAIN:
MOVIE,#00H;关中断
MOVSP,#57H;设置堆栈指针
MOVPSW,#00H;选用寄存器组0
MOVTMOD,#11H;设定中断工作方式为T0和T1
;
MOVA,56H
CJNEA,#0AAH,CSTART;判上电复位标志,无标志转冷启动
MOVA,57H
CJNEA,#55H,CSTART;无标志转冷启动
AJMPHSTART;有上电复位标志转热启动
NOP
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;转开始工作
NOP
NOP
LJMPERR;软件陷阱
HSTART:
MOVSCON,#00H;有上电标志,热启动,清串行口控制寄存器
MOVIP,#00H;清中断优先控制寄存器
SETBFKEY;重设按键
SETBMKEY
SETBEA;开中断
AJMPBEGIN;转向继续工作
NOP
NOP
LJMPERR;软件陷阱
SETUP:
SETBEA;开中断
;
MAIN1:
ACALLDISPLY;调用显示
JBFKEY,JUDGE;按键扫描
ACALLKEYDLY;延时消抖动
JBFKEY,JUDGE;无键按下转向判断是否到点
CLRET0;功能键被按下,则
CLRTR0;暂停计时
ACALLMENU;调用菜单设置程序
BEGIN:
SETBWORKIN;置工作标志位,开始工作
SETBET0;开中断
SETBTR0;开始计时
MOVA,R4;移入工作模式选择
RLA;指针放大
MOVDPTR,#M_TAB
JMP@A+DPTR;根据工作模式跳转到相应程序段
M_TAB:
AJMPWORK1
AJMPWORK2
AJMPWORK3
AJMPWORK4
NOP
NOP
LJMPERR;软件陷阱
WORK1:
;
WORK2:
CLRSWITCH;工作方式1和2:
开继电器
AJMPMAIN2
NOP
NOP
LJMPERR;软件陷阱
WORK3:
;
WORK4:
SETBSWITCH;工作方式3和4:
不开继电器
MAIN2:
CLRBELL;蜂鸣器短鸣一声,以示开始工作
ACALLDL05S
SETBBELL
JUDGE:
JNBWORKIN,MAIN1;判断是否在定时之中
MOVA,SL;判断秒是否为零
JNZMAIN1
MOVA,SH;判断秒是否为零
JNZMAIN1
MOVA,ML;判断分是否为零
JNZMAIN1
MOVA,MH;判断分是否为零
JNZMAIN1
MOVA,HL;判断时是否为零
JNZMAIN1
MOVA,HH;判断时是否为零
JNZMAIN1;若时分秒全为零则
CLRET0;停止计时
CLRTR0;
ACALLACTION;调用到点工作子程序
AJMPMAIN;返回
NOP
NOP
LJMPERR;软件陷阱
;
;******************
;倒计时程序;
;******************
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;移入分位的地址
ACALLADDBCD;分减1
CJNER3,#99H,OUTT0;判断分要否借位
MOVMH,#05H
MOVML,#09H
MOVR0,#HH
ACALLADDBCD
OUTT0:
POPDPH;恢复现场
POPDPL
POPPSW
POPACC
SETBEA
RETI;中断返回
NOP
NOP
LJMPERR;软件陷阱
;
;
;**************************
;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;交换
ANLA,#0FH;取结果数的高位
MOV@R0,A;存数
RET
NOP
NOP
LJMPERR;软件陷阱
;
;**************
;加1程序;
;**************
ADDONE:
MOVR0,ADDRES;移入被加数单元的地址
CLRIFDEC;设定BCD子程序做加法
ACALLADDBCD;调用BCD子程序
CLRC;判断被加数是否大于
MOVA,R3;最大值"MAX"
CJNEA,MAX,JGOVER
JGOVER:
JCENDADO
CLRA;若大于"MAX",则清零
MOV@R0,A
DECR0
MOV@R0,A
ENDADO:
RET
NOP
NOP
LJMPERR;软件陷阱
;
;******************
;调时快进程序;
;******************
QUICK:
CLRLPLMOD;设定显示方式不闪烁
CLRHPLMOD
ACALLADDONE;调用加1子程序
MOVL0,R4;将工作模式选择数移入显存
INCL0;加1转化成显示值
ACALLKEYDLY;延时
ACALLDL100
JNBMKEY,QUICK;判断键是否松开
SETBLPLMOD;若松开则恢复闪烁显示方式
CJNER6,#02H,ENDQUK
SETBHPLMOD
CLRLPLMOD
ENDQUK:
RET
NOP
NOP
LJMPERR;软件陷阱
;
;
;******************
;功能菜单程序;
;******************
MENU:
MOVR6,#00H;初始化;R6计功能键按键次数
MOVADDRES,#05H;将R5的地址送入,以便于改变R4的值
MOVMAX,#04H;定义工作模式选择寄存器R4的最大值
MOVDSPLYP,#L0;定义显示指针指向显存
SETBLPLMOD;设定低两位数闪烁
CLRHPLMOD
MOVL0,R4;送显示数据"F-0X"
INCL0
MOVL1,#00H
MOVL2,#0BH
MOVL3,#00H
SETBLED4
;
WAITFK:
ACALLDISPLY;等待F键释放
JNBFKEY,WAITFK
MENU1:
ACALLDISPLY
JBMKEY,JGFKEY;M键扫描
ACALLKEYDLY;延时消抖动
JBMKEY,JGFKEY;未按下则转F键扫描
CJNER6,#00H,NEXT1;
MOVSL,#00H;若中途改变定时方式,则清除原计时数据
MOVSH,#00H
MOVML,#00H
MOVMH,#00H
MOVHL,#00H
MOVHH,#00H
NEXT1:
MOVR2,#00H;R2用于判断按键时间是否超过0.5秒
NEXT2:
ACALLADDONE;调用加1程序
MOVL0,R4;移入工作方式选择数
INCL0
;
WAITMK:
ACALLDISPLY;等待M键释放
INCR2;R2自增一
CLRC
CJNER2,#0C8H,JGQUIC;若R2大于等于200则调用快进子程序
JGQUIC:
JCWATMK1
ACALLQUICK
WATMK1:
JNBMKEY,WAITMK;R2小于200则等待M键释放
;
JGFKEY:
JBFKEY,MENU1;功能(F)键扫描
ACALLKEYDLY;延时消抖动
JBFKEY,MENU1;键未按下则转修改(M)键扫描
INCR6;F键按键次数加1
MOVA,R6;移入按键次数
RLA;指针放大
MOVDPTR,#FUNTAB
JMP@A+DPTR;根据按键次数跳转到相应的程序段
FUNTAB:
AJMPWAITFK
AJMPSETLOW
AJMPSETHI
AJMPENDMEN
NOP
NOP
AJMPENDMEN
;STWKMD:
;工作模式设定,不需另外改变菜单
;
SETLOW:
MOVMAX,#60H;设置低位(秒位或分位)
MOVA,R4;移入工作模式选择数
RLA;指针放大
MOVDPTR,#FTAB1
JMP@A+DPTR;根据工作模式选择数跳转到相应的程序段
FTAB1:
AJMPSETSS
AJMPSETM60
AJMPSETSS
AJMPSETM60
NOP
NOP
AJMPWAITFK
SETSS:
MOVDSPLYP,#SL;设定显示区域为MM:
SS
MOVADDRES,#SH
AJMPWAITFK
SETM60:
MOVDSPLYP,#ML;设定显示区域为HH:
MM
MOVADDRES,#MH
AJMPWAITFK
;
SETHI:
CLRLPLMOD;设置高位(分位或时位)
SETBHPLMOD;高两位数码管闪烁
MOVMAX,#31H;最大数为30
MOVA,R4;移入工作模式选择数
RLA;指针放大
MOVDPTR,#FTAB2;移入表首地址
JMP@A+DPTR;根据工作模式选择数跳转到相应的程序段
FTAB2:
AJMPSETM30
AJMPSETHH
AJMPSETM30
AJMPSETHH
NOP
NOP
AJMPWAITFK;返回等待键释放
SETM30:
MOVADDRES,#MH;移入分位的地址
AJMPWAITFK;转向等待键释放
SETHH:
MOVADDRES,#HH;移入时位的地址
AJMPWAITFK;转向等待键释放
;
ENDMEN:
CLRHPLMOD;恢复不闪烁显示方式
RET
NOP
NOP
LJMPERR;软件陷阱
;
;****************
;到点工作程序;
;****************
ACTION:
MOVL0,R4;移入工作模式选择数
INCL0;送显示数"F-0X"
MOVL1,#00H
MOVL2,#0BH
MOVL3,#00H
SETBLED4
MOVDSPLYP,#L0;指针指向显存
SETBLPLMOD;设定显示方式不闪烁
SETBHPLMOD
MOVA,R4;移入工作模式选择数
RLA;
MOVDPTR,#A_TAB
JMP@A+DPTR;根据工作模式选择数跳转
A_TAB:
AJMPACTF1;工作模式一
AJMPACTF1;工作模式二
AJMPACTF3;工作模式三
AJMPACTF3;工作模式四
NOP
NOP
LJMPERR;软件陷阱
ACTF1:
SETBSWITCH;工作模式一(或二):
关继电器
MOVR_MOD,#82H;响铃模式参数#82H
MOVR2,#96H;响铃次数参数#96H
ACTF11:
ACALLRING;调用响铃子程序
JNBMKEY,ENDACT;等待键按下
JNBFKEY,ENDACT;有键按下则结束响铃
DJNZR2,ACTF11;次数未满继续响铃
MOVR_MOD,#0FFH;参数#0FF使响铃无效
AJMPACTF11;无键按下返回
NOP
NOP
LJMPERR;软件陷阱
ACTF3:
CLRSWITCH;工作模式三(或四):
开继电器
CLRBELL;蜂鸣器短鸣一声
ACALLDL1S
SETBBELL
MOVR_MOD,#0FFH;响铃模式参数#0FFH
MOVR2,#96H;响铃时间参数#96H
ACTF31:
ACALLRING;调用响铃子程序
JNBMKEY,ENDACT;等待键按下
JNBFKEY,ENDACT;有键按下则结束
DJNZR2,ACTF31;次数未满继续
MOVR2,#96H;重新赋值
CLRBELL;短鸣一声(说明:
响铃模式参数#0FFH使
ACALLDL100;响铃程序无效,仅起延时作用,
SETBBELL;每延时一段时间短鸣一声,以
AJMPACTF31;提醒使用者继电器仍在工作)
NOP
NOP
LJMPERR;软件陷阱
ENDACT:
SETBSWITCH;关继电器
AWAITF:
ACALLDISPLY;调用显示
JNBFKEY,AWAITF;等待键释放
AWAITM:
ACALLDISPLY;调用显示
JNBMKEY,AWAITM;等待键释放
RET
NOP
NOP
LJMPERR;软件陷阱
;
;**************
;响铃程序;
;**************
RING:
MOVR5,#18H;R5为循环控制变量
RING1:
JNBMKEY,R_EXIT;键扫描
JNBFKEY,R_EXIT;有键按下则退出
MOVA,R_MOD;移入响铃模式参数
MOVC,ACC.7;根据响铃模式参数改变响铃
MOVBELL,C
RLA
MOVR_MOD,A
ACALLDL100;延时
DJNZR5,RING1;循环次数控制
R_EXIT:
SETBBELL;关闭响铃
RET
NOP
NOP
LJMPERR;软件陷阱
;
;**************
;显示程序;
;**************
DISPLY:
PUSHACC;数据压栈保护
PUSHPSW
MOVPSW,#10H;选用寄存器组2
MOVR0,DSPLYP;移入显示指针
MOVR2,#0FDH;R2寄存的是数码管选通数
MOVA,PLYTS;移入显示循环控制量
JNZPLAY;不为0则转PLAY
MOVPLYTS,#64H;否则从新赋值
CPLBRIGHT;亮灭指示位取反
PLAY:
DECPLYTS;显示循环控制量减1
JNBLPLMOD,PLAYL;低两位数码管不闪则"PLAYL"
JBBRIGHT,PLAYL;亮灭指示为1也"PLAYL"
ACALLNOPLAY;否则灭灯延时
AJMPPLAY1;转显示高位数码管
NOP
NOP
LJMPERR;软件陷阱
;用来显示低位
PLAYL:
ORLP1,#7FH;清原显示数据
ORLP3,#3CH;清原选通数据
MOVA,R2;移入数码管位选数
RLA;换一位
ANLP3,A;选通低位的个位数码管
MOVR2,A;暂存位选数
MOVA,@R0;移入显示数值
MOVDPTR,#TABLE1;移入表首地址
MOVCA,@A+DPTR;查表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 51 单片机 定时 汇编程序 汇总