日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STC15库函数上手笔记】5、定时器

發布時間:2023/12/9 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STC15库函数上手笔记】5、定时器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 硬知識
    • 定時器初始化函數
  • 測試
    • 基本功能測試
      • main.c
      • 中斷服務函數
      • 實驗現象
    • 模擬PWM信號
      • main.c
      • 實驗現象

STC實驗箱4
IAP15W4K58S4
Keil uVision V5.29.0.0
PK51 Prof.Developers Kit Version:9.60.0.0


硬知識

摘自《STC庫函數使用參考》

定時器初始化函數

Timer_Inilize

TIM_InitTypeDef的定義見于文件"timer.H".

typedef struct {u8 TIM_Mode; //工作模式u8 TIM_Polity; //優先級設置u8 TIM_Interrupt; //中斷允許u8 TIM_CIkSource; //時鐘源u8 TIM CIkOut; //可編程時鐘輸出u16 TIM_Value; //裝載初值u8 TIM_Run; //是否運行 }TIM_InitTypeDef;

TIM_Mode:定時器的工作模式:

TIM_Polity:中斷的優先級:
TIM_Interrupt:中斷允許或禁止:
TIM_CIkSource:定時器的時鐘源選擇:

TIM_CIkOut:定時器溢出時取反對應IO輸出高速時鐘:
TIM_Value:一個16位的初值。
TIM_Run:初始化后是否運行定時器:

測試

基本功能測試

main.c

#include "./Drivers/config.h" #include "./Drivers/delay.h"#include "./Drivers/timer.h" #include "./Drivers/GPIO.h"/*------------------------------------------------------------------*/ /* --- STC MCU International Limited -------------------------------*/ /* --- STC 1T Series MCU RC Demo -----------------------------------*/ /* --- Mobile: (86)13922805190 -------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/ /* --- Web: www.GXWMCU.com -----------------------------------------*/ /* --- QQ: 800003751 ----------------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*------------------------------------------------------------------*//************* 功能說明 **************本程序演示3個定時器的使用。定時器0做16位自動重裝10us定時,不中斷,從P3.5高速輸出脈寬10us 50KHZ時鐘信號。用戶可以修改時間從而修改頻率,也可以允許中斷,但注意時間不要太短(一般10us以上)。定時器1做16位自動重裝1ms定時, 中斷,從P3.4高速輸出脈寬1ms 500HZ時鐘信號。定時器2做16位自動重裝20ms定時,中斷,從P3.0高速輸出脈寬20ms 25HZ時鐘信號。同時中斷里從P1.0取反輸出25HZ時鐘信號。******************************************//************************ IO口配置 ****************************/ void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure; //結構定義GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin = GPIO_Pin_4 | GPIO_Pin_5; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化GPIO_InitStructure.Pin = GPIO_Pin_0; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化 }/************************ 定時器配置 ****************************/ void Timer_config(void) {TIM_InitTypeDef TIM_InitStructure; //結構定義TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_Polity = PolityLow; //指定中斷優先級, PolityHigh,PolityLowTIM_InitStructure.TIM_Interrupt = DISABLE; //中斷是否允許, ENABLE或DISABLETIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定時鐘源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut = ENABLE; //是否輸出高速脈沖, ENABLE或DISABLETIM_InitStructure.TIM_Value = 65536UL - ((double)MAIN_Fosc * 10/1000000.); //初值,TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后啟動定時器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_Polity = PolityLow; //指定中斷優先級, PolityHigh,PolityLowTIM_InitStructure.TIM_Interrupt = ENABLE; //中斷是否允許, ENABLE或DISABLETIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定時鐘源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut = ENABLE; //是否輸出高速脈沖, ENABLE或DISABLETIM_InitStructure.TIM_Value = 65536UL - ((double)MAIN_Fosc * 1/1000.); //初值,TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后啟動定時器, ENABLE或DISABLETimer_Inilize(Timer1,&TIM_InitStructure); //初始化Timer1 Timer0,Timer1,Timer2TIM_InitStructure.TIM_Interrupt = ENABLE; //中斷是否允許, ENABLE或DISABLE. (注意: Timer2固定為16位自動重裝, 中斷固定為低優先級)TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定時鐘源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut = ENABLE; //是否輸出高速脈沖, ENABLE或DISABLETIM_InitStructure.TIM_Value = 65536UL - ((double)MAIN_Fosc/12 * 20/1000.); //初值TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后啟動定時器, ENABLE或DISABLETimer_Inilize(Timer2,&TIM_InitStructure); //初始化Timer2 Timer0,Timer1,Timer2 }/******************** 主函數**************************/ void main(void) {GPIO_config();Timer_config();EA = 1;while (1){} }

中斷服務函數

/********************* Timer0中斷函數************************/ void timer0_int (void) interrupt TIMER0_VECTOR {}/********************* Timer1中斷函數************************/ void timer1_int (void) interrupt TIMER1_VECTOR {}/********************* Timer2中斷函數************************/ void timer2_int (void) interrupt TIMER2_VECTOR {P10 = ~P10; }

實驗現象



模擬PWM信號

修改timer.c中的timer0_int函數:

/********************* Timer0中斷函數************************/ void timer0_int (void) interrupt TIMER0_VECTOR {extern u16 PWM_high,PWM_low; //中間變量,用戶請勿修改。if(P35){TH0 = (u8)(PWM_low >> 8); //如果是輸出高電平,則裝載低電平時間。TL0 = (u8)PWM_low;}else{TH0 = (u8)(PWM_high >> 8); //如果是輸出低電平,則裝載高電平時間。TL0 = (u8)PWM_high;} }

main.c

#include "./Drivers/config.h" #include "./Drivers/delay.h"#include "./Drivers/GPIO.h" #include "./Drivers/timer.h"/************* 功能說明 **************本程序演示使用定時器做軟件PWM。定時器0做16位自動重裝,中斷,從T0CLKO高速輸出PWM。本例程是使用STC15F/L系列MCU的定時器T0做模擬PWM的例程。PWM可以是任意的量程。但是由于軟件重裝需要一點時間,所以PWM占空比最小為32T/周期,最大為(周期-32T)/周期, T為時鐘周期。PWM頻率為周期的倒數。假如周期為6000, 使用24MHZ的主頻,則PWM頻率為4000HZ。******************************************//************* 本地常量聲明 **************/#define PWM_DUTY 6000 //定義PWM的周期,數值為時鐘周期數,假如使用24MHZ的主頻,則PWM頻率為6000HZ。#define PWM_HIGH_MIN 32 //限制PWM輸出的最小占空比。用戶請勿修改。 #define PWM_HIGH_MAX (PWM_DUTY-PWM_HIGH_MIN) //限制PWM輸出的最大占空比。用戶請勿修改。/************* 本地變量聲明 **************/u16 PWM_high,PWM_low; //中間變量,用戶請勿修改。 u16 pwm; //定義PWM輸出高電平的時間的變量。用戶操作PWM的變量。/************* 本地函數聲明 **************//************* 外部函數和變量聲明 *****************/void GPIO_config(void) {GPIO_InitTypeDef GPIO_InitStructure; //結構定義GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_InitStructure.Pin = GPIO_Pin_5; //指定要初始化的IO, 或操作GPIO_Inilize(GPIO_P3, &GPIO_InitStructure); //P3.5初始化為推挽輸出 }/************************ 定時器配置 ****************************/ void Timer_config(void) {TIM_InitTypeDef TIM_InitStructure; //結構定義TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMaskTIM_InitStructure.TIM_Polity = PolityHigh; //指定中斷優先級, PolityHigh,PolityLowTIM_InitStructure.TIM_Interrupt = ENABLE; //中斷是否允許, ENABLE或DISABLETIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定時鐘源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_ExtTIM_InitStructure.TIM_ClkOut = ENABLE; //是否輸出高速脈沖, ENABLE或DISABLETIM_InitStructure.TIM_Value = 65536UL - PWM_HIGH_MIN; //初值,TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后啟動定時器, ENABLE或DISABLETimer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2 }/**************** 計算PWM重裝值函數 *******************/ void LoadPWM(u16 i) {u16 j;if(i > PWM_HIGH_MAX) i = PWM_HIGH_MAX; //如果寫入大于最大占空比數據,則強制為最大占空比。if(i < PWM_HIGH_MIN) i = PWM_HIGH_MIN; //如果寫入小于最小占空比數據,則強制為最小占空比。j = 65536UL - PWM_DUTY + i; //計算PWM低電平時間i = 65536UL - i; //計算PWM高電平時間EA = 0;PWM_high = i; //裝載PWM高電平時間PWM_low = j; //裝載PWM低電平時間EA = 1; }/******************** 主函數**************************/ void main(void) {GPIO_config();Timer_config();EA = 1;P35 = 0; //對于STC15W408S系列,要輸出低,或者設置成推挽或OD,否則不正常pwm = (u16)(PWM_DUTY * 0.25); //給PWM一個初值,這里為25%占空比LoadPWM(pwm); //計算PWM重裝值while (1){} }

實驗現象

PWM頻率 = 定時器時鐘頻率 / PWM_DUTY =30MHz/6000=5000Hz= 30MHz / 6000 = 5000 Hz=30MHz/6000=5000Hz

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的【STC15库函数上手笔记】5、定时器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。