交通灯实验报告
- 格式:doc
- 大小:3.16 MB
- 文档页数:8
单片机应用技术
电子系09261—08 09 金娜侯玉洋
实验报告
任务10 模拟交通灯控制
1、任务目地
通过对模拟交通灯控制系统的制作,掌握定时器和中断系统的综合应用,进一步熟练软、硬件联调方法。
2、任务要求
设计并实现单片机交通灯控制系统,实现以下三种情况:
(1)正常情况下双方向轮流点亮交通灯,交通灯的状态如表4-8所示;
(2)特殊情况时,A道放行。
(3)有紧急车辆通过时,A、B道均为红灯。
紧急情况优先级高于特殊情况。
表4.8 交通灯显示状态
东西方向(简称A方向)南北方向(简称B方向)
状态说明
红灯黄灯绿灯红灯黄灯绿灯
灭灭亮亮灭灭A方向通行,B方向禁行
灭灭闪烁亮灭灭A方向通行,B方向禁行
灭亮灭亮灭灭A方向通行,B方向禁行
亮灭灭灭灭亮A方向通行,B方向禁行
亮灭灭灭灭闪烁A方向通行,B方向禁行
两灭灭灭亮灭A方向通行,B方向禁行
3、电路元器件
4.9 交通灯控制电路元器件清单
元器件清单参数数量元器件名称参数数量IC插座DIP40 1 电阻10k欧姆 3
单片机89C51 1 电解电容22uf 1
晶体振荡器12MHZ 1 弹性按键 3
瓷片电容30PF 2 电阻300欧姆12
发光二极管12
4.10 交通灯控制系统电路
4、程序设计
在正常情况下,交通灯控制程序流程如图4.11所示。
在中断情况下,中断服务程序流程如图4.12所示,特殊情况时,采用外部中断1方式进入与其相应的中断服务程序,并设置该中断为低优先级中断;有紧急车辆通过时,采用外部中断0方式进入与其相应的中断服务程序,并设置该中断为高优先级中断,实现中断嵌入套。
开始
A绿灯,B红灯
延时55s
A绿灯闪烁3次
延时2s
A红灯、B绿灯
延时55s
B绿灯闪烁3次A红灯、B黄灯
中断相应
关中断
保护现场
开中断
A绿灯、B红灯
延时5s
关中断
恢复现场
保护现场
A红灯、B绿灯
延时10s
中断响应
返回
图4.11 在正常情况下交通灯控制程序流程
图4.12 中断情况下交通灯状态下交通灯状态流程
从上图可以看出,程序需要多个不同的延时时间:2s 、5s 、10s 、55s 等。
假定信号灯闪烁时间时亮灭时间各为0.5s ,那么0.5s 延时作为基本延时时间。
设计的交通灯程序如下: #include<reg51.h>
unsigned char t0,t1; //定义全局变量,用来保存延时时间循环次数 void delay0_5s1() //延时0.5s {
for(t0=0;t0<0x0a;t0++) //采用全局变量t0作为循环控制变量 { TH1=0x3c; //设置定时器初值 TL1=0xb0; TR1=1; //启动T1 while(!TF1); //查询计数是否溢出,即50ms 定时时间到,TF1=1 TF1=0; //50ms 定时时间到,将定时器溢出标志位TF1清零 } }
void delay_t1(unsigned char t) {
for(t1=0;t1<t;t1++) //采用全局变量t1作为循环控制变量 delay0_5s1(); }
void int_0() interrupt 0 //紧急情况中断 {
unsigned char i,j,k,l,m; i=P1; //保护现场,暂存 P1口、t0、t1、TH1、TL0 j=t0; k=t1; l=TH1; m=TL1; P1=0xdb; //两个方向都是红灯 delay_t1(20); //延时10s P1=i; //恢复现场,恢复进入中断前P1口、t0、t1、TH1、TL0 t0=j; t1=k; TH1=l;
延时2s
开中断
返回
TL1=m;
}
void int_1() interrupt 2 //特殊情况中断
{
unsigned char i,j,k,l,m;
EA=0; //关中断
i=P1; //保护现场,暂存P1口、t0、t1、TH1、TL1
k=t1;
l=TH1;
m=TL1;
EA=1; //开中断
P1=0xf3; //A道放行
delay_t1(10); //延时5s
EA=0; //关中断
P1=i; //恢复现场,恢复进入中断前P1口、t0、t1、TH1、TL1 t0=j;
t1=k;
TH1=l;
TL1=m;
EA=1; //开中断
}
void main() //主函数
{
unsigned char k;
TMOD=0x10; //T1在工作方式1
EA=1; //开总中断允许位
EX0=1; //开外部中断0中断允许位
IT0=1; //设置外部中断0为下降沿触发
EX1=1; //开外部中断1中断允许位
IT1=1; //设置外部中断1为下降沿触发
while(1)
{
P1=0xf3; //A为绿灯,B为红灯,延时55s
delay_t1(20);
for(k=0;k<3;k++) //A绿灯闪烁3次
{
P1=0xf3;
delay0_5s1(); //延时0.5s
P1=0xfb;
delay0_5s1(); //延时0.5s
}
P1=0xeb; //A黄灯,B红灯,延时2s
delay_t1(4);
P1=0xde; //A黄灯,B红灯,延时55s
delay_t1(20);
for(k=0;k<3;k++) //B绿灯闪烁3次
{
P1=0xde;
delay0_5s1(); //延时0.5s
P1=0xdf;
delay0_5s1(); //延时0.5s
}
P1=0xdd; //A红灯,B黄灯,延时2s
delay_t1(4);
}
}
成品展示:
任务总结:
这个任务程序里我们用到了,主函数、延时函数和中断函数。
在复杂的十字交叉口交通灯控制系统里,不仅涉及到单片机定时/计数器的应用还涉及到中断技术的综合应用,训练了定时/计数器和中断的编程方法和步骤;根据程序的设计,循序渐进的训练了我们对单片机定时器的概念的掌握,熟悉了定时器的工作方式,明白了中断概念和终端结构,也熟练掌握
了中断程序的编写与C语言函数的调用,使我们的综合分析与调试能力大大的提升了。