自己的第一个单片机程序

         在这个星期,心血来潮,完成了单片机的大作业,设计一个红绿灯的交互式的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口上的,灯的闪烁用的是程序控制,没有做到精确的时间控制,以后会把单片机的时间控制加上,还有外部中断的实现也会加上的。

你可能感兴趣的:(单片机程序设计)