📄 timer0.c
字号:
#include<STC12C5410AD.h>
#include<buzzer.h>
#include<uart.h>
#define RELOAD_H ( 65536-3000)/256;
#define RELOAD_L ( 65536-3000 )%256;
/*----------------------------------------------------------------------------------
extern variables
-----------------------------------------------------------------------------------*/
extern unsigned char refresh_flag;
extern unsigned char keyscan_flag;
extern unsigned char keyscan_tubefresh_counter;
extern unsigned char ad_counter;
extern unsigned char adc_flag;
extern unsigned char uart_counter,send_flag;
extern unsigned char buzzer_timer;
extern unsigned char buzzer_timer_trigger;
/*-----------------------------------------------------------------------------------
功能:定时器0初始化(晶振18.4M,计数周期为0.66us)
名称:Timer0_Init()
输入:无
输出:无
返回:无
-------------------------------------------------------------------------------------*/
void Timer0_Init(void)
{
//工作方式控制寄存器TMOD
//--------------------------------------------------------------------------------------
//TMOD寄存器用于定义定时/计数器的操作方式及工作模式,其格式如下:
// 7 6 5 4 3 2 1 0
// GATE C/T M1 M0 GATE C/T M1 M0
//--------------------------------------------------------------------------------------
//其中低4位(0~3)位定义定时/计数器0,高4位(4~7)定义定时/计数器1
//--------------------------------------------------------------------------------------
// M1 M0 为操作方式选择位
// 0 0 方式0 13位计数器
// 0 1 方式1 16位计数器
// 1 0 方式2 自动再装入的8位计数器
// 1 1 方式3 将定时/计数器0分成两个8位计数器.
//--------------------------------------------------------------------------------------
//C/T:选择定时器或计数模式. C/T=1时为计数模式 当C/T=0时为定时模式
//--------------------------------------------------------------------------------------
// GATE:选通控制.当GATE=1时,只有当 INTx端口为高电平且TRx置位为1时才选通定时器/计数器x;
// 当GATE=0时,只需TRx置位为1即选通定时/计数器x.
TMOD |= 0x01; //定时器0,方式1
TL0 = 22; //TL0定时器0低8位计数器
TH0 = 22; //TH0定时器0高8位计数器
TR0 = 1; //定时器/计数器0启动位.TR0=1:开始计时或计数 TR0=1禁止计时或计数
ET0 = 1; //定时器/计数器0中断使能
EA = 1; //全局中断使能
}
/*-----------------------------------------------------------------------------------
功能:定时器0中断服务程序
名称:Timer0_ISR(void) interrupt 1
输入:无
输出:无
返回:无
备注:10ms中断一次
-------------------------------------------------------------------------------------*/
void Timer0_ISR(void) interrupt 1
{
//---digit tube about--------------------------------------------------------------
refresh_flag = 1;
//----keyboard about----------------------------------------------------------------
keyscan_tubefresh_counter++;
if( keyscan_tubefresh_counter >= 5 )
{
refresh_flag = 0;
keyscan_tubefresh_counter = 0;
keyscan_flag = 1;
}
//----ad about----------------------------------------------------------------------
ad_counter++;
if(ad_counter >= 250)
{
ad_counter = 0;
adc_flag = 1 ;
}
//--------uart about----------------------------------------------------------------
uart_counter++;
if(uart_counter >= 250)
{
uart_counter = 0;
send_flag =1;
}
//------------buzzer about-----------------------------------------------------------
if(buzzer_timer_trigger)
{
buzzer_timer++;
if(buzzer_timer >= 254)
{
buzzer_timer = 0;
buzzer_timer_trigger = 0;
close_buzzer();
}
}
//定时器0初值重装
TL0 = RELOAD_L;
TH0 = RELOAD_H;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -