单片机控制交通灯说明书

来源:互联网 发布:linux服务器死机原因 编辑:程序博客网 时间:2024/04/29 13:34
 

                 单片机控制交通灯说明书

一、设计思路

      如何使主干道通车时间 ,可任意设置;次干道通车时间 ,可任意设置;黄灯亮时间 ,可任意设置;怎样采用倒计时的方式,用两位十进制数字显示红、绿、黄色信号灯的倒计时时间。

二、电路图

        二、           使用材料

1、单片机89c51                        两片

2、CD4072                             一片

3、LED七段吗数码管                    四个

4、CD4511 四片

5、红,绿,黄发光二极管                各两个

三、元器件结构与工作原理

1、单片机89c51  

     89C51包含了运算器、控制器、片内存储器、四个

I/O 接口,串行接口、定时器和计数器、中断系统、振

荡器。                      

 1)主电源引脚

Vcc接+5V电源正端

Vss接+5V电源地端

 2)外接晶体引脚

XTAL1:片内反相放大器输入端

XTAL2:片内反相放大器输出端。外接晶体时,XTAL1与XTAL2各接晶体的一端,接外接晶体与片内反相器构成振荡器。

3)输入输出引脚

    本电路运用了P1.0---P1.7:P1口的8个引脚。可作为准双向I/O接口使用。

P2.0~P2.7:P2口的8个引脚。一般可作为准双向I/O接口;在接有片外存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用 的为高8位地址总线。

P3.0~P3.7:P3口的8个引脚。除作为准双向I/O接口使用外,还具有第二功能。

4)RST是复位端。单片机的振荡器工作时,该引脚上出现两个机器周期的高电平就可实现复位操作,使单片机回复道初始状态。

2. CD 40511

  CD4511是一个用于驱动共阴极LED(数码管)显示器的BCD码-七段码译码器,特点如下:具有BCD转换,消隐和锁存控制、七段译码及驱动功能的CMOS电路能提供较大的拉电流。可直接驱动LED显示器。

  BI:4脚是测试消隐输入控制端,当BI=0时,不管其它输入端状态如何,七段码均处熄灭状态,不显示数字。

  LT:3脚是测试输入端,当BI=1,LT=0时,译码输出全为1,不管输入 DCBA 状态如何,七段均发亮,显示“8”。它主要用来检测数码管是否损坏。 &

四、实验原理

采用两片51系列单片机芯片AT89C51,完成交通信号控制系统。该系统的技术指标:主干道通车时间 ,可任意设置;次干道通车时间 ,可任意设置;黄灯亮时间 ,可任意设置;采用倒计时的方式,用两位十进制数字显示红、绿、黄色信号灯的倒计时时间。

备注:

      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

原创粉丝点击