完成了,,,慶祝 /*************************************************************** * 程序名稱(chēng):MSC51單片機(jī)交通燈 晶振:12.00 P1口 * 實(shí)驗(yàn)對(duì)象:HC6800單片機(jī)學(xué)習(xí)開(kāi)發(fā)板 * 單 片 機(jī):AT89S52或STC89C52 時(shí)間:紅綠燈各亮10s * * 更多的資料和程序共享請(qǐng)關(guān)注51hei.com ****************************************************************/ /#include <reg52.h> #define uchar unsigned char /*宏定義 */ #define uint unsigned int /*宏定義 */ uchar sec,sec1; /*秒*/ uchar int_num; /*定時(shí)溢出作用標(biāo)號(hà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); //閃爍延時(shí) void inter_init(); /*定時(shí)器初始化子函數(shù)聲明*/ /****專(zhuān)用數(shù)碼管顯示表***/ //uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*0x40顯示“一”符號(hào)*/ //uchar code wema[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00}; //---------------------初始化T0函數(shù)-------------------------- void time0(void) interrupt 1 /*定時(shí)器T0服務(wù)子程序*/ { TH0=(65535-50000)/256; TL0=(65535-50000)%256; int_num++; } //---------------------定時(shí)器函數(shù)-------------------------- void inter_init() /*定時(shí)器初始化子函數(shù)*/ { EA=1; ET0=1; /*打開(kāi)定時(shí)器T0*/ TMOD=0x01; /*工作方式1*/ TCON = 0x00; /*觸發(fā)方式*/ IP = 0x01; /*中斷優(yōu)先級(jí)別,T0優(yōu)先*/ TH0=(65535-50000)/256; /*置初值,大約50ms一個(gè)中斷 */ TL0=(65535-50000)%256; TR0=1; /*置位TR0,啟動(dòng)定時(shí)器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路口綠燈開(kāi) redb=0; // b路口紅燈開(kāi) EA=1; // 開(kāi)中斷 } if(sec1==20) //20s { greena=1; // a路口綠燈關(guān) EA=0; // 關(guān)中斷 redyellowb(); // b路口紅黃燈 redb=1; // b路口紅燈關(guān) greenb=0; // b路口綠燈開(kāi) reda=0; // a路口紅燈開(kāi) sec=0; // 秒清零 EA=1; // 關(guān)中斷 sec1=0; // 秒1清零 () } } // } //------------------------------10ms時(shí)間調(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(); /*定時(shí)器初始化*/ reda=0;greenb=0; // 路燈初始化 while(1) //死循環(huán) { time10(); //調(diào)用 } }