当前位置: 首页 > news >正文

配置timer控制 IO的输出(STC8)

使用STC8的Timer控制IO输出

STC8系列单片机具有多个定时器,可以用于精确控制IO口的输出状态。以下是使用Timer0和Timer1控制IO输出的方法。

初始化Timer0
配置Timer0为16位自动重装模式,用于周期性控制IO输出:

/************************ 定时器配置 ****************************/
void	Timer_config(void)
{TIM_InitTypeDef		TIM_InitStructure;						//结构定义//定时器0做16位自动重装, 中断频率为1000HZTIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;	//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext//如果配置ENABLE,则P3.5端口会同步输出时钟脉冲TIM_InitStructure.TIM_ClkOut    = DISABLE;			//是否输出高速脉冲, ENABLE或DISABLE// 1秒钟要调用1000次定时器中断函数,每1/1000秒,1ms,调用1次定时器中断函数TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);		//初值 ---------------------- 设置输出频率1000Hz, 1ms//                                                  频率不能太低:>= 367//                                                  频率不能太高:<= 1000000(1MHz) 否则不准确// 65536 - (24000 000 / 1000) = 65536 - 24000 = 41536 (TIM_Value)// 0 |----------------------------------------| 41536 |---------------| 65535//                                                     +++++++++++++++ 每溢出一次,执行一次中断函数TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4NVIC_Timer0_Init(ENABLE,Priority_0);						//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}

Timer0中断服务程序
在中断中翻转IO口状态:
我是写了一个函数的声明
extern void timer0_call();
我调用了这个函数
timer0_call();
在原本的库文件中写的,函数中调用了函数,具体实现的逻辑都在main.c文件中实现

extern void timer0_call();   // 谁要使用,谁要定义此回调函数void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{// TODO: 在此处添加用户代码timer0_call();//我添加的代码
}

使用Timer1的PWM功能
STC8的Timer1可以产生PWM信号控制IO输出

直接IO控制
通过定时器中断直接控制多个IO口:

// 定时器0中断回调函数
void timer0_call() {u8 i = 0;if(COM1.RX_Cnt > 0) {for(i=0; i<COM1.RX_Cnt; i++)	{// RX1_Buffer[i]存的是接收的数据// TODO: 做具体的逻辑TX1_write2buff(RX1_Buffer[i]);// 写一个byte}}COM1.RX_Cnt = 0;     
}

案例代码

main.c文件

#include	"GPIO.h"
#include	"Timer.h"
#include    "NVIC.h"
#include    "UART.h"
#include    "Switch.h"// 配置timer控制UART接收:在Timer中断函数中接收并处理UART消息void GPIO_config(void) {GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义// P30 P31GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;		//指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化
}/************************ 定时器配置 ****************************/
void	Timer_config(void)
{TIM_InitTypeDef		TIM_InitStructure;						//结构定义//定时器0做16位自动重装, 中断频率为1000HZTIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	//指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;	//指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext//如果配置ENABLE,则P3.5端口会同步输出时钟脉冲TIM_InitStructure.TIM_ClkOut    = DISABLE;			//是否输出高速脉冲, ENABLE或DISABLE// 1秒钟要调用1000次定时器中断函数,每1/1000秒,1ms,调用1次定时器中断函数TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);		//初值 ---------------------- 设置输出频率1000Hz, 1ms//                                                  频率不能太低:>= 367//                                                  频率不能太高:<= 1000000(1MHz) 否则不准确// 65536 - (24000 000 / 1000) = 65536 - 24000 = 41536 (TIM_Value)// 0 |----------------------------------------| 41536 |---------------| 65535//                                                     +++++++++++++++ 每溢出一次,执行一次中断函数TIM_InitStructure.TIM_Run       = ENABLE;				//是否初始化后启动定时器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure);				//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4NVIC_Timer0_Init(ENABLE,Priority_0);						//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
}void UART_config(void) {// >>> 记得添加 NVIC.c, UART.c, UART_Isr.c <<<COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}// 定时器0中断回调函数
void timer0_call() {u8 i = 0;if(COM1.RX_Cnt > 0) {for(i=0; i<COM1.RX_Cnt; i++)	{// RX1_Buffer[i]存的是接收的数据// TODO: 做具体的逻辑TX1_write2buff(RX1_Buffer[i]);// 写一个byte}}COM1.RX_Cnt = 0;     
}void main() {// 配置GPIO_config();Timer_config();UART_config();// 全局中断使能EA = 1;while (1) {}
}

库函数:Timer_isr.c文件需要在Timer0_ISR_Handler 中添加需要中断的接口或者给一个调用的函数

#include	"Timer.h"// 函数声明
extern void timer0_call();   // 谁要使用,谁要定义此回调函数//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{// TODO: 在此处添加用户代码timer0_call();//我添加的代码
}

注意事项

  • 时钟频率影响定时精度,需根据实际系统时钟调整定时器初值
  • 使用PWM功能时需注意IO口的复用功能配置
  • 高精度定时需考虑中断响应时间的补偿

以上方法适用于STC8系列单片机的Timer控制IO输出应用,可根据具体需求调整定时器配置和IO操作逻辑。

http://www.xdnf.cn/news/1274797.html

相关文章:

  • 浏览器CEFSharp88+X86+win7 之js交互开启(五)
  • 【LeetCode】102 - 二叉树的层序遍历
  • MySQL 处理重复数据详细说明
  • DBAPI 实现不同角色控制查看表的不同列
  • SQL约束:数据完整性的守护者
  • 【面试场景题】异地多活改造方案
  • 实现两个开发板的串口通讯(基于STC8实现)
  • Oracle lgwr触发条件
  • c语言常见错误
  • 深入解析微服务分布式事务的原理与优化实践
  • 【代码随想录day 16】 力扣 513.找树左下角的值
  • Linux 路由子系统深度分析:框架、实现与代码路径
  • MariaDB 数据库管理
  • 活动策划(展会、年会),在线工具能快速出邀请函不?
  • Python 实例属性和类属性
  • 为wordpress顶部header.php文件中调用不同的标题和摘要
  • H3C(基于Comware操作系统)与eNSP平台(模拟华为VRP操作系统)的命令差异
  • Shell脚本-了解i++和++i
  • 堆(Java实现)
  • Spark学习(Pyspark)
  • 整数规划-分支定界
  • 【软件测试】BUG篇 — 详解
  • ATF(TF-A)安全通告 TFV-13(CVE-2024-7881)
  • 33.搜索旋转排序数组
  • ECharts 的理解和简单应用笔记
  • Gin vs Beego vs Echo:三大主流 Go Web 框架深度对比
  • 使用Blender可视化多传感器坐标系转换
  • sqli-labs-master/Less-51~Less-61
  • 文件 IO
  • MySQL 子查询