📄 main.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 + -