基于Proteus仿真的交通信号灯设计——利用汇编语言实现
设计要求
基本信息
- 采用AT89C51单片机
- 晶振频率:12MHZ
- 红绿灯:发光二极管
- 数字显示:LED数码管
- 东西南北四个方向,一次循环共有六个状态,且每个状态的倒计时时间一样
交通状态
- 东西红灯22s,南北绿灯22s(数码管从0到21);
- 东西红灯5s,南北绿灯5s且没0.5s闪烁一次(数码管从0到4);
- 东西红灯4s,南北绿灯4s且没0.5s闪烁一次(数码管从0到3);
- 东西绿灯22s,南北红灯22s(数码管从0到21);
- 东西绿灯5s且没0.5s闪烁一次,南北红灯5s(数码管从0到4);
- 东西绿灯4s没0.5s闪烁一次,南北红灯4s(数码管从0到3);
电路仿真原理图
电路总体布局
复位电路
晶振电路
LED指示灯电路
P1口控制LED灯的亮灭,高电平点亮,低电平熄灭
数码管显示电路
P0与P2口控制数码管的显示,低电平点亮,高电平熄灭;由于P0口不能输出高电平,故接一个上拉电阻RP1(此处解释来自网络——上拉电阻RP1的目的是使P0口可输出高电平)文章来源:https://www.toymoban.com/news/detail-490551.html
汇编语言代码(注释很详细)
;分配内存和IO口
DATE_EW EQU 30H;定义两个计数变量
DATE_NS EQU 31H
R_EW BIT P1.0;定义信号灯变量
Y_EW BIT P1.1
G_EW BIT P1.2
G_NS BIT P1.3
Y_NS BIT P1.4
R_NS BIT P1.5
ORG 0000H
;初始化程序
START:MOV P1,#0;控制9个红绿灯,高电平,高电平点亮,此处清零
MOV P2,#0FFH;控制数码管十位,低电平点亮,此处全灭
MOV P0,#0FFH;控制数码管个位,低电平点亮,此处全灭
;***************状态1**************东西红灯22s,南北绿灯22s
STATE1:MOV P1,#0;清除上一状态的灯况
SETB R_EW;点亮东西红灯
SETB G_NS;点亮南北绿灯
MOV DATE_EW,#21;赋值
MOV DATE_NS,#21
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP1:LCALL DISPLAY1;调用数码管显示子程序
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP1;A不等于0,则继续循环
LCALL DISPLAY1;再执行一遍,0也要显示
LJMP STATE2;执行状态2
;***************状态2**************东西红灯5s,南北绿灯5s且带闪烁
STATE2:MOV P1,#0;清除上一状态的灯况
MOV DATE_EW,#4;赋值
MOV DATE_NS,#4
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP2:LCALL DISPLAY2;调用数码管显示子程序
SETB R_EW;点亮东西红灯
SETB G_NS;点亮南北绿灯
LCALL DELAY1
CLR G_NS;熄灭南北绿灯
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP2;A不等于0,则继续循环
LCALL DISPLAY2;再执行一遍,0也要显示
LJMP STATE3;执行状态3
;***************状态3**************东西红灯5s,南北绿灯5s且带闪烁
STATE3:MOV P1,#0;清除上一状态的灯况
MOV DATE_EW,#3;赋值
MOV DATE_NS,#3
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP3:LCALL DISPLAY2;调用数码管显示子程序
SETB R_EW;点亮东西红灯
SETB Y_NS;点亮南北黄灯
LCALL DELAY1
CLR Y_NS;熄灭南北黄灯
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP3;A不等于0,则继续循环
LCALL DISPLAY2;再执行一遍,0也要显示
LJMP STATE4;执行状态4
;***************状态4**************东西绿灯22s,南北红灯22s
STATE4:MOV P1,#0;清除上一状态的灯况
SETB G_EW;点亮东西绿灯
SETB R_NS;点亮南北红灯
MOV DATE_EW,#21;赋值
MOV DATE_NS,#21
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP4:LCALL DISPLAY1;调用数码管显示子程序
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP4;A不等于0,则继续循环
LCALL DISPLAY1;再执行一遍,0也要显示
LJMP STATE5;执行状态5
;***************状态5**************东西绿灯5s且带闪烁 ,南北红灯5s
STATE5:MOV P1,#0;清除上一状态的灯况
MOV DATE_EW,#4;赋值
MOV DATE_NS,#4
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP5:LCALL DISPLAY2;调用数码管显示子程序
SETB G_EW;点亮东西绿灯
SETB R_NS;点亮南北红灯
LCALL DELAY1
CLR G_EW;熄灭东西绿灯
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP5;A不等于0,则继续循环
LCALL DISPLAY2;再执行一遍,0也要显示
LJMP STATE6;执行状态6
;***************状态6**************东西黄灯4s且带闪烁 ,南北红灯4s
STATE6:MOV P1,#0;清除上一状态的灯况
MOV DATE_EW,#3;赋值
MOV DATE_NS,#3
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP6:LCALL DISPLAY2;调用数码管显示子程序
SETB Y_EW;点亮东西黄灯
SETB R_NS;点亮南北红灯
LCALL DELAY1
CLR Y_EW;熄灭东西黄灯
DEC R7;数码管数字减一,东西南北倒计时一样
DEC R6
MOV A,R7
CJNE A,#0,LOOP6;A不等于0,则继续循环
LCALL DISPLAY2;再执行一遍,0也要显示
LJMP STATE1
;不闪烁状态调用
DISPLAY1:PUSH ACC;保护现场
MOV A,R6;东西方向数值进累加器A
MOV B,#10;为寄存器B赋值10
DIV AB;进制转换,十位给A,个位给B
MOV DPTR,#TABLE;查表指令三剑客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位数码管点亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;个位数码管点亮
MOV A,R7;南北方向数值进累加器A
MOV B,#10;为寄存器B赋值10
DIV AB;进制转换,十位给A,个位给B
MOV DPTR,#TABLE;查表指令三剑客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位数码管点亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;个位数码管点亮
LCALL DELAY1;调用延时程序,调用两次0.5,不用写1s的延时程序了hhh
LCALL DELAY1
POP ACC;恢复现场
RET
;闪烁的状态调用
DISPLAY2:PUSH ACC;保护现场
MOV A,R6;东西方向数值进累加器A
MOV B,#10;为寄存器B赋值10
DIV AB;进制转换,十位给A,个位给B
MOV DPTR,#TABLE;查表指令三剑客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位数码管点亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;个位数码管点亮
MOV A,R7;南北方向数值进累加器A
MOV B,#10;为寄存器B赋值10
DIV AB;进制转换,十位给A,个位给B
MOV DPTR,#TABLE;查表指令三剑客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位数码管点亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;个位数码管点亮
LCALL DELAY1;调用延时程序
POP ACC;恢复现场
RET
;********闪烁程序,间隔0.5s************这里不用了,直接写到主程序内部
SPARKLE:SETB R_EW;点亮东西红灯
SETB G_NS;点亮南北绿灯
LCALL DELAY1
CLR G_NS;熄灭南北绿灯
LCALL DELAY1
RET
;********延时程序,延时0.5s************
DELAY1:MOV R0,#15
D1:MOV R1,#202
D2:MOV R2,#81
D3:DJNZ R2,$; R2一直减1,直到减为0,执行下面语句
DJNZ R1,D2
DJNZ R0,D1
RET
;***********数码管共阳极字符表(低电平点亮)*********
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;配合查表指令使用
END
资源链接
链接:https://pan.baidu.com/s/1FOfYZcAPmIF6ZxGwyE21LQ?pwd=0000
提取码:0000
–来自百度网盘超级会员V4的分享文章来源地址https://www.toymoban.com/news/detail-490551.html
到了这里,关于基于Proteus仿真的交通信号灯设计——利用汇编语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!