仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1. 设计一个智能十字路口交通灯控制器。
2.用单片机控制控制LED红、黄、绿指示灯,模拟指示十字路口通行状态。
3.控制东西、南北方向的十字路口交通信号灯。
4.东西向通行时间为80s,南北向通行时间为60s,缓冲时间为3s。
5.东西方向红灯时间=南北方向绿灯时间+黄灯缓冲时间,反之亦然。
6.鼓励新创意,增加新功能。
第二章 系统设计方案2.1设计思路
1.采用AT89S52单片机作为主控芯片及外围控制芯片,设计十字路口交通灯控制器的硬件电路。
2.采用AT89S52单片机汇编语言,完成十字路口交通灯控制器的软件编程。
3.采用LED显示和中断定时电路,利用定时器T0产生每10ms一次的中断,每100次中断为1s。对两个方向分别显示红、绿、黄灯,以及相应的剩余时间(倒计时)。
4.用独立式按键实现特殊车辆(消防车、救护车、警车)通行的控制功能。
5.设置闯红灯报警功能
2.2方案设计
利用AT89S52单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,数码管显示剩余时间
。红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯,8个共阴极数码管显示剩余时间,
单片机源程序如下:
- ;***********************************************
- ;***********************************************
- ;*********内存、IO口分配************************
- SHANSHUO EQU 20H ;闪烁标志
- JISHU1 EQU 30H ;计数变量
- JISHU2 EQU 31H
- TIME_0 EQU 32H ;中断变量
- TIME_1 EQU 33H ;
- SHUCHU EQU P0 ;数码管段输出
- G_1 BIT P1.0 ;定义LED
- Y_1 BIT P1.1
- R_1 BIT P1.2
- G_2 BIT P1.3
- Y_2 BIT P1.4
- R_2 BIT P1.5
- WEI1 BIT P2.0 ;数码管片选
- WEI2 BIT P2.1
- WEI3 BIT P2.2
- WEI4 BIT P2.3
- K1 BIT P3.0 ;紧急按键
- ;********************************************
- ORG 0000H
- SJMP START
- ORG 000BH ;定时器0中断入口
- LJMP T0_0
- ORG 0030H
- START:
- MOV P1,#0 ;LED高电平有效,清零
- MOV P2,#0 ;数码管片选高电平有效,清零
- CLR SHANSHUO ;闪烁标志清零
- CLR JISHU1 ;计数变量清零
- CLR JISHU2 ;
- CLR TIME_0 ;中断变量清零
- CLR TIME_1 ;
- MOV TMOD,#01H ;定时器0方式1
- MOV TH0,#3CH ;装初值,50MS
- MOV TL0,#0B0H ;
- SETB EA ;开总中断
- SETB ET0 ;开定时器中断
- SETB TR0 ;启动定时器
- ;***************状态1*************************
- ZT1:
- MOV P1,#0 ;LED清零
- MOV JISHU1,#83 ;计数装初值
- MOV JISHU2,#80 ;
- MOV R6,JISHU1 ;
- MOV R7,JISHU2 ;
- SETB G_1 ;东西绿灯亮
- SETB R_2 ;南北红灯亮
- AA: CALL DISPLAY ;显示
- MOV A,R7 ;
- CJNE A,#0,AA ;判断时间是否已到
- ;*************状态2***************************
- ZT2:
- MOV P1,#0 ;LED清零
- MOV JISHU1,#3 ;计数器重装初值
- MOV JISHU2,#3 ;
- MOV R6,JISHU1 ;
- MOV R7,JISHU2 ;
- SETB Y_1 ;东西黄灯点亮
- SETB R_2 ;南北红灯继续亮
- BB: JNB SHANSHUO,CC ;判断闪烁标志位
- SETB Y_1 ;是一则点亮黄灯
- AJMP QW ;跳到显示
- CC: CLR Y_1 ;是零则熄灭黄灯,达到闪烁的效果
- QW: CALL DISPLAY ;显示
- MOV A,R6 ;
- CJNE A,#0,BB ;判断是否到了三秒
- CLR SHANSHUO ;清闪烁
- ;*************状态3***************************
- ZT3:
- MOV P1,#0 ;LED清零
- MOV JISHU1,#60 ;计数器重新装初值
- MOV JISHU2,#63 ;
- MOV R6,JISHU1 ;
- MOV R7,JISHU2 ;
- SETB R_1 ;东西红灯点亮
- SETB G_2 ;南北绿灯点亮
- EE: CALL DISPLAY ;显示
- MOV A,R6 ;
- CJNE A,#0,EE ;判断时间是否到了
- ;*************状态4***************************
- ZT4:
- MOV P1,#0 ;LED清零
- MOV JISHU1,#3 ;计数器重新装初值
- MOV JISHU2,#3 ;
- MOV R6,JISHU1 ;
- MOV R7,JISHU2 ;
- SETB R_1 ;东西红灯点亮
- SETB Y_2 ;南北黄灯点亮
- FF: JNB SHANSHUO,QR ;判断闪烁位是1/0
- SETB Y_2 ;1则点亮黄灯
- SJMP QE ;显示
- QR: CLR Y_2 ;0则熄灭黄灯
- QE: CALL DISPLAY ;显示
- MOV A,R6 ;
- CJNE A,#0,FF ;判断时间到没
- CLR SHANSHUO ;闪烁清零
- LJMP START ;跳 循环
- ;**************中断子程序*********************
- T0_0:
- CLR EA ;关总中断
- MOV TH0,#3CH ;重新装初值
- MOV TL0,#0B0H ;
- INC TIME_0 ;定时器变量加1
- INC TIME_1 ;
- MOV A,TIME_0 ;
- CJNE A,#0AH,NEXT ;判断是否到了500MS
- MOV TIME_0,#0 ;到则清变量
- CPL SHANSHUO ;给闪烁位取反
- JB K1,NEXT ; 按键K1处理,紧急处理
- MOV A,P1 ;读取当前LED显示
- MOV P1,#0 ;LED清零
- MOV P0,#0 ;P0口输出0
- MOV P2,#0 ;P2口输出0,不显示
- SETB R_1 ;点亮红色指示灯
- SETB R_2 ;点亮红色指示灯
- JNB K1,$ ;等待按键松开
- MOV P1,A ;P1口LED还原
- NEXT: MOV A,TIME_1 ;
- CJNE A,#20,QUIT ;判断是否到了1S,没到则退出
- MOV TIME_1,#0 ;到则清变量
- DEC R7 ;寄存器自减一
- DEC R6 ;寄存器自减一
- QUIT: SETB EA ;开总中断
- RETI ;中断返回
- ;**************显示子程序*********************
- DISPLAY:
- PUSH ACC ;进堆栈
- MOV A,R7 ;装载东西方向显示缓存值到寄存器A
- MOV B,#0AH ;寄存器B装载10
- DIV AB ;进制转换
- MOV DPTR,#TAB ;十位
- MOVC A,@A+DPTR ;查表,获得东西方向10位上的显示段码
- MOV SHUCHU,A ; 显示段码输出到显示端口
- SETB WEI1 ; 10位的数码管位选信号设置为1,点亮数码管
- CALL DELAY1MS ; 延时1ms
- CLR WEI1 ; 10位的数码管位选信号设置为0,熄灭数码管
- MOV A,B ;个位
- MOV DPTR,#TAB ;查表,获得东西方向个位上的显示段码
- MOVC A,@A+DPTR ;
- MOV SHUCHU,A ;显示段码输出到显示端口
- SETB WEI2 ;个位的数码管位选信号设置为1,点亮数码管
- CALL DELAY1MS ;延时1ms
- CLR WEI2 ;个位的数码管位选信号设置为0,熄灭数码管
- MOV A,R6 ;装载东西方向显示缓存值到寄存器A
- MOV B,#0AH ;寄存器B装载10
- DIV AB ;进制转换
- MOV DPTR,#TAB ;十位
- MOVC A,@A+DPTR ;查表,获得南北方向10位上的显示段码
- MOV SHUCHU,A ;显示段码输出到显示端口
- SETB WEI3 ;10位的数码管位选信号设置为1,点亮数码管
- CALL DELAY1MS ;延时1ms
- CLR WEI3 ;10位的数码管位选信号设置为0,熄灭数码管
- MOV A,B ;个位
- MOV DPTR,#TAB ;查表,获得东西方向个位上的显示段码
- MOVC A,@A+DPTR ;
- MOV SHUCHU,A ;显示段码输出到显示端口
- SETB WEI4 ;个位的数码管位选信号设置为1,点亮数码管
- CALL DELAY1MS ;延时1ms
- CLR WEI4 ;个位的数码管位选信号设置为0,熄灭数码管
- POP ACC ;退出堆栈
- RET ;返回
- ;**************** 延时 ***********************
- DELAY1MS: ;延时1ms子函数
- MOV R1,#01H
- MOV R2,#0FFH
- DD: DJNZ R2,DD
- DJNZ R1,DD
- RET
- ;****************共阳数码管字符表******************************
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- END
复制代码
所有资料51hei附件下载:
Keil和Proteus源程序.zip
(139.59 KB, 下载次数: 96)
十字路口交通灯.docx
(609.41 KB, 下载次数: 67)
|