基于MCS-51单片机的交通灯设计

来源:互联网 发布:calendar.js api 编辑:程序博客网 时间:2024/05/01 11:05

设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管, 在南北方向也有两个数码管。 要求交通灯按照表 1进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。

交通灯的状态切换表

文档下载:http://wenku.baidu.com/view/90f849876529647d26285204?fr=prin

警告:不同单片机的动态扫描显示不一样,即下面黄底红字是让数码管显示函数,如果单片机不一样,只需改显示      函数即可,其他的不要动。

2: 程序设计(仅供参考的 C语言源程序)

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<math.h>  #define uchar unsigned char#define uint  unsigned int#define ulang unsigned langstatic unsigned char count;code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};          //共阴数码管 0-9uchar smg[8];                 //定义缓冲区uint  we,ns,h,j;   //ns代表南北,we代表东西    int aaa();   //东西红灯亮,南北绿灯,黄灯亮int bbb();   //南北红灯亮,东西绿灯,黄灯亮int eee();   //第一次完成显示,继续第二次初始化void delay(unsigned int cnt){ while(--cnt);} void display( ){                                 //取每一位的数字            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];}void main(){     uchar i;     TMOD |=0x01;  //定时器0 10ms in 12M crystal 用于计时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( );    //扫描数码管       }   }void timer() interrupt 1             //中断函数{      TH0=0xd8;                  //重新赋值   TL0=0xf0;   count++;}int aaa()       {          if(j<25)                 //东西红灯计数30秒,南北25秒绿灯亮      {      if(j==1) { we=30,ns=25; } ns--;      we--;      P1=0xde; return 0; }      if(25<=j<30)          //南北黄灯5秒  {             if(j==26)  {  ns=5; }      P1=0xee;     ns--; we--;   return 0;    }}int bbb(){            if(h<25)         {                    //南北红灯30秒,东西绿灯25秒      if(h==1) { we=25,ns=30; } ns--;      we--;       P1=0xf3; return 0; }      if(25<=h<30)           //东西黄灯5秒  {             if(h==26)  {  we=5; }      P1=0xf5;     ns--; we--;   return 0;    }       } int eee()      //一次周期交通灯显示完后,重新赋值,等待第二次 {  j=0; h=0; return 0; } int ccc()          //交通灯控制函数 {       if (count==100)       //定时一秒    {            count=0;    j++;            //算法函数 if ( (j>30)&&(j!=61))  { h++;      bbb();  return 0;   }    if(j==61)   { eee(); return 0;}               aaa();        return 0;      }  } 

	
				
		
原创粉丝点击