#include<reg51.h> //單片機頭文件聲明
unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//定義無符號數組,定義的數據要放在ROM里面
sbit sl=P2^7;
sbit sh=P2^6;
sbit xl=P2^2;
sbit xh=P2^3;
sbit zh=P2^5;
sbit zl=P2^0;
sbit yl=P2^4;
sbit yh=P2^1;
char count=20; //定時時間取10ms,循環100次即為1s
unsigned char sxs=6; //10秒上下,為上下綠燈亮時倒計數
unsigned char zys=6; //10秒左右,為左右綠燈亮時倒計數
bit flag=1; //方向標志,1->上下綠燈亮 0->zy
void delay(char x) //延遲函數,通過for循環進行延時
{
char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void display() //數碼管顯示函數
{
if(flag==1) //如果方向標志為上下
{
P1=tab[sxs/10];
P0=tab[sxs%10];
}
if(flag==0) //方向標志假如為左右
{
P1=tab[zys/10];
P0=tab[zys%10];
}
}
void lights() //小燈函數
{
if(flag==1) //判斷方向是否為上下
{
sl=xl=zh=yh=1;
sh=xh=zl=yl=0;
}
if(flag==0) //判斷方向是否為左右
{
sl=xl=zh=yh=0;
sh=xh=zl=yl=1;
}
}
initial() //初始化函數
{
TMOD=0x01; //設置定時器為工作方式1
TH0=15536/256; //在晶振頻率12MHz下,賦初值
TL0=15536%256;
EA=1; //允許CPU中斷
TR0=1; //啟動定時器T0
ET0=1; //允許定時器T0中斷
}
main() //主函數
{
initial(); //調用初始化函數
while(1) //無限循環,用于循環點亮小燈和顯示數碼管
{
display(); //調用數碼管顯示函數
lights(); //調用小燈函數
}
}
t0_int() interrupt 1 //中斷函數,T0中斷
{
TH0=15536/256;
TL0=15536%256;
count--; //計數器減1
if(count==0) //判斷計數器是否計滿100次
{
count=20; //定時時間重新取值
if(flag==1) //假如方向標志時上下
{
sxs--; //時間倒計時
if(sxs==0) //左數碼管顯示0
{
flag=0; //方向標志取反,方向為左右
sxs=8; //右數碼管取值
}
}
if(flag==0) //假如方向標志時左右
{
zys--; //時間倒計時
if(zys==0) //右數碼管顯示0
{
flag=1; //方向標志取反,方向為上下
zys=6; //左數碼管取值
}
}
}
}
|