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

📄 main.c

📁 时间倒计时C51源程序
💻 C
字号:
//**********************************************************************
//功能		: 时间倒计时程序
//作者		: lihj
//创建日期	: 2004-06-15
//版本		: V1.0
//修改记录	:
//***********************************************************************
#include "REG51.h"
#include "intrins.h"					//包含内联函数

#ifndef TRUE							//如果没有定义宏TRUE,那么定义以下宏
#define TRUE		0
#define FALSE		1
#endif									//结束条件编译

//系统宏定义
#define XTAL		12000000			//系统晶振
#define TIME_BASE	10					//时间基准, 以1ms为单位
#define RED_TIME	45					//红灯倒计时时间
#define GREEN_TIME	30					//绿灯倒计时时间

//全局变量声明
int	 g_wTimerIniValue;					//定时器初始化值
int  g_w10msCounter;					//10ms系统时钟基准
int  g_wRedDownCounter;					//红灯倒计时计数器
int  g_wGreenDownCounter;				//绿灯倒计时计数器
bit  g_bUpdateCountFlag;				//更新标志
sbit g_bRedFlag = P1^0;					//假设P1.0口输入红灯计数信号,高电平有效
sbit g_bGreenFlag = P1^1;				//假设P1.1口输入绿灯计数信号,高电平有效

//函数声明
char TimerIni(char);					//初始化定时器函数
char UpdateCounter(int, int*);			//计数器生成函数
void OutputTime(int );					//输出当前计时值

//主循环
void main(void)
{
	int cur_counter=60;					//当前输出值

	//初始化全局变量
	g_w10msCounter = 0;					//10ms系统时钟基准
	g_wRedDownCounter = RED_TIME;		//红灯倒计时计数器
	g_wGreenDownCounter = GREEN_TIME;	//绿灯倒计时计数器
	g_bUpdateCountFlag = 0;				//更新标志
	g_bRedFlag = 0;
	g_bGreenFlag = 0;
		
	g_wTimerIniValue = 65535 - ((XTAL/12)/1000)*TIME_BASE + 1;		
										//初值=65536 - 定时时间长度
 	TimerIni(0);						//将定时器0初始化成10ms定时器
	
	EA = 1;								//总中断使能

	while(1)							//主循环体
	{
		if(_testbit_(g_bUpdateCountFlag))
		{
			//更新红灯计数器 
			if(g_bRedFlag)
			{
				//红灯开始计数的时候,初始化绿灯倒计时时间
				g_wGreenDownCounter = GREEN_TIME;				
				UpdateCounter(100, &g_wRedDownCounter);
				cur_counter = g_wRedDownCounter;
			}

			//更新绿灯计数器
			if(g_bGreenFlag)
			{
				//绿灯开始计时的时候,初始化红灯倒计时时间
				g_wRedDownCounter = RED_TIME;
				UpdateCounter(100, &g_wGreenDownCounter);
				cur_counter = g_wGreenDownCounter;
			}

			//输出当前计时时间
			OutputTime(cur_counter);
		}
	}
}
	
//定时器初始化函数
//参数说明	: n, 定时器序号
char TimerIni(char n)
{
 	if(n == 0)							//使用定时器0
	{
		TMOD = 0X01;					//定时器0工作方式1(16位定时器)
		TH0 = g_wTimerIniValue >> 8;	//定时器赋初始值
		TL0 = g_wTimerIniValue;
		ET0 = 1;						//允许定时器中断
		TR0 = 1;						//启动计数
	}		
	else if(n == 1)						//使用定时器1
	{
		TMOD = 0x10;					//工作方式1
		TH1 = g_wTimerIniValue >> 8;	//定时器赋初值
		TL1 = g_wTimerIniValue;
		ET1 = 1;						//允许定时器中断
		TR1 = 1;						//启动计数
	}
	else
	{
		return FALSE;					//返回出错标志
	}

	return TRUE;
}

//计数器生成函数
//传入参数 	: count, 多少ms计数器,单位1ms
//			: *pCounter, 指向需要更新的计数器
char UpdateCounter(int count, int *pCounter)
{
	//计数器长度限幅(600s)
	//更长时间的计数器需要更改时间基准
	if(count > 65536/TIME_BASE)
	{
		return FALSE;
	}

	if(g_w10msCounter%count == 0)
    {
		if(*pCounter == 0)				//已经到零了,直接返回
		{
			return TRUE;
		}

		(*pCounter) --;					//向下减一
	}

	return TRUE;
}

//定时器0中断服务程序
//interrupt关键字后的数字指向中断向量号
//using关键字后的数字表示该中断函数使用第几组寄存器
void Timer0Int(void) interrupt 1 using 1
{
	TL0 += g_wTimerIniValue;
	TH0 += g_wTimerIniValue>>8;				//恢复定时器初值

	g_w10msCounter ++;						//10ms计数器累加
	if(g_w10msCounter >= 60000)
	{
		g_w10msCounter -= 60000;
	}

	g_bUpdateCountFlag = 1;					//更新其它计数器
}
	
//将当前倒计时时间输出到显示界面
//预留接口
void OutputTime(int count)
{

}

⌨️ 快捷键说明

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