硬件连基于AT89C51单片机的交通信号灯控制系统

  • 格式:doc
  • 大小:134.00 KB
  • 文档页数:15

硬件连基于AT89C51单片机的交通信号灯控制系统 哦,第一次提问,问的太笼统了,我是电路硬件部分不会设计,请大家帮帮忙 主要要求是(1) 以AT89C51为核心的交通信号灯控制系统的设计方案; (2) 根据设计方案绘制硬件原理图; (3) 根据硬件原理图绘制印刷电路板图(PCB); ,谢谢接图给了,是proteus仿真的,不过毕设没这么简单吧..难道主要是要你设计pcb,原理图没有,程序我有复制给你看看吧

仿真图的复位和晶振电路没截图,反正仿真的时候画布画都行 #include #define uchar unsigned char #define uint unsigned int

sbit RED_A=P0^0; sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; sbit YELLOW_B=P0^4; sbit GREEN_B=P0^5;

uchar Flash_Count = 0; Operation_Type = 1;

void DelayMS(uint x) { uchar t; while(x--) { for(t=120;t>0;t--); } } void Traffic_lignt() { switch(Operation_Type) { case 1: RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=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: DelayMS(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个按钮的键盘(SET、UP、DOWN)、12个led指示灯(红黄绿三种颜色,东西并联、南北并联),等。 (2)基本功能: 要求东西方向(A方向)车道和南北方向(B方向)车道两条交叉道路上的车辆交替通行,每次通行时间为N秒(红灯、绿灯亮的时间为N秒,N≤60S) ,可以设置。 在绿灯转为红灯时,要求黄灯先亮3秒(固定),才能交换运行车道 。 剩余秒数显示:2位LED数码管,倒计时方式:(N+3)~1 可选的扩展功能: 黄灯亮时,要求0.5s闪烁一次。 A方向、B方向的通行时间可以不同,如:A方向通行50s,B方向通行30s。 #include unsigned char temp; unsigned char 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; if (temp!=0x0f) //有键按下 { for(i=50;i>0;i--) for(j=200;j>0;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=table[key]; STH0=tab[key]/256; //找出键对应的频率的时间,作为定时器中断初始值 STL0=tab[key]%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;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3; P1_0=~P1_0; P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%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;i>0;i--) for(j=200;j>0;j--); temp=P3; 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=table[key]; STH0=tab[key]/256; STL0=tab[key]%256; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f; } TR0=0; } }

P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=12; break; case 0x0d: