⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51.txt

📁 利用单片机做的交通灯控制程序
💻 TXT
字号:
自己弄的程序

已经调试通过

不过还有个问题

由于没设定输入为0时进入出错程序

当按键设定为0时会出错

有兴趣的可以加下

        org  0000h
        mov  sp,#70h
        sjmp main
        org  0023h
        ljmp sent
main:   mov  a,#00h
        mov  p2,a
        lcall del1
        mov  a,p2
        mov  r1,a
        lcall del1
        mov  a,#00h
        mov  p2,a
        mov  a,p2
        xrl  a,r1
        cjne a,#00h,error ;绿灯时间储入r1  缺一错误跳转  

        mov  a,#00h
        mov  p0,a
        mov  a,p0
        anl  a,#00fh
        mov  r2,a         ;黄灯时间储入r2
         lcall del1
        mov  a,#00h
        mov  p0,a
        mov  a,p0
        anl  a,#00fh
        xrl  a,r2
        cjne a,#00h,error ;```
        mov  a,r1
        add  a,r2
        mov  r3,a          ;黄灯加红灯时间存入r3
                         

        mov  a,#66h
        add  a,r3         ;判断r3是否大于99大于99则出错
        jc   error
cus:    mov  scon, #90h    ;设置串行口为方式2
        setb ea            ;开中断
        setb es            ;允许串行口中断
        lcall sout           ;先发送红灯数据
        mov   r0,#02h
        cjne   r0,#00,$    ;等待两次中断
start:  mov  a,   r1
        mov  30h, a         ;将绿灯时间存入30h单元
        mov  a,   r2
        mov  31h, a         ;将黄灯时间存入31h单元
        mov  a,   r3
        mov  32h, a         ;将绿灯加红灯时间存入32h单元
        mov  a,   r4
        mov  33h, a         ;将红灯时间存入33h单元
main0:  mov  a,   32h        ;取红灯加黄灯时间
        mov  2ah, a          ;存入2ah  倒计时显示时间
        mov  r3,  #0bfh      ;数码管控制码 绿灯亮其他灭
        mov  a,   30h
        mov  r7,  a          ;取延时时间存入r7,即绿灯亮时间
main1:  lcall del            ;调用一秒延时子程序 并显示倒计时时间
        djnz  r7,main1       ;判断延时时间是否到  没到则 转main1循环
        mov   r3,#0dfh       ;数码管控制码 黄灯亮其他灭
        mov   a,  31h
        mov   r7, a          ;取延时时间存入r7,  即黄灯亮时间
main2:  lcall del
        djnz  r7,main2       ;判断时间到否  没到则循环
        mov   r3,#7fh        ;数码管控制码  红灯亮其他灭
        mov   a,33h            ;取红灯时间
        mov   2ah,a            ;存入 2ah   倒计时显示时间
        mov   a,33h
        mov   r7,a            ;取延时时间存入r7,即红灯亮时间
 main3: lcall del             ;调用一秒延时 并显示倒计时时间
        djnz  r7,main3        ;判断时间是否到没到循环
        ajmp  main0            ;跳转到main循环执行程序
error:  sjmp error
del:    dec  2ah                 ;倒计时时间减1
        mov  dptr , # table    ;1秒延时加到计时显示 子程序  取表头地址存入dptr
        mov  a,2ah             ; 取倒计时显示时间到a中
        mov  b,#0ah             ;数字10存入b中
        div  ab                  ;a除以b 十位数存入a中 个位数存入b中
        movc a,@a+dptr           ;代码装换
        mov  r1,a                ;代码存入r1
        mov  a,b                 ;个位数存入a中
        add  a,r1                ;代码与个位相加 得显示码     存入a
        mov  r2,a                ;显示码存入r2
disp:   mov  a,r2                ;显示码存入r2
        mov  p1,a                ;送出显示码 显示
        mov  a,r3
        mov  p0,a                ;输出信号灯控制码控制灯亮
t2:     mov r6,#10               ;延时程序 0.999秒   12mHZ时为0.99秒
d1:     mov r5,#200              ;6mHz时为1.98秒   可改r6=#5
d2:     mov r4,#248
        djnz r4,$
        djnz r5,d2
        djnz r6,d1
        ret                     ;子程序返回
table:  db 00h,10h,20h,30h,40h,
           db 50h,60h,70h,80h,90h


sent:  jnb   ri,send   ;不是接收,转向发送
       lcall sin       ;接收,调用接收子程序
       reti             ;中断返回
send:  clr ti           ;清发送中断标志
       dec r0           ;r0减1变为1
       reti             ;中断返回
sout:  push psw
       push acc         ;保存 psw acc装状态
       mov a,r3         ;取黄灯加红灯时间放入a中
       mov c,p
       mov tb8,c        ;取奇偶效验为存入tb8
       mov sbuf,a       ;发送数据
       pop a
       pop psw           ;恢复 psw acc状态
       ret               ;子程序返回
sin:   push psw
       push a           ;保存 psw acc状态
       clr  ri            ;清接收中断标志
       mov  a,sbuf         ;读入缓存区内容
       mov  c,p            ;取奇偶效验位
       jnc  s1             ;p=c=0转移到s1
       jnb  rb8,error      ;若两次效验位不一样,则出错
       ljmp s2             ;正确则转s2
s1:    jb   rb8,error      ;若双方效验位不一样,则出错
s2:    mov  r4,a           ;接收到的红灯时间存入r4
       dec  r0             ; r0减1
       pop  a
       pop  psw            ;恢复 psw acc状态
       ret                 ;子程序返回

del1 : nop                 ; 15毫秒延时子程序 12m赫兹时
                           ;30毫秒延时子程序 6m赫兹时
del2 : mov   r6,  #50
del3 : mov   r7,  #150
del4 : djnz  r7,  del4
del5 : djnz  r6,  del3

       ret

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -