资源简介
以单片机为核心,设计一个简单交通灯控制系统,设A车道与B车道交叉组成十字路口,A是主道,B是支道。设计要求如下:
(1) 用发光二极管模拟交通信号灯、两个方向分别设置红、绿、黄3种通行指示灯,用按键开关模拟车辆检测信号。
(2) 正常情况下,A、B两车道轮流放行, A车道放行40秒,其中5秒用于警告,B车道放行25秒,其中5秒用于警告。有计时牌显示路口通行转换剩余时间。
(3) 在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15秒;在A车道放行期间,若B车道有车而A车道无车,按下开关K2使B车道放行15秒。
(4) 有特种车辆如119、120通过路口时,系统可转为特种车辆放行,其他车辆禁止通行的状态,15s后系统恢复正常管理。
(5) 两个方向放行的时间可以通过键盘设置。
代码片段和文件信息
#include
#define uint unsigned int
#define uchar unsigned char
uchar code SEG7[10]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}; //段码组合共阴极
uchar code ACT[4]={0xfa0xf50xfa0xf5}; //位码组合 低有效
//*************************************************************************************
uchar sec=15cntflag=0mnstatus=0ijsign1sign2sign3ab=0; //cnt记录一次中断;flag控制黄灯闪烁;sign作为按键按下标记;
char c=15d=10;
//*************************************************************************************
sbit EWGREEN=P2^0; //定义六盏交通灯的端口
sbit EWYELLOW=P2^1;
sbit EWRED=P2^2;
sbit SNGREEN=P2^4;
sbit SNYELLOW=P2^5;
sbit SNRED=P2^6;
sbit k1=P3^0; // 定义按键接口
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit k5=P3^4;
sbit k6=P3^5;
sbit k7=P3^6;
//************************调用函数定义**************************************************
void LED_ORD(uchar);
void LED_5S(uchar);
void inter0(uchar);
void display(uchar);
void display1(uchar);
void keys1();
void keys2();
void keys3();
//*************************中断程序*************************************************
void inrupt(void)
{
TMOD=0x01;
TH0 = -(50000/256);
TL0 = -(50000%256);
ET0=1;
TR0=1;
EA=1;
}
//**************************中断处理程序***************************************************
void timeout(void) interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
cnt++;
//**********************************//
keys1(); //控制“东西”道路时间的按键(有20和30秒的选择)
keys2(); //控制“南北”道路时间的按键
keys3(); //紧急停止通车按键
//****************************************//
switch(status)
{
case 0: m=1;n=1;i=0;j=1; break; //status是0和1两种状态;控制是轮到“东西”显示还是“南北”显示;
case 1: m=2;n=2;i=2;j=3; break;
case 2:m=3;n=3;break;
}
if(flag==0){LED_ORD(m);} //红绿灯正常显示
else
{
if(cnt<=10){LED_5S(n);} //黄灯闪
else {EWYELLOW=1;SNYELLOW=1;} // 黄灯灭
}
if(cnt>=20)
{
sec--;cnt=0;
//*****************************//
if(status==0)
{
if(k2==0) {status=1;flag=0;sec=8;}
if(k3==0) {status=2;a=sec;flag=0;sec=4;b=0;}
}
if(status==1)
{
if(k1==0) {status=0;flag=0;sec=6;}
if(k3==0) {status=2;a=sec;flag=0;sec=4;b=1;}
}
//*************************************//
if(sec<=5)
{
flag=1;
if(sec==0)
{
if(status==0) //让两次交替循环下去
{
flag=0;i=2;j=3; //status=0状态结束,开始status=1状态,重新赋值;
status=1;sec=d;
}
//flag重置为0;flag用来提示到了5秒内闪黄灯;
else if(status==1)
{
status=0;flag=0;i=0;j=1;sec=c; //status=1状态结束,开始status=0状态,重新赋值;
}
else if(status==2&&b==0){sec=a;status=0;flag=0;}
else if(status==2&&b==1){sec=a;status=1;flag=0;}
//此处多添加了i和j重新复制;是因为:
} //当一个状态过后到了这里,但是i和j如果不重新赋值则还是等于上个状态显示的位码;
} //则接下去会在原来显示的位码处显示一个中断时间,又跳回新的显示位码;
}
}
void LED_ORD(uchar f) //控制东西、南北红绿灯
{
switch(f)
{
case 1: P2=0xBE; break;
case 2: P2=0xEB; break;
case 3: P2=0xbb;break;
}
}
void LED_5S(
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2010-12-28 13:11 智能交通灯\
文件 4736 2010-12-28 13:07 智能交通灯\jtd.c
文件 6376 2005-03-22 15:22 智能交通灯\STARTUP.A51
文件 14048 2010-12-28 13:07 智能交通灯\STARTUP.LST
文件 749 2010-12-28 13:07 智能交通灯\STARTUP.OBJ
文件 109553 2010-12-28 13:07 智能交通灯\traffic_light.DSN
文件 2184 2010-12-28 13:07 智能交通灯\交通灯.Uv2
文件 20480 2010-12-28 13:11 智能交通灯\说明.doc
- 上一篇:webuploader分片上传
- 下一篇:李爱华、程磊_面向对象程序设计课后答案
评论
共有 条评论