為什么說(shuō)新浪的門戶網(wǎng)站做的好網(wǎng)站服務(wù)器搭建與管理
目錄
一、引言
二、定時(shí)器基礎(chǔ)知識(shí)
三、STC8定時(shí)器配置
四、代碼示例
五、總結(jié)
一、引言
在單片機(jī)開發(fā)中,定時(shí)器(Timer)是一個(gè)極其重要的組件,它允許開發(fā)者基于時(shí)間觸發(fā)各種事件或任務(wù)。STC8增強(qiáng)型單片機(jī)作為一款功能豐富的微控制器,內(nèi)置了高性能的定時(shí)器模塊,為開發(fā)者提供了精確的時(shí)間控制功能。本文將詳細(xì)介紹STC8增強(qiáng)型單片機(jī)定時(shí)器的基本原理、配置方法以及應(yīng)用示例。
二、定時(shí)器基礎(chǔ)知識(shí)
定時(shí)器是單片機(jī)內(nèi)部的一個(gè)計(jì)數(shù)器,它以一定的頻率(時(shí)鐘源)進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)值達(dá)到設(shè)定的閾值時(shí),會(huì)產(chǎn)生一個(gè)中斷或標(biāo)志位的變化,從而觸發(fā)相應(yīng)的處理程序。STC8增強(qiáng)型單片機(jī)的定時(shí)器通常具有多種工作模式,如定時(shí)模式、計(jì)數(shù)模式、捕獲模式等,以滿足不同的應(yīng)用需求。
三、STC8定時(shí)器配置
STC8增強(qiáng)型單片機(jī)的定時(shí)器配置主要包括以下幾個(gè)方面:
-
時(shí)鐘源選擇:定時(shí)器可以選擇不同的時(shí)鐘源進(jìn)行計(jì)數(shù),如系統(tǒng)時(shí)鐘、外部時(shí)鐘等。時(shí)鐘源的選擇會(huì)影響定時(shí)器的計(jì)數(shù)速度和精度。
-
工作模式設(shè)置:根據(jù)應(yīng)用需求,選擇合適的定時(shí)器工作模式。例如,在需要精確計(jì)時(shí)的場(chǎng)合,可以選擇定時(shí)模式;在需要測(cè)量外部事件頻率的場(chǎng)合,可以選擇計(jì)數(shù)模式。
-
計(jì)數(shù)初值和重裝載值:設(shè)置定時(shí)器的計(jì)數(shù)初值和重裝載值,以確定定時(shí)器的溢出時(shí)間和周期。計(jì)數(shù)初值是定時(shí)器開始計(jì)數(shù)時(shí)的初始值,重裝載值是在定時(shí)器溢出后重新加載到定時(shí)器的值。
-
中斷和標(biāo)志位設(shè)置:根據(jù)需要,配置定時(shí)器的中斷和標(biāo)志位。當(dāng)定時(shí)器溢出時(shí),可以產(chǎn)生中斷請(qǐng)求,并在中斷服務(wù)程序中執(zhí)行相應(yīng)的處理邏輯。同時(shí),定時(shí)器溢出時(shí)還會(huì)設(shè)置相應(yīng)的標(biāo)志位,方便程序查詢定時(shí)器的狀態(tài)。
四、代碼示例
以下是一個(gè)基于STC8增強(qiáng)型單片機(jī)的定時(shí)器應(yīng)用示例代碼,用于實(shí)現(xiàn)一個(gè)簡(jiǎn)單的LED閃爍功能:
#include "STC8G_H_GPIO.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_Switch.h"
#include "STC8G_H_Timer.h"
#include "Config.h"
void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure; //結(jié)構(gòu)定義GPIO_InitStructure.Pin = GPIO_Pin_3; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P5, &GPIO_InitStructure); //初始化
}void UART_config(void) {// >>> 記得添加 NVIC.c, UART.c, UART_Isr.c <<<COMx_InitDefine COMx_InitStructure; //結(jié)構(gòu)定義COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use = BRT_Timer1; //選擇波特率發(fā)生器, 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; 優(yōu)先級(jí)(低到高) 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
}int count = 0;void timer0_callback() {int i;// 當(dāng)Timer0中斷觸發(fā)時(shí),會(huì)回調(diào)這個(gè)函數(shù)count++;// 燈光閃爍if (count == 1000) { // 1000ms進(jìn)入if語(yǔ)句一次P53 = !P53;count = 0;}// 發(fā)送接收數(shù)據(jù)// if (count == 20) { // 20ms進(jìn)入if語(yǔ)句一次// 是否消息發(fā)送完畢//if (COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0) {// 數(shù)據(jù)長(zhǎng)度是否大于0//if(COM1.RX_Cnt > 0) {// 收數(shù)據(jù)//for (i = 0; i < COM1.RX_Cnt; i++) {//TX1_write2buff(RX1_Buffer[i]);//}//COM1.RX_Cnt = 0;//}//}//count = 0;//}
}void Timer_config() {TIM_InitTypeDef init;// 16位自動(dòng)重載機(jī)制模式init.TIM_Mode = TIM_16BitAutoReload; //工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskinit.TIM_ClkSource = TIM_CLOCK_1T; //時(shí)鐘源 TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Extinit.TIM_ClkOut = DISABLE; //可編程時(shí)鐘輸出, ENABLE,DISABLE/*裝載初值TIM_Value,目標(biāo)值:65536目標(biāo)值 裝載初值* 差值: 65536 - 65530 = 6* 差值: 65536 - 64536 = 1000* 差值: 65536 - 41536 = 24000裝載初值41536 = 65536 - (MAIN_Fosc / 1000)24000000次/s ÷ 1000 = 24000次/ms根據(jù)系統(tǒng)主頻,按照裝載的初值開始逐漸向目標(biāo)值遞增;一旦到達(dá)目標(biāo)值后,觸發(fā)一次Timer的中斷 -> 調(diào)用中斷函數(shù): interrupt TMR0_VECTOR;16位自動(dòng)重載機(jī)制模式:達(dá)到目標(biāo)值后,重新回到裝載的初值,開始遞增;*/init.TIM_Value = 65536 -(MAIN_Fosc / 1000); //裝載初值 = 目標(biāo)值減去差值// init.TIM_PS = 0; //8位預(yù)分頻器 (注意:并非所有系列都有此寄存器,詳情請(qǐng)查看數(shù)據(jù)手冊(cè))init.TIM_Run = ENABLE; //是否運(yùn)行 ENABLE,DISABLETimer_Inilize(Timer0, &init);// 中斷配置NVIC_Timer0_Init(ENABLE, Priority_0);}int main() {// 開啟全局中斷EA = 1;// 1. 設(shè)置P53引腳的工作模式GPIO_config();UART_config();// 2. 配置Timer的參數(shù)Timer_config();P53 = 0; // 熄燈while(1) {}}
上列代碼所需庫(kù)函數(shù)文件:
?
上列代碼中提到的MAIN_Fosc在Config.h文件中:
五、總結(jié)
本文詳細(xì)介紹了STC8增強(qiáng)型單片機(jī)定時(shí)器的基本原理、配置方法以及應(yīng)用示例。通過合理配置定時(shí)器的時(shí)鐘源、工作模式、計(jì)數(shù)初值和重裝載值等參數(shù),可以實(shí)現(xiàn)精確的時(shí)間控制功能。在實(shí)際應(yīng)用中,我們可以利用定時(shí)器來(lái)實(shí)現(xiàn)LED閃爍、按鍵掃描、延時(shí)等待等各種功能。