北京交通大学单片机课程设计交通灯
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交通灯设计
班级:
姓名:
学号:
2016年5月5日
1 课程设计总体目标
1.1总体结构
1.设计一个十字路口交通控制器。
2.开始运行后,先南北绿灯60S(通行60S)、东西红灯65S(禁止65S);然后,南北转黄灯闪烁5S;接着,东西绿灯30S(通行30S),南北红灯35S(禁止35S);最后,东西转黄灯闪烁5S;
3.在二极管亮或者闪烁的同时两个方向的数码管显示倒计时,东西向一组数码管,南北向一组数码管。
2 硬件设计
包括硬件电路及工作原理描述
1.设计思路
模拟交通灯控制电路时运用单片机来控制红、黄、绿三色LED灯显示,并通过定时器中断来控制数码管显示倒计时。
红、黄、绿交替闪亮,利用数码管计数显示间隔等,用于管理十字路口的车辆及行人通过,计时牌显示路口通行转换剩余时间。
2.单片机总控制电路如下图:
STC89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,STC89C51在众多嵌入式控制应用系统中得到广泛应用。
3.74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)DIR=“1”,信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。8051的/RD和/PSEN相与后接DIR,使得RD且PSEN 有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。
3 软件设计
程序流程框图
程序:
C语言:
#include
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //东西向指示灯sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北向指示灯sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
//延时倍数,闪烁次数,操作类型变量
uchar Time_Count=0,Flash_Count=0,Operation_Type=1;
//定时器0中断函数
void T0_INT() interrupt 1
{
TL0=-50000/256;
TH0=-50000%256;
switch(Operation_Type)
{
case 1://东西向绿灯与南北向红灯亮
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=100) return; //65s(65*100*50ms)切换
Time_Count=0;
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=~YELLOW_A;GREEN_A=0;
if(++Flash_Count!=10) return;//闪烁
Flash_Count=0;
Operation_Type=3;
break;
case 3://东西向红灯与南北向绿灯亮
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=100) return; //30s(30*100*50ms)切换
Time_Count=0;
Operation_Type=4;
break;
case 4://南北向黄灯开始闪烁,绿灯关闭
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=~YELLOW_B;GREEN_A=0;
if(++Flash_Count!=10) return;//闪烁
Flash_Count=0;
Operation_Type=1;
break;
}
}
//主程序
void main()
{
TMOD=0x01;//T0方式1
IE=0x82;
TR0=1;
while(1);
}
汇编语言:
ZX EQU 42H
ZW EQU 43H
KCOUNTER EQU 50H
ORG 0
LJMP MAIN
ORG 0BH
LJMP T0INT
ORG 30H
MAIN: MOV SP,#6FH
MOV 46H,#2;0.1s
MOV TMOD,#01H
MOV TH0,#3CH;50ms
MOV TL0,#0D4H
MOV IE,#82H
SETB TR0
LP1: LCALL ZT1
SJMP LP1
T0INT:
CLR TR0
PUSH ACC
PUSH 0
DJNZ 46H,T0
MOV 46H,#2
INC R1;判断用数字变量
DEC R2;南北计时变量
DEC R3;东西数字变量
T0: MOV TH0,#3CH
MOV TL0,#0D4H
SETB TR0
P0P 0
POP ACC
RETI
ZT1: MOV R2,#60
MOV R3,#66 ;南北绿灯60s,东西红灯65s