在这个星期,心血来潮,完成了单片机的大作业,设计一个红绿灯的交互式的C语言的程序,写到单片机里,就可以实现红绿灯的来回亮灭,这次写博客是为了分享我自己设计的程序,里面一定会有一些不足,正式上交的时候会改正的,以下是程序:
<pre name="code" class="cpp">#include<stc89.h> //我用的专门的stc芯片的库,没有的可以用reg52.h
void delay (unsigned char x) //延时函数
{
unsigned char i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<=250;j++)
for(k=0;k<=100;k++);
}
void NumberLight (unsigned char x) //数码管计数
{
switch(x)
{
case 0:
P2=0x03;
break;
case 1:
P2=0x9f;
break;
case 2:
P2=0x24;
break;
case 3:
P2=0x0c;
break;
case 4:
P2=0x99;
break;
case 5:
P2=0x48;
break;
case 6:
P2=0x40;
break;
case 7:
P2=0x1f;
break;
case 8:
P2=0x00;
break;
case 9:
P2=0x08;
break;
}
}
void CountLight(unsigned char x)
{
unsigned char i;
for(i=x;i>0;i--)
{
NumberLight(i);
delay(10);
}
NumberLight(0);
delay(10);
}
void GreenOn(unsigned char n) //控制绿灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7e;
break;
case 2:
P1=0xdb;
break;
}
}
void YellowOn(unsigned char n) //控制黄灯亮,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7d;
break;
case 2:
P1=0xbb;
break;
}
}
void GreenFlash(unsigned char n) //控制绿灯闪烁,N=1时为南北方向,N=2时为东西方向
{
switch(n)
{
case 1:
P1=0x7f;
NumberLight(3);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(2);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(1);
delay(10);
GreenOn(1);
delay(10);
P1=0x7f;
NumberLight(0);
delay(10);
GreenOn(1);
delay(10);
break;
case 2:
P1=0xfb;
NumberLight(3);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(2);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(1);
delay(10);
GreenOn(2);
delay(10);
P1=0xfb;
NumberLight(0);
delay(10);
GreenOn(2);
delay(10);
break;
}
}
void NanBei()
//南北向通行流程
{
GreenOn(1);
CountLight(9);
GreenFlash(1);
YellowOn(1);
CountLight(3);
}
void DongXi()
//东西向通行流程
{
GreenOn(2);
CountLight(9);
GreenFlash(2);
YellowOn(2);
CountLight(3);
}
void main()
{
//硬件自检,检查硬件的可用性
P1=0x00;
P2=0x00;
delay(40);
//红绿灯工作状态的循环
while(1)
{
NanBei(); //南北向通行
DongXi(); //东西向通行
}
}
PS:单片机的P1口是管理的红绿灯,P2口是管理的数码管显示数字,数码管是共阳极,且引脚g-a接在了P3的1-7上,儿红绿灯用的是P1口上的LED,分别是0-2口和5-7口上的,灯的闪烁用的是程序控制,没有做到精确的时间控制,以后会把单片机的时间控制加上,还有外部中断的实现也会加上的。