标题:
求基于51单片机的交通灯控制系统设计
[打印本页]
作者:
追月
时间:
2017-1-2 11:17
标题:
求基于51单片机的交通灯控制系统设计
用AT89C51单片机控制一个交通信号灯系统。设A车道与B车道交叉组成十字路口,A是主车道,B是支道。设计要求如下:
1) 用发光的二极管模拟交通信号灯,用按键开关模拟车辆检测信号;
2) 正常情况下,A、B车道轮流放行,A车道放行50s,其中5s用于警告;B车道放行30s,其中5s用于警告。
3) 在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥堵情况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;在A车道放行期间,若B车道有车而A车道无车,按下开关K2使B车道放行15s。
4) 有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。
作者:
aj123
时间:
2017-5-4 10:49
#include<reg52.h> #include<bstv51.h> #define uchar unsigned char #define uint unsigned int sbit nbp1=P0^4;//南北方向数码管第一位; sbit nbp2=P0^5;//南北方向数码管第二位; sbit dxp1=P0^6;//东西方向数码管第一位; sbit dxp2=P0^7;//东西方向数码管第二位; sbit hdnb=P0^2;//南北方向红灯; sbit hddx=P0^0;//东西方向红灯; sbit ldnb=P0^3;//南北方向绿灯; sbit lddx=P0^1;//东西方向绿灯; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //0-9 uchar num=30;num2,shi,ge; void delayms(xms) //延时函数x毫秒函数 { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void display(uchar shi,uchar ge) //南北数码管显示函数 { P1=table[shi]; nbp1=0; //选中南北方向数码管第一位 delayms(3); nbp1=1; //关闭南北方向数码管第一位 P1=table[ge]; nbp2=0; //选中南北第二位 delayms(3); nbp2=1; //关闭南北方向数码管第二位 P2=table[shi]; dxp1=0; //选中南北方向数码管第一位 delayms(3); dxp1=1; //关闭南北方向数码管第一位 P2=table[ge]; dxp2=0; //选中南北第二位 delayms(3); dxp2=1; } void T1_time()interrupt 3 //定时器1中断函数 { TH1=(65536-45872)/256; TL1=(65536-45872)%256; num2++; if(num2==20) { num2=0; //说明计时够一秒 num--; if(num==0) { lddx=~lddx; hdnb=~hdnb; ldnb=~ldnb; hddx=~hddx; num=30; } } shi=num/10; ge=num%10; } void main() //主函数 { TMOD=0x10; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; ET1=1; TR1=1; lddx=0; //东西方向绿灯亮 hdnb=0; //南北方向红灯亮 ldnb=1; hddx=1; P1=0x00; P2=0x00; nbp1=1; dxp1=1; dxp2=1; nbp2=1; while(1) { display(shi,ge); } }
作者:
山有扶苏儿
时间:
2019-5-29 09:35
/*#include<REG51.H> */
#include<AT89X51.H>
#define uchar unsigned char
uchar code duanma[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code weima[4]={0x0D,0x0E,0x07,0x0B};
uchar code deng[4]={0xDE,0xDD,0xF3,0xEB};
char SN=50,WE=60;
char SN_G=50,WE_G=40,Y=10;
uchar i,k=0,count=0;
void delayms(uchar ms);
void light();
void led();
sbit K0=P3^7;
sbit K1=P3^6;
sbit K2=P3^3;
sbit K3=P3^5;
/*程序初始化*/
void init(void)
{
/*12MHz */
TMOD=0x01;
TH1=(65536-50000)/256; /*0x3C*/
TL1=(65536-50000)%256; /*0xB0*//*计50000个数,用时50ms*/
IT0=1;/*外部中断0为边沿触发方式*/
ET0=1;/*允许T0中断*/
TR0=1;/*启动计数器*/
EA=1;/*CPU开放总中断*/
EX0=1;/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
EX1=1;/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*延时ms毫秒*/
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0;i<200;i++)
{}
}
}
/*中断0处理程序*/
void int0(void) interrupt 0
{
EA=0;/*CPU禁止响应一切中断*/
P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
while(1)/*无条件循环*/
{
P2=weima[0],P0=duanma[(SN_G+Y)%10];/*南北方向数码管显示可通行时间的个位*/
delayms(10); /*延时*/
P2=weima[1],P0=duanma[(SN_G+Y)/10];/*南北方向数码管显示可通行时间的十位*/
delayms(10); /*延时*/
P2=weima[2],P0=duanma[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/
delayms(10); /*延时*/
P2=weima[3],P0=duanma[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
delayms(10); /*延时*/
/*设置南北方向通行时间*/
if(K0==0) /*P3^7=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K0==0)
{
while(K0==0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
{
}
SN_G++;/*南北方向绿灯时间+1*/
if(SN_G==100)
SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
}
}
/*设置东西方向通行时间*/
if(K1==0) /*P3^6=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K1==0)
{
while(K1==0)/*当松开K1开关时,跳出空循环,执行后面的程序*/
{
}
WE_G++;/*东西方向绿灯时间+1*/
if(WE_G==100)
WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/
}
}
/*返回*/
if(K3==0) /*P3^5=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K3==0)
{
while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{
}
count=0;/*清零*/
k=0;/*南北方向通车,东西方向不通车*/
SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
EA=1; /*CPU开放总中断*/
break;/*跳出*/
}
}
}
}
/*中断1处理程序*/
void int1(void) interrupt 2
{
P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
EA=0;/*CPU禁止响应一切中断*/
TR0=!TR0;/*计数器停止工作*/
while(1)/*无条件循环*/
{/*数码管扫描程序,*/
P2=weima[0];/*显示南北方向个位*/
delayms(10);/*延时*/
P2=weima[1];/*显示南北方向十位*/
delayms(10);/*延时*/
P2=weima[2];/*显示东西方向个位*/
delayms(10);/*延时*/
P2=weima[3];/*显示东西方向十位*/
delayms(10);/*延时*/
/*返回*/
if(K3==0) /*P3^5=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K3==0)
{
while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{
}
EA=1;/*CPU开放总中断*/
TR0=!TR0;/*启动计数器*/
break;/*跳出*/
}
}
}
}
/*键盘程序*/
void key()
{
/*南北有车而东西无车*/
if(K0==0) /*K0=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K0==0)
{
while(K0==0)/*当松开K0开关时,跳出循环,执行后面的程序*/
{
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
}
count=0;/*清零*/
k=0;/*南北方向通车,东西方向不通车*/
SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
}
}
/*南北无车而东西有车*/
if(K1==0) /*K1=0*/
{
delayms(20);/*延时,把抖动的时间抛掉*/
if(K1==0)
{
while(K1==0)/*当松开K1开关时,跳出循环,执行后面的程序*/
{
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
}
count=0;/*清零*/
k=1;/*南北方向不通车,东西方向通车*/
SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
}
}
}
/*定时函数*/
void time1(void) interrupt 1
{
TH0=0x3c;
TL0=0xb0;/*计50000个数,用时50ms*/
count++; /*自增运算*/
if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/
{
SN--;/*自减运算*/
WE--;/*自减运算*/
count=0;/*清零*/
if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
{
k++;/*自增运算*/
if(k>3)/*当k>3时,执行程序*/
k=0;/*清零*/
switch(k)/*switch 语句*/
{
case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
case 1:SN=Y,WE=Y;break; /*东西南北方向显示时间均为黄灯闪亮时间*/
case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
case 3:SN=Y,WE=Y;break; /*东西南北方向显示时间均为黄灯闪亮时间*/
}
}
}
}
/*交通灯函数*/
void light()
{
P1=deng[k];/*交通灯对应着k的值变化*/
if(P1==deng[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;/*延时50ms*/
P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/
}
else
if(P1==deng[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
{
TH1=(65536-300000)/256;
TL1=(65536-300000)%256;/*延时50ms*/
P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/
}
}
/*数码管函数*/
void led()
{
P2=weima[0],P0=duanma[SN%10];/*显示南北方向个位*/
delayms(10);/*延时*/
P2=weima[1],P0=duanma[SN/10];/*显示南北方向十位*/
delayms(10);/*延时*/
P2=weima[2],P0=duanma[WE%10];/*显示东西方向个位*/
delayms(10);/*延时*/
P2=weima[3],P0=duanma[WE/10];/*显示东西方向十位*/
delayms(10); /*延时*/
}
/*主函数*/
void main(void)
{
init();/*调用程序初始化函数*/
while(1)/*无条件循环*/
{
key();/*调用键盘程序*/
light();/*调用交通灯函数*/
led(); /*调用数码管函数*/
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1