完成了,,,慶祝 /*************************************************************** * 程序名稱:MSC51單片機交通燈 晶振:12.00 P1口 * 實驗對象:HC6800單片機學習開發板 * 單 片 機:AT89S52或STC89C52 時間:紅綠燈各亮10s * * 更多的資料和程序共享請關注51hei.com ****************************************************************/ /#include <reg52.h> #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<x;i++) // 執行x次,延遲X*10ms 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(); //調用 } }