51單片機(jī)用C語(yǔ)言實(shí)現(xiàn)交通燈
交通燈,紅黃綠燈交替亮,怎樣實(shí)現(xiàn)呢?其實(shí)就是根據(jù)單片機(jī)定時(shí)器及倒計(jì)時(shí)的程序修改。
源程序如下:
#include
bit red,green,yellow,turnred; //定義紅、黃、綠及轉(zhuǎn)紅標(biāo)志
code unsigned char tab[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共陰數(shù)碼管 0-9
unsigned char Dis_Shiwei;//定義十位
unsigned char Dis_Gewei; //定義個(gè)位
void delay(unsigned int cnt) //用于動(dòng)態(tài)掃描數(shù)碼管的延時(shí)程序
{
while(--cnt);
}
main()
{
TMOD |=0x01;//定時(shí)器設(shè)置 10ms in 12M crystal定時(shí)器0,工作方式1,16位定時(shí)器
TH0=0xd8; //65535-10000=55535=D8F0(十六進(jìn)制)
TL0=0xf0;
IE= 0x82; //中斷控制,EA=1開(kāi)總中斷,ET0=1:定時(shí)器0中斷允許
TR0=1; //開(kāi)定時(shí)器0中斷
P1=0xfc;//紅燈亮,根據(jù)紅黃綠接燈的順序。
red =1;
while(1)
{
P0=Dis_Shiwei;//顯示十位,這里實(shí)現(xiàn)用8位數(shù)碼管,即左1位
P2=0;
delay(300);//短暫延時(shí)
P0=Dis_Gewei; //顯示個(gè)位,左數(shù),2位
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1
{
static unsigned char second=60,count; //初值60
TH0=0xd8;//重新賦值,10毫秒定時(shí)
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒減1
if(second==0)
{ //這里添加定時(shí)到0的代碼 ,可以是燈電路,繼電器吸合等,或者執(zhí)行一個(gè)程序
if(red) //紅滅,先轉(zhuǎn)黃
{
red=0;yellow=1;
second=4;
P1=0xF3;//黃燈亮4秒,黃燈為過(guò)渡燈,再根據(jù)情況轉(zhuǎn)綠或轉(zhuǎn)紅
}
else if(yellow && !turnred)
{
yellow=0;green=1;
second=25;
P1=0xCF;//綠燈亮25秒,
}
else if(green)
{
yellow=1;green=0;
second=4;
P1=0xF3;//黃燈亮4秒
turnred=1;
}
else if(yellow && turnred) //綠燈滅,轉(zhuǎn)黃燈,后紅燈,turnred=1時(shí)
{
red=1;yellow=0;
P1=0xFC;//紅燈亮60秒
second=60;
turnred=0; //接下來(lái)是轉(zhuǎn)黃,綠。
}
}
Dis_Shiwei=tab[second/10];//十位顯示值處理
Dis_Gewei=tab[second]; //個(gè)位顯示處理
}
}
評(píng)論