当前位置:文档之家› 51单片机数码管倒计时模拟交通灯汇编程序

51单片机数码管倒计时模拟交通灯汇编程序


/**********************************************************************
51单片机数码管倒计时模拟交通灯汇编程序
LED数码管为4位共阳数码管
P0口为数码管段码口,段码口驱动为74HC573
P1口为数码管位码口,位码口驱动为9013
数码管从左向右分别为1,2,3,4
P1.0,P1.1,P1.2,P1.3分别对应数码管1,2,3,4;
数码管1,2为东西方向倒计时数值十位、个位
数码管3,4为南北方向倒计时数值十位、个位
P2口控制发光二极管,驱动器74HC573由P3.7控制选通;
***********************************************************************/


/********************伪指令************************/
EW_UNIT_BUF EQU 50H //东西方向数码管个位数字缓存
EW_DECA_BUF EQU 51H //东西方向数码管十位数字缓存
NS_UNIT_BUF EQU 52H //南北方向数码管个位数字缓存
NS_DECA_BUF EQU 53H //南北方向数码管十位数字缓存
SEGMENT_CODE EQU P0 //数码管段码口为P0
BIT_CODE EQU P1 //数码管位码口为P1
COUNT_REGISTER EQU R7 //循环变量寄存器为R7
EW_COUNT_VALUE EQU R6 //R6为东西方向倒计时数值寄存器
NS_COUNT_VALUE EQU R3 //R3为南北方向倒计时数值寄存器
EW_RED BIT P2.7 //东西方向红灯
EW_YELLOW BIT P2.6 //东西方向黄灯
EW_GREEN BIT P2.5 //东西方向绿灯
NS_RED BIT P2.4 //南北方向红灯
NS_YELLOW BIT P2.3 //南北方向黄灯
NS_GREEN BIT P2.2 //南北方向绿灯


/************主程序******************/
ORG 0000H
AJMP MAIN
ORG 000BH //T0中断向量入口地址
LJMP INTT0
ORG 0030H
MAIN: MOV P0,#0FFH //I/0口,寄存器初始化
MOV P1,#0FFH
MOV P2,#0FFH
MOV P2,#00H
CLR P3.7 //流水灯驱动器74hc573选通置低,573选通
MOV BIT_CODE,#00H
MOV COUNT_REGISTER,#20 //定时计数器T0定时50ms,循环20次获得一秒定时


/*************T0初始化**************/
MOV TMOD,#01H //定时计数器T0,模式1,16位
MOV TH0,#3CH //50MS定时初值
MOV TL0,#0B0H
SETB EA //开总中断
SETB ET0 //开T0中断
SETB TR0 //T0启动


/**********************************
状态1:
东西红灯亮,倒计时初值20S
南北绿灯亮,倒计时初值17S
**********************************/
STATE1: MOV EW_COUNT_VALUE,#20 //东西方向倒计时初值20
MOV NS_COUNT_VALUE,#17 //南北方向倒计时初值17
MOV P2,#00H
SETB EW_RED //东西红灯20s
SETB NS_GREEN //南北绿灯17s

/**********************************
状态2:
南北绿灯17S倒计时完成,绿灯熄灭
黄灯点亮,倒计时初值3S
**********************************/
STATE2: LCALL DISPLAY //调用显示子程序
CJNE NS_COUNT_VALUE,#00H,STATE2 //若倒计时未到0则继续调

用显示子程序
MOV NS_COUNT_VALUE,#3 //黄灯倒计时初值3
CLR NS_GREEN //绿灯熄灭
SETB NS_YELLOW //黄灯点亮

/**********************************
状态3:
南北黄灯灭,红灯倒计时初值20s
东西红灯灭,绿灯亮,倒计时初值17s
**********************************/
STATE3: LCALL DISPLAY
CJNE NS_COUNT_VALUE,#00H,STATE3
MOV NS_COUNT_VALUE,#20 //南北黄灯灭,红灯倒计时初值20s
CLR NS_YELLOW
SETB NS_RED
MOV EW_COUNT_VALUE,#17 //东西红灯灭,绿灯亮,倒计时初值17s
CLR EW_RED
SETB EW_GREEN

/**********************************
状态4:
南北持续红灯
东西绿灯灭,黄灯倒计时初值3s
**********************************/
STATE4: LCALL DISPLAY
CJNE EW_COUNT_VALUE,#00H,STATE4
MOV EW_COUNT_VALUE,#3 //东西绿灯灭,黄灯倒计时初值3s
CLR EW_GREEN
SETB EW_YELLOW
CLR NS_GREEN

/**********************************
状态5:
黄灯倒计3s完成后所有状态完成,
返回状态1,循环
**********************************/
STATE5: LCALL DISPLAY
CJNE EW_COUNT_VALUE,#00H,STATE5
SJMP STATE1 //返回状态1



/******中断子程序**********/
INTT0: DJNZ COUNT_REGISTER,NT0 //计数寄存器不为0则跳转,T0重新赋初值
MOV COUNT_REGISTER,#20 //计数寄存器赋值20
DEC EW_COUNT_VALUE //东西方向倒计时数值减1
DEC NS_COUNT_VALUE //东西方向倒计时数值减1
NT0: MOV TH0,#3CH //T0赋50MS初值
MOV TL0,#0B0H
SETB TR0 //启动T0
RETI

/********LED数码管显示子程序*********/
DISPLAY:MOV DPTR,#TABLE //显示代码表首地址送DPTR
MOV A,EW_COUNT_VALUE //东西倒计时数值减1
MOV B,#10 //将倒计时寄存器中16进制数转换为10进制
DIV AB
MOV EW_DECA_BUF,A //东西倒计时数值十位存放在EW_DECA_BUF
MOV EW_UNIT_BUF,B //东西倒计时数值个位存放在EW_UNIT_BUF
MOV A,EW_UNIT_BUF
MOVC A,@A+DPTR //取东西倒计时个位显示码
MOV SEGMENT_CODE,A //东西倒计时个位显示码送段码口
MOV BIT_CODE,#02H //P1.1为1,P1口其余位为0,点亮东西倒计时个位
LCALL DELAY_1MS //延时1MS
MOV A,EW_DECA_BUF
MOVC A,@A+DPTR //取东西倒计时数值十位显示码
MOV SEGMENT_CODE,A //东西倒计时十位显示码送段码口
MOV BIT_CODE,#01H //P1.0为1,P1口其余位为0,点亮东西倒计时十位
LCALL DELAY_1MS //延时1MS

MOV A,NS_COUNT_VALUE //南北方向倒计时数值显示
MOV B,#10
DIV AB
MOV NS_DECA_BUF,A
MOV NS_UNIT_BUF,B
MOV A,NS_UNIT_BUF
MOVC A,@A+DPTR
MOV SEGMENT_CODE,A
MOV BIT_CODE,#08H
LCALL DELAY_1MS
MOV A,NS_DECA_BUF
MOVC A,@A+DPTR
MOV

SEGMENT_CODE,A
MOV BIT_CODE,#04H
LCALL DELAY_1MS
RET

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H //0~9共阳数码管显示码
DB 92H, 82H, 0F8H,80H, 90H

DELAY_1MS: //1MS软件延时子程序
MOV R5,#5
DELAY1: MOV R4,#100
DELAY2: DJNZ R4,DELAY2
DJNZ R5, DELAY1
RET
END

相关主题
文本预览
相关文档 最新文档