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

基于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的分享

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用汇编语言实现基于Proteus仿真的交通信号灯设计

    发表评论