基于MCS-51单片机的交通灯设计设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。表1交通灯的状态切换表警告:不同单片机的动态扫描显示不一样,即下面黄底红字是让数码管显示函数,如果单片机不一样,只需改显示函数即可,其他的不要动。2:程序设计(仅供参考的C语言源程序)#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include#defineucharunsignedchar#defineuintunsignedint#defineulangunsignedlangstaticunsignedcharcount;codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0-9ucharsmg[8];//定义缓冲区uintwe,ns,h,j;//ns代表南北,we代表东西intaaa();//东西红灯亮,南北绿灯,黄灯亮intbbb();//南北红灯亮,东西绿灯,黄灯亮inteee();//第一次完成显示,继续第二次初始化voiddelay(unsignedintcnt){while(--cnt);}voiddisplay(){//取每一位的数字smg[0]=tab[we/10];smg[1]=tab[we%10];smg[2]=0x00;smg[3]=0x00;smg[4]=0x00;smg[5]=0x00;smg[6]=tab[ns/10];smg[7]=tab[ns%10];}voidmain(){uchari;TMOD|=0x01;//定时器010msin12Mcrystal用于计时TH0=0xd8;//初值TL0=0xf0;ET0=1;TR0=1;EA=1;display();while(1){for(i=0;i<8;i++)//显示函数,因单片机而异{P0=smg[i];P2=i;delay(100);}ccc();//进入交通灯控制程序display();//扫描数码管}}voidtimer()interrupt1//中断函数{TH0=0xd8;//重新赋值TL0=0xf0;count++;}intaaa(){if(j<25)//东西红灯计数30秒,南北25秒绿灯亮{if(j==1){we=30,ns=25;}ns--;we--;P1=0xde;return0;}if(25<=j<30)//南北黄灯5秒{if(j==26){ns=5;}P1=0xee;ns--;we--;return0;}}intbbb(){if(h<25){//南北红灯30秒,东西绿灯25秒if(h==1){we=25,ns=30;}ns--;we--;P1=0xf3;return0;}if(25<=h<30)//东西黄灯5秒{if(h==26){we=5;}P1=0xf5;ns--;we--;return0;}}inteee()//一次周期交通灯显示完后,重新赋值,等待第二次{j=0;h=0;return0;}intccc()//交通灯控制函数{if(count==100)//定时一秒{count=0;j++;//算法函数if((j>30)&&(j!=61)){h++;bbb();return0;}if(j==61){eee();return0;}aaa();return0;}}