⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 交通灯的闪烁
💻 C
字号:
//************************************************************
//*程序名称	: 按键流水灯测试程序(带按键软件去抖)
//*硬件环境	: MJ51学习板
//*CPU类型	: AT89S52@12MHz
//*程序作者	:  LittleJimmy, jimmy416@163.com
//*编写日期	:  2007-8-28
//************************************************************

//============================================================
//*特别说明: 学习板中LED/数码管与LCD电路复用了P0口,且LCD侧LCD
//*电路可能会影响到LED显示,所以运行此程序时,请将J3的八个位跳
//*线连接至‘SEG X 8’一侧
//============================================================
#include <reg52.h>

unsigned char	TimeCount;						//计数值
unsigned char	status;							//状态,以RD1为准,0为红灯,1为红/黄灯,2为绿灯,3为绿/黄灯
unsigned char	dispSHI,dispGE;

sbit SEGCLK = P3^3;					//SPI显示相关引脚定义
sbit SEGOUT = P3^4;
sbit SEGDAT = P3^5;

sbit RD1_red	=	P0^0;			//红绿灯相关定义,RD1为方向1,RD2为方向2		
sbit RD1_yellow	=	P0^1;
sbit RD1_green	=	P0^2;
sbit RD2_red	=	P0^5;
sbit RD2_yellow	=	P0^6;
sbit RD2_green	=	P0^7;

unsigned char code DispCode[17]={ 	//SPI数码管显示码表
	0x03,	//code of '0'
	0x9F,	//code of '1'
	0x25,	//code of '2'
	0x0D,	//code of '3'
	0x99,	//code of '4'
	0x49,	//code of '5'
	0x41,	//code of '6'
	0x1F,	//code of '7'
	0x01,	//code of '8'
	0x09,	//code of '9'
	0x11,	//code of 'A'
	0xC1,	//code of 'B'
	0x63,	//code of 'C'
	0x85,	//code of 'D'
	0x61,	//code of 'E'
	0x71,	//code of 'F'
	0xFF	//code of ' '
};

#define REDTIME			20			//红灯时间
#define YELLOWTIME 		3			//黄灯时间
#define GREENTIME 		10			//绿灯时间


//****************************************************************
//* SPI数码管显示函数
//****************************************************************
void SerialDisp(unsigned int DispVal)
{
	unsigned char i;

	SEGOUT = 0;
	for(i=0;i<16;i++)
	{
		SEGCLK = 0;
		if( (DispVal>>i) & 0x01 )
		{
			SEGDAT = 1;
		}
		else
		{
			SEGDAT = 0;
		}
		SEGCLK = 1;
	}
	SEGOUT = 1;
}


//****************************************************************
//* 主函数
//****************************************************************
void main(void){
	P2 = 0xFF;
	P0 = 0xFF;

	TimeCount = REDTIME;
	dispSHI =	TimeCount /10;
	dispGE	=	TimeCount % 10;

	status = 0;	
	P0 = 0xFF;
	RD1_red=0;	
	RD2_green=0;

	TMOD = 0x01;		//定时器方式1
	TH0 = 0x3C;
	TL0 = 0xB0;
	ET0 = 1;
	TR0 = 1;
	EA = 1;

	while(1);
}


//****************************************************************
//* 定时器中断服务程序
//****************************************************************
void timer0_ser(void) interrupt 1 {
	unsigned int disptemp;
	static count=0;

	TH0 = 0x3C;
	TL0 = 0xB0;

	count++;
	if (count >= 20){			//1S
		count = 0;
		TimeCount--;

		dispSHI =	TimeCount /10;
		dispGE	=	TimeCount % 10;

		disptemp = (DispCode[dispSHI]<<8) | DispCode[dispGE];
		SerialDisp(disptemp);

		if (TimeCount == 0){	//计时时间到
			status++;
			if (status >= 4)status = 0;
			P0 = 0xFF;
			switch(status){
				case 0:	
					TimeCount = REDTIME;
					RD1_red=0;	
					RD2_green=0;
					break;
				case 1:
					TimeCount = YELLOWTIME;   
					RD1_red=0;	
					RD2_green=0;	
					RD1_yellow=0;	
					RD2_yellow=0;
					break;
				case 2:
					TimeCount = GREENTIME;   
					RD1_green=0;	RD2_red=0;
					break;
				case 3:
					TimeCount = YELLOWTIME;
					RD1_green=0;
					RD2_red=0;	
					RD1_yellow=0;
					RD2_yellow=0;
					break;
				default:
					break;
			}
		} 
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -