功能要求
1)东西方向显示绿灯时,南北方向显示红灯,持续10秒钟后,绿灯变为黄灯并持续3秒钟;
2)然后东西方向显示红灯,南北方向显示绿灯,持续10秒钟后,绿灯变黄灯并持续3秒钟,如此反复。
需求分析
需求一:不同方向上不同的灯亮起
利用开发板上搭载的8个led灯实现不同方向上不同颜色的灯,前4个灯的前三个表示东西方向上的红绿黄三个颜色,后四个灯的后三个表示南北方向上的红绿黄三个颜色
规定
1000 0010 表示东西方向上红灯,南北方向上绿灯
1000 0001 表示东西方向上红灯,南北方向上黄灯
需求二:根据时间改变灯的亮灭
利用定时器产生精准的时间,当到达我们规定的时间时改变灯的状态
具体实现
需求一
通过按一定编码顺序给led灯赋能,实现不同方向上特定颜色的灯亮起,同时让一个方向上只亮特定的那一个灯。
一共有4个状态(前面表示东西方向的颜色,后面表示南北方向的颜色)
红 绿 (0111 1101)
红 黄 (0111 1110)
绿 红 (1011 1011)
黄 红 (1101 1011)
这时候我们使用一个数组来存储这个编码。
a[]={0x7d,0x7e,0xd7,0xe7};(这里使用16进制比较方便)
当我们需要红绿时
P2=a[0]即可完成。
需求二
首先先选择定时器的模式为模式一
TMOD=0X01;
然后清空定时器标识位和打开定时器
TF0=0;
TR0=1;
设置定时器的初值为每1毫秒进入一次中断,这样1000次后就是1秒钟
TH0=64536/256;
TL0=64536%256;
因为我们需要使用中断,所以要打开中断允许
EA=1;
ET0=1;
这样我们的定时器就设置完毕了,接下来我们来编写中断服务函数
首先我们设置一个标识变量,当我们进入一次中断时这个标识变量加一,当标识变量到1000时清零并且秒钟的标识加一证明过了一秒钟。之后我们只需要在每次进入中断时对秒钟进行查询与比较,然后对灯进行赋能即可完成在特定的时间改变灯的状态。
代码
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned int
uchar a[]={0x7d,0x7e,0xd7,0xe7};
uint xx=0;
uint yy=0;
void main()
{
TMOD=0X01;
TF0=0;
TR0=1;
TH0=64536/256;
TL0=64536%256;
ET0=1;
EA=1;
PT0=1;
while(1)
{
}
}
void timer0_into() interrupt 1
{
TH0=64536/256;
TL0=64536%256;
xx++;
if(xx==1000)
{
xx=0;
yy++;
if(yy<=10)
{
P2=a[0];
}
if(yy>10&&yy<=13)
{
P2=a[1];
}
if(yy>13&&yy<=23)
{
P2=a[2];
}
if(yy>23&&yy<26)
{
P2=a[3];
}
if(yy==26)
yy=0;
}
}