STC8学习5 - 定时器

这篇具有很好参考价值的文章主要介绍了STC8学习5 - 定时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定时器也可以做为计数器,其实他们本质上的原理是一样的,定时器是计数单片机内部的系统时钟,每1个或者12个时钟脉冲,就加一。计数器则是记录外部输入脉冲。

1. 定时器0有四种工作模式,这里使用的是定时器0的16位可重新装载模式,16位(0x0000~0xFFFF)即可以从0数到65535共计65536个,区别8位(0x00~0xFF)的256个,可重装载指的是初始化设置的起始数,在溢出中断后会重新装载。

TMOD =  0x00;//配置工作模式

2.配置定时器0的工作频率,手上的设备是工作在35MHz,设置1T模式,定时器0也工作35MHz,计数间隔就是1/35 us, 如果设置12T模式,那么定时器0就会工作在35/12 MHz,计数间隔就是12/35 us。

AUXR |= 0x80;     //工作时钟不分频

3. 计算初始置,以定时1ms为例,1ms = 1000us  计数间隔是1/35 us,那么需要1000/(1/35) = 35000个间隔 ,就是说经过35000个计数后,时间间隔为1ms,那么就设置初始置为65536 - 35000 = 30536,转换16进制就是 0x7748 ,按高低为分给TL0,TH0.

    TL0 = 0x48;
    TH0 = 0x77;

4.使能定时中断,还有总中断

    ET0 = 1;  //使能定时器0中断
    EA = 1; //打开总中断

5.开始计数

   TR0 = 1;  //启动定时器0计数

void T0_Lsr(void) interrupt 1
{
  static unsigned  int val;
    val ++;
    if(val == 1000)
    {
      LED_RED = ! LED_RED;
        val = 0;
    }
    
}


void Timer0_Init(void)
{
    TMOD =  0x00;//配置工作模式
    AUXR |= 0x80;     //工作时钟不分频
    TL0 = 0x48;
    TH0 = 0x77;
    TR0 = 1;  //启动定时器0计数
    ET0 = 1;  //使能定时器0中断
    EA = 1; //打开总中断

}


void  main(void)
{
    P0M0 = 0x00;
    P0M1 = 0x00;
  
    Timer0_Init();
    while(1)
    {

6,定时器0和1是在一起,配置起来非常相似。要注意下不同定时器的区别

    TMOD = 0x00是同时配置的定时器0和1的工作模式,都是16位重装模式

    AUXR |= 0x40; 给第七位赋值1,工作时钟不分频  (配置定时器1的时钟位)

    TL1 = 0x48;  一样的1ms配置    (配置定时器1的初始值,刚开始配置错成定时器0了)
    TH1 = 0x77;
    TR1 = 1;  //启动定时器1计数       (配置定时器1)
    ET1 = 1;  //使能定时器1中断
    EA = 1; //打开总中断                    

   再改一下中断序号3

void T1_Lsr(void) interrupt 3
{
  static unsigned  int val;
    val ++;
    if(val == 1000)
    {
      LED_RED = ! LED_RED;
        val = 0;
    }
    
}

 

void Timer1_Init(void)
{
  TMOD =  0x00;//配置工作模式
  AUXR |= 0x40;     //工作时钟不分频
    TL1 = 0x48;
    TH1 = 0x77;
    TR1 = 1;  //启动定时器0计数
    ET1 = 1;  //使能定时器0中断
    EA = 1; //打开总中断

}

7.和定时器0、1相比,定时器2的区别就非常大了。 定时器2,只有16位可重装模式,不用配置模式。但是需要将设备设置为定时器。

AUXR &= ~0X08 ; //设置为定时器

同样要设置工作频率

AUXR |= 0x04;     //工作时钟不分频

注意下面有点恶心的区别就是初始值的格式不一样 ,数字2在中间

   T2L = 0x48;
   T2H = 0x77;

还有就是,使能溢出中断和启动中断都不能直接对T2R和IE2进行设置,需要对整个寄存器进行设置

 AUXR |= 0X10;  //启动定时器2计数
 IE2 |= 0X04;  //使能定时器2中断

void T2_Lsr(void) interrupt 12
{
  static unsigned  int val;
    val ++;
    if(val == 1000)
    {
      LED_RED = ! LED_RED;
        val = 0;
    }
    
}


void Timer2_Init(void)
{
    AUXR &= ~0X08 ; //设置为定时器
  AUXR |= 0x04;     //工作时钟不分频
    T2L = 0x48;
    T2H = 0x77;
    AUXR |= 0X10;  //启动定时器2计数
    IE2 |= 0X04;  //使能定时器2中断
    EA = 1; //打开总中断

}


void  main(void)
{
    P0M0 = 0x00;
    P0M1 = 0x00;
  
    Timer2_Init();
    while(1)
    {

8.定时器3、4和定时器2类似,只是运用的寄存器不一样。因为不能直接按位设置数值,所以配置的时候要很仔细,设置3的时候,就有可能设置到4的位上。(找bug找了快十分钟stc8g定时0.5us,单片机

这里开始配置错了,配置的是T4H,T4L

    T3L = 0x48;
    T3H = 0x77;

这里开始写错了,写的是T3T4M |= 0X80.把T4给启动了

T4T3M |= 0X08;  //启动定时器3计数  T3T4M |= 0X08

没有语法错误,编译都不会报错,但是现象不对。

void T3_Lsr(void) interrupt 19
{
  static unsigned  int val;
    val ++;
    if(val == 1000)
    {
      LED_RED = ! LED_RED;
        val = 0;
    }
    
}


void Timer3_Init(void)
{
  T4T3M |= 0x02;     //工作时钟不分频,T3是定时器
    T4T3M &= ~0X04;
    T3L = 0x48;
    T3H = 0x77;
    T4T3M |= 0X08;  //启动定时器3计数  T3T4M |= 0X08
    IE2 |= 0X20;  //使能定时器3中断  IE2 |= 0X20

    EA = 1; //打开总中断

}


void  main(void)
{
    P0M0 = 0x00;
    P0M1 = 0x00;
  
    Timer3_Init();
    while(1)
    {


        
    }
}文章来源地址https://www.toymoban.com/news/detail-736812.html

到了这里,关于STC8学习5 - 定时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

    什么是定时器:定时器-与非网 上节课的一段代码: TimeCount++然后一个延时1毫秒,每运行1ms,变量就会加一。 系统已经运行了多少个毫秒。 实际使用时的代码如下, 判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。 如果没有松开,会一直死在这一行。所以,

    2024年02月09日
    浏览(45)
  • STC8学习 ——ADC 1

    注意:  uint8_t正常左移8位是0,但如果赋值给uint16_t就占uint16_t中高8位,要保留数据就要把八位数据左移8位后赋给16数据,继续赋给8位数据,结果就是0 注意:通过ADC采集数据并输出电压的原理是  电压和对应ADC端口采集结果的比值是恒定的 ADC第15通道采集的内部参考电压值

    2023年04月24日
    浏览(60)
  • 单片机读/写端口或引脚区别及具体1个用例(一种基于STC8G1K08A最小8脚嵌入式单片机LED安全夜灯方案)

    51单片机读引脚和读端口测试总结_单片机怎么读取引脚电平_爱嘟嘟的小屁孩的博客-CSDN博客 近期看了几篇有关单片机读/写端口或引脚的区别的文章,其中上面引用本CSDN的这篇文章,总结的2点感觉还不错,先引用一下: 1. 51单片机里对某一个I/O口进行读--改--写(例如上面的

    2024年02月08日
    浏览(40)
  • 【STC8】热启动&&串口指令下载

      在目标开发板没有装载自动下载电路的时候,往往需要冷启动,也就是需要手动开关电源,来达到单片机复位下载。当然还有一种方法是热启动,通过串口接收到自定义的指令后,软件执行复位下载。这就是本文介绍的内容。 开发板:STC8A8K64S4A12开发板(用的是STC8A8K64

    2024年02月06日
    浏览(70)
  • STC15W104 定时器实现灯的闪烁(定时器原理讲解)

    STC15W104单片机共有2个定时器,分别为定时器0、定时器2。 定时器是单片机中的一种常用外设,用于在一定时间间隔内产生中断。 定时器通常用于计时、测量时间间隔、生成PWM信号等应用中。 在STC15W104单片机中,定时器可以被配置为定时器/计数器模式。 在定时器模式下,定

    2024年02月13日
    浏览(29)
  • STC89C52定时器的简介

    针对于STC89C52RC而言,这个芯片内部包含了三个定时器——T0、T1和T2,他们的中断优先级分别是1、3和5。 怎么还有一个定时器2呢?博主也是今天整理这篇博客的时候,翻阅芯片手册才发现的。如果说,我们经常用的T0和T1叫做通用定时器的话,那么T2我愿称之为高级定时器。今

    2024年02月05日
    浏览(34)
  • STC8比较器功能案例介绍

    📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》 📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定)上。 📑实验说明 🌿采用10K电位器,0 - 5V可调电压范围,可调端接到P37外部端口引

    2024年02月08日
    浏览(26)
  • 单片机STC8H入门

      STC8H系列单片机是不需要外部晶振和外部复位的单片机。在相同的工作频率下,STC8H系列单片机比传统的8051快约12倍,是宽电压/高速/高可靠/低功耗/强抗静电/较强干扰的新一代8051单片机。 用常用的C51版的keil安装,可以进入下面链接下载: https://download.csdn.net/download/wei

    2024年02月02日
    浏览(33)
  • STC89C52RC的定时器/计数器

    目录 一、STC89C52RC的定时器/计数器 二、定时器/计数器的工作方式如何选择 三、使用Timer0实现1秒定时 四、使用Timer1实现计数器功能 STC89C52RC芯片内置了2个定时器/计数器(Timer0和Timer1),这两个模块可以用于实现定时和计数功能。 这两个定时器/计数器模块的主要特性如下:

    2024年02月07日
    浏览(34)
  • 『STC8H8K64U』概述

            大家好,我是初尧.C。希望看完这篇文章对你能有所帮助,不足之处请指正~📝         本文由初尧.C 原创 CSDN首发 如需转载还请通知🚫         📌无端坠入凡生梦. 却惹三千烦恼丝📌         欢迎各位💘点赞+收藏+留言💖         系列专栏― STC8H8K64U🎨     

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包