STC8H简易函数定时调用

写框架什么的太麻烦了,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()函数

STC8H1K单片机(System Technology Corporation)是一款8位微控制器,其内置了ADC(Analog-to-Digital Converter,模拟到数字转换器)。使用ADC进行中断操作通常涉及到以下步骤: 1. **配置ADC模块**: - 首先,你需要初始化ADC,设置转换模式、通道选择、采样时间等。例如,你可以调用`ADC_Init()`函数配置ADC。 ```c void ADC_Init(void) { // 设置ADC寄存器和配置 ADC_InitStructure.ADC_Mode = ADC_Mode_ContinuousConv; ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单次转换或连续扫描 ADC_InitStructure.ADC_NbrOfChannel = 1; // 如果只有一个通道 ADC_Init(&ADC_InitStructure); } ``` 2. **启用中断**: - 打开ADC中断,在这里通常是当转换完成后触发中断。这通常通过设置中断使能标志并开启全局中断。 ```c void ADC_Enable_IT(ADC_TypeDef* ADCx, ADC_FLAG eADCFlag) { ADC_Cmd(ADCx, ENABLE); // 开启ADC模块 __enable_INT(); // 全局中断使能 if (eADCFlag == ADC_FLAG_ADRDY) { // 如果等待的是转换完成标志 ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE); // 启动EOC(End Of Conversion)中断 } } ``` 3. **中断服务函数**: - 编写一个中断服务函数(ISR),该函数会在ADC转换结束后被调用。在这个函数中,你可以读取ADC的结果。 ```c void EXTI0_IRQHandler(void) { static uint16_t adc_result; // 检查是否是ADC中断 if (__HAL_GET_IT_SOURCE(EXTI_LINE0) & IT_ADC) { ADC_ReadResult(&adc_result); // 从ADC获取结果 // 处理中断逻辑,如数据处理、存储或更新UI等 ADC_ClearITPendingBit(ADC, ADC_IT_EOC); // 清除中断标志 } } ``` 4. **清理中断**: - 在中断服务函数末尾,确保清除中断标志,以便下一次转换可以正常触发。 5. **中断后处理**: - 根据中断后的处理需求,可能需要执行其他任务,比如关闭中断、继续下一个转换等。 记得检查相关的头文件和库函数定义,因为这些可能会根据实际编译环境略有不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值