專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

MSC51單片機交通燈程序

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2011年09月04日   【字體:
完成了,,,慶祝

/***************************************************************
* 程序名稱:MSC51單片機交通燈  晶振:12.00 P1口
* 實驗對象:HC6800單片機學(xué)習(xí)開發(fā)板
* 單 片 機:AT89S52或STC89C52  時間:紅綠燈各亮10s
*          
* 更多的資料和程序共享請關(guān)注51hei.com
****************************************************************/
/#include <reg52.h>
#define uchar unsigned char           /*宏定義 */
#define uint unsigned int             /*宏定義 */
uchar sec,sec1;                       /*秒*/
uchar int_num;                        /*定時溢出作用標(biāo)號*/
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();                    /*定時器初始化子函數(shù)聲明*/


/****專用數(shù)碼管顯示表***/
//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函數(shù)--------------------------
void time0(void) interrupt 1  /*定時器T0服務(wù)子程序*/
 {
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  int_num++;
 }

//---------------------定時器函數(shù)--------------------------
void inter_init()     /*定時器初始化子函數(shù)*/
  {
   EA=1;
   ET0=1;     /*打開定時器T0*/
   TMOD=0x01; /*工作方式1*/
   TCON = 0x00;   /*觸發(fā)方式*/
   IP = 0x01;    /*中斷優(yōu)先級別,T0優(yōu)先*/
   TH0=(65535-50000)/256; /*置初值,大約50ms一個中斷 */
   TL0=(65535-50000)%256;
   TR0=1;    /*置位TR0,啟動定時器0*/
  }
//--------------------- 交通燈變換--------------------------
 void time10()      
  {
    if(int_num==20)          //20為1s可改為10加速調(diào)試
     {        
       int_num=0;
       sec++;
   sec1++;      
       if(sec==10)            //10s
         { 
          greenb=1;        // b路口綠燈關(guān)
       EA=0;          // 關(guān)中斷
     redyellowa();       // a路口紅黃燈共閃(調(diào)用)
       reda=1;         //  a路口紅燈關(guān)
     greena=0;        //  a路口綠燈開
     redb=0;         //  b路口紅燈開
       EA=1;         //  開中斷
             }
      if(sec1==20)       //20s
       {
          greena=1;       //  a路口綠燈關(guān)
        EA=0;        //  關(guān)中斷
      redyellowb();         // b路口紅黃燈
        redb=1;        // b路口紅燈關(guān)
      greenb=0;       // b路口綠燈開
      reda=0;                    // a路口紅燈開
      sec=0;       // 秒清零
      EA=1;       //   關(guān)中斷
      sec1=0;       // 秒1清零 ()
     }    
 }              //
  }

 //------------------------------10ms時間調(diào)用----------------------------------
 
void delay10ms(uint x)
{ uint i,j;    // 聲明變量
 for (i=1;i<x;i++)  // 執(zhí)行x次,延遲X*10ms
  for (j=1;j<120;j++);// 執(zhí)行120次,延遲10ms
}       // delay1ms()函數(shù)結(jié)束
      
//---------------------- // a路口紅黃燈共閃(調(diào)用)---------------------------
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路口紅黃燈共閃(調(diào)用)---------------------------
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;
 }
//---------------------主函數(shù)--------------------------------
void main()
{
  inter_init();       /*定時器初始化*/
  reda=0;greenb=0;     // 路燈初始化
 while(1)    //死循環(huán)
 
  { 
 
   time10();       //調(diào)用
 
   
  }
}
關(guān)閉窗口

相關(guān)文章