1、硬件连基于AT89C51单片机的交通信号灯控制系统硬件连基于AT89C51单片机的交通信号灯控制系统哦,第一次提问,问的太笼统了,我是电路硬件部分不会设计,请大家帮帮忙 主要要求是(1) 以AT89C51为核心的交通信号灯控制系统的设计方案;(2) 根据设计方案绘制硬件原理图;(3) 根据硬件原理图绘制印刷电路板图(PCB);,谢谢接图给了,是proteus仿真的,不过毕设没这么简单吧.难道主要是要你设计pcb,原理图没有,程序我有复制给你看看吧仿真图的复位和晶振电路没截图,反正仿真的时候画布画都行#include #define uchar unsigned char#define uint
2、 unsigned intsbit RED_A=P00;sbit YELLOW_A=P01;sbit GREEN_A=P02;sbit RED_B=P03;sbit YELLOW_B=P04;sbit GREEN_B=P05;uchar Flash_Count = 0;Operation_Type = 1;void DelayMS(uint x) uchar t; while(x-) for(t=120;t0;t-); void Traffic_lignt() switch(Operation_Type) case 1: RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=
3、0;YELLOW_B=1;GREEN_B=1; DelayMS(2000); Operation_Type = 2; break; case 2: DelayMS(200); YELLOW_A=YELLOW_A; if(+Flash_Count !=10) return; Flash_Count=0; Operation_Type = 3; break; case 3: RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type = 4; break; case 4: Del
4、ayMS(200); YELLOW_B=YELLOW_B; if(+Flash_Count !=10) return; Flash_Count=0; Operation_Type = 1; break; void main() while(1) Traffic_lignt(); 一、设计目的: 在完成“单片机原理及应用”课程的学习后,通过设计小型的单片机应用系统,加深对所学知识的理解和提高单片机系统的设计能力。 二、设计任务和要求: 1、设计任务:设计基于AT89C51单片机的十字路口交通灯控制电路。 2、具体要求: (1)设计硬件电路,包括:单片机最小系统、2位LED数码管显示器、3个按钮的
5、键盘(SET、UP、DOWN)、12个led指示灯(红黄绿三种颜色,东西并联、南北并联),等。 (2)基本功能: 要求东西方向(A方向)车道和南北方向(B方向)车道两条交叉道路上的车辆交替通行,每次通行时间为N秒(红灯、绿灯亮的时间为N秒,N60S) ,可以设置。 在绿灯转为红灯时,要求黄灯先亮3秒(固定),才能交换运行车道 。 剩余秒数显示:2位LED数码管,倒计时方式:(N+3)1 可选的扩展功能: 黄灯亮时,要求0.5s闪烁一次。 A方向、B方向的通行时间可以不同,如:A方向通行50s,B方向通行30s。 #include unsigned char temp;unsigned char
6、 key;unsigned char i,j;unsigned char STH0;unsigned char STL0;unsigned int code tab=64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178;void main(void)TMOD=0x01;ET0=1;EA=1;while(1)P3=0xff; /将P3口取出P3_4=0; /使P3_4为低电平,这样可以判断第一竖排有没有键按下temp=P3;temp=temp & 0x0f;
7、if (temp!=0x0f) /有键按下for(i=50;i0;i-)for(j=200;j0;j-); /延时temp=P3; temp=temp & 0x0f;if (temp!=0x0f) /再判断是否有键按下temp=P3;temp=temp & 0x0f;switch(temp) /判断是哪个键按下case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;temp=P3;P1_0=P1_0;P0=tablekey;STH0=tabkey/256; /找出键对应的频率
8、的时间,作为定时器中断初始值STL0=tabkey%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;TR0=0;P3=0xff;P3_5=0; /跟上面差不多,现在是判断第二排的按键temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=4
9、;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;temp=P3;P1_0=P1_0;P0=tablekey;STH0=tabkey/256;STL0=tabkey%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;TR0=0;P3=0xff;P3_6=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3
10、;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;temp=P3;P1_0=P1_0;P0=tablekey;STH0=tabkey/256;STL0=tabkey%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;TR0=0;P3=0xff
11、;P3_7=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f)for(i=50;i0;i-)for(j=200;j0;j-);temp=P3;temp=temp & 0x0f;if (temp!=0x0f)temp=P3;temp=temp & 0x0f;switch(temp)case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;temp=P3;P1_0=P1_0;P0=tablekey;STH0=tabkey/256;STL0=
12、tabkey%256;TR0=1;temp=temp & 0x0f;while(temp!=0x0f)temp=P3;temp=temp & 0x0f;TR0=0;void t0(void) interrupt 1 using 0TH0=STH0;TL0=STL0;P1_0=P1_0;思路: 红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。三、硬件电路设计此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显
13、示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。四、软件程序(C语言) 以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。/*/程序名:十字路口交通灯控制/编写人:黄庭剑/初写时间:2009年1月2日/程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换./CPU说明:AT89C51型单片机; 24MHZ晶体振荡器/完成时间:2
14、009年1月6日/*/#include#include#includesfr p0 = 0x80;sfr p1 = 0x90;sfr p2 = 0xA0;sfr p3 = 0xb0; /这部分内容其实在“#include”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。sbit sw = p00;sbit OE =P06;sbit LE =P07; /74LS373锁存器控制端定义c
15、har display= 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 ; /p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;/函数声明 beginvoid delay1(int count);void delay_long(int number1,int number2);void people_car_drive();/函数声明end/*/延时子程序void delay1(int count) int i; for(i=count;i0;i-) ; void delay_long(int number1,int num
16、ber2) int a,b; for(a=number1;a0;a-) for(b=number2;b0;b-) _nop_(); /*/延时子程序 void people_car_drive() int p_1=2,i,j=9,p_2=6; /*/行人通行时,延时20秒 p2=0x09; /南北红灯亮 p3=0x24; /东西绿灯亮 while(p_1-0) LE=1; OE=0; if(p_1=0)OE=1; /当十位数减到0时,只显示个位数 p1=displayp_1; delay1(1000); LE=0; j=9; for(i=10;i0;i-) if(p_1=0&j=3)break
17、; /减到3时退出循环,让其黄灯闪烁显示 p1=displayj-; delay_long(16000,2); if(sw=1)return; /*/ p2=0x12; /南北黄灯闪烁三秒,以提醒行人注意 p3=0x12; p1=display3; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display2; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=displ
18、ay1; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1);/*以下是车辆通行时延时60秒/ p2=0x24; /南北绿灯亮 p3=0x09; /东西红灯亮 while(p_2-0) LE=1; OE=0; if(p_2=0)OE=1; /当十位数减到0时,只显示个位数 p1=displayp_2; delay1(1000); LE=0; j=9; for(i=10;i0;i-) if(p_2=0&j=3)break; /减到2时退出循环 p1=displayj-; delay_long(16000,2); if(sw=1)re
19、turn; p2=0x12; /南北黄灯闪烁三秒,以提醒行人注意 p3=0x12; p1=display3; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display2; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); p2=0x12; p3=0x12; p1=display1; delay_long(8000,1); p2=0x00; p3=0x00; delay_long(14000,1); /南北黄灯闪烁三秒完毕 void main() /主函数入口处 p0=0x01; p1=0x00; p2=0x00; p3=0x00; /初始化各端口 while(1) if(sw=0) people_car_drive();else p2=0x00; p3=0x00; /关闭所有交通灯参考:1|评论 .