单片机计时器详解_单片机计时器中断能计时多久 - CSDN
  • 单片机(AT89C51)定时/计数器详解及其实验案例

    千次阅读 多人点赞 2020-04-21 16:47:35
    单片机(AT89C51)定时/计数器及其实验案例 目录: 定时/计数器应用范围 定时/计数器概述 定时/计数器的结构和工作原理 定时/计数器的控制寄存器 定时/计数器的四种工作方式 定时/计数器的应用 定时/计数器...

     

     


    目录

    定时/计数器应用范围

    定时/计数器概述

    定时/计数器的结构和工作原理

     定时/计数器的结构:

    定时/计数器的工作原理:

    定时/计数器的控制寄存器

    定时/计数器方式寄存器TMOD

     定时/计数器控制寄存器TCON

    定时/计数器的四种工作方式

    方式0

    方式1

    方式2

    方式3

     总结:

    定时/计数器的应用

    计算定时/计数初值

    定时/计数器应用步骤

    定时/计数器的案例分析(见下一篇,尽请期待!!!)



    定时/计数器应用范围

     定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制延时频率测量脉宽测量信号发生信号检测等。此外,定时/计数器还可作为串行通信中波特率发生器。

    定时/计数器概述

    1. 80C51单片机内部有两个定时/计数器T0T1其核心是计数器,基本功能是加1
    2. 对外部事件脉冲(下降沿)计数,是计数器;对片内机周脉冲计数,是定时器。
    3. 计数器由二个8位计数器组成。
    4. 定时时间和计数值可以编程设定,其方法是在计数器内设置一个初值,然后加1计满后溢出。调整计数器初值,可调整从初值到计满溢出的数值,即调整了定时时间和计数值。
    5. 定时/计数器作为计数器时,外部事件脉冲必须从规定的引脚(P3.4,P3.5)输入。且外部脉冲的最高频率不能超过时钟频率的1/24

    定时/计数器的结构和工作原理

     定时/计数器的结构

    8051单片机内部有两个16位的可编程定时/计数器,称为定时器0T0)和定时器1(T1),可编程选择其作为定时器用或作为计数器用。其逻辑结构如下图所示:

    定时/计数器的工作原理

    可用一个简单的框图构造它的模型 :N位计数器构成了电路的核心。定时和计数两种方式的区别在于计数器的脉冲来源.初值寄存器是用来设定“定时/计数的具体参数”

    注:

    1) 何时控制启动计数?                               启动控制(TR)                       

    2) 如何控制定时还是计数?                        定时/计数控制C/T来控制(后面会介绍)

    3) 如何控制定时/计数的长短?                   N位初值寄存器(设定初值)

    定时/计数器的控制寄存器

    参与定时器/计数器管理的SFRTMODTCON  

    定时/计数器方式寄存器TMOD

    TMOD

    4位控制T1

    4位控制T0

    门控位

    计数/定时

    方式选择

    工作方式

    选择

    门控位

    计数/定时

    方式选择

    工作方式

    选择

    G

    C / T

    M1

    M0

    G

    C / T

    M1

    M0

     M1-M0:工作方式的选择位

    M1M0

    工作方式

    功能

    00

    方式0

    13位计数器

    01

    方式1

    16位计数器

    10

    方式2

    两个8位计数器,初值自动装入

    11

    方式3

    两个8位计数器,仅适用T0

     C/T:计数/定时方式选择位

    •    C/T=1,计数工作方式,对外部事件脉冲计数,用作计数器。
    •    C/T=0,定时工作方式,对片内机周脉冲计数,用作定时器。

    GATE:门控位 

    •    GATE=0,运行只受TCON中运行控制位TR0/TR1的控制。
    •    GATE=1,运行同时受TR0/TR1和外中断输入信号的双重控制。只有当INT0/INT1=1TR0/TR1=1,T0/T1才能运行。

         注:TMOD字节地址89H,不能位操作,设置TMOD须用字节操作指令。

         eg:TMOD=0XA6              0XA6 --->1010 0110    说明:高四位(T1双重控制,定时工作方式,并且为方式2)低四位(T0只              受TCON中运行控制位TR0/TR1的控制,计数工作方式,并且方式2)

    说明:不管是定时还是计数工作方式,定时器T0T1在对内部时钟或外部脉冲计数时,不占用CPU时间,除非产生溢出时才可能中断CPU的当前操作。

     定时/计数器控制寄存器TCON

    TCON

     

    TCON

    T1

    中断标志

    T1

    运行标志

    T0

    中断标志

    T0

    运行

    标志

    INT1

    中断

    标志

    INT1

    触发

    方式

    INT0

    中断

    标志

    INT0

    触发

    方式

    位名称

    TF1

    TR1

    TF0

    TR0

    IE1

    IT1

    IE0

    IT0

     

    TCON4位与外中断INT1,INT0有关,已在中断中叙述。不清楚可以查看上一篇blog(单片机(AT89C51)中断系统详解和中断系统应用实验

    高4位与定时/计数器T0、T1有关。

    TF1: 定时/计数器T1溢出(中断)标志。

    TF0: 定时/计数器T0溢出(中断)标志。

    TR1: 定时/计数器T1运行控制位。TR1=1,T1运行;  TR1=0,T1停止

    TR0: 定时/计数器T0运行控制位。TR0=1,T0运行;  TR0=0,T0停止。

    注:TCON的字节地址为88H,每一位有位地址,均可位操作。


    定时/计数器的四种工作方式

    在TMOD的M1-M0中已经提到,现在对此进行深入的探讨 

    方式0

    当TMOD中的M0=0,M1=0时,为13位计数或定时方式。其中 TLi 使用低5位

    方式1

    TMOD中的M0=1,M1=0时,为16位计数或定时方式。

    方式2

    TMOD中的M0=0,M1=1时,为8位自动重装初值计数或定时方式。

    在方式2时,将16位计数器分成两个8位的计数器,THi 用来存放初值,当计数器溢出时,一方面TFi1,申请中断,一方面自动将TH的值装入TL

    方式3

    T0 在方式3下时,T1作为波特率发生器,T1的控制位TF1TR1出借给T0使用,而T0则构成两个独立的结构,其中TL0构成一个完整的8位定时器/计数器,而TH0则是一个仅能对晶振频率12分频的定时器。

    T1作波特率发生器时,可以设置成方式012,用在任何不需要中断控制的场合。一般作波特率时常设成方式2的自动重装模式。

     总结:

    M1M0

    方式

    计   数   器   配   置

    0   0

    0

    TLx5位与THx8位构成13位计数器

    0  1

    1

    TLxTHx构成16位计数器

    1  0

    2

    自动重装初值(THx)8(TLx溢出时)计数器

    1  1

    3

    仅用于T0,分成两个8位计数器,T1停止计数

                 


    定时/计数器的应用

    计算定时/计数初值

    定时/计数初值计算公式:

    其中:

    N与工作方式有关:     方式0,N=13;   方式1,N=16;   方式23,N=8

    机周时间与主振频率有关:机周时间=12/fosc       eg:fosc=12MHZ时,1机周=1uS; fosc=6MHZ1机周=2uS

     

    例:定时器工作方式0,晶振频率6MHz,定时1ms,初值为?

           T=2^13-1ms/2us= 8192-500=7692=1 1110 0000 1100    所以:TLi(低五位)=01100                    THi(高八位)=11110000

           工作方式1,频率12MHz,定时25ms,初值为?

           T=2^16-25ms/1us=65536-25000=9E58                             所以:TLi(低八位)=0101 1000             THi(高八位)=1001 1110  

           晶振频率12MHz时,工作方式2的最长定时时间为多少毫秒?四种工作方式最长定时时间分别为多少毫秒?

          工作方式2,3--->八位                          最长时间=1us*2^8=0.256ms

          工作方式1     ---->16位                         最长时间=1us*2^16=65.536ms   

          工作方式0     ---->13位                         最长时间=1us*2^13=8.192ms 

     

    定时/计数器应用步骤

    ⑴ 合理选择定时/计数器工作方式

    ⑵ 计算定时/计数器定时初值(按上述公式计算)

    编制应用程序

        ①定时/计数器的初始化

           包括定义TMOD、写入定时初值、设置中断系统、启动定时/计数器运行等。

        ②正确编制定时/计数器中断服务程序

            注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。

     


    定时/计数器的案例分析(见下一篇,尽请期待!!!https://blog.csdn.net/weixin_45629315/article/details/105657169

     

     

    展开全文
  • 单片机mcu—time定时器详解

    千次阅读 2017-08-25 14:47:51
    其中看门狗定时器和SysTick定时器本篇笔记阐述,这里主要记下对平时使用定时器作用的计时计数器的一些自己的理解。  按照参考手册中的定义 高级定时器 通用定时器 基本定时器,这三个定时器成上下级的关系,

    STM32定时器分了好几个类别,各个类别针对功能作用都不大相同。

    分别有: 1.高级定时器 、2.通用定时器、 3.基本定时器、 4.看门狗定时器 、 5.SysTick定时器 

    其中看门狗定时器和SysTick定时器本篇笔记阐述,这里主要记下对平时使用定时器作用的计时计数器的一些自己的理解。 
    按照参考手册中的定义 高级定时器 通用定时器 基本定时器,这三个定时器成上下级的关系,即基本定时器有的功能通用定时器都有,而且还增加了向下、向上/向下计数器、PWM生成、输出比较、输入捕获等等功能;而高级定时器又包含了通用定时器的所有功能,另外还增加了死区互补输出、刹车信号、加入重复计数器等等。(这里等等功能请参考《STM32参考手册》) 
          所以学习STM32 定时器实际就是学习一下高级定时器,然后适当的删减后就是后面的两种定时器了。 
    假若不涉及输出输入,定时器的最基本用法就是计数定时作用了本篇笔记主要针对这部分的理解所写下的。 

    高级定时器中一共有20个寄存器: 

    TIMx_CR1、TIMx_CR2、TIMx_SMCR、TIMx_DIER、TIMx_SR、TIMx_EGR、TIMx_CCMR1、TIMx_CCMR2、 
    TIMx_CCER、TIMx_CNT、TIMx_PSC、TIMx_ARR、TIMx_RCR、TIMx_CCR1、TIMx_CCR2、TIMx_CCR3、 
    TIMx_CCR4、TIMx_BDTR、TIMx_DCR、TIMx_DMAR 
    好吧一堆寄存器光看都看到眼花缭乱了,当然不是所有寄存器都涉及到才能让定时器工作的,例如最基本的定时功能所涉及的只有几个与时基功能相关的寄存器,TIMx_CNT(计数器寄存器)、TIMx_PSC(预分频器寄存器)、TIMx_ARR(自动装载寄存器)、TIMx_RCR(重复次数寄存器)。参考手册中有那么 衣服定时器的框图。这几个寄存器的关系如图所示的: 

    CK_PSC这根时钟线上的时钟源的选择,即给定时器计数计时的时钟源的输入方式,有四种方式,分别是内部时钟,外部时钟模式1,外部时钟模式2,内部触发。这部分日后再说,这里暂且使用最常用的内部时钟方式,既是当内部时钟为72MHz 的内部时钟源。 
    如图所示的,时钟源首先进入预分频器,然后再进入预先装入自动重装载寄存器的计数器中,当计数器溢出时产生一次中断和一次事件更新。除了多了一个PSC,其他的基本和51单片机很相似,初次看参考手册中的功能描述中出现了好多次“更新事件(UEV)”。这究竟是怎么的一样东西呢? 在这里有个新概念叫“影子寄存器”,在上图中,可以看到PSC、ARR、REP(重复计数器中的低八位)这三个寄存器框框下都有个黑影,每次这三个寄存器就是影子寄存器,如果看到参考手册全图中还可以看到另外还有几个框框下也有阴影部分的,这几个寄存器也是影子寄存器。何谓影子寄存器呢,例如PSC寄存器可以理解为有两个,一个是用户可以访问到的寄存器,可读可写,另一部分就是客户访问不到的但其装载值和实际寄存器是密切关联的,当程序在运行中改写PSC 这时候影子寄存器的作用就体现了,因为立刻写入的值可能会大于或小于目前正在运行的寄存器中的数值,而真实在运行时候的正是这个影子寄存器中的值,而程序写入的是可访问的寄存器,只有当产生一个更新事件的时候影子寄存器才会读入访问寄存器中的值,这样就可以防止突然修改而产生的非正常中断或不会中断等异常问题。当然在控制器CR1中控制这个影子寄存器是否起作用,不起作用的话就是立即写入这个数值到寄存器中。

    另外高级定时器中还有RCR重复次数寄存器这个,也是比较简单的事件更新(UEV) 都是在RCR为0的情况下产生计数器溢出而产生的,当RCR中不为0的时候计数器溢出只会使得重复次数寄存器递减而不会产生UEV,这样就可以使得定时器的定时情况得以延长,而相当于有16位的分频器,16位的计数器,再加入16位的重复次数,一共48位的计数定时器。详细看参考手册,这个很好理解。 

        基本的基时单元就是上面提及的这几个,下面看看3.0库是如何实习的基本使用

    1. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 

    2.         
    3.       TIM_DeInit(TIM2);                                           //重新将Timer设置为缺省值 
    4.         
    5.       TIM_InternalClockConfig(TIM2);                              //采用内部时钟给TIM2提供时钟源       
    6.       TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1;            //预分频系数为36000-1,这样计数器时钟为72MHz/36000 = 2kHz        
    7.       TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割       
    8.       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器模式为向上计数模式        
    9.       TIM_TimeBaseStructure.TIM_Period = 2000 - 1;           //设置计数溢出大小,每计2000个数就产生一个更新事件 
    10.       TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);         //将配置应用到TIM2中 
    11.       TIM_ClearFlag(TIM2, TIM_FLAG_Update);                  //清除溢出中断标志   
    12.         
    13.       TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                //开启TIM2的中断 
    14. 以上是一个最基本的定时器配置的代码,载自网上被转载无数次的地方…… 
    15. 中断函数自己按照需求写,这里不多说。 
    16. 在库中的初始化函数和初始化数据类型有3类,TIM_TimeBaseInitTypeDef、TIM_OCInitTypeDef、TIM_ICInitTypeDef 
    17. 与基时参数相关的数据类型是TIM_TimeBaseInitTypeDef 

    18. typedef struct 

    19.   uint16_t TIM_Prescaler;     

    20.   uint16_t TIM_CounterMode;       
    21.   uint16_t TIM_Period;           

    22.   uint16_t TIM_ClockDivision;    
    23.   uint8_t TIM_RepetitionCounter; 
    24. } TIM_TimeBaseInitTypeDef;
    以上是从库stm32f10x_tim.h中 截取的代码,整体的数据结构可以中这段注释中得知,不懂E文的要么翻字典要么翻库函数中文翻译 

    版本(当然这个是2.0的库,有部分会和3.0后的版本很不相同),这部分的数据类型还是很一样的,不多说。  
    接着就是TIM_TimeBaseInit()这个函数了,在stm32f10x_tim.c的224行中 

    1. void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct) 

    2.   uint16_t tmpcr1 = 0; 

    3.   /* Check the parameters */ 
    4.   assert_param(IS_TIM_ALL_PERIPH(TIMx));  
    5.   assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct->TIM_CounterMode)); 
    6.   assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct->TIM_ClockDivision)); 

    7.   tmpcr1 = TIMx->CR1;   

    8.   if((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM2) || (TIMx == TIM3)|| 
    9.      (TIMx == TIM4) || (TIMx == TIM5))  
    10.   { 
    11.     /* Select the Counter Mode */ 
    12.     tmpcr1 &= (uint16_t)(~((uint16_t)(TIM_CR1_DIR | TIM_CR1_CMS))); 
    13.     tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_CounterMode; 
    14.   } 
    15.    
    16.   if((TIMx != TIM6) && (TIMx != TIM7)) 
    17.   { 
    18.     /* Set the clock division */ 
    19.     tmpcr1 &= (uint16_t)(~((uint16_t)TIM_CR1_CKD)); 
    20.     tmpcr1 |= (uint32_t)TIM_TimeBaseInitStruct->TIM_ClockDivision; 
    21.   } 

    22.   TIMx->CR1 = tmpcr1; 

    23.   /* Set the Autoreload value */ 
    24.   TIMx->ARR = TIM_TimeBaseInitStruct->TIM_Period ; 
    25.    
    26.   /* Set the Prescaler value */ 
    27.   TIMx->PSC = TIM_TimeBaseInitStruct->TIM_Prescaler; 
    28.       
    29.   if ((TIMx == TIM1) || (TIMx == TIM8)|| (TIMx == TIM15)|| (TIMx == TIM16) || (TIMx == TIM17))   
    30.   { 
    31.     /* Set the Repetition Counter value */ 
    32.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter; 
    33.   } 

    34.   /* Generate an update event to reload the Prescaler and the Repetition counter 
    35.      values immediately */ 
    36.   TIMx->EGR = TIM_PSCReloadMode_Immediate;            
    37. }
    可以看3.0后的函数里把所有的TIMx都加入一个函数里面做判断了,不需要和2.0的区分TIM1和TIM 两类函数,比较其基本操作都一样无非就是多了一个两个寄存器而已。
    转自芯片之家

    展开全文
  • 51单片机串口通讯详解

    千次阅读 2019-11-04 22:26:31
    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不...

    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
    由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。
    1.串口配置

    51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。
    (1)状态控制寄存器 SCON
    SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:
    在这里插入图片描述
    SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。
    在这里插入图片描述
    (2)电源与波特率控制寄存器
    控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:
    在这里插入图片描述
    仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按 字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波特率加倍。
    (3)定时器控制模式寄存器
    TMOD是定时器、计数器模式控制寄存器,它是一个逐位定义的8为寄存器,但只能使用字节寻址
    在这里插入图片描述
    当串口工作在工作方式0和2是,波特率固定,方式0时fosc/12;方式2时fosc/32或fosc/64(根据SMOD判断)。当串口工作在方式1时,波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)),X是初值;C/T#为定时器和计数器选择位,0为定时器,1为计数器

    2.串口通用程序
    为了有较好的通用性,将串口程序配置为一个H文件和C文件,往后只要开发51单片机程序,都可以将该两个文件复制在工程中直接使用,无须修改。
    (1)uart.H

    #ifndef _UART_H_
    #define _UART_H_
    
    #include "reg52.h"
    
    void UartInit(void);
    void Send_string(unsigned char *c);
    void Send_Data(unsigned char DAT);
    
    #endif
    

    (2)uart.c

    #include "uart.h"
    
    //串口初始化
    void UartInit(void)
    {
    	/*串口初始化 */
    	TMOD = 0x20;	  //定时器T1使用工作方式2
    	SCON = 0x50;	  //工作方式1,,允许接收   
    	PCON = 0x10;
    	TH1 = 253;        // 设置初值,波特率9600bps
    	TL1 = 253;
    	TR1 = 1;          // 开始计时	
    	ES = 1;         //打开接收中断
    	EA = 1;           // 打开所以中断   
    	TI = 0;
    	RI = 0;
    }
    
    void Send_Data(unsigned char DAT)
    {
    	ES = 0;
    	TI=0;
    	SBUF = DAT ;
    	while(TI==0);
    	TI=0;
    	ES = 1;
    }
    
    void Send_string(unsigned char  *c)
    {
    	while(*c != '\0')
    	{
    		Send_Data(*c++);
    	}	
    }
    
    void RSINTR() interrupt 4 using 2
    {
    	EA=0;
    	if(TI==1) //发送中断	  
    	{
    		TI=0;
    	}
    
    	if(RI==1)	 //接收中断		  
    	{	
    
    		RI=0;								 
    
    	}
    	EA=1;
    }
    
    

    如需串口参考例程, 请关注公众号,首页回复“串口”获取资料
    在这里插入图片描述

    展开全文
  • 系统的功能分析 (末尾附文件) 框架图: 原理图: 声光报警电路(低电平有效)设计...本系统所采用的报警模块为5V有源蜂鸣模块,电路中采用三极管9012来驱动,只要单片机引脚为低电平,蜂鸣就会鸣叫报警,反之则

    系统的功能分析

    (末尾附文件)
    框架图:
    在这里插入图片描述

    原理图:

    在这里插入图片描述

    声光报警电路(低电平有效)设计
    有源蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
    LED灯即发光二极管,它是半导体二极管的一种,可以把电能转化成光能。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。
    本系统所采用的报警模块为5V有源蜂鸣器模块,电路中采用三极管9012来驱动,只要单片机引脚为低电平,蜂鸣器就会鸣叫报警,反之则不鸣叫,可以通过控制单片机相关引脚方波输出形式控制蜂鸣器的鸣叫方式。同时,将LED灯串联个电阻与蜂鸣器并联,串联电阻为限流电阻,当蜂鸣器间隔鸣叫的时候,LED指示灯将闪烁报警。可以通过控制单片机引脚方波输出形式控制蜂鸣器的鸣叫方式。电路简单可靠,不需额外占单片机的I/O口。其电路原理图如下图所示。

    在这里插入图片描述
    4位共阳数码管驱动电路设计
    数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色。
    led数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。本设计中选择4位共阳数码管来显示数据。4位共阳数码管一共12个引脚,4个位选,8个段选。1、2、3、4、5、7、10、11为段选,6、8、9、12为四个数码管的位选。每个位选通过三极管进行驱动,在本设计中,Q1-Q5三极管均为驱动电路。R3-R5均为限流电阻,保护三极管。当单片机控制位选的引脚为低电平时,则相关位的数码管可以亮,否则,相关位的数码管不亮。单片机控制段选的引脚通过高低电平的组合即可显示不同的数据信息。其具体电路原理图如下图所示。
    在这里插入图片描述

    系统软件设计

    在这里插入图片描述
    部分代码

    #include <reg52.h>	         //调用单片机头文件
    #define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
    #define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535
    #include <intrins.h>
    
    //数码管段选定义      0     1    2    3    4    5	6	 7	  8	   9	
    uchar code smg_du[]={0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,
    					0x60,0x25,0x39,0x26,0x31,0x71,0xff};	 //断码
    
    //数码管位选定义
    sbit smg_we1 = P3^4;	    //数码管位选定义
    sbit smg_we2 = P3^5;
    sbit smg_we3 = P3^6;
    sbit smg_we4 = P3^7;
    
    uchar dis_smg[8] =  {0x90,0xf5,0x1c,0x34,0x71,0x32,0x12,0xf4};	//显示内容
    bit flag_500ms;
    sbit beep = P2^3;
    uchar a_a;
    uchar menu_1;	   	//设置参数用
    
    uchar fen,miao,weimiao;     		// 倒计时数
    uchar num_value;    // 用做中间的变量
    bit flag_num_en ;   // 倒计时器开始计时使能标志位
    uchar set_fen = 30; // 设置倒计时数的启始值 
    uchar set_miao = 0; // 设置倒计时数的启始值 
    
    /***********************1ms延时函数*****************************/
    void delay_1ms(uint q)
    {
    	uint i,j;
    	for(i=0;i<q;i++)
    		for(j=0;j<120;j++);
    }
    
    
    /***********************数码位选函数*****************************/
    void smg_we_switch(uchar i)	   //选择i位单独显示
    {
    	switch(i)
    	{
    		case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
    		case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
    		case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
    		case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
    	}	
    }
    
    
    /*************定时器0初始化程序***************/
    void time_init()	  
    {
    	EA   = 1;	 	  //开总中断
    	TMOD = 0X01;	  //定时器0、工作方式1
    	ET0  = 1;		  //开定时器0中断 
    	TR0  = 1;		  //允许定时器0定时
    }
    
    /***********************数码显示函数*****************************/
    
    void display()
    {
    	uchar i;
    	for(i=0;i<4;i++)
    	{					          
    		P1 = 0xff;			 //消隐 
    		smg_we_switch(i);	 //位选
    		P1 = dis_smg[i];	 //段选	     
    		delay_1ms(1);			 
    	}	
    }
    
    

    .

    链接:https://pan.baidu.com/s/1_0cRVISgIYQkS2gSAQSRZA
    提取码:n4r2

    .

    展开全文
  • 51单片机模拟音乐详解

    万次阅读 多人点赞 2017-11-12 18:31:14
    想用蜂鸣模拟出音乐,就需要先把乐谱转换为十六进制数,简单看来音乐就是高低不一,长短不一声的音间隔不同时间的排列组合,所以乐谱改编成十六进制就是三个要素:音符即DO,RE,MI,FA,SO,LA,SI这七个不同音符,音高...
  • 单片机学习(三)定时器篇

    千次阅读 2018-07-29 19:03:50
    一、定时器介绍  定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和...
  • 51单片机的定时/计数器

    千次阅读 2018-09-18 22:54:08
    51单片机的定时/计数器 实现LED灯闪烁,代码如下: #include &lt;reg51.h&gt; //51单片机头文件 sbit LED = P0^0; //定义特殊寄存器p0.0;注意:sbit 必须小写、P 大写! void main() { unsigned int i; //...
  • PIC 系列单片机内部配备有数量不等的定时器/计数器模块:例如PIC17CX系列和PIC18CX系列都都配置了4个定时器/计数器模块;而PIC16F87X系列都配置了3个定时器/计数器模块,分别记为TMR0、TMR1和TMR2。 TMR0、TMR1...
  • 单片机定时器TMOD与TCON详解

    千次阅读 2019-12-03 23:22:01
    TMOD:定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 D7 D6 D5 D4 D3 D2 ... ...
  • 详解单片机各大分类

    千次阅读 2020-03-02 10:42:20
    单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多...
  • 51单片机-定时器/计数器

    千次阅读 2016-05-29 11:36:04
    定时器顾名思义就是设定一段时间,这段时间到了之后可以触发中断,在中断中处理我们的任务。定时器还有一个功能就是计数,每次一个出发定时器内部的TH.TL就会加一,如果加满了就会产生溢出中断。...
  • 学习笔记之-51单片机定时计数器

    千次阅读 多人点赞 2017-02-12 16:51:30
    一、单片机的时序 单片机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的。由于指令的字节数不同,取这些指令所需要的时间也就不同,即使是字节数相同的指令,由于执行操作有较大的差别,不同的指令执行时间也不...
  • 单片机应用程序架构

    2018-09-21 13:54:34
    对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。发现真正使用架构的并不多,而且这类书籍基本没有。好不容易找到份资料,可以参考...
  • 对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。发现真正使用架构的并不多,而且这类书籍基本没有。好不容易找到份资料,可以参考...
  • 单片机(AT89C51)定时/计数器实验案例

    千次阅读 多人点赞 2020-04-23 10:11:25
    继上篇的《单片机(AT89C51)定时/计数器详解及其实验案例》由于各种原因里面没有实验案例现在在此补上。 单片机(AT89C51)定时/计数器详解见上篇:...
  • 牛人总结的单片机应用程序架构

    千次阅读 2018-03-08 17:51:58
    工作中经过摸索实验,总结出单片机大致应用程序的架构有三种:1. 简单的前后台顺序执行程序,这类写法是大多数人使用的方法,不需用思考程序的具体架构,直接通过执行顺序编写应用程序即可。2. 时间片轮询法,此方法...
  • 对于单片机程序来说,大家都不陌生,但是真正使用架构,考虑架构的恐怕并不多,随着程序开发的不断增多,本人觉得架构是非常必要的。发现真正使用架构的并不多,而且这类书籍基本没有。好不容易找到份资料,可以参考...
  • STM32最小系统硬件组成详解

    万次阅读 多人点赞 2019-03-20 12:45:01
    STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 启动 1、电源 : 一般3.3V LDO供电 加多个0.01uf去耦电容 2、复位:有三种复位方式:上电复位、手动复位、程序自动复位 通常低电平复位:(51单片机...
  • 【51单片机】(手把手教你)串口通信-基础篇

    万次阅读 多人点赞 2016-01-23 01:11:28
    通信方式 并行 适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。 串行 只能一位一位的传送。 ...建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为...
  • 51单片机定时器详解

    千次阅读 2020-03-06 23:46:32
    51单片机有5个中断源,也就是说,有5种情况会使单片机去处理中断程序。 52单片呢,有6个中断源,
1 2 3 4 5 ... 14
收藏数 261
精华内容 104
关键字:

单片机计时器详解