|
51单片机左的交通灯控制系统 原理图,PCB,程序都有.
交通灯的原理图(ad画的 需要用ad打开,里面也有pdf版本)
交通灯的pcb图(有2个版本):
交通灯的单片机源程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dongxi_red=P1^3; //东西方向红灯定义
- sbit dongxi_yellow=P3^6; //东西方向黄灯定义
- sbit dongxi_green=P3^7; //东西方向绿灯定义
- sbit nanbei_red=P1^2; //南北方向红灯定义
- sbit nanbei_yellow=P1^1; //南北方向黄灯定义
- sbit nanbei_green=P1^0; //南北方向绿灯定义
- uchar tab[]={0xbf,0x7f,0xef,0xdf}; //数码管位选
- uchar IRtime; //红外解码时间次数
- uchar IRbyte[4]; //红外一字节
- uchar IRdate[33]; //红外数据码,用户码,停止码共33位
- uchar IRbyte_ok,IRdate_ok; //接收一字节完成标志位,解码完成标志位
- bit flag=0;
- uchar num=45,num1=40,shi,ge,shi1,ge1,i;
- uchar table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段选
- void delay(uchar z) //延时
- {
- uchar k,l;
- for(k=0;k<110;k++)
- for(l=0;l<z;l++);
- }
- void dongxi__red() //东西方向红灯亮,黄绿灯都灭,南北方向绿灯亮,红黄灯灭
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=1;
- nanbei_yellow=1;
- nanbei_green=0;
- }
- void nanbei__yellow() //东西方向红灯亮,黄绿灯都灭,南北方向黄灯亮,红绿灯灭
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=1;
- nanbei_yellow=0;
- nanbei_green=1;
- }
- void nanbei__red() //南北方向红灯亮,黄绿灯都灭,东西方向绿灯亮,红黄灯灭
- {
- dongxi_red=1;
- dongxi_yellow=1;
- dongxi_green=0;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- }
- void dongxi__yellow() //南北方向红灯亮,黄绿灯都灭,东西方向黄灯亮,红绿灯灭
- {
- dongxi_red=1;
- dongxi_yellow=0;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- }
- void number(uchar num,num1) //两个数码管分别求个位和十位
- {
- shi=num/10;
- ge=num%10;
- shi1=num1/10;
- ge1=num1%10;
- }
- void display(uchar shi,ge) //数码管显示
- {
- P2=tab[1];
- P0=0x00;
- P0=table[shi];
- delay(5);
- P2=tab[0];
- P0=0x00;
- P0=table[ge];
- delay(5);
- }
- void display1(uchar shi1,ge1) //数码管显示
- {
- P2=tab[3];
- P0=0x00;
- P0=table[shi1];
- delay(5);
- P2=tab[2];
- P0=0x00;
- P0=table[ge1];
- delay(5);
- }
- void start() //定时器0、1,外中断0初始化
- {
- EA=1;
- EX0=1;
- EX1=1;
- IT0=1;
- IT1=1;
- ET0=ET1=1;
- TMOD=0X21;
- TH1=0X00;
- TL1=0X00;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=TR1=1;
- }
- void first() //一开始东西方向亮红灯45秒,南北绿灯40秒
- {
- if(num>5)
- {
- dongxi__red();
- number(num,num1);
- display(shi,ge);
- display1(shi1,ge1);
- }
- if(num<=5) //南北绿灯亮完了亮黄灯5秒
- {
- nanbei__yellow();
- number(num,num1);
- display(shi,ge);
- display1(shi1,ge1);
- if(num==0){num=45;num1=40;flag=1;}
- }
- }
- void second() //南北红灯45秒,东西绿灯40秒
- {
- if(num>5)
- {
- nanbei__red();
- number(num1,num);
- display(shi,ge);
- display1(shi1,ge1);
- }
- if(num<=5) //东西绿灯结束,亮黄灯5秒
- {
- dongxi__yellow();
- number(num1,num);
- display(shi,ge);
- display1(shi1,ge1);
- if(num==0){num=45;num1=40;flag=0;}
- }
- }
- void all_red() //双向禁行,亮红灯,数码管关闭
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- P2=0x00;
- P0=0x00;
- }
- void nanbei_all_red() //南北方向禁行,亮红灯数码管关闭,东西方向正常工作
- {
- for(num=45;num>0;)
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- number(num,num1);
- display(shi,ge);
- }
- for(num=40;num>0;)
- {
- nanbei__red();
- number(num,num1);
- display(shi,ge);
- }
- for(num=5;num>0;)
- {
- dongxi__yellow();
- number(num,num1);
- display(shi,ge);
- }
-
- }
- void dongxi_all_red() //东西方向禁行,亮红灯数码管关闭,南北方向正常工作
- {
- for(num=45;num>0;)
- {
- dongxi_red=0;
- dongxi_yellow=1;
- dongxi_green=1;
- nanbei_red=0;
- nanbei_yellow=1;
- nanbei_green=1;
- number(num,num1);
- display1(shi,ge);
- }
- for(num=40;num>0;)
- {
- dongxi__red();
- number(num,num1);
- display1(shi,ge);
- }
- for(num=5;num>0;)
- {
- nanbei__yellow();
- number(num,num1);
- display1(shi,ge);
- }
-
- }
-
- void jiema() //红外解码
- {
- uchar i,j,k=1;
- for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- {
- if(IRdate[k]>5)
- IRbyte[i] |=0x80;
- if(j<7)
- IRbyte[i]>>=1;
- k++;
- }
- }
- IRbyte_ok=1;
- }
- void display2() //比对收到的信号
- {
- switch(IRbyte[2])
- {
- case 0x45 :while(1) all_red(); //按下该键两个方向都持续亮红灯
- case 0x46 :while(1) dongxi_all_red(); //按下该键东西方向持续亮红灯
- case 0x47 :while(1) nanbei_all_red(); //按下该键南北方向持续亮红灯
- }
- }
- void main()
- {
- start(); //初始化
- while(1)
- {
- if(!flag)
- first();
- if(flag)
- second();
- if(IRdate_ok) //红外接收完成
- {
- jiema(); //解码
- IRdate_ok=0; //标志位清零
- if(IRbyte_ok) //如果解码完成,做相关指令
- {
- display2();
- IRbyte_ok=0; //解码完成标志清零
- }
- }
- }
- }
- void ex0() interrupt 0 //外中断0用来接收红外脉冲
- {
- static uchar i; //静态变量i
- static bit flag;
- if(flag) //如果flag为1执行一下操作
- {
- if((IRtime<53)&&(IRtime>=32)) //IRtime在此范围内说明接收到红外起始信号
- i=0;
- IRdate[i]=IRtime; //将IRtime的值保存到数组中
- IRtime=0;
- i++;
- if(i==33) //如果i=33接收到停止位
- {
- i=0;
- IRdate_ok=1;
- }
- }
- else //flag不为1时执行
- {
- IRtime=0; //IRtime数值清零
- flag=1; //flag置1
- }
- }
- void et0() interrupt 1 //定时器0用来控制交通灯的时间
- {
- TH0=(65536-50000)/256; //重装初值
- TL0=(65536-50000)%256;
- i++;
- if(i==20)
- {
- i=0;
- num--;
- num1--;
- if(num1==0)
- num1=5;
- }
- }
- void time0() interrupt 3 //定时器1用来计算收到的红外脉宽
- …………余下代码请下载附件…………
复制代码
交通灯源码和pcb原理图资料下载:http://www.51hei.com/bbs/dpj-54314-1.html
|
|