MSC51單片機交通燈程序
* 程序名稱:MSC51單片機交通燈 晶振:12.00 P1口
* 實驗對象:HC6800單片機學習開發(fā)板
* 單 片 機: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(); /*定時器初始化子函數(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服務子程序*/
{
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路口綠燈關
EA=0; // 關中斷
redyellowa(); // a路口紅黃燈共閃(調(diào)用)
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時間調(diào)用----------------------------------
void delay10ms(uint x)
{ uint i,j; // 聲明變量
for (i=1;ix;i++) // 執(zhí)行x次,延遲X*10ms
for (j=1;j120;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)用
}
}
評論