C51单片机交通灯
51单片机的交通灯c程序

#include<reg52.h>#define uint unsigned int#define uchar unsigned charchar TAB[11]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x00}; //数码管状态表void delay_100ms(uint );void delay(uint );void display(uint );void yejian(void);int i,k,t,flag=0;sbit A1=P1^0;sbit A2=P1^1;sbit A3=P1^2;sbit A4=P1^3;sbit SB=P3^7;void main () //主程序{EA=1;//初始化,开所有中断ET1=1;//开定时器T1中断TMOD=0x10;//设置定时器工作方式2TH1=(65536-50000)/256;//设置定时器初值TL1=(65536-50000)%256;while(1){if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;k=8;while(k>0)//状态1南北红灯,东西绿灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k); //显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}if(k==0) k=3;while(k>=0)//状态2南北红灯,东西绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x69;delay_100ms(5);P2=0x41;delay_100ms(5);k--;}k=2;flag=1;while(k>=0)//状态3南北红灯,东西黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0x7d;delay_100ms(10);k--;}P2=0x96;k=8;while(k>0)//状态4南北绿灯,东西红灯{if(SB==0) flag=1;if(flag==1) yejian();TR1=1;//开启T1while(t!=10) display(k);// 显示倒计时if(t==10) t=0;k--;TR1=0;//关闭T1}k=3;while(k>=0)//状态5东西红灯,南北绿灯闪烁三次{if(SB==0) flag=1;if(flag==1) yejian();P2=0x96;delay_100ms(5);P2=0x14;delay_100ms(5);k--;}k=2;while(k>=0)//状态6东西红灯,南北黄灯{if(SB==0) flag=1;if(flag==1) yejian();P2=0xd7;delay_100ms(10);k--;}}}void yejian(void){uint m=k;while(flag==1){if(SB==1) flag=0;k=11;P2=0xff;delay_100ms(5);P2=0x00;delay_100ms(5);}k=m;}void delay_100ms(uint z)//显示数码管延时100ms {TR1=1;//开启T1while(t!=z) display(k);if(t==z){t=0;TR1=0;//关闭T1}}void exter0() interrupt 3//定时器中断程序{TH1=(65536-50000)/256;TL1=(65536-50000)%256;t++;}void display(uint i)//倒计时显示{A1=A2=A3=A4=0;A4=1;P0=TAB[i];//显示第一位数值delay(4);A4=0;A3=1;P0=TAB[i];//显示第二位数值delay(4);A3=0;A2=1;P0=TAB[i];//显示第三位数值delay(4);A2=0;A1=1;P0=TAB[i];//显示第四位数值delay(4);A1=0;}void delay(uint z)//软件延时{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
51单片机交通灯

/*交通灯控制系统C语言源程序*//*Author:ZhaoWenjie All Rights Reserved*/ /*2009/10/18*/#include <reg51.h>#define uchar unsigned char#define uint unsigned intuchar data buf[4];uchar data sec_dx=20;//东西数默认uchar data sec_nb=30;//南北默认值uchar data set_timedx=20;uchar data set_timenb=30;int n;uchar data b;//定时器中断次数//sbit k1=P1^6;//定义5组开关//sbit k2=P1^7;//sbit k3=P2^7;//sbit k4=P3^0;//sbit k5=P3^1;//定义5组开关sbit k4=P3^7; //切换方向sbit k1=P3^5; //时间加sbit k2=P3^6; //时间减sbit k3=P3^4; //确认sbit k5=P3^1; //禁止// P3^2 //只允许东西方向通行// P3^3 //只允许南北方向通行sbit Y ellow_nb=P2^5; //南北黄灯标志sbit Y ellow_dx=P2^2; //东西黄灯标志sbit Green_nb=P2^4;sbit Green_dx=P2^1;sbit Buzz=P3^0;bit Buzzer_Indicate;bit time=0;//灯状态循环标志bit set=1;//调时方向切换键标志uchar code table[11]={ //共阴极字型码0x3f, //--00x06, //--10x5b, //--20x4f, //--30x66, //--40x6d, //--50x7d, //--60x07, //--70x7f, //--80x6f, //--90x00 //--NULL};//函数的声明部分void delay(int ms);//延时子程序void key();//按键扫描子程序void key_to1();//键处理子程序void key_to2();void key_to3();void display();//显示子程序void logo(); //开机LOGOvoid Buzzer();//主程序void main(){TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;// 开始默认状态,东西绿灯,南北黄灯sec_nb=sec_dx+5;while(1){key(); //调用按键扫描程序display(); //调用显示程序Buzzer();}}//函数的定义部分void key() //按键扫描子程序{if(k1!=1){delay(10);if(k1!=1){while(k1!=1){key_to1();for(n=0;n<40;n++){ display();}}}}if(k2!=1){delay(10);if(k2!=1){while(k2!=1){key_to2();for(n=0;n<40;n++){ display();}}}}if(k3!=1){TR0=1; //启动定时器Buzzer_Indicate=0;sec_nb=set_timenb; //从中断回复,仍显示设置过的数值sec_dx=set_timedx;if(time==0){ P2=0X99;sec_nb=sec_dx+5; }else { P2=0xC3;sec_dx=sec_nb+5; }}if(k4!=1){delay(5);if(k4!=1){while(k4!=1);set=!set;}}if(k5!=1){delay(5);if(k5!=1){while(k5!=1)key_to3();}}}void display() //显示子程序{buf[1]=sec_dx/10; //第1位东西秒十位buf[2]=sec_dx%10; //第2位东西秒个位buf[3]=sec_nb/10; //第3位南北秒十位buf[0]=sec_nb%10; //第4位南北秒个位P1=0xff; // 初始灯为灭的P0=0x00;P1=0xfe; //片选LCD1P0=table[buf[1]];delay(1);P1=0xff;P0=0x00;P1=0xfd; //片选LCD2P0=table[buf[2]];delay(1);P1=0xff;P0=0x00;P1=0Xfb; //片选LCD3P0=table[buf[3]];delay(1);P1=0xff;P0=0x00;P1=0Xf7;P0=table[buf[0]]; //片选LCD4delay(1);}void time0(void) interrupt 1 using 1 //定时中断子程序{b++;if(b==19) // 定时器中断次数{ b=0;sec_dx--;sec_nb--;if(sec_nb<=5&&time==0) //东西黄灯闪{ Green_dx=0;Y ellow_dx=!Y ellow_dx;}if(sec_dx<=5&&time==1) //南北黄灯闪{ Green_nb=0;Y ellow_nb=!Y ellow_nb;}if(sec_dx==0&&sec_nb==5)sec_dx=5;if(sec_nb==0&&sec_dx==5)sec_nb=5;if(time==0&&sec_nb==0){ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb+5;}if(time==1&&sec_dx==0){P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx+5;}}}void key_to1() //键盘处理子程序之+{TR0=0; //关定时器if(set==0)set_timenb++; //南北加1Selseset_timedx++; //东西加1Sif(set_timenb==100)set_timenb=1;if( set_timedx==100)set_timedx=1; //加到100置1sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to2() //键盘处理子程序之-{TR0=0; //关定时器if(set==0)set_timenb--; //南北减1Selseset_timedx--; //东西减1Sif(set_timenb==0)set_timenb=99;if( set_timedx==0 )set_timedx=99; //减到1重置99sec_nb=set_timenb ; //设置的数值赋给东西南北sec_dx=set_timedx;}void key_to3() //键盘处理之紧急车通行{TR0=0;P2=0Xc9;sec_dx=00;sec_nb=00;Buzzer_Indicate=1;}void int0(void) interrupt 0 using 1 //只允许东西通行{TR0=0;P2=0Xc3;Buzzer_Indicate=0;sec_dx=00;sec_nb=00;}void int1(void) interrupt 2 using 1 //只允许南北通行{TR0=0;P2=0X99;Buzzer_Indicate=0;sec_nb=00;sec_dx=00;}void logo()//开机的Logo "- - - -"{ for(n=0;n<50;n++){P0=0x40;P1=0xfe;delay(1);P1=0xfd;delay(1);P1=0Xfb;delay(1);P1=0Xf7;delay(1);P1 = 0xff;}}void Buzzer(){if(Buzzer_Indicate==1)Buzz=!Buzz;else Buzz=0;}void delay(int ms) //延时子程序{uint j,k;for(j=0;j<ms;j++)for(k=0;k<124;k++);}。
基于80C51单片机的交通灯C语言源程序

#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SH_CP=P2^0;sbit DS=P2^1;sbit ST_CP=P2^2;uchar temp;uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void NB_tong();void DX_tong();void NBY_show();void DXY_show();sbit RED_A=P1^0;//A代表NB南北sbit YELLOW_A=P1^1;sbit GREEN_A=P1^2;sbit RED_B=P1^3;//B代表DX东西sbit YELLOW_B=P1^4;sbit GREEN_B=P1^5;sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^3;sbit SPK=P3^7;//蜂鸣器uchar time=0,Count=0;//--------------------------------//延时//--------------------------------void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//---------------------------------------//74HC595的驱动//---------------------------------------void In_595(){uchar i;for(i=0;i<8;i++){temp<<=1;DS=CY;SH_CP=1;_nop_();_nop_();SH_CP=0;}void Out_595(){ST_CP=0;_nop_();ST_CP=1;_nop_();ST_CP=0;}//---------------------------------------//T0定时器定时及各种情况下灯亮的调用//---------------------------------------void Timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;Count++;time=time%60;if(Count==20){time++;Count=0;}if(time<=30) NB_tong();if((time>30)&&(time<=35)) NBY_show();if((time>35)&&(time<=55)) DX_tong();if((time>55)&&(time<=60)) DXY_show();}//------------------------------------//按键处理//------------------------------------void EX_INT0() interrupt 0{if(K1==0) //K1按下强制NB南北通行,倒计时黑屏暂停;断开继续以前动作。
单片机c语言程序设计---C51-交通灯实验报告

单片机c语言程序设计---C51-交通灯实验报告课程名称:单片机c语言设计实验类型:设计型实验实验项目名称: C51-交通灯实验一、实验目的和要求1.熟悉单片机的硬件结构及其工作原理2.掌握单片机的C51编程二、实验内容和原理(1)硬件设计使用P1端口连接VD1、VD2、VD3,模拟路口东面的红、黄、绿灯;P0端口连接VD9、VD10、VD11,模拟路口西面的红、黄、绿灯;P3端口连接VD17、VD18、VD19,模拟路口南面的红、黄、绿灯;P2端口连接VD25、VD26、VD27,模拟路口北面的红、黄、绿灯。
路口红绿灯的显示规律为:①南面和北面显示红灯(即VD17和VD25为红灯)时,东面和西面显示绿灯(即VD3和VD11为绿灯)。
②南面和北面,东面和西面都变成黄灯。
③南面和北面显示绿灯,东面和西面显示红灯④南面和北面,东面和西面都变成黄灯,然后再从①进行循环(需注意:此处设置的黄灯显示时长应短于红灯或绿灯的显示时长)(2)protues仿真通过Keil编译后,利用protues软件进行仿真。
在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
三、主要仪器设备四、操作方法与实验步骤1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。
启动仿真,观察仿真结果。
五、实验结果与分析void S_N(void){VD1=0;VD9=0;VD19=0;VD27=0;Delay(1000);VD1=1;VD9=1;VD19=1;VD27=1;}int main (void) {while(1){E_W();NOT();S_N();NOT();}}六、讨论和心得。
51单片机用C语言实现交通灯_红绿灯_源程序

c o d eu n s i g n e dc h a rt a b [ ] = { 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 , 0 x 6 d , 0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f } ; / / 共阴数码管 0 9 u n s i g n e dc h a rD i s _ S h i w e i ; / / 定义十位 u n s i g n e dc h a rD i s _ G e w e i ;/ / 定 g n e di n tc n t ) { w h i l e ( c n t ) ; } m a i n ( ) { T M O D| = 0 x 0 1 ; / / 定时器设置 1 0 m si n1 2 Mc r y s t a l 定时器 0 ,工作方式 1 ,1 6 位定时器 T H 0 = 0 x d 8 ; / / 6 5 5 3 5 1 0 0 0 0 = 5 5 5 3 5 = D 8 F 0 (十六进制) T L 0 = 0 x f 0 ; I E =0 x 8 2 ;/ / 中断控制,E A = 1 开总中断,E T 0 = 1 :定时器 0 中断允许 T R 0 = 1 ; / / 开定时器 0 中断 P 1 = 0 x f c ; / / 红灯亮,根据红黄绿接灯的顺序。 r e d= 1 ; w h i l e ( 1 ) { P 0 = D i s _ S h i w e i ; / / 显示十位,这里实现用 8 位数码管,即左 1 位 P 2 = 0 ; d e l a y ( 3 0 0 ) ; / / 短暂延时 P 0 = D i s _ G e w e i ;/ / 显示个位,左数,2 位 P 2 = 1 ;
单片机80C51 交通灯程序

#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit RED_DONGXI = P1^0;//南北方向红灯亮sbit YELLOW_DONGXI = P1^1;//南北方向黄灯亮sbit RED_NANBEI = P1^3;//东西方向红灯亮sbit GREEN_DONGXI = P1^2;//南北方向绿灯亮sbit YELLOW_NANBEI = P1^4;//东西方向黄灯亮sbit GREEN_NANBEI = P1^5;//东西方向绿灯亮sbit DXweixuan1 = P1^6;//南北方向数码管位选1sbit DXweixuan2 = P1^7;//南北方向数码管位选2sbit NBweixuan1 = P3^0;//东西方向数码管位选1sbit NBweixuan2 = P3^1;//东西方向数码管位选2sbit L1=P3^5; sbit L2=P3^6;sbit L3=P3^7;uintaa, bai,shi,ge,bb;uint shi1,ge1,shi2,ge2;uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uint code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint z);voidinit(uint a);void display(uint shi1,uint ge1,uint shi2,uint ge2);void xtimer0();void init1();void init2();void init3();void init4();void init5();void xint1();void xint0();void LED_ON();void LED_OFF();void main(){P0=0xFF;P1=0xFF;P2=0x00;P3=0xFF;EA=1;EX0=1;IT0=0;init1();while(1){init2();//第2个状态init3(); //第3个状态init4(); //第4个状态init5();//第5个状态}}void init1()//第一个状态:东西、南北方向均亮红灯5S{uint temp;temp=5;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0; //第一个状态东西、南北均亮红灯5SRED_NANBEI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;YELLOW_DONGXI=1;YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;}shi1=shi2=temp/10;ge1=ge2=temp%10;if(temp==0){temp=5;break;}display(ge1,shi1,ge2,shi2);}}void init2()//第二个状态:东西亮红灯30S~5S、南北亮绿灯25~0S; {uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=1;RED_NANBEI=0;GREEN_DONGXI=0;GREEN_NANBEI=1;YELLOW_DONGXI=1;//第二个状态:东西亮绿灯25S、南北亮红灯YELLOW_NANBEI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;shi1=(temp+5)/10;ge1=(temp+5)%10;shi2=temp/10;ge2=temp%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}voidinit3() //第三个状态:东西绿灯变为黄灯闪5次、南北亮红灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=0;GREEN_DONGXI=1;if(aa==20)//定时20*50MS=1S{aa=0;temp--;YELLOW_DONGXI=~YELLOW_DONGXI;shi1=temp/10;shi2=shi1;ge1=temp%10;ge2=ge1;}if(temp==0){temp=6;break;}display(ge1,shi1,ge2,shi2);}}voidinit4()//第四个状态:东西亮绿灯25~0S,南北方向亮红灯30~5S;{uint temp;temp=26;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_DONGXI=0;RED_NANBEI=1;YELLOW_DONGXI=1;//第一个状态东西、南北均亮红灯5S GREEN_NANBEI=0;if(aa==20){aa=0;temp--;shi1=temp/10;shi2=(temp+5)/10;ge1=temp%10;ge2=(temp+5)%10;if(temp==0){temp=26;break;}}display(ge1,shi1,ge2,shi2);}}voidinit5()//第五个状态:东西亮红灯、南北绿灯闪5次转亮黄灯5S {uint temp;temp=6;TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;while(1){RED_NANBEI=1;RED_DONGXI=0;GREEN_DONGXI=1;GREEN_NANBEI=1;if(aa==20){aa=0;temp--;YELLOW_NANBEI=~YELLOW_NANBEI;shi1=temp/10;shi2=shi2;ge1=temp%10;ge2=ge1;if(temp==0){temp=6;break;}}display(ge1,shi1,ge2,shi2);}}display(uint shi1,uint ge1,uint shi2,uint ge2) {DXweixuan1=0;DXweixuan2=1;NBweixuan1=1;NBweixuan2=1;P0=table[ge1];delay(5);DXweixuan1=1;DXweixuan2=0;NBweixuan1=1;NBweixuan2=1;P0=table[shi1];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=0;NBweixuan2=1;P0=table[ge2];delay(5);DXweixuan1=1;DXweixuan2=1;NBweixuan1=1;NBweixuan2=0;P0=table[shi2];delay(5);}voidxint0() interrupt 0{RED_NANBEI=0;RED_DONGXI=0;GREEN_NANBEI=1;GREEN_DONGXI=1;YELLOW_NANBEI=1;YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0;NBweixuan2=0;DXweixuan1=0;DXweixuan2=0;delay(2);returnvoidxint1() interrupt 2{RED_NANBEI=1;RED_DONGXI=1; GREEN_NANBEI=0; GREEN_DONGXI=0; YELLOW_NANBEI=1; YELLOW_DONGXI=1;P0=0x00;NBweixuan1=0; NBweixuan2=0; DXweixuan1=0; DXweixuan2=0;delay(2);return;}voidxtimer0() interrupt 1 {TH0=(65535-50000)/256; TL0=(65535-50000)%256; aa++;}voiddelay(uint z){uintx,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}。
51单片机 交通灯

实验二交通灯实验一、实验目的a)按键、数码管、发光二极管综合应用编程技术b)数据存储于EEPROM的技术(也可以不使用)c)定时中断技术d)按键中断技术二、实验实现的功能a)对绿黄红灯的时间进行设定。
b)紧急按键功能,当按下该键时,所有路口变成红灯,相当于交警指挥特殊车辆通过。
再按该键,恢复正常显示。
三、系统硬件设计四、系统软件设计#include <stc10.h>#define uchar unsigned char#define uint unsigned int#define N 10//0--F的共阴极字段码表ucharcodevalue[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X7C,0X39,0X5E,0X79,0X71};uchar Num_Buffer[]={0,0};uchar GT=0,YT=0;RT=0,Operation_Type=1,sec=0,count=0,k=0;sbit P02=P0^2;sbit P03=P0^3;sbit P36=P3^6;sbit P37=P3^7;/************************北方向灯组位定义***************************/ sbit BG=P2^3;sbit BY=P2^4;sbit BR=P2^5;/************************西方向灯组位定义***************************/ sbit XG=P2^0;sbit XY=P2^1;sbit XR=P2^2;/************************南方向灯组位定义***************************/ sbit NG=P3^3;sbit NY=P3^4;sbit NR=P3^5;/************************东方向灯组位定义***************************/ sbit DG=P2^6;sbit DY=P2^7;sbit DR=P3^2;/*******************************************************************/ void delay(uint x) //延时{uchar i;while(x--){for(i=0;i<120;i++);}}void display(uchar n) //显示函数{Num_Buffer[1]=n/10;Num_Buffer[0]=n%10;P0=0XFB;P1=codevalue[Num_Buffer[1]];delay(N);P0=0XF7;P1=codevalue[Num_Buffer[0]];delay(N);}uchar scan_key() //按键扫描程序{uchar i,m;P36=0;P37=1;for(i=0;i<2;i++){delay(N);m=P0;switch(m&0xe0){case 0xc0: k=i*3+1;return k;break;case 0xa0: k=i*3+2;return k;break;case 0x60: k=i*3+3;return k;break;default: break;}P36=1;P37=0;}}void dingshi() //设定绿黄红灯的时间{uchar k;P2=0XFF;P3=0XFF;while(1){display(0); //开始时显示0k=scan_key();if(k==4) //按下4键设定主干道绿灯时间{while(1){display(GT);k=scan_key();if(k==4){ delay(20N);GT++;}if(k==3) //按下3键设定好绿灯时间{ delay(20N);break;}}}else if(k==5) //按下5键设定黄灯时间{while(1){ ;display(YT);k=scan_key();if(k==5){ delay(20N);YT++;}if(k==3) //按下3键设定好绿灯时黄间{ delay(20N);break;}}}else if(k==6) //按下6键设定红灯时间{while(1){display(RT);k=scan_key();if(k==6){ delay(20N);RT++;}if(k==3) //按下3键设定好红灯时间{ delay(20N);break;}}}else if(k==3) //再次按下3键时间设定好返回break;}}void zanting() //暂停程序{ uchar k;k=scan_key();if(k==3) //按下3键暂停{ TR0=0;delay(50N);while(1){BG=1;BY=1;BR=0;NG=1;NY=1;NR=0; //东西南北红灯都亮XG=1;XY=1;XR=0;DG=1;DY=1;DR=0;k=scan_key();if(k==3) //再次按下3键开始{delay(50N);break;}}}}void yunxing() //运行程序{ uchar i;delay(50N);while(1){switch(Operation_Type){case 1://东西向绿灯与南北向红灯亮sec=GT;while(1){if(sec>-1){TR0=1;display(sec);BG=1;BY=1;BR=0;NG=1;NY=1;NR=0;XG=0;XY=1;XR=1;DG=0;DY=1;DR=1;zanting();}else{TR0=0;Operation_Type=2;break;}}break;case 2://东西向黄灯亮5s,绿灯关闭sec=YT;while(1){if(sec>-1){TR0=1;BG=1;BY=1;BR=0;NG=1;NY=1;NR=0;XG=1;XY=~XY;XR=1;DG=1;DY=~DY;DR=1;for(i=0;i<50;i++) //以数码管显示来延时{display(sec);}zanting();}else{TR0=0;Operation_Type=3;break;}}break;case 3://东西向红灯,南北向绿灯亮sec=RT;while(1){if(sec>-1){TR0=1;display(sec);BG=0;BY=1;BR=1;NG=0;NY=1;NR=1;XG=1;XY=1;XR=0;DG=1;DY=1;DR=0;zanting();}else{TR0=0;Operation_Type=4;break;}}break;case 4://东西向红灯亮,南北向黄灯亮5ssec=YT;while(1){if(sec>-1){TR0=1;BG=1;BY=~BY;BR=1;NG=1;NY=~NY;NR=1;XG=1;XY=1;XR=0;DG=1;DY=1;DR=0;for(i=0;i<50;i++){display(sec);}zanting();}else{TR0=0;Operation_Type=1;break;}}}}}void shan(){P2=0XB6;P3=0X37;delay(5N);P2=0X6D;P3=0X2F;delay(5N);P2=0XDB;P3=0X1B;delay(5N);}main(){P1M0=0XFF;P1M1=0X00;TMOD=0X01; //定时器T0,工作方式1TH0=-50000/256; //定时器T0赋初值TL0=-50000%256;EA=1; //开总中断ET0=1; //定时器T0中断允许while(1){P02=1;P03=1;shan(); //开始时二极管闪烁scan_key();if(k==1)dingshi();if(k==2)yunxing();}}void timer0(void) interrupt 1{TH0=-50000/256;TL0=-50000%256;count++;if(count==20){count=0;sec--;}}五、实验过程中遇到的问题及解决方法问题1:将各路口的灯用P2,P3口赋值来表示,显示乱码解决:直接对每个灯进行位定义,然后直接赋值,这样简单明了易查错,而且对按键扫描程序没有任何影响问题2:设定的时间走到1直接显示下一个灯的时间,没有显示0解决:检查发现在执行时if(sec>0),改成if(sec>-1)运行正常问题3:黄灯闪烁程序为XG=1;XY=~XY;XR=1;DG=1;DY=~DY;DR=1;发现运行时黄灯不闪烁,一直为黄色解决:因为运行时执行指令的速度较快,导致黄灯的熄灭人的眼睛无法识别,加延时函数delay(5N)既可,当加入延时函数又出现了新的问题,即数码管显示不连续,有的位显示一直闪烁,分析问题在于当加入延时函数后影响了数码管的扫描频率,数码管是动态显示的,靠的就是快速移位显示来显示4为数码管,将延时函数用数码管显示程序来代替,保证了数码管的显示,又解决了黄灯的闪烁问题。
51单片机c语言交通灯设计报告

xxxxxxxxx基于AT89S52交通灯设计学院:电子信息工程专业班级: xxxxxxxxxxxxxx姓名: xx xx学号: xxxxxxxxxxx指导老师: xxxxxxxxxx摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。
交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个安全的交通环境,人们的生命和财产安全有了保障。
本设计旨在模拟十字路口的交通灯,以AT89S51单片机为基础,结合按键和数码管等元器件设计出一个简单且完全的交通灯系统。
关键词:交通灯 AT89S52 单片机目录一、设计任务 (4)二、AT89S52单片机及其他元器件简介 (4)(1)AT89S52单片机 (4)三、系统硬件电路设计 (6)(1)时钟电路设计 (6)(2)复位电路设计 (6)(3)灯控制电路设计 (7)(4)按键控制电路设计 (7)四、元件清单及实物图 (8)1、程序清单 (8)2、原理图 (9)五、实验心得 (9)附1 源程序代码 (10)附2 原理图 (16)一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。
(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时,要求每秒亮一次。
(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通行。
二、AT89S52单片机及其他元器件简介(1)AT89S52单片机AT89S52是一种低功耗、高性能CMOS8位微控制器。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2级中断结构,全双工串行口,片内晶振及时钟电路。
51单片机用C语言实现交通灯

51单片机用C语言实现交通灯51 单片机用C 语言实现交通灯(红绿灯)源程序交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改。
源程序如下:#include bit red,green,yellow,turnred; //定义红、黄、绿及转红标志code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0- 9unsigned char Dis_Shiwei;//定义十位unsigned char Dis_Gewei; //定义个位void delay(unsigned int cnt) //用于动态扫描数码管的延时程序{while(--cnt);}main() {TMOD |=0x01;//定时器设置10ms in 12M crystal 定时器0,工作方式1,16 位定时器TH0=0xd8; //65535-10000=55535=D8F0(十六进制)TL0=0xf0;IE= 0x82; //中断控制,EA=1 开总中断,ET0=1:定时器0 中断允许TR0=1; //开定时器0中断P1=0xfc;//红灯亮,根据红黄绿接灯的顺序。
red =1;while(1) {P0=Dis_Shiwei;//显示十位,这里实现用8 位数码管,即左1 位P2=0;delay(300); //短暂延时P0=Dis_Gewei; //显示个位,左数,2 位P2=1;delay(300);}}void tim(void) interrupt 1 using 1{static unsigned char second=60,count; //初值60TH0=0xd8;//重新赋值,10 毫秒定时TL0=0xf0;count++;if (count==100) {count=0;second--;//秒减1if(second==0){ //这里添加定时到0 的代码,可以是灯电路,继电器吸合等,或者执行一个程序if(red) //红灭,先转黄{red=0;yellow=1;second=4;P1=0xF3;//黄灯亮4 秒,黄灯为过渡灯,再根据情况转绿或转红}else if(yellow && !turnred){yellow=0;green=1;second=25;P1=0xCF;// 绿灯亮25 秒,}else if(green){yellow=1;green=0;second=4;P1=0xF3;//黄灯亮4 秒turnred=1;}else if(yellow && turnred) //绿灯灭,转黄灯,后红灯,turnred=1 时{red=1;yellow=0;P1=0xFC;//红灯亮60 秒second=60;turnred=0; //接下来是转黄,绿。
51单片机的交通灯设计(可用)

基于51单片机的交通灯设计2.AT89C51单片机最小实现电路及配套发光二极管电路。
3.设计要求1.编程要求:主程序利用 C 语言编写。
2.实现功能:使用AT89C51单片机控制 4个方向的交通灯(红﹑黄﹑绿)并用数码管显示其时间。
3. 实验现象:状态一:主干道、支干道均亮红灯5秒;状态二:主干道亮绿灯30秒、支干道亮红灯;状态三:主干道绿灯闪3次转亮黄灯、支干道亮红灯3秒;状态四:主干道亮红灯、支干道亮绿灯25秒;状态五:主干道亮红灯、支干道绿灯闪3次转亮黄灯3秒;返回到第二个状态。
4.设计相关知识4.1 硬件设计1. AT89C51简介:AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。
它是一种带2K字节闪存可编程可擦除只读存储器的单片机。
AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2. 2位8段数码管工作原理:2位8段数码管电路采用“共阴”连接,阴极公共端(COM)由晶体管推动。
如图4-3所示:段码和位码,段码即段选信号 SEG,它负责数码管显示的内容,图中 a~g、dp组成的数据(a 为最低位,dp 为最高位)就是段码。
位码即位选信号 DIG,它决定哪个数码管工作,哪个数码管不工作。
当需要某一位数码管显示数字时,只需要先选中这位数码管的位信号,再给显示数字的段码。
4.2 软件应用1. Proteus7.5简介:Proteus软件不仅具有EDA工具软件的仿真功能,还能仿真单片机及外围器件Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。
在编译方面,它支持IAR、Keil和MPLAB等多种编译器。
at89c51单片机_交通灯控制系统(包括源码and仿真图)

设计任务书设计要求和技术指标1、技术指标:设计一个十字路口的交通灯控制电路,每条道路上各配有一组红、黄、绿交通信号灯,其中红灯亮,表示该道路禁止通行;黄灯亮表示该道路上未过停车线的车辆禁止通行,已过停车线的车辆继续通行;绿灯表示该道路允许通行。
该电路自动控制十字路口两组红、黄、绿交通灯的状态转换,实现十字路口自动化。
2、设计要求(1)要求甲车道和乙车道上的车辆交替运行,每秒通行时间为25秒种;(2)要求黄灯先亮5秒种,才能变换车道;(3)黄灯亮时要求每秒闪亮一次;(4)要求绘出原理图,并用Protel画出印制板图;(5)根据设计要求和技术指标设计好电路,选好元件及参数;(6)拟定测试方案和设计步骤;(7)写出设计性报告。
录` 目一、项目名称................................................................................. 错误!未定义书签。
二、选题背景 (2)2.1 课题背景 (2)2.2 交通灯的历史 (2)三、单片机简介 (3)3.1 单片机的发展历程 (3)3.2 单片机的特点: (4)3.3 AT89C51单片机简介 (4)四、设计基本要求和步骤 (6)4.1 基本要求 (6)4.2 设计步骤 (7)五、硬件和软件设计 (7)5.1 硬件电路图 (7)5.2 程序流程图 (9)主程序 (9)运行过程 (10)LED显示程序 (11)T0中断 (12)INT0中断 (12)5.3 P0、P1口显示状态编码表 (13)5.4 程序源代码 (13)5.5 程序运行效果图 (18)六、心得体会 (20)七、参考文献 (21)摘要本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。
系统包括人行道、左转、右转、以及基本的交通灯的功能。
系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间、违规车辆检测以及根据具体情况手动控制等功能。
51单片机的交通灯设计

第一章绪论1.1摘要交通信号灯常用于交叉路口,用来控制车的流量,提高交叉口车辆的通行能力,减少交通事故。
交通灯主要通过单片机来控制,单片机的代码采用c语言编程,最后烧录到单片机内,使其完成相应的应用。
在本控制电路中,采用了数码管显示时间,这样可以很方便的看出来红绿灯的亮灭计时,这相对于其他电路的红绿灯设计是非常有优势的。
在本电路中采用的是七十秒的总计时,每七十秒进行一次红绿灯切换,使两个路口的人能够交替通行。
在红绿灯切换之前,先有黄灯的长亮来提示红绿灯即将替换,后有红绿灯的闪烁来提示。
通过本次大作业的设计。
A,加强对单片机和C51语言的认识,充分掌握和理解设计各部分的工作原理、设计过程、选择芯片器件、模块化编程等多项知识。
B,用单片机模拟实现具体应用,使个人设计能够真正使用。
C,把理论知识与实践相结合,充分发挥个人能力,并在实践中锻炼。
D,提高利用已学知识分析和解决问题的能力。
E,提高实践动手能力。
1.2关键字交通灯、控制器、c51、电路仿真、数码管、proteus。
1.3设计要求a,设计一个70秒的交通灯,每七十秒进行一次红绿灯的切换。
b,在倒数十秒时,黄灯亮,直到倒数五秒。
c,倒数五秒时,红绿灯闪烁,直到0秒。
d,第0秒时,红绿灯切换。
1.4设计内容(1)填写实验报告。
(2)进行总体设计,画出原理图。
(3)用Protel软件画出PCB仿真。
(4)编写并调试程序。
1.5软件介绍。
1.5.1 keil cKeil C51是美国Keil Software公司(ARM公司之一)出品的51系列兼容单片机C语言软件开发系统。
与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
Keil C51目前由ARM国内授权代理商提供技术支持和销售等相关服务。
C51交通灯程序设计

C51期末课程设计大作业课程名称:交通灯程序设计学院:信息技术学院系别:计算机应用系专业:计算机应用技术班级: Z090X组序号:第二组组员X X学号 XXXXXXXX一、功能要求 (1)二、方案论证 (1)三、硬件解读 (2)四、流程图 (5)五、软件设计 (8)六、设计总结 (15)一、功能要求(一)设计所要完成的功能如下:1、信号灯受一个起动开关控制,当起动开关接通时,信号系统开始工作,且先南北红灯亮,东西绿灯亮。
当起动开关断开时,所有信号灯都熄灭。
2、南北红灯亮维持25S。
在南北红灯亮的同时东西绿灯也亮,并维持20S。
到20S时,东西绿灯闪烁,闪烁3S后熄灭。
在东西绿灯熄灭时,东西黄灯亮,并维持2S。
到2S时,东西黄灯熄,东西红灯亮。
同时,南北红灯熄灭,南北绿灯亮。
东西红灯亮维持30S。
南北绿灯亮维持25S。
然后闪烁3S,熄灭。
同时南北黄灯亮,维持2S后熄灭,这时南北红灯亮,东西绿灯亮3、要有倒计时数码显示。
(二)设计要求:1、功能要求2、方案论证3、系统硬件电路设计(给出键盘电路、LED显示电路)4、系统程序设计(要求给出流程图和程序清单)二、方案论证(一)方案的选择和论证根据题目要求,系统可以划分为几个基本模块:1、时钟模块2、时钟设置模块3、显示译码模块4、复位电路对各模块的实现,分别有以下一些不同的设计方案:(1) 标准时基模块方案一:采用直接从晶振分频得到12MHz信号。
该方案比较容易实现,但精确度不高,很难达到题目精确度的要求。
方案二:采用单片机C51经过延时程序产生12MHz时基信号。
在单片机程序设计中通过延时程序的循环产生所需要的12MHz的时基信号,该方案精确度比较高,而且也易于程序调整,电路结构简单,系统资源占用较小。
基于上述理论分析,拟订方案二。
(2)时钟控制模块方案一:采用单片机对键盘扫描和读取来控制不同时间值。
通过单片机对键盘的引脚不停的扫描,读入某时刻按下的键,通过单片机内部查表程序译出按键所对应的值从而使时间的值发生改变。
C51交通灯程序设计

引言概述:
正文内容:
一、设计目的
1.1.实现交通灯的循环变化控制
1.2.提高交通流畅性和效率
1.3.确保交通安全性和顺畅进行
二、设计原理
2.1.使用C51单片机来进行交通灯的控制
2.2.通过输入和输出控制来实现交通灯的变化
2.3.利用定时器来控制交通灯的时间间隔
2.4.使用状态机来管理不同交通灯状态的切换
三、实现步骤
3.1.设计交通路口的几个不同方向的交通流线
3.2.根据交通流量和优先级确定交通灯的时间间隔
3.3.编写C语言程序,在C51单片机上实现交通灯控制3.
4.进行硬件连接和测试,确保程序正常运行
3.5.进行调试和优化,使交通灯控制更加精准和稳定
四、注意事项
4.1.注意交通流量的变化和应对策略的调整
4.2.确保交通灯程序适应不同交通流量和交通情况的变化4.3.防止信号错误和故障导致交通混乱或事故发生
4.4.遵守相关交通规则和法规,确保交通安全
总结:。
基于51单片机的交通灯C语言程序

基于51单片机的交通灯C语言程序
/*南北:P1-0红,P1-1黄,P1-2绿,
东西:P1-4红,P1-5黄,P1-6绿,*/
#include"REG51.H"
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
TR0=1;
EA=1;ET0=1;
while (1)
{
if(time>24)
P1=0xeb; //P1--2=0,P1_4=0,南北绿东西红
else if(time>19)
{ //南北绿熄灭,南北黄闪烁
P1_2=1;
P1_1=~P1_1; }
//P1=0xed;
else if(time>4 )
P1=0xbe; //P1--0=0,P1_6=0,南北红东西绿
else
{
P1_6=1; //东西绿熄灭,东西黄闪烁
P1_5=~P1_5;
}
if(time>=25)
display((time-20)+(time-25)*100);
else if(time>=20)
display((time-20)*101);
else if(time>=5)
display(time*100+(time-5));
zt=zt/10;
a[1]=zt%10;
zt=zt/10;
a[0]=zt%10;
lie=0x01;
for ( i=0;i<4;i++)
{
P3=~lie;
P2=chr[a[i]];
基于MCS-51单片机的交通灯设计

基于MCS-51单片机的交通灯设计设计一个基于单片机的交通灯信号控制器。
已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。
要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。
表1 交通灯的状态切换表1:系统设计(1)任务分析与整体设计思路试题要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。
计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1 秒中的功能。
当计时每到 1 秒钟后,东西、南北信号灯各状态的暂存剩余时间的变量减1。
当暂存剩余时间的变量减到0 时,切换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。
开始下一个状态,如此循环重复执行。
动态扫描:需要使用4 个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的数字从变量中提取出“十位”和“个位”,用动态扫描的方式在数码管中显示。
整个程序依据定时器的溢出数来计时,每计时1S 则相应状态的剩余时间减1,一直减到0时触发下一个状态的开始。
(2)单片机型号及所需外围器件型号,单片机硬件电路原理图图1 交通灯硬件电路原理图选用MCS51 系列AT89S51 单片机作为微控制器,选择两个四联的共阴极数码管组成8位显示模块,由于AT89S51 单片机驱动能力有限,采用两片74HC244 实现总线的驱动,一个74HC244完成共阴极数码管位控线的控制和驱动,另一个74HC244完成数码管的7 段码输出,在7段码输出口上各串联一个100 欧姆的电阻对7 段数码管限流。
用P3口的P3.0-P3.5完成发光二极管的控制,实现交通灯信号的显示,每个发光二极管串联500欧姆电阻起限流作用。
硬件电路原理图如图1 所示。
(3)程序设计思路,单片机资源分配以及程序流程①单片机资源分配单片机P3口的P3.0-P3.1引脚用作输出,控制发光二极管的显示。
51单片机c语言交通灯设计报告

xxxxxxxxx基于AT89S52交通灯设计学院:电子信息工程专业班级:xxxxxxxxxxxxxx姓名:xx xx学号:xxxxxxxxxxx指导老师:xxxxxxxxxx摘要交通灯在我们日常生活中随处可见,它在交通系统中处于至关重要的位置。
交通灯的使用大大减少了交通繁忙路口的事故发生,给行人和车辆提供一个安全的交通环境,人们的生命和财产安全有了保障。
本设计旨在模拟十字路口的交通灯,以AT89S51单片机为基础,结合按键和数码管等元器件设计出一个简单且完全的交通灯系统。
关键词:交通灯AT89S52 单片机目录一、设计任务 (4)二、AT89S52单片机及其他元器件简介 (4)(1)AT89S52单片机 (4)三、系统硬件电路设计 (6)(1)时钟电路设计 (6)(2)复位电路设计 (6)(3)灯控制电路设计 (7)(4)按键控制电路设计 (7)四、元件清单及实物图 (8)1、程序清单 (8)2、原理图 (9)五、实验心得 (9)附1 源程序代码 (10)附2 原理图 (16)一、设计任务(1)、设计一个十字路口的交通灯控制电路,要求南北方向和东西方向两条交叉道路上的车辆交替运行,每次通行时间都设30秒,时间可设置修改。
(2)、在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道,且黄灯亮时,要求每秒亮一次。
(3)、有紧急车辆要求通过时,系统要能禁止东西和南北两条路上所有的车辆通行。
二、AT89S52单片机及其他元器件简介(1)AT89S52单片机AT89S52是一种低功耗、高性能CMOS8位微控制器。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6位向量2级中断结构,全双工串行口,片内晶振及时钟电路。
C51单片机的交通灯控制系统.

基于C51单片机的交通灯控制系统1、实验方案论证:进行十字路口的交通信号灯控制电路设计,画出电路原理图及实验电路图,进行软件编程、以及使用说明文档的建立等一整套工作任务。
进行十字路口的交通信号灯控制程序设计,提交一个符合上述功能要求的十字路口的交通信号灯控制系统设计。
2、控制流程分析:对设计要求进行分析后可得出以下交通工作状态表:3、硬件设计概要:根据设计要求,可用6个LED灯分别模拟东西、南北的交通灯。
具体接法如下:AT89C51的P1口接LED灯,P1.0、P1.1、P1.2分别接东西方向红、绿、黄交通灯,P1.3、P1.4、P1.5分别接南北方向的红、绿、黄交通灯。
P1口和LED 灯之间要接限流保护电阻。
两位数码管段选接P2口,位选接P0口低两位,P0口低两位接上拉电阻使其可以输出高电平。
紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。
三、原理图设计1、LED显示部分电路设计:把单片机AT89C51的P1口作为红黄绿灯显示部分,用6个LED灯分别模拟东西、南北的交通灯。
P1.0、P1.1、P1.2各通过一个300Ω的限流保护电阻接东西方向的红、绿、黄LED灯;P1.3、P1.4、P1.5各通过一个300Ω的限流保护电阻接南北方向的红、绿、黄LED灯。
LED灯的一端接电源,另一端经电阻接P1口,因此当P1口引脚输出低电平时LED灯发光,即此方案采取低电平驱动方式。
具体电路如下:2、紧急情况处理电路设计:紧急情况按钮一端接地,另一端与外中断1引脚相连;恢复正常按钮一端接地,另一端与外中断0引脚相连。
在程序设计时,我会将其设置为下降沿触发方式。
具体电路如下:3、数字显示电路设计:选用共阴极两位数码管。
两位数码管A~G引脚各通过一个300Ω的限流保护电阻分别接P2.0~P2.6,位选1引脚和2引脚分别接P0.0口低两位,P0口低两位接5kΩ的上拉电阻使其可以输出高电平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机应用技术课程设计基于单片机的交通灯控制系统设计院(系)名称专业名称学生姓名指导教师2012年月日目录1 设计任务与要求 (1)2 系统硬件设计............ (3)2.1硬件系统设计 (4)2.1.1单片机模块 (4)2.1.2 显示模块 (5)2.1.3 按键模块 (6)2.2 系统软件设计 (6)2.2.1正常工作模式子程序 (8)2.2.2 延时子程序 (9)2.2.3 夜间模式子程序 (10)2.2.4绿灯闪烁子程序 (12)2.2.5显示倒计时子程序 (12)3系统测试与实现 (14)3.1 汇编源程序 (14)3.2 Proteus仿真 (14)4 课程设计总结 (17)参考文献 (18)1 设计任务与要求当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
但这一技术在19世纪就已出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。
这是世界上最早的交通信号灯。
1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。
它由红绿两以旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。
1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。
电气启动的红绿灯出现在美国,这种红绿灯由红绿黄三色圆形的投光器组成,1914年始安装于纽约市5号大街的一座高塔上。
红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。
带控制的红绿灯,一种是把压力探测器安在地下,车辆一接近红灯便变为绿灯;另一种是用扩音器来启动红绿灯,司机遇红灯时按一下嗽叭,就使红灯变为绿灯。
红外线红绿灯当行人踏上对压力敏感的路面时,它就能察觉到有人要过马路。
红外光束能把信号灯的红灯延长一段时间,推迟汽车放行,以免发生交通事故。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
本次课程设计需要完成的任务是用单片机实现交通灯的基本功能,该系统除了可以实现基本交通灯功能外,也能实现紧急特殊模式等功能。
详细功能为:在白天正常东西方向和南北方向通车,通车时间均为45秒。
正常通车情况下,可以对通车的时间进行倒计时计数,并通过显示器显示出来。
如果遇到特殊情况,在处理特殊事件时,可使整个十字路口禁止通车。
强制东西通行,适用某些需要只进行东西通车的情况。
强制南北通行,适用某些需要只进行南北通车的情况。
在夜间车流量较少的情况下,正常东西方向和南北方向通车,通车时间均为10秒,相对与白天通行模式,车辆等待时间减少,提高了通行效率。
2 系统设计此次设计通过ATMEL公司的单片机AT89C52对整个交通灯电路进行控制。
根据上面的功能要求,本次设计需要完成正常模式﹑计时功能﹑紧急特殊模式﹑夜间模式等四个功能。
在正常模式下,交通灯每45秒改变一次通行方向,使得南北和东西交替通行。
而LED显示系统则显示到下一次改变所剩的时间,利于司机调整车辆状况。
每到同行方向转换时,绿灯闪烁,变为黄灯。
提醒司机注意通行方向的改变,避免不必要的危险。
本交通灯的设计运用了单片机的外部中断,系统的紧急和夜间模式的切换采用中断系统完成。
这样在任何通行情况下都可进入以上两种模式。
在设计中,设置外部中断0为夜间模式触发按钮,由电平触发完成,设置为低优先级,设置外部中断1为紧急模式触发按钮,由电平触发完成,设置为高优先级。
此时无论紧急状况(如车祸等)发生在何时都可以直接进入紧急模式以便于交通管理人员处理问题。
同时,通过在紧急模式下软件检测p3.7和p3.6是否不为1来触发东西及南北强制通行模式,以弥补外部中断的不足,实现更多的功能。
此次设计运用了软件延时程序,这样不仅调整延时长短十分灵活,而且不占用内部定时/计数器的资源。
设计中通过对指令运行的次数进行循环来实现软件延时。
当晶振频率为12MHz时有以下时间周期:震荡周期:1/12微秒;状态周期:1/6微秒;机器周期:1微秒;指令周期:1~4微秒;(根据指令的不同而不同)软件延时的优点是较为灵活,调整更为容易,且不受延时时间限制。
但软件延时长时间占用系统资源,使得CPU工作效率不高,在中断频繁的系统中其定时精度也受到中断的影响。
但本系统要求延时时间较长,且没有频繁申请的中断系统,所以选择软件延时配合外部申请中断模式切换较为合理。
2.1硬件系统设计根据上面的功能要求,硬件系统主要模块有单片机模块﹑显示模块﹑按键模块,其硬件总电路图如附录二所示。
2.1.1 单片机模块AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
本设计中AT89C52使用12MHz晶振。
XTAL1(19脚)和XTAL2(18脚):外接晶体引脚,XTAL1和XTAL2分别接外部晶振一端;RST:即为RESET,该引脚为单片机的上电复位或掉电保护端。
在此设计中接正常模式按扭;P3.7:使用第二功能,接强制南北通行按扭;P3.6:使用第二功能,接强制东西通行按扭;P3.3:使用第二功能INT1,接紧急工作模式按扭;P3.2:使用第二功能INT0,接夜间工作模式按扭;P1.0~P1.7:输出BCD码,用来控制LED显示器的显示控制;P2.7、P2.6、P2.5:输出高低电平,用来控制南北交通信号灯;P2.1、P2.2、P2.3:输出高低电平,用来控制东西交通信号灯;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS。
单片机与其他模块的连接如下图1所示:图2-1 单片机与其它模块的连接2.1.2 显示模块传统的共阳极或共阴极的数码管其显示输入需要为段码,这样就使得电路相对复杂和繁琐。
对于相同的功能在成本相差不大的情况下,此处运用了带BCD 译码电路的LED显示器。
这样既可使线路简化,又可使可靠性提高本设计中使用的自带BCD译码电路的LED显示器,其主要特点是采用四线BCD码输入,可显示0-F十六进制数。
使用时直接输入BCD码即可显示相应的数字,使得电路大大简化。
设计时,把P1.0~P1.7当做BCD码输出端口,连接到LED显示器上,这样可把BCD码直接转换成可显示的数字,显示模块的连接如图2所示:图2-2 显示模块图中的总线接至单片机的P1.0~P1.7端口。
2.1.3 按键模块在此系统中,按键模块是实现各项功能的关键,按键通过电阻与单片机相连接,可以对单片机进行控制,低电平信号对相应的单片机引脚有效,可使按键的另一端接地。
本设计中有强制东西通行按键﹑强制南北通行按键﹑夜间模式按键﹑正常模式按键﹑紧急模式按键五个按键,分别对应着相应的子模式。
如图3所示:图2-3 按键模块各按键与单片机相对应的接口见上面的单片机模块。
2.2 系统软件设计根据前面的要求以及硬件的设置情况,本系统的软件部分需要进行中断设置。
为了实现上述要求,软件部分应包括正常模式﹑夜间模式﹑紧急模式﹑强制通行等子程序。
主程序流程图如图4所示:图2-4 主程序流程图开机上电处于正常模式下,交通灯每45秒改变一次通行方向,使得南北和东西交替通行。
而显示系统则显示到下一次改变所剩的时间,利于司机调整车辆状况。
每到同行方向转换时,绿灯闪烁,变为黄灯。
提醒司机注意通行方向的改变,避免不必要的危险。
在设计运用了单片机的外部中断,系统的紧急和夜间模式的切换采用中断系统完成。
这样在任何通行情况下都可进入以上两种模式。
在设计中,设置外部中断0为夜间模式触发按钮,由电平触发完成,设置为低优先级,设置外部中断1为紧急模式触发按钮,由电平触发完成,设置为高优先级。
此时无论紧急状况(如车祸等)发生在何时都可以直接进入紧急模式以便于交通管理人员处理问题。
同时,通过在紧急模式下软件检测p3.7和p3.6是否不为1来触发东西及南北强制通行模式,以弥补外部中断的不足,实现更多的功能。
总程序见附录一。
调用正常通行子程序 INT1中断?调用紧急模式子程序 INT0中断?调用夜间模式子程序外部中断初始化开始NN2.2.1正常工作模式子程序正常模式下,交通灯每45秒改变一次通行方向,使得南北和东西交替通行,其流程图如图5所示。
其主要程序为:MOV R6,#03H ;绿灯闪烁次数MOV R0,#00H ;MOV P2,R0 ;灯全灭SETB P2.7 ;南北绿灯亮SETB P2.1 ;东西红灯亮ACALL DISPLAY ;显示倒计时ACALL FLASHN ;南北方向绿灯闪烁CLR P2.7 ;南北绿灯灭SETB p2.6 ;南北黄灯亮ACALL DELAY2 ;短延时2CLR P2.6 ;南北黄灯灭CLR P2.1 ;东西红灯灭SETB P2.3 ;东西绿灯亮SETB P2.5 ;南北红灯亮ACALL DISPLAY ;显示倒计时ACALL FLASHS ;东西方向绿灯闪烁CLR P2.3 ;东西绿灯灭SETB P2.2 ;东西黄灯亮ACALL DELAY2 ;短延时2CLR P2.2 ;东西黄灯灭开始外部中断初始化进入正常工作状态南北45秒倒计时显示东西45秒倒计时显示图2-5 正常工作模式流程图2.2.2 延时子程序设计中通过对指令运行的次数进行循环来实现软件延时。
当晶振频率为12MHz时每个机器周期是1微秒,一条NOP指令是一个机器周期,一条DJNZ 指令是两个机器周期,所以可写出如下的1秒延时子程序:DELAY: MOV R2,#33DEL3: MOV R3,#100DEL2: MOV R4,#75DEL1: NOPNOPDJNZ R4,DEL1DJNZ R3,DEL2DJNZ R2,DEL3其流程图如6所示:开始R2<-33R3<-100R4<-75NOPNOPDJNZ R4DJNZ R3DJNZ R2返回图2-61秒延时子程序流程图2.2.3 夜间模式子程序系统在主程序中已经完成中断初始化,在正常模式下,其随时可通过中断0进入夜间模式,不受当时通行方向的影响。
夜间模式中,交通灯每45秒改变一次通行方向,使得南北和东西交替通行。