十字路口交通灯控制一、设计任务及题目要求利用JD51开发板上彩色LED灯做出符合普通十字路口通行逻辑的交通灯,1.东西绿-南北红、东西红-南北绿;2.LED绿-红切换时,黄灯亮并延时3秒;3.数码管前两位显示东西向量倒计时,后两位显示南北向量倒计时。二、工作原理及设计思路在JD51电路板上有红、绿、黄三种颜色LED灯,自定义选取两组彩灯对其进行逻辑控制。工作时,先南北绿灯16S、东西红灯19S,然后,南北绿灯转黄灯3S;接着,东西绿灯15S,南北红灯18S,东西绿灯转黄灯3S。在LED亮的同时两个方向的数码管显示倒计时,东西向一组数码管,南北向一组数码管。三、硬件电路设计及描述使用JD51电路板上P1^7口的红色LED,P1^6口的黄色LED,P1^5口的绿色LED表示东西向指示灯,P1^4口的红色LED,P1^3口的黄色LED,P1^2口的绿色LED表示南北向指示灯,四位数码管的前两位显示东西向量倒计时,后两位显示南北向量倒计时。单片机课程设计——十字路口交通灯1四、软件设计流程及描述五、程序和注释C语言程序:#includereg52.h#defineucharunsignedchar#defineuintunsignedint//定义位变量sbitRED_A=P1^7;//东西向指示灯sbitYELLOW_A=P1^6;sbitGREEN_A=P1^5;sbitRED_B=P1^4;//南北向指示灯sbitYELLOW_B=P1^3;sbitGREEN_B=P1^2;sbiten=P2^5;//573片选使能ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳0-9不带小数点数表ucharcodetable_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳0-9带小数点数表uchartime[4]={0,0,0,0};//数码管显示00.00初值uchartimec[4]={1,6,1,9};//南北绿初值16.19uchartimeb[4]={1,5,1,8};//东西绿初值15.18红灯比绿灯长三秒ucharcp=0;//计数初值intn=0;//C语言延时程序voidDelayMS(uintx){uchari;while(x--)for(i=0;i120;i++);单片机课程设计——十字路口交通灯2}//数码管动态扫描程序voiddisplay(uchar*p){inti,j=0xFE;//第一位选通for(i=0;i4;i++){P2=j;P0=*p;DelayMS(3);j=(j1)|0x01;//第二位选通if(j==0xEF);p++;}}//中断初始化函数voidtimer0_initialize(void){EA=0;//关闭中断TR0=0;//停止计数TMOD=0x01;//T0工作在方式一TL0=0x00;//装入低八位初值TH0=0xEE;//装入低八位初值,定时器溢出产生中断5msPT0=1;//T0中断优先级调制最高ET0=1;//开启T0中断EA=1;//开启总中断TR0=1;//开始计数}//中断服务函数voidtimer0_isr(void)interrupt1{intk;//控制亮灯时间k++;if((k=200)&&(k200*(16+1)))//1秒到16秒,东西绿16秒,南北红16秒{RED_A=1;YELLOW_A=1;GREEN_A=0;RED_B=0;YELLOW_B=1;GREEN_B=1;}if((k=200*(16+1))&&(k200*(16+4+1)))//16秒到19秒,东西黄3秒,南北红3秒{RED_A=1;YELLOW_A=0;GREEN_A=1;RED_B=0;YELLOW_B=1;GREEN_B=1;}单片机课程设计——十字路口交通灯3if((k=200*(16+4+1))&&(k200*(16+4+1+15)))//接下来15秒,东西红15秒,南北绿15秒{RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=1;GREEN_B=0;}if((k=200*(16+4+1+15)))//接下来3秒,东西红3秒,南北黄3秒{RED_A=0;YELLOW_A=1;GREEN_A=1;RED_B=1;YELLOW_B=0;GREEN_B=1;if((k==200*(16+4+1+18))){k=0;}}TR0=0;cp++;//数码管逻辑判断if(cp==200){cp=0;if((time[0]!=0)&&(time[2]!=0)&&(time[1]==0)&&(time[3]==0))//非0位-1,为0位变9{time[1]=9;time[3]=9;time[0]--;time[2]--;}elseif((time[0]!=0)&&(time[2]!=0)&&(time[1]==0)&&(time[3]!=0)){time[1]=9;time[3]--;time[0]--;}elseif((time[0]!=0)&&(time[2]!=0)&&(time[1]!=0)&&(time[3]==0)){单片机课程设计——十字路口交通灯4time[1]--;time[3]=9;time[2]--;}elseif((time[1]!=0)&&(time[3]!=0)){time[1]--;time[3]--;}elseif((time[3]!=0)&&(time[0]==0)&&(time[1]==0)&&(time[2]==0))//熄灭的灯为3.0变成3{time[0]=0;time[1]=3;time[1]--;time[3]--;}elseif((time[3]!=0)&&(time[0]!=0)&&(time[1]==0)&&(time[2]==0)){time[0]--;time[1]=9;time[2]=0;time[3]--;}elseif((time[3]!=0)&&(time[0]!=0)&&(time[1]==0)&&(time[2]==0)){time[0]--;time[1]=9;time[2]=0;time[3]--;}elseif((time[3]==0)&&(time[0]==0)&&(time[1]!=0)&&(time[2]!=0))单片机课程设计——十字路口交通灯5{time[0]=0;time[1]--;time[2]--;time[3]=9;}elseif((time[3]==0)&&(time[0]==0)&&(time[1]!=0)&&(time[2]==0)){time[1]--;time[3]=3;time[3]--;}//东西绿与南北绿的转换elseif((time[3]==0)&&(time[0]==0)&&(time[1]==0)&&(time[2]==0)){if(n==0){time[0]=timec[0];time[1]=timec[1];time[2]=timec[2];time[3]=timec[3];n++;}elseif(n==1){time[0]=timeb[0];time[1]=timeb[1];time[2]=timeb[2];time[3]=timeb[3];n=0;}}else{while(1);}单片机课程设计——十字路口交通灯6}timer0_initialize();}//主函数voidmain(void){uchari,dpldata[4];timer0_initialize();en=1;while(1){for(i=0;i4;i++)//数码管第二位用带小数点的数表,隔开东西与南北的倒计时{if(i==1){dpldata[i]=table_d[time[i]];}else{dpldata[i]=table[time[i]];}}display(dpldata);}}汇编语言程序:ORG0000HJMPMAIN//中断入口地址ORG000BHMOVTL0,#0B0H//装入初值MOVTH0,#3CHDJNZR2,EXIT_T0//用寄存器R2装溢出的次数MOVR2,#20//溢出20次为1秒DECR3//东西方向计数寄存器DECR4//南北方向计数寄存器EXIT_T0:RETIMAIN:MOVTMOD,#01H//T0工作在方式一MOVTH0,#3CH//装入初值MOVTL0,#0B0HMOVR2,#20//设置R2初值为20单片机课程设计——十字路口交通灯7SETBTR0//开始计数SETBET0//开启T0中断SETBEA//开启总中断MOVSP,#60H//堆栈指针的地址N_B:MOVP1,#0CFH//设置P1口的值MOVR3,#16//南北绿16SMOVR4,#19//东西红19SNB_W1:CJNER3,#0,NB_DISP//判断南北方向绿灯倒计时是否结束,不为0跳到数码管显示SJMPN_B_YNB_DISP:CALLDISPLAYSJMPNB_W1N_B_Y:CPLP1.5//熄灭南北绿灯NB_W2:MOVR3,#0CJNER4,#0,NB_DISP2//判断东西红灯是否结束JMPD_XNB_DISP2:CPLP1.6CALLDISPLAYSJMPNB_W2D_X:MOVP1,#07BHMOVR3,#18//东西红18sMOVR4,#15//南北绿15SDX_W1:CJNER4,#0,DX_DISPSJMPD_X_YDX_DISP:CALLDISPLAYSJMPDX_W1D_X_Y:CPLP1.2DX_W2:MOVR4,#0CJNER3,#0,DX_DISP2JMPN_BDX_DISP2:CPLP1.3CALLDISPLAYSJMPDX_W2单片机课程设计——十字路口交通灯8DISPLAY:MOVDPTR,#TAB1//数表中的值送入DPTRMOVA,R3MOVB,#10DIVAB//倒计时/10MOVCA,@A+DPTR//数表送到A中MOVP0,A//A送到P0SETBp2^0//实现位选SETBp2^2MOVP2,#0FEHMOVP2,#0FFHMOVA,BMOVCA,@A+DPTRMOVP0,ASETBp2^0SETBp2^2MOVP2,#0FDHMOVP2,#0FFHMOVA,R4MOVB,#10DIVABMOVCA,@A+DPTRMOVP0,ASETBp2^0SETBp2^2MOVP2,#0FBHMOVP2,#0FFHMOVA,BMOVCA,@A+DPTRMOVP0,ASETBp2^0SETBp2^2MOVP2,#0F7HMOVP2,#0FFHSETBp2^0SETBp2^2RETTAB1://数码管数表DB0C0H,0F9H,0A4H,0B0H,99HDB92H,82H,0F8H,80H,90HEND单片机课程设计——十字路口交通灯9六、实验结果七、实验心得“纸上得来终觉浅,绝知此事要躬行。”经过了半个学期单片机理论课程的学习,我对单片机的内部结构及工作原理有了基本的了解,由于内容太多,学起来有些囫囵吞枣。但经过一个具体的课程设计,我对作品中用到的模块有了更深刻的理解,比如中断优先级寄存器IP,有关定时器/计数器的TMOD、TCON寄存器。同时也感受到制作出一个满足要求的、可靠的程序不是一个简单的过程,需要不断的修改调试,但在这一试错的过程中,是积累经验的最佳时期。从“知”到“行”,我对单片机有了更浓厚的兴趣和更强烈的探索欲望。当看到程序成功控制单片机运行时,心里充满了成就感。