×
单片机 > 单片机程序设计 > 详情

MSC51单片机交通灯程序

发布时间:2020-05-16 发布时间:
|
/***************************************************************
* 程序名称:MSC51单片机交通灯  晶振:12.00 P1口
* 实验对象:HC6800单片机学习开发板
* 单 片 机:AT89S52或STC89C52  时间:红绿灯各亮10s
*         
* 更多的资料和程序共享请关注51hei.com
****************************************************************/
/#include
#define uchar unsigned char           /*宏定义 */
#define uint unsigned int             /*宏定义 */
uchar sec,sec1;                       /*秒*/
uchar int_num;                        /*定时溢出作用标号*/
sbit reda=P1^0;         //A路口红灯
sbit yellowa=P1^1;     //A路口黄灯
sbit greena=P1^2;     //A路口绿灯
sbit redb=P1^3;         //B路口红灯
sbit yellowb=P1^4;     //b路口黄灯
sbit greenb=P1^5;     //b路口绿灯
void redyellowb();      //b路口红黄灯闪烁
void redyellowa();      //a路口红黄灯闪烁
void delay10ms(uint x);     //闪烁延时
void inter_init();                    /*定时器初始化子函数声明*/


/****专用数码管显示表***/
//uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40显示“一”符号*/
//uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00};




//---------------------初始化T0函数--------------------------
void time0(void) interrupt 1  /*定时器T0服务子程序*/
{
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  int_num++;
}

//---------------------定时器函数--------------------------
void inter_init()     /*定时器初始化子函数*/
  {
   EA=1;
   ET0=1;     /*打开定时器T0*/
   TMOD=0x01; /*工作方式1*/
   TCON = 0x00;   /*触发方式*/
   IP = 0x01;    /*中断优先级别,T0优先*/
   TH0=(65535-50000)/256; /*置初值,大约50ms一个中断 */
   TL0=(65535-50000)%256;
   TR0=1;    /*置位TR0,启动定时器0*/
  }
//--------------------- 交通灯变换--------------------------
void time10()     
  {
    if(int_num==20)          //20为1s可改为10加速调试
     {       
       int_num=0;
       sec++;
   sec1++;     
       if(sec==10)            //10s
         {
          greenb=1;        // b路口绿灯关
       EA=0;          // 关中断
     redyellowa();       // a路口红黄灯共闪(调用)
       reda=1;         //  a路口红灯关
     greena=0;        //  a路口绿灯开
     redb=0;         //  b路口红灯开
       EA=1;         //  开中断
             }
      if(sec1==20)       //20s
       {
          greena=1;       //  a路口绿灯关
        EA=0;        //  关中断
      redyellowb();         // b路口红黄灯
        redb=1;        // b路口红灯关
      greenb=0;       // b路口绿灯开
      reda=0;                    // a路口红灯开
      sec=0;       // 秒清零
      EA=1;       //   关中断
      sec1=0;       // 秒1清零 ()
     }   
}              //
  }

//------------------------------10ms时间调用----------------------------------

void delay10ms(uint x)
{ uint i,j;    // 声明变量
for (i=1;i  for (j=1;j<120;j++);// 执行120次,延迟10ms
}       // delay1ms()函数结束
     
//---------------------- // a路口红黄灯共闪(调用)---------------------------
void redyellowa()
{
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
    yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
delay10ms(50);
yellowb=0;redb=0;
delay10ms(50);
yellowb=1;redb=1;
}
//---------------------- // b路口红黄灯共闪(调用)---------------------------
void redyellowb()
{
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
    yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
delay10ms(50);
yellowa=0;reda=0;
delay10ms(50);
yellowa=1;reda=1;
}
//---------------------主函数--------------------------------
void main()
{
  inter_init();       /*定时器初始化*/
  reda=0;greenb=0;     // 路灯初始化
while(1)    //死循环

  {

   time10();       //调用

  
  }
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析