写框架什么的太麻烦了,stc内存又少(难受)
省流:其实就一个定时时间到了就走一边函数,然后重新计时
timer1.h
#ifndef __TIMER1_H__
#define __TIMER1_H__
/** TCON
* b7: TF1:T1溢出中断标记 -硬件置1,响应中断后硬件清零(也可软件查询清0)
* b6:TR1:T1运行控制位,-由软件设置
* GATE==0:
* TR1=1:T1计数
* TR1=0:T1禁止技术
* GATE=1:
* TR1=1且INT1=1:T1计数
* 否则禁止计数
*/
/** TMOD
* b7:T1_GATE:控制定时器1,=1时,TR1=1且INT1=1:T1计数
* b6:T1_C/T:控制定时器1用作定时器或计数器,=0用作定时器,=1用作计数器(T1/P3.5)
* b5:T1_M1:
* b4:T1_M0:
* T1M1: T1M0
* 0 0 16位自动重载模式
* 0 1 16位不自动重载
* 1 0 8位自动重载
* 1 1 T1停止工作
*/
/** AUXR
* b6:T1x12:=0:12T模式;=1:1T模式
*/
/** TH1, TL1
* 技术寄存器
*/
/** INTCLKO
* b1:定时器1时钟输出控制;=0:关闭事件输出;=1:P34定时器1时钟输出,定时器溢出自动翻转
*/
/**
* tim<sec> = (65536-[TH,TL])/SYSTICK*时钟xT
* [TH,TL] = 65536-tim<sec>*SYSTICK/时钟xT
*/
void timer1Init(double tim);
unsigned int systemTimeGet(void);
#endif
timer1.c
#include "tim/timer1/timer1.h"
#include "head_file/STC8H.h"
volatile unsigned int system_tick = 0;
void timer1Init(double tim)
{
unsigned int tick_time = 65536-(tim*SYSTICK);
TMOD &= ~0xf0; //16位自动重载 定时器
AUXR |= 0x40; //时钟源 1T模式
INTCLKO &= ~0x02; //关闭定时器io输出
TH1 = tick_time>>8;
TL1 = tick_time&0xff;
TCON &= ~0x80; //中断标记位清零
TCON |= 0x40; //定时器启动
ET1 = 1; //开启定时器1中断
EA = 1; //开启总中断
}
void timer1Isr(void) interrupt 3
{
system_tick++;
}
unsigned int systemTimeGet(void)
{
return system_tick;
}
使用:
main.c
#include "tim/timer1/timer1.h"
#include "uart/uart1/uart1.h"
#include "head_file/STC8H.h"
#include "main/main.h"
void loopTask(void (*task)(void), unsigned int *task_tick, unsigned long max_tick)
{
if((systemTimeGet() - *task_tick) >= max_tick)
{
*task_tick = systemTimeGet();
task();
}
}
unsigned int task1_tick = 0;
void task1(void)
{
sendChar(0x01);
}
unsigned int task2_tick = 0;
void task2(void)
{
sendChar(0x02);
}
void main(void)
{
P3M0 = GPIO_MODE_NOMAL_M0(P3M0, PIN_0|PIN_1); P3M1 = GPIO_MODE_NOMAL_M1(P3M1, PIN_0|PIN_1);
timer1Init(0.001);
uart1Init(19200);
while (1)
{
loopTask(task1, &task1_tick, 1000);
loopTask(task2, &task2_tick, 2000);
}
}
使用介绍:
主要是loopTask()函数