使用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.pswp.cn/web/92624.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92624.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92624.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python练习】086. 编写一个函数,实现简单的DHCP服务器功能

086. 编写一个函数,实现简单的DHCP服务器功能 086. 编写一个函数,实现简单的DHCP服务器功能 安装依赖库 示例代码 代码说明 示例输出 注意事项 扩展功能 DHCP服务器功能实现方法 依赖库安装 基本功能实现 功能说明 运行方法 注意事项 扩展功能 086. 编写一个函数,实现简单的…

生产环境Tomcat运行一段时间后,如何测试其性能是否满足后续使用

要测试生产环境中已运行一段时间的Tomcat性能是否满足后续使用需求&#xff0c;需从基础监控、负载压力测试、配置合理性校验、稳定性验证等多维度入手&#xff0c;结合工具和实际业务场景定位瓶颈&#xff0c;确保其能应对未来可能的流量增长。以下是具体方法和步骤&#xff1…

Qt中的设计模式:经典的MVC,MVP和MVVM

Qt中的设计模式&#xff1a;经典的MVC&#xff0c;MVP和MVVM 前言 ​ 笔者这里最近正在研究经典的三大 Model/View 框架&#xff0c;不得不说&#xff0c;我先前的确写过Qt在这里的体现&#xff0c;但是&#xff0c;笔者认为之前的文章中&#xff0c;我只是机械的memcpy的Qt的…

Windows浮动ip怎么配置

Windows浮动IP怎么配置&#xff0c;达到IP漂移的效果&#xff0c;方法肯定是有的&#xff0c;这里我推荐一款好用的高可用Vip漂移软件PanguVip&#xff0c;我们先看下最终达到的效果图&#xff0c;如下所示PanguVip软件免费下载百度网盘为您提供文件的网络备份、同步和分享服务…

[langchain] Sync streaming vs Async Streaming

我不太清楚langchain中的sync stream 和 async steam有什么关系和区别sync stream from langchain.chat_models import init_chat_model from langchain_deepseek.chat_models import ChatDeepSeek import dotenv dotenv.load_dotenv()messages [ ("system", &quo…

nginx下lua的实现机制、Lua错误处理、面向对象

nginx下lua的实现机制 nginxlua概述 nginx&#xff1a;功能由模块提供。 http模块、events模块&#xff0c;mail模块。 处理http请求的时候&#xff0c;可以利用模块做一些功能&#xff1a;eg&#xff1a;登录校验&#xff0c;js合并&#xff0c;数据库访问&#xff0c;鉴权。 …

Axure基于中继器实现的组件库(导航菜单、动态表格)

摘要 本文将为您详细介绍基于 Axure 的中继器组件库中的 9 个独特组件&#xff0c;这些组件不仅能够极大地提升您的原型设计效率&#xff0c;还能为您的项目增添令人惊叹的交互效果和视觉呈现。 引言 在当今快速发展的数字产品设计领域&#xff0c;原型设计工具的革新不断推动着…

Kafka 生产者与消费者分区策略全解析:从原理到实践

一、生产者分区策略1.1 分区好处&#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务&#xff0c;可以实现负载均衡的效果。&#xff0…

高频面试点:深入理解 TCP 三次握手与四次挥手

在网络通信的世界里,TCP(Transmission Control Protocol,传输控制协议)是确保数据可靠传输的基石。其中,三次握手建立连接、四次挥手断开连接的过程,更是 Java 秋招面试中的高频考点。今天,我们就深入剖析这两个关键过程,结合原理、代码示例与面试真题,帮你吃透知识点…

k8s-nfs实现创建sc的两种方式

法一&#xff1a;基于 官方 NFS CSI 插件 法二&#xff1a;基于 nfs-subdir-external-provisioner 法一 官方 NFS CSI 插件 大致步骤# 安装 NFS sudo apt update sudo apt install -y nfs-kernel-server # 创建共享目录 sudo mkdir -p /data/nfs sudo chmod 777 /data/nfs # 配…

n8n 入门指南:更适合跨境出海搞钱的AI智能体

如果你最近刷到 AI 圈的分享应该会发现——n8n 又火起来了。其实 n8n 早在 2020 年左右就被程序员玩过一波&#xff0c;当时很多人拿它做网站自动发邮件、消息转发之类的“流程自动化”。但那时候 AI 还没这么卷&#xff0c;大家也没觉得多有用。n8n为什么最近又翻红&#xff1…

【数据分享】各省农业土地流转率(2010-2023)

数据介绍土地流转是推动农业规模化、现代化发展的关键机制。为助力相关研究&#xff0c;现分享一份覆盖全国30个省级行政区、时间跨度为2010-2023年的农业土地流转率面板数据集。本数据直接提取自权威统计年报&#xff0c;具有较高的参考价值。一、数据概览覆盖范围&#xff1a…

音视频时间戳获取与同步原理详解

引言&#xff1a;为什么音视频同步如此重要&#xff1f; 在音视频技术领域&#xff0c;"同步"是决定用户体验的核心要素。想象一下观看电影时画面与声音错位0.5秒的场景&#xff1a;角色说话时嘴唇动作与声音不匹配&#xff0c;爆炸场景的视觉冲击先于音效到达——这…

Day38--动态规划--322. 零钱兑换,279. 完全平方数,139. 单词拆分,56. 携带矿石资源(卡码网),背包问题总结

Day38–动态规划–322. 零钱兑换&#xff0c;279. 完全平方数&#xff0c;139. 单词拆分&#xff0c;56. 携带矿石资源&#xff08;卡码网&#xff09;&#xff0c;背包问题总结 今天的是几道经典的“完全背包”题目。前两道题目&#xff0c;要区分求的是“价值”&#xff0c;还…

应用层Http协议(1)

应用层Http协议&#xff08;1&#xff09; 在互联网世界中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个至关重要的协议。它定义了客户端&#xff08;如浏览器&#xff09;与服务器之间如何通信&#xff0c;以交换或传…

elementui input无法输入问题

背景。开发小程序。自定义表单在pc段设置好input输入框属性后。 在小程序端无法输入原因&#xff1a;长度受限制&#xff0c;导致input组件的maxlength属性认为长度是0导致无法输入任何值。看解释是应为遇到空字符串等情况会设置为0解决。因为未找到设置maxlength为0处&#xf…

算法_python_学习记录_02

算法学习和视频学习过程中&#xff0c;有许多前几天还不知道的知识点&#xff0c;现在一点一点归纳整理出来&#xff0c;稳步前进&#xff0c;前进~ 20_贪心算法系列题 00_参考文档 详解贪心算法&#xff08;Python实现贪心算法典型例题&#xff09;_顺序贪婪算法-CSDN博客P…

Meta AI水印计划的致命缺陷——IEEE Spectrum深度文献精读

一、原文信息 标题: Metas AI Watermarking Plan Is Flimsy, at Best 中文译名: Meta的AI水印计划脆弱不堪 作者: David Evan Harris(加州大学伯克利分校)、Lawrence Norden(纽约大学法学院) 发表日期: 2024年3月5日 发表期刊: IEEE Spectrum 二、原文全文翻译 Met…

gpt-oss 全量技术解读

一、概述 gpt-oss 是 OpenAI 发布的开放权重&#xff08;open-weight&#xff09;模型系列&#xff0c;面向强推理、Agent 能力与多样化应用场景。 提供两种规格&#xff1a; gpt-oss-120b&#xff1a;面向生产与高推理需求&#xff0c;单卡 80GB GPU&#xff08;如 NVIDIA …

实现EtherNet/IP网络与Modbus TCP网络之间数据互通

硬件连接与配置使用工业以太网网关&#xff08;如ENE-350&#xff09;作为桥接设备&#xff0c;通过以太网交换机实现硬件互联。 网关需根据应用场景配置为EtherNet/IP从站或Modbus TCP主/从站模式。案例1&#xff1a;EtherNet IP主站PLC和Modbus TCP主站PLC的互联网关配置&…