IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> SYK-0806-A2S1 工业自动化控制之【05-定时器控制的流水灯】 -> 正文阅读

[嵌入式]SYK-0806-A2S1 工业自动化控制之【05-定时器控制的流水灯】

大家好,我是『芯知识学堂』的SingleYork,前一篇文章给大家介绍了“SYK-0806-A2S1 工业自动化控制之【04-输入输出点动控制】”,这一篇中,笔者要给大家介绍如何使用定时器来实现流水灯的效果。

说到定时器,那么我们先来看下我们现在使用的这款IAP15W413AS单片机的定时器资源:
在这里插入图片描述

从官方的芯片手册上我们可以看到,STC15W401AS这个系列的单片机只有定时器0和定时器2这两个定时器,也即IAP15W413AS这个型号只有定时器0和定时器2这两个定时器。所以,本例中,我们也只能用到这两个定时器了。本例笔者要实现的功能如下:

  • Y00-Y02由定时器0控制实现流水灯效果,间隔时间为500ms;
  • Y03-Y05由定时器2控制实现流水灯效果,间隔时间为500ms;

明确好功能后,我们就可以来写代码了,首先,我们在SYSTEM组中添加timer.c文件,再在BSP组中添加bsp_timer.c文件,如下图所示:

在这里插入图片描述
timer.c文件是库文件,基本不需要做太多修改,这里笔者只是将原本库函数的中“void timer0_int (void) interrupt TIMER0_VECTOR”、“void timer2_int (void) interrupt TIMER2_VECTOR”等中断函数删除了,后面放到了“app.c”文件中。
而bsp_timer.c文件中,主要就是对timer0和timer2的配置,具体代码如下:

#include	"bsp_timer.h"

/************************ 定时器配置 ****************************/
void	Timer_config(void)
{
	TIM_InitTypeDef		TIM_InitStructure;						//结构定义
    
	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	    //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
	TIM_InitStructure.TIM_Polity    = PolityLow;			    //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
	TIM_InitStructure.TIM_Interrupt = ENABLE;					//中断是否允许,   ENABLE或DISABLE
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;		        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = DISABLE;				    //是否输出高速脉冲, ENABLE或DISABLE
	TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);		//初值,
	TIM_InitStructure.TIM_Run       = ENABLE;					//是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer0,&TIM_InitStructure);					//初始化Timer0	  Timer0,Timer1,Timer2,Timer3,Timer4

	TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;	    //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload
	TIM_InitStructure.TIM_Polity    = PolityLow;			    //指定中断优先级, PolityHigh,PolityLow
	TIM_InitStructure.TIM_Interrupt = ENABLE;				    //中断是否允许,   ENABLE或DISABLE
	TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;			    //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
	TIM_InitStructure.TIM_ClkOut    = DISABLE;				    //是否输出高速脉冲, ENABLE或DISABLE
	TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000UL);		//初值,
	TIM_InitStructure.TIM_Run       = ENABLE;				    //是否初始化后启动定时器, ENABLE或DISABLE
	Timer_Inilize(Timer2,&TIM_InitStructure);				    //初始化Timer1	  Timer0,Timer1,Timer2,Timer3,Timer4

}

这里没有太多好说的,主要是“TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 1000UL);”这一句,涉及到定时时间,需要大家搞清楚具体的计算方法。根据官方提供的计算公式:

定时器T0工作在1T模式时的溢出率 =(SYSclk)/(65536-[RL_TH0,RL_TL0])

我们可以得到:

[RL_TH0,RL_TL0] = 65536-SYSclk/定时器T0工作在1T模式时的溢出率

也即:

TIM_InitStructure.TIM_Value = 65536- SYSclk/定时器T0工作在1T模式时的溢出率

如果我们要得到1ms的基准定时的话,那么定时的溢出率就是1000了,本例中定时器0和定时器2都设采用的1ms基准定时。

接下来就是app.c里面的,我们需要定义两个变量timer0_cnt和timer2_cnt用来计数,再定义timer0_step和timer2_step两个变量用来作为swtich语句的case值:

u16 timer0_cnt = 0;
u16 timer2_cnt = 0;
u8  timer0_step= 0;
u8  timer2_step= 0;

然后将timer0和timer2的中断函数也都添加到app.c中:

/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR //1ms
{
    timer0_cnt ++;
}

/********************* Timer0中断函数************************/
void timer2_int (void) interrupt TIMER2_VECTOR //1ms
{
    timer2_cnt ++;
}

最后,就只需要在app_run函数里面添加我们需要实现的代码就行了:

void app_run(void)
{
    /*****************************************
        Y00-Y02由定时器0控制实现流水灯效果
    *****************************************/
    
    timer0_step = timer0_cnt/500;
    
    switch(timer0_step)
    {
        case 0:Y00 = OutputT_ON ;Y01 = OutputT_OFF;Y02 = OutputT_OFF;break;
        case 1:Y00 = OutputT_OFF;Y01 = OutputT_ON ;Y02 = OutputT_OFF;break;
        case 2:Y00 = OutputT_OFF;Y01 = OutputT_OFF;Y02 = OutputT_ON ;break;
        default:break;
    }
    if(timer0_step>=3)
    {
        timer0_cnt = 0; 
    }
    
    /*****************************************
        Y03-Y05由定时器2控制实现流水灯效果
    *****************************************/
    
    timer2_step = timer2_cnt/500;
    
    switch(timer2_step)
    {
        case 0:Y03 = OutputT_ON ;Y04 = OutputT_OFF;Y05 = OutputT_OFF;break;
        case 1:Y03 = OutputT_OFF;Y04 = OutputT_ON ;Y05 = OutputT_OFF;break;
        case 2:Y03 = OutputT_OFF;Y04 = OutputT_OFF;Y05 = OutputT_ON ;break;
        default:break;
    }
    if(timer2_step>=3)
    {
        timer2_cnt = 0; 
    }
}

好了,关于使用本节内容笔者就介绍到这里了,有疑问的小伙伴们可以给笔者留言或者直接参与评论,下一节笔者将给大家介绍定时器在其他方面的应用,详见“SYK-0806-A2S1 工业自动化控制之【06-输入信号延时控制输出】”感谢大家的支持!
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-28 23:05:40  更:2021-12-28 23:07:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:30:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码