单片机的汇编交通灯程序.docx
《单片机的汇编交通灯程序.docx》由会员分享,可在线阅读,更多相关《单片机的汇编交通灯程序.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机的汇编交通灯程序.docx](https://file1.bdocx.com/fileroot1/2022-11/25/1dde14c5-e3e0-4ac1-a693-a04fbe123d70/1dde14c5-e3e0-4ac1-a693-a04fbe123d701.gif)
单片机的汇编交通灯程序
/*******************************************************************************
*描述:
*
*AT89S52液晶演示数据p0,控制p2*
*功能:
*
*万年历、频率计、密码锁、点阵屏*
*作者:
*
*哥不在江湖~~*
*技术支持:
*
*湖南工学院*
**
**
**
**
**
**
**
**
********************************************************************************/
;***********************************************************************************************;
;系统起始程序区
ORG0000H
START:
LJMPMAIN
ORG000BH
LJMPTIME
ORG001BH
LJMPTIME2
;***********************************************************************************************;
;系统监控程序区
ORG0030H
MAIN:
MOVSP,#80H;确立堆栈区
MOVPSW,#00H;
MOVTMOD,#01H;定时器初始化,定时器0以工作方式1工作
CLRF0;判断表格首地址标志位
CLREA
MOVR0,#20H;RAM区首地址
MOVR7,#96;RAM区单元个数
ML:
MOV@R0,#00H
INCR0
DJNZR7,ML
TSF:
MOVDPTR,#DISBH;系统初始化后提示符“P.”字符代码表首地址
MOVR5,#08H
MOVR0,#78H
DISPTSF:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR5,DISPTSF
FUN:
ACALLDISP;调显示子程序显示提示符“P.”
ACALLKEY;调用键扫描程序
JB20H.0,JT;S2键按下,则执行交通灯的程序
JB20H.1,SZAJ2;S3键按下,则执行数字按键的程序
LJMPFUN
SZAJ2:
LJMPSZAJ
;***********************************************************************************************;
;交通灯程序入口
JT:
MOVIE,#82H;定时器0初始化
MOVTMOD,#01H;(1秒钟定时)
MOVTH0,#3CH
MOVTL0,#0B0H
MOVR4,#20
CLR21H.0
CLRTR1
CLRTR0
;***********************************************************************************************;
ONE:
MOVR3,#15;第一个状态,主绿次红
MOVP3,#0DEH;灯亮,R3为秒计数
;***********************************************************************************************;
TSF1:
MOVDPTR,#DISBH
MOVR5,#08H
MOVR0,#78H
DISPTSF1:
CLRA;数码管显示缓存区扫描
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR5,DISPTSF1
MOV78H,#05H;数码管显示缓存区付初值
MOV79H,#01H;主绿次红,初值15
SETBTR0;开定时
;***********************************************************************************************;
HA1:
ACALLDISP
JNB21H.0,HUI1
CLR21H.0;15秒倒计时程序
DJNZ78H,HUIQU1
MOVR6,79H
CJNER6,#00H,TEN
LJMPHUIQU1
TEN:
ACALLDISP
JNB21H.0,TEN
MOV78H,#09H
MOV79H,#00H
DECR3
CLR21H.0
LJMPHUIQU1
HUI1:
LJMPHA1
HUIQU1:
DJNZR3,HA1
;***********************************************************************************************;
CLRTR0;第二个状态,主黄次红
;***********************************************************************************************;
TWOTWO:
MOVIE,#88H;定时器1初始化
MOVTMOD,#10H;(0.5秒定时器)
MOVTH1,#3CH
MOVTL1,#0B0H
MOVR4,#10
;***********************************************************************************************;
TWO:
MOVR3,#5;R3还是秒计数
MOVP3,#0DDH;灯亮
;***********************************************************************************************;
TSF2:
MOVDPTR,#DISBH
MOVR5,#08H
MOVR0,#78H;数码管显示缓存区扫描
DISPTSF2:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR5,DISPTSF2;数码管显示缓存区付初值
MOV78H,#05H;主黄次红,初值05
MOV79H,#00H
;***********************************************************************************************;
CLR22H.0
SETBTR1;开定时器1
MOVR7,#00H
HA2:
ACALLDISP
JNB22H.0,HA2;执行两次0.5秒定时,则计1秒
INCR7
CLR22H.0
CJNER7,#02H,HA2
DEC78H
MOVR7,#00H
;***********************************************************************************************;
CJNER3,#4,HUIQU2;当倒计时剩下3秒时,执行主行道黄灯闪烁的程序
;***********************************************************************************************;
SHAN21:
CLR22H.0
LIANG2:
JB22H.0,SHAN22
MOVP3,#0DFH;主行道闪烁程序
ACALLDISP
LJMPLIANG2
SHAN22:
CLR22H.0
MIE2:
JB22H.0,SHAN2
MOVP3,#0DDH
ACALLDISP
LJMPMIE2
SHAN2:
DEC78H
DECR3
CJNER3,#1,SHAN21
LJMPTIAO2
HUIQU2:
DJNZR3,HA2
HUI2:
LJMPHA2
TIAO2:
NOP
;***********************************************************************************************;
CLRTR1;第三个状态,主红次绿
CLRTR0;定时器的选择
SANSAN:
MOVIE,#82H
MOVTMOD,#01H
MOVTH0,#3CH
MOVTL0,#0B0H
MOVR4,#20
;***********************************************************************************************;
SAN:
MOVR3,#5
MOVP3,#0F3H
;***********************************************************************************************;
TSF3:
MOVDPTR,#DISBH
MOVR5,#08H
MOVR0,#78H
DISPTSF3:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR5,DISPTSF3
MOV78H,#05H
MOV79H,#00H
;***********************************************************************************************;
SETBTR0;开定时
HA3:
ACALLDISP
JNB21H.0,HA3;5秒倒计时程序
CLR21H.0
DEC78H
DJNZR3,HA3
;***********************************************************************************************;
CLRTR0;选择定时器1,即0.5秒定时器
SISI:
MOVIE,#88H
MOVTMOD,#10H
MOVTH1,#3CH
MOVTL1,#0B0H
MOVR4,#10
;***********************************************************************************************;
SI:
MOVR3,#5
MOVP3,#0EBH
TSF4:
MOVDPTR,#DISBH
MOVR5,#08H
MOVR0,#78H
DISPTSF4:
CLRA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR5,DISPTSF4
MOV78H,#05H
MOV79H,#00H
CLR22H.0
SETBTR1
HA4:
ACALLDISP
JNB22H.0,HA4
INCR7
CLR22H.0
CJNER7,#02H,HA4
DEC78H
MOVR7,#00H
;***********************************************************************************************;
CJNER3,#4,HUIQU4
;***********************************************************************************************;
SHAN41:
CLR22H.0
LIANG4:
JB22H.0,SHAN42
MOVP3,#0FBH
ACALLDISP
LJMPLIANG4
SHAN42:
CLR22H.0
MIE4:
JB22H.0,SHAN4
MOVP3,#0EBH
ACALLDISP
LJMPMIE4
SHAN4:
DEC78H
DECR3
CJNER3,#1,SHAN41
LJMPTIAO4
HUIQU4:
DJNZR3,HA4
HUI4:
LJMPHA4
TIAO4:
NOP
LJMPJT
;***********************************************************************************************;
SZAJ:
MOVP3,#0FFH;数据初始化
MOV78H,#10H
MOV79H,#10H
MOV7AH,#10H
MOV7BH,#10H
MOV7CH,#10H
MOV7DH,#10H
MOV7EH,#10H
MOV7FH,#10H
XS:
ACALLDISP
ACALLKEY
JB20H.0,KEY00;是S2键,转KEY00执行
JB20H.1,KEY11;是S3键,转KEY11执行
JB20H.2,KEY22;是S4键,转KEY22执行
JB20H.3,KEY33;是S5键,转KEY33执行
JB20H.4,KEY44;是S6键,转KEY44执行
JB20H.5,KEY55;是S7键,转KEY55执行
JB20H.6,KEY66;是S8键,转KEY66执行
JB20H.7,KEY77;是S9键,转KEY77执行
LJMPOUT
KEY00:
LCALLJIAOHUAN
MOV7FH,#00H
LCALLDISP
LJMPOUT
KEY11:
LCALLJIAOHUAN
MOV7FH,#01H
LCALLDISP
LJMPOUT
KEY22:
LCALLJIAOHUAN
MOV7FH,#02H
LCALLDISP
LJMPOUT
KEY33:
LCALLJIAOHUAN
MOV7FH,#03H
LCALLDISP
LJMPOUT
KEY44:
LCALLJIAOHUAN
MOV7FH,#04H
LCALLDISP
LJMPOUT
KEY55:
LCALLJIAOHUAN
MOV7FH,#05H
LCALLDISP
LJMPOUT
KEY66:
LCALLJIAOHUAN
MOV7FH,#06H
LCALLDISP
LJMPOUT
KEY77:
LCALLJIAOHUAN
MOV7FH,#07H
LCALLDISP
OUT:
LJMPXS
TIME:
MOVTH0,#3CH
MOVTL0,#0B0H
DECR4
CJNER4,#0,ZHUAN
SETB21H.0
MOVR4,#20
ZHUAN:
RETI
TIME2:
MOVTH1,#3CH
MOVTL1,#0B0H
DECR4
CJNER4,#0,ZHUAN2
SETB22H.0
MOVR4,#10
ZHUAN2:
RETI
DISBH:
DB11H,10H,10H,10H,10H,10H,10H,10H,10H;提示符“P.”字符序号
;显示字符段选码表(共阳极代码)
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;0-8
DB90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH;9,A,B,C,D,E,F,灭,p.
;**************************************************************************************;
;键扫描子程序
KEY:
LCALLKEYCHULI;调P1口数据处理子程序
JZEXIT;没有键按下,转返回
LCALLDISP;调显示子程序去抖动
LCALLDISP
LCALLKEYCHULI;调P1口数据处理子程序
JZEXIT;没有键按下,转返回
MOVB,20H;保存取反后的键值
KEYSF:
LCALLKEYCHULI;调P1口数据处理子程序
JZKEY1;键释放,则将键值转移并保存
LCALLDISP;调显示子程序延时
LJMPKEYSF;等待释放
KEY1:
MOV20H,B;键值送20H保存
EXIT:
RET;子程序返回
;P1口按键数据处理子程序
KEYCHULI:
PUSHPSW;保护现场
CLRRS1;改变当前寄存器组为组1
SETBRS0
MOVP1,#0FFH;先向P1口写1
MOVA,P1;读P1口数据
CPLA;P1口数据取反
MOV20H,A;保存取反后的键值
CLRRS1;恢复当前寄存器组为组0
CLRRS0
POPPSW;恢复现场
RET;子程序返回
;数码管显示子程序DISP
;入口:
7FH,7EH,7DH,7CH,7BH,7AH,79H,78H(LED7,LED6,LED5,LED4,LED3,LED2,LED1,LED0)
DISP:
PUSHDPH
PUSHDPL
PUSHACC
PUSHPSW
CLRRS1;改变当前寄存器组为组1
SETBRS0
MOVR1,#78H;显示缓冲存储单元首地址
MOVR2,#0FEH;从右至左显示
MOVR5,#08H;循环次数,即驱动数码管的位数
DISP1:
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A;送段控
MOVP2,R2;送位控
LCALLDL
MOVA,R2;延时1毫秒
RLA;获得新的位控码
MOVR2,A;保存新的位控码
INCR1;获得新的显示缓冲单元地址
DJNZR5,DISP1;循环没有结束则继续
DISP2:
POPPSW;恢复当前寄存器组的组号
POPACC
POPDPL
POPDPH
RET
;延时1ms子程序(晶振频率12MHz)DL
DL:
MOVR7,#02H
DL1:
MOVR6,#0FFH
DL2:
DJNZR6,DL2
DJNZR7,DL1
RET
;将78至7EH单元的内容交换子程序
JIAOHUAN:
MOV78H,79H
MOV79H,7AH
MOV7AH,7BH
MOV7BH,7CH
MOV7CH,7DH
MOV7DH,7EH
MOV7EH,7FH
RET
END