基于Proteus仿真的交通信号灯设计——利用汇编语言实现

基于Proteus仿真的交通信号灯设计——利用汇编语言实现,第1张

基于Proteus仿真的交通信号灯设计——利用汇编语言实现

文章目录
  • 基于Proteus仿真的交通信号灯设计——利用汇编语言实现
    • 设计要求
      • 基本信息
      • 交通状态
    • 电路仿真原理图
      • 电路总体布局
      • 复位电路
      • 晶振电路
      • LED指示灯电路
      • 数码管显示电路
    • 汇编语言代码(注释很详细)
    • 资源链接

设计要求 基本信息
  1. 采用AT89C51单片机
  2. 晶振频率:12MHZ
  3. 红绿灯:发光二极管
  4. 数字显示:LED数码管
  5. 东西南北四个方向,一次循环共有六个状态,且每个状态的倒计时时间一样
交通状态
  1. 东西红灯22s,南北绿灯22s(数码管从0到21);
  2. 东西红灯5s,南北绿灯5s且没0.5s闪烁一次(数码管从0到4);
  3. 东西红灯4s,南北绿灯4s且没0.5s闪烁一次(数码管从0到3);
  4. 东西绿灯22s,南北红灯22s(数码管从0到21);
  5. 东西绿灯5s且没0.5s闪烁一次,南北红灯5s(数码管从0到4);
  6. 东西绿灯4s没0.5s闪烁一次,南北红灯4s(数码管从0到3);
电路仿真原理图 电路总体布局

复位电路

晶振电路

LED指示灯电路

P1口控制LED灯的亮灭,高电平点亮,低电平熄灭

数码管显示电路

P0与P2口控制数码管的显示,低电平点亮,高电平熄灭;由于P0口不能输出高电平,故接一个上拉电阻RP1(此处解释来自网络——上拉电阻RP1的目的是使P0口可输出高电平)

汇编语言代码(注释很详细)
;分配内存和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的分享

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498727.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存