STC8增强型单片机开发【定时器Timer⭐】

目录

一、引言

二、定时器基础知识

三、STC8定时器配置

四、代码示例

五、总结


一、引言

在单片机开发中,定时器(Timer)是一个极其重要的组件,它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的微控制器,内置了高性能的定时器模块,为开发者提供了精确的时间控制功能。本文将详细介绍STC8增强型单片机定时器的基本原理、配置方法以及应用示例。

二、定时器基础知识

定时器是单片机内部的一个计数器,它以一定的频率(时钟源)进行计数,当计数值达到设定的阈值时,会产生一个中断或标志位的变化,从而触发相应的处理程序。STC8增强型单片机的定时器通常具有多种工作模式,如定时模式、计数模式、捕获模式等,以满足不同的应用需求。

三、STC8定时器配置

STC8增强型单片机的定时器配置主要包括以下几个方面:

  1. 时钟源选择:定时器可以选择不同的时钟源进行计数,如系统时钟、外部时钟等。时钟源的选择会影响定时器的计数速度和精度。

  2. 工作模式设置:根据应用需求,选择合适的定时器工作模式。例如,在需要精确计时的场合,可以选择定时模式;在需要测量外部事件频率的场合,可以选择计数模式。

  3. 计数初值和重装载值:设置定时器的计数初值和重装载值,以确定定时器的溢出时间和周期。计数初值是定时器开始计数时的初始值,重装载值是在定时器溢出后重新加载到定时器的值。

  4. 中断和标志位设置:根据需要,配置定时器的中断和标志位。当定时器溢出时,可以产生中断请求,并在中断服务程序中执行相应的处理逻辑。同时,定时器溢出时还会设置相应的标志位,方便程序查询定时器的状态。

四、代码示例

以下是一个基于STC8增强型单片机的定时器应用示例代码,用于实现一个简单的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;				//结构定义
    GPIO_InitStructure.Pin  = GPIO_Pin_3;				//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;			//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);	//初始化
}


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_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4

    NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    UART1_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;
    // 当Timer0中断触发时,会回调这个函数

    count++;

    // 灯光闪烁
    if (count == 1000) {	// 1000ms进入if语句一次
        P53 = !P53;
        count = 0;
    }

    //  发送接收数据
    // if (count == 20) {	// 20ms进入if语句一次
    // 是否消息发送完毕
    //if (COM1.RX_TimeOut > 0 && --COM1.RX_TimeOut == 0) {
    // 数据长度是否大于0
    //if(COM1.RX_Cnt > 0) {
    // 收数据
    //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位自动重载机制模式
    init.TIM_Mode = TIM_16BitAutoReload;		//工作模式,  	TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
    init.TIM_ClkSource = TIM_CLOCK_1T;			//时钟源		TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
    init.TIM_ClkOut = DISABLE;							//可编程时钟输出,	ENABLE,DISABLE

    /*
    装载初值TIM_Value,目标值:65536

    				目标值   装载初值
    * 差值: 65536 - 65530 = 6
    * 差值: 65536 - 64536 = 1000
    * 差值:	 65536 - 41536 = 24000

    装载初值41536 = 65536 - (MAIN_Fosc / 1000)

    24000000次/s ÷ 1000 = 24000次/ms

    根据系统主频,按照装载的初值开始逐渐向目标值递增;
    一旦到达目标值后,触发一次Timer的中断 -> 调用中断函数: interrupt TMR0_VECTOR;
    16位自动重载机制模式:达到目标值后,重新回到装载的初值,开始递增;


    */
    init.TIM_Value = 65536 -(MAIN_Fosc / 1000);		//装载初值  = 目标值减去差值
    // init.TIM_PS = 0;         //8位预分频器 (注意:并非所有系列都有此寄存器,详情请查看数据手册)
    init.TIM_Run = ENABLE;			//是否运行		ENABLE,DISABLE

    Timer_Inilize(Timer0, &init);
    // 中断配置
    NVIC_Timer0_Init(ENABLE, Priority_0);

}


int main() {
    // 开启全局中断
    EA = 1;

    // 1. 设置P53引脚的工作模式
    GPIO_config();
    UART_config();
    // 2. 配置Timer的参数
    Timer_config();

    P53 = 0;		// 熄灯
    while(1) {



    }

}

上列代码所需库函数文件:

 

上列代码中提到的MAIN_Fosc在Config.h文件中:

五、总结

本文详细介绍了STC8增强型单片机定时器的基本原理、配置方法以及应用示例。通过合理配置定时器的时钟源、工作模式、计数初值和重装载值等参数,可以实现精确的时间控制功能。在实际应用中,我们可以利用定时器来实现LED闪烁、按键扫描、延时等待等各种功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/612495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【WPF学习笔记(一)】WPF应用程序的组成及Window类介绍

WPF应用程序的组成及Window类介绍 WPF应用程序的组成及Window类介绍前言正文1、WPF介绍1.1 什么是WPF1.2 WPF的特点1.3 WPF的控件分类 2、XAML介绍2.1 XAML的定义2.2 XAML的特点2.3 XAML的命名空间 3、WPF应用程序组成3.1 App.config3.2 App.xaml3.3 App.xaml.cs3.4 MainWindow…

六级仔细阅读

画两到三个词&#xff0c;精准定位 要原文和同义都满足才选 先看题目&#xff0c;在看原文&#xff0c;不要先看选项 做不出答案就继续往下读&#xff0c;读出来了就不用继续读了 分清楚是问为什么还是是什么&#xff0c;是什么看前面&#xff0c;为什么看后面 不知道就优先…

用例自动生成工具:Tcases实践指南

软件质量保障 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。 Tcases能做什么? Tcases 是一个用于设计测试用例的工具。无论何种系统&#xff0c;无论何种测试类型&#xff08;单元测试、系统测试等&#xff09;&#xff0c;都可以使用 Tcases 来设计测试。你也可以…

【系统分析师】软件架构设计

文章目录 1、构件与软件复用1.1 主流构件标准1.2 构件获取与管理1.3 构件复用的方法 2、软件架构概述3、软件架构建模4、软件架构风格4.1 经典架构风格4.2 层次架构风格4.3 富互联网应用-RIA 5、面向服务的架构5.1 SOA概述5.2 SOA的关键技术5.3 SOA的实现方法 6、软件架构评估6…

使用python获取一下microsoft的搜索积分

主要使用的库是pyautogui PyAutoGUI接管了鼠标、键盘使用权,基本上完全照搬人的操作; 主要步骤如下: 登录edge浏览器打开搜索页面 找到搜索框的位置坐标使用pyautogui模拟点击搜索框模拟输入搜索文字模拟点击键盘enter键重复以上动作伪代码如下: import pyautogui import ti…

linux性能监控之top

说完了atop和htop&#xff0c;我们在来说说Linux自带的top&#xff0c;我们先看看命令效果&#xff1a; 可以看到是一个实时的系统监控工具&#xff0c;提供了一个动态的、交互式的实时视图&#xff0c;显示系统的整体性能信息以及正在运行的进程的相关信息。 我们先来解析下命…

【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装

5月9日消息&#xff0c;据外电报道&#xff0c;OpenAI 周三发布了文档草案&#xff0c;阐述了它希望 ChatGPT 及其其他人工智能技术如何运作。冗长的Model Spec 文件的一部分透露&#xff0c;该公司正在探索进军色情和其他露骨内容领域。 看完这个&#xff0c;心里有点惊讶&am…

Go实现树莓派I2C读取SHT30温度湿度传感器

简介 树莓派其实本身包含很多资源引脚&#xff0c; 合理利用其实可以自制智能家居的一部分&#xff0c;本身硬件和Linux系统等高级语言支持加生态&#xff0c; 不说了&#xff0c; 做就好了… I2C 功能开启 参考之前的文章就可以了 Go实现树莓派读取bh1750光照强度 查看I2C总…

大米自动化生产线揭秘:包装设备选择与维护之道

在现代化的大米生产过程中&#xff0c;自动化生产线的应用已经越来越广泛。其中&#xff0c;包装设备作为生产线上的重要一环&#xff0c;其选择与维护直接关系到产品的质量和生产效率。与星派一起探讨大米自动化生产线中包装设备的选择与维护之道。 一、包装设备的选择 在选择…

寻找最大价值的矿堆 - 矩阵

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、Java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给你一个由’0’(空地)、‘1’(银矿)、‘2’(金矿)组成的地图…

Element快速上手!

Element是饿了么公司前端团队开发的一套基于Vue的组件库&#xff0c;用于快速构建网页~ 官网链接&#xff1a; Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.elem…

未授权访问:Memcached 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

求阶乘n!末尾0的个数溢出了怎么办

小林最近遇到一个问题&#xff1a;“对于任意给定的一个正整数n&#xff0c;统计其阶乘n&#xff01;的末尾中0的个数”&#xff0c;这个问题究竟该如何解决&#xff1f; 先用n5来解决这个问题。n的阶乘即n!5!5*4*3*2*1120&#xff0c;显然应该为2个数相乘等于10才能得到一个结…

AI大模型探索之路-训练篇20:大语言模型预训练-常见微调技术对比

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Xilinx 千兆以太网TEMAC IP核简介

Xilinx 公司提供了千兆以太网MAC控制器的可参数化LogiCORET™IP解决方案&#xff0c;通过这个IPCore可以实现FPGA与外部网络物理层芯片的互连。基于Xilinx FPGA 的以太网设计&#xff0c;大大降低了工程的设计复杂度&#xff0c;缩短了开发周期&#xff0c;加快了产品的面市速度…

大数据Scala教程从入门到精通第六篇:Scala源文件编写和运行

一&#xff1a;Scala源文件编写和运行 1&#xff1a;源代码比较 public class HelloJava{public static void main(String[] args){System.out.println("hello scala")} } object HelloScala{//用于声明方法 入参是一个String类型的数组。返回值类型为空def main…

用云手机打造海外社媒矩阵

在全球经济一体化的大背景下&#xff0c;中国出海企业及B2B外贸公司正将海外社交媒体营销作为重要的市场拓展策略。为更好地触及不同受众群体&#xff0c;构建跨平台的社媒矩阵已成为企业营销的关键步骤。本文将探讨如何利用云手机技术&#xff0c;高效管理并运营多个海外社交媒…

泰迪智能科技携手新乡学院开展“泰迪智能双创工作室”共建交流会

为深化校企合作&#xff0c;实现应用型人才培养目标。5月8日&#xff0c;广东泰迪智能科技股份有限公司河南分公司市场总监张京瑞到访新乡学院数学与统计学院参观交流&#xff0c;数学与统计学院院长赵国喜、副院长皮磊、张秦&#xff0c;教研室主任许寿方、姚广出席本次交流会…

【研发日记】Matlab/Simulink避坑指南(十二)——Initialize Function执行Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(八)——else if分支结构Bug》 见《研发日记&#xff0c;Matlab/Simuli…

【matlab基础知识代码】(十六)代数方程的图解法多项式型方程的准解析解方法

>> ezplot(exp(-3*t)*sin(4*t2)4*exp(-0.5*t)*cos(2*t)-0.5,[0 5]), line([0 5],[0 0]) 验证 >> t0.6738; >> exp(-3*t)*sin(4*t2)4*exp(-0.5*t)*cos(2*t)-0.5 ans -2.9852e-04 >> ezplot(x^2*exp(-x*y^2/2)exp(-x/2)*sin(x*y)) >> hold on; …