配置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.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的互聯網關配置&…