#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; //左数码管取值
}
}
}
}
|