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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STC15W204S-35I SOP16 - 定时器 2:16 位自动重装定时器 -> 正文阅读

[嵌入式]STC15W204S-35I SOP16 - 定时器 2:16 位自动重装定时器

定时器 2

原理图

在这里插入图片描述

示例

配置定时器 2:

  • 16 位自动重装定时器;
  • 时钟源等于内部系统时钟;
  • 允许其在计数溢出之后请求中断;
  • 每次中断反转一次 P1.1 的输出电平。

main.c 文件:

/**
 * STC15W204S-35I SOP16
 * Timer 2 - 16 bit, auto-reload
 */

/**
 * Interrupt Registers Definition
 */
sfr IE = 0xA8; /* Interrupt Enable Register */
sfr IE2 = 0xAF; /* Interrupt Enable 2 Register */

/**
 * Interrupt Registers Bits Definition
 */
/** IE */
#define GLOBAL_IE_EA    (0x80)
/** IE2 */
#define T2_IE2_ET2      (0x04) /* Timer 2 interrupt enable */


/**
 * Timer 2 Registers Definition
 */
sfr T2L = 0xD7; /* Timer 2 Counter Low Register */
sfr T2H = 0xD6; /* Timer 2 Counter High Register */
sfr AUXR = 0x8E; /* Auxiliary Register */

/**
 * Timer 2 Registers Bits Definition
 */
/** AUXR */
#define T2_AUXR_T2R     (0x10) /* Timer 2 - Run Control */
#define T2_AUXR_T2CT    (0x08) /* Timer 2 - Counter or Timer Selection */
#define T2_AUXR_T2x12   (0x04) /* Timer 2 - Speed Control */


/**
 * Port 1 Registers Definition
 */
sfr P1 = 0x90; /* Port 1 Register */

sbit LED = P1^1;


void main() {
    AUXR &= ~T2_AUXR_T2CT; // T2 acts as a timer
//    AUXR |= T2_AUXR_T2x12; // T2's clock source is divided by 1
    
    T2H = (65536 - 10000) >> 8; // 8 MSB
    T2L = (65536 - 10000) & 0xFF; // 8 LSB
    
    AUXR |= T2_AUXR_T2R; // T2 run
    
    IE2 |= T2_IE2_ET2; // Enable T2 overflow interrupt request
    
    IE |= GLOBAL_IE_EA; // Enable global interrupt
    
    while(1) {}
}

void timer2InterruptService() interrupt 12 {
    LED = !LED;
}

使用 STC-ISP 下载程序,频率设为 12.000 MHz

注意:虽然 STC-ISP 提示下载失败!但是,我发现单片机仍然按照我的设想执行程序,这里可能是 STC-ISP 有问题。

在这里插入图片描述

T2 的时钟源进行 12 分频(AUXR &= ~T2_AUXR_T2x12;),测量 P1.1 输出:

注意:虽然在原理图中,我给单片机的电源符号是 5V,但是在实际测试中,我使用的是 USB 转串口模块上提供的 3.3V(实测没有 3.3V),这并不妨碍单片机正常运行。

在这里插入图片描述

不对 T2 的时钟源进行分频(AUXR |= T2_AUXR_T2x12;),测量 P1.1 输出:

在这里插入图片描述

模块化处理

把所有的代码写在一个 main.c 文件是非常不好的习惯,我们需要将上例中的定时器 2 模块化处理:

  • 将 6 ~ 40 行提取到 stc15w204s.h 头文件中;
  • 将 46 ~ 54 行封装成函数,在 timer2.c 文件中实现,在 timer2.h 头文件中声明。

工程结构:

在这里插入图片描述

stc15w204s.h 头文件:

  • 声明有关定时器 2 的特殊功能寄存器;
  • 声明有关定时器 2 的特殊功能寄存器的位掩码;
  • 以及其他。
#ifndef __STC15W204S_H
#define __STC15W204S_H


/**
 * Interrupt Registers Definition
 */
sfr IE = 0xA8; /* Interrupt Enable Register */
sfr IE2 = 0xAF; /* Interrupt Enable 2 Register */

/**
 * Interrupt Registers Bits Definition
 */
/** IE */
#define GLOBAL_IE_EA    (0x80)
/** IE2 */
#define T2_IE2_ET2      (0x04) /* Timer 2 interrupt enable */


/**
 * Timer 2 Registers Definition
 */
sfr T2L = 0xD7; /* Timer 2 Counter Low Register */
sfr T2H = 0xD6; /* Timer 2 Counter High Register */
sfr AUXR = 0x8E; /* Auxiliary Register */

/**
 * Timer 2 Registers Bits Definition
 */
/** AUXR */
#define T2_AUXR_T2R     (0x10) /* Timer 2 - Run Control */
#define T2_AUXR_T2CT    (0x08) /* Timer 2 - Counter or Timer Selection */
#define T2_AUXR_T2x12   (0x04) /* Timer 2 - Speed Control */


/**
 * Port 1 Registers Definition
 */
sfr P1 = 0x90; /* Port 1 Register */


typedef enum {
    FALSE = 0,
    TRUE = !FALSE
} boolean;


#define enableInterrupts(enable)    if(enable) {                \
                                        IE |= GLOBAL_IE_EA;     \
                                    } else {                    \
                                        IE &= ~GLOBAL_IE_EA;    \
                                    }                           

#endif

timer2.h 头文件:

#ifndef __STC15W204S_TIMER_2_H
#define __STC15W204S_TIMER_2_H


#include "stc15w204s.h"


typedef enum {
    TIMER2_PRESCALER_DIVIDED_BY_1   = ((unsigned char)0x00),
    TIMER2_PRESCALER_DIVIDED_BY_12  = ((unsigned char)0x01)
} Timer2Prescaler;


typedef struct {
    void (*asTimer)(boolean);
    void (*setCounter)(unsigned int);
    void (*setTimer)(unsigned int);
    void (*setPrescaler)(Timer2Prescaler);
    void (*start)(boolean);
    void (*enableInterrupt)(boolean);
} Timer2;


extern Timer2 timer2;


/**
 * First call to this function to initialize
 * the <code>timer2</code> variable.
 */
void Timer2Constructor();


#endif

timer2.c 文件:

#include "timer2.h"


Timer2 timer2;


/**
 * If true, timer 2 acts as timer,
 * otherwise it acts as counter.
 */
void asTimer(boolean isTimer) {
    if(isTimer) {
        AUXR &= ~T2_AUXR_T2CT;
    } else {
        AUXR |= T2_AUXR_T2CT;
    }
}

/**
 * Set the initial value of the counter
 * or the timer.
 */
void setCounter(unsigned int counter) {
    T2H = (counter) >> 8;
    T2L = (counter) & 0xff;
}

/**
 * Set the prescaler of the timer 2.
 */
void setPrescaler(Timer2Prescaler prescaler) {
    switch(prescaler) {
        case TIMER2_PRESCALER_DIVIDED_BY_1:
            AUXR |= T2_AUXR_T2x12;
            break;
        case TIMER2_PRESCALER_DIVIDED_BY_12:
            AUXR &= ~T2_AUXR_T2x12;
            break;
    }
}

/**
 * If true, start the timer 2 to run,
 * othewise, stop.
 */
void start(boolean start) {
    if(start) {
        AUXR |= T2_AUXR_T2R;
    } else {
        AUXR &= ~T2_AUXR_T2R;
    }
}

/**
 * If true, enable timer 2 overflow
 * interrupt request, othewise, disable.
 */
void enableInterrupt(boolean enable) {
    if (enable) {
        IE2 |= T2_IE2_ET2;
    } else {
        IE2 &= ~T2_IE2_ET2;
    }
}

/**
 * First call to this function to initialize
 * the <code>timer2</code> variable.
 */
void Timer2Constructor() {
    timer2.asTimer = &asTimer;
    timer2.setCounter = &setCounter;
    timer2.setTimer = &setCounter;
    timer2.setPrescaler = &setPrescaler;
    timer2.start = &start;
    timer2.enableInterrupt = &enableInterrupt;
}

将定时器 2 的功能模块化处理之后,main.c 文件如下:

/**
 * STC15W204S-35I SOP16
 * Timer 2 - 16 bit, auto-reload
 */

#include "timer2.h"


sbit LED = P1^1;


void main() {
    Timer2Constructor();
    timer2.asTimer(TRUE);
    timer2.setPrescaler(TIMER2_PRESCALER_DIVIDED_BY_1);
    timer2.setTimer(65536 - 10000);
    timer2.start(TRUE);
    timer2.enableInterrupt(TRUE);
    
//    IE |= GLOBAL_IE_EA; // Enable global interrupt
    enableInterrupts(TRUE);
    
    while(1) {}
}

void timer2InterruptService() interrupt 12 {
    LED = !LED;
}

参考

宏晶科技 STC - STC15 系列单片机器件手册

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

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:46:52-

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