標(biāo)題:
實(shí)訓(xùn)單片機(jī)交通燈軟件程序
[打印本頁(yè)]
作者:
xiongda
時(shí)間:
2015-5-26 19:42
標(biāo)題:
實(shí)訓(xùn)單片機(jī)交通燈軟件程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0,i;
uchar num=30;
uchar flag=0,flag2=0,flag3=0;
sbit K1=P2^0;
sbit Stop=P3^4;
sbit LEDGreen_ew=P1^0;
sbit LEDYellow_ew=P1^1;
sbit LEDRed_ew=P1^2;
sbit LEDGreen_sn=P1^3;
sbit LEDYellow_sn=P1^4;
sbit LEDRed_sn=P1^5;
void Turn_LED();
void Delay(uint z);
void Sys_Inital();
void Turnkey();
void delay10ms();
void main()
{
Sys_Inital();
while(1)
{
Turnkey();
}
}
void Turn_LED()
{
if(count==20) //定時(shí)時(shí)間為1s
{
count=0;
num--;
if(num==0)
{
flag++;
if(flag==3)
{flag=0;}
if(flag==1)
{num=2;}
switch(flag%3)
{
case 0:
LEDGreen_ew=0;LEDYellow_ew=1;LEDRed_ew=1;
LEDGreen_sn=1;LEDYellow_sn=1;LEDRed_sn=0;
break;
case 1:
LEDGreen_ew=1;LEDYellow_ew=0;LEDRed_ew=1;
LEDGreen_sn=1;LEDYellow_sn=0;LEDRed_sn=1;
break;
case 2:
LEDGreen_ew=1;LEDYellow_ew=1;LEDRed_ew=0;
LEDGreen_sn=0;LEDYellow_sn=1;LEDRed_sn=1;
break;
}
num=30;
}
}
}
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay10ms()
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Sys_Inital()
{
TMOD = 0x01;
TH0 = 0x3C; //定時(shí)器0高8位
TL0 = 0xB0; //定時(shí)器0低8位
EA = 1; //開總中斷
ET0 = 1; //定時(shí)器0中斷允許
TR0=1; //定時(shí)器0開始計(jì)時(shí)
EX0=1; //外部中斷0允許
IT0=1;
LEDGreen_ew=1;
LEDYellow_ew=1;
LEDRed_ew=1;
LEDGreen_sn=1;
LEDYellow_sn=1;
LEDRed_sn=1;
}
void Turnkey()
{
if(K1==0)
{
delay10ms();
if(K1==0)
{
flag3++;
while((i<50)&&(K1==0))
{
delay10ms();
i++;
}
i=0;
}
}
if(flag3==2)
{
flag3=0;
num=30;
}
}
void int0() interrupt 0
{
EA=0; //關(guān)中斷
Delay(10); //設(shè)置鍵消抖 10ms
if(!Stop)
{
flag2++;
if(flag2==2)
{flag2=0;}
switch(flag2)
{
case 0:TMOD=0x01;TR0=1; break;
case 1:TMOD=0x00; TR0=0; break;
}
while((i<50)&&(Stop==0))
{
delay10ms();
i++;
}
i=0;
}
EA=1; //開中斷
}
void time0() interrupt 1
{
TH0=0x3c; //定時(shí)時(shí)間為50ms
TL0=0xb0;
count++;
}
作者:
xiongda
時(shí)間:
2015-5-26 19:43
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int //***********參數(shù)初始化********************
uchar count=0,count2=0; //定時(shí)器0,定時(shí)器1的計(jì)數(shù)初值
uchar green_ns=60,green_ew=30,red_ns=34,red_ew=64,yellow_ns=4,yellow_ew=4;//南北綠燈亮60 東西綠燈30 南北紅燈34 東西紅燈64 南北黃燈4 東西黃燈4
uchar snorth=60,ewest=64; //上電后南北綠燈亮60秒,東西紅燈亮64秒
uchar ding_ns=0,ding_ew=0; //南北狀態(tài)轉(zhuǎn)換標(biāo)志位,東西狀態(tài)轉(zhuǎn)換標(biāo)志位
uchar flag=0,flag2=0; //設(shè)置鍵按下次數(shù)的標(biāo)志位,長(zhǎng)按鍵的標(biāo)志位
//***********引腳定義**********************
sbit wela=P2^0; //鎖存器位選
sbit dula=P2^1; //鎖存器位選
sbit NS_R=P2^2; //南北發(fā)光二極管
sbit NS_Y=P2^3;
sbit NS_G=P2^4;
sbit EW_R=P2^5; //東西發(fā)光二極管
sbit EW_Y=P2^6;
sbit EW_G=P2^7;
sbit set=P3^2; //按鍵 設(shè)置鍵 加1鍵 減1鍵
sbit up=P3^4;
sbit down=P3^5;
//*********函數(shù)聲明部分******************
void delay(uint z);
void Inital();
void display(uchar s);
void display_ew(uchar w)
void display_ns(uchar r);
void turnkey();
void show();
//*********共陽(yáng)數(shù)碼管段碼***************
unsigned char code SEG7[10]= { 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/};
//*******軟件延時(shí)函數(shù) 延時(shí)1毫秒*********
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//********初始化函數(shù)*******************
void Inital()
{
wela=0; //鎖存器初始化
dula=0;
TMOD = 0x11;
//計(jì)數(shù)器0,1工作在方式1,數(shù)值大小16位,定時(shí)時(shí)間=12*(65536-x)/f x為初值,f為時(shí)鐘頻率
TH0 = 0xD8; //定時(shí)器0高8位
TL0 = 0xF0; //定時(shí)器0低8位
EA = 1; //開總中斷
ET0 = 1; //定時(shí)器0中斷允許
TR0=1; //定時(shí)器0開始計(jì)時(shí)
TH1=0xD8; //定時(shí)器1高8位
TL1=0xF0; //定時(shí)器1低8位
ET1 = 1; //定時(shí)器1中斷允許
EX0=1; //外部中斷0允許
IT0=0; //外部中斷0電平觸發(fā)
NS_R=1; //南北發(fā)光二極管初始化
NS_G=0;
NS_Y=1;
EW_R=0; //東西發(fā)光二極管初始化
EW_G=1;
EW_Y=1;
}
//**********數(shù)碼管顯示函數(shù)*************
void display(uchar s)
{
P1=SEG7[s];
}
//*******數(shù)碼管顯示東西方向數(shù)字********
void display_ew(uchar w)
{
uchar x,y,i=0;
x=w%10; //個(gè)位
y=w/10; //十位
dula=1;
display(x);
dula=0;
P1=0x00;
wela=1;
P1=0x04;
wela=0;
delay(5);
dula=1;
display(y);
dula=0;
P1=0x00;
wela=1;
P1=0x08;
wela=0;
delay(5);
}
//*******數(shù)碼管顯示南北方向數(shù)字********
void display_ns(uchar r)
{
uchar x,y,i=0;
x=r%10; //個(gè)位
y=r/10; //十位
dula=1;
display(x);
dula=0;
P1=0x00;
wela=1;
P1=0x01;
wela=0;
delay(5);
dula=1;
display(y);
dula=0;
P1=0x00;
wela=1;
P1=0x02;
wela=0;
delay(5);
}
// **********鍵盤掃描函數(shù)************
void turnkey()
{
flag2=0; //掃描之前加10減10標(biāo)志位清零
if(!up)
{
delay(10); //按鍵消抖 時(shí)10ms
if(!up)
{
TR1=1; //定時(shí)器1開始1s定時(shí),用于鍵盤掃描的定時(shí)數(shù)值加10
while(!up)
{
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
NS_G=0;
break;
case 2:
display_ns(yellow_ns);
NS_Y=0;break;
case 3:
display_ew(green_ew);
EW_G=0;
break;
case 4:
display_ew(yellow_ew);
EW_Y=0;
break;
}
}
while(!up); //等待按鍵結(jié)束
delay(10); //按鍵消抖 延時(shí)10ms
while(!up);
TR1=0; //定時(shí)器1結(jié)束
if(count2>=100)
{
flag2=1;
count2=0;
switch(flag2%3)
{
case 0:break;
case 1:
switch(flag)
{
case 0:break;
case 1:
green_ns+=9;
if(green_ns>99)
green_ns=0;
break;
case 2:break;
case 3:
green_ew+=9;
if(green_ew>99)
green_ew=0;
break;
case 4:break;
}
break;
case 2:
switch(flag)
{
case 0:break;
case 1:
green_ns-=9;
if(green_ns<=0)
{
green_ns=99;
}
break;
case 2:break;
case 3:
green_ew-=9;
if(green_ew<=0)
{
green_ew=99;
}
break;
case 4:break;
}
break;
}
}
switch(flag) //短按鍵加一
{
case 0:break;
case 1:
//南北綠燈加一
green_ns++;
if(green_ns==100)
green_ns=0;
red_ew=green_ns+yellow_ns;
break;
case 2:
//南北黃燈加一
yellow_ns++;
if(yellow_ns==10)
yellow_ns=0;
red_ew=green_ns+yellow_ns;
break;
case 3:
//東西綠燈加一
green_ew++;
if(green_ew==100)
green_ew=0;
red_ns=green_ew+yellow_ew;
break;
case 4:
//東西黃燈處理加一
yellow_ew++;
if(yellow_ew==10)
yellow_ew=0;
red_ns=green_ew+yellow_ew;
break;
}
}
}
if(!down)
{
delay(10); //按鍵消抖 延時(shí)10ms
if(!down)
{
TR1=1; //定時(shí)器1開始計(jì)時(shí)
while(!down)
{
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
NS_G=0;
break;
case 2:
display_ns(yellow_ns);
NS_Y=0;
break;
case 3:
display_ew(green_ew);
EW_G=0;
break;
case 4:
display_ew(yellow_ew);
EW_Y=0;
break;
}
}
while(!down); //等待按鍵結(jié)束
delay(10); //按鍵消抖 延時(shí)10ms
while(!down);
TR1=0; //定時(shí)器1結(jié)束計(jì)時(shí)
if(count2>=100)
{
flag2=2;
count2=0;
switch(flag2%3)
{
case 0:break;
case 1:
switch(flag)
{
case 0:break;
case 1:
green_ns+=9;
if(green_ns>99)
green_ns=0;
break;
case 2:
break;
case 3:
green_ew+=9;
if(green_ew>99)
green_ew=0;
break;
case 4:
break;
}
break;
case 2:
switch(flag)
{
case 0:break;
case 1:
green_ns-=9;
if(green_ns<=0)
{
green_ns=99;
}
break;
case 2:break;
case 3:
green_ew-=9;
if(green_ew<=0)
{
green_ew=99;
}
break;
case 4:break;
}
break;
}
}
switch(flag) //短按鍵減一
{
case 0:break;
case 1: //南北綠燈減一
green_ns--;
if(green_ns==255)
{
green_ns=99;
}
red_ew=green_ns+yellow_ns;
break;
case 2: //南北黃燈減一
yellow_ns--;
if(yellow_ns==255)
yellow_ns=9;
red_ew=green_ns+yellow_ns;
break;
case 3:
green_ew--;
if(green_ew==255)
green_ew=99;
red_ns=green_ew+yellow_ew;
break;
case 4: //東西黃燈減一
yellow_ew--;
if(yellow_ew==255)
{
yellow_ew=9;
}
red_ns=green_ew+yellow_ew;
break;
}
}
}
} //*************閃爍顯示函數(shù)*****************
void show()
{
switch(count/17) //1秒 亮3次滅3次
{
case 0:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
case 1:break;
case 2:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
case 3:break;
case 4:
switch(flag)
{
case 0:break;
case 1:
display_ns(green_ns);
break;
case 2:
display_ns(yellow_ns);
break;
case 3:
display_ew(green_ew);
break;
case 4:
display_ew(yellow_ew);
break;
}
break;
}
}
//***************主函數(shù)*********************
void main()
{
Inital(); //初始化函數(shù)
while(1)
{
if(flag==0)
{
display_ns(snorth);
display_ew(ewest);
}
else
if(flag!=0)
{
turnkey(); // 鍵盤掃描函數(shù)
show();
//閃爍顯示函數(shù)
}
}
}
//*************定時(shí)器0中斷函數(shù)**************
void time0() interrupt 1
{
TH0=0xD8; //定時(shí)時(shí)間為10ms
TL0=0xF0;
count++;
if(count==100)
//定時(shí)時(shí)間為1s
{
count=0;
if(flag==0)
{
snorth--;
//南北數(shù)字減1
ewest--;
//東西數(shù)字減1
if(snorth==0)
{
ding_ns++;
//南北下一狀態(tài)處理
switch(ding_ns%3)
{
case 0: snorth=green_ns;
NS_R=1;
NS_G=0;
NS_Y=1;
break;
case 1: snorth=yellow_ns;
NS_R=1;
NS_G=1;
NS_Y=0;
break;
case 2: snorth=red_ns;
NS_R=0;
NS_G=1;
NS_Y=1;
break;
}
}
if(ewest==0)
{
ding_ew++;
//東西下一狀態(tài)處理
switch(ding_ew%3)
{
case 0:ewest=red_ew;
EW_R=0
EW_G=1;
EW_Y=1;
break;
case 1:ewest=green_ew;
EW_R=1;
EW_G=0;
EW_Y=1;
break;
case 2: ewest=yellow_ew;
EW_R=1;
EW_G=1;
EW_Y=0;
break;
}
}
}
}
} //*********外部中斷處理函數(shù)(設(shè)置鍵)************
void int0() interrupt 0
{
EA=0; //關(guān)中斷
if(!set)
{
delay(10); //設(shè)置鍵消抖 10ms
if(!set)
{
NS_R=1;
NS_G=1;
NS_Y=1;
EW_R=1;
EW_G=1;
EW_Y=1;
flag++;
}
while(!set);
delay(10);
while(!set);
switch(flag)
{
case 0:break;
case 1:
NS_R=1;
//南北發(fā)光二極管
NS_G=0;
NS_Y=1;
EW_R=1;
//東西發(fā)光二極管
EW_G=1;
EW_Y=1;
display_ns(green_ns);
break;
case 2:
NS_R=1;
//南北發(fā)光二極管
NS_G=1;
NS_Y=0;
EW_R=1;
//東西發(fā)光二極管
EW_G=1;
EW_Y=1;
display_ns(yellow_ns);
break;
case 3:
NS_R=1;
//南北發(fā)光二極管
NS_G=1;
NS_Y=1;
EW_R=1;
//東西發(fā)光二極管
EW_G=0;
EW_Y=1;
display_ew(green_ew);
break;
case 4:
NS_R=1;
//南北發(fā)光二極管
NS_G=1;
NS_Y=1;
EW_R=1;
//東西發(fā)光二極管
EW_G=1;
EW_Y=0;
display_ew(yellow_ew);
break;
}
if(flag==5)
{
flag=0;
//改值后的初始化紅綠燈狀態(tài)和數(shù)碼管數(shù)字
snorth=green_ns;
ewest=red_ew;
NS_R=1;
NS_G=0;
NS_Y=1;
EW_R=0;
EW_G=1;
EW_Y=1;
ding_ns=0;
ding_ew=0;
}
}
EA=1;
//開中斷
}
//***********定時(shí)器1中斷函數(shù)****************
void time1() interrupt 3
{
TH1=0xD8;
TL1=0xF0;
count2++;
} 紅
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit AA=P2^2; // 南北紅
sbit BB=P2^3; // 南北黃
sbit CC=P2^4; // 南北綠
sbit DD=P2^5; // 東西紅
sbit EE=P2^6; // 東西黃
sbit FF=P2^7; // 東西綠
void delay(uint z);
void main()
{
while(1)
{
AA=0;
BB=0;
CC=0;
DD=0;
EE=0;
FF=0;
delay(500);
AA=1;
BB=1;
CC=1;
DD=1;
EE=1;
FF=1;
delay(500);
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} 數(shù)碼管顯示檢測(cè)程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count=0;
ucharcount2=0,green_ns=60,
green_ew=30,red_ns=34,red_ew=64,
yellow_ns=4,yellow_ew=4;//南北綠燈亮60 東西綠燈30 南北紅燈34 東西紅燈64 南北黃燈4 東西黃燈4
uchar ding_ns=0,ding_ew=0,flag=0,snorth=60,ewest=64; //計(jì)數(shù)到0后的處理,開始南北綠燈亮的時(shí)間,東西紅燈亮的時(shí)間
void delay(uint z);
void display(uchar s);
sbit LED_EW_0=P2^0; //數(shù)碼管 位選段
sbit LED_EW_1=P2^1;
sbit LED_NS_0=P2^2;
sbit LED_NS_1=P2^3;
unsigned char code SEG7[10]=
{ 0xC0,/*0*/ // 共陽(yáng)數(shù)碼管 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/0x90,/*9*/ };
void delay(uint z) //1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar s) //數(shù)碼管顯示程序
{
P1=SEG7[s];
}
void main()
{
while(1)
{
LED_EW_0=1;
LED_EW_1=1;
LED_NS_0=1;
LED_NS_1=1;
P1=0x00;
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1