15. 定时计数器T0作定时应用技术(一)

发布者:快乐心跳最新更新时间:2016-09-21 来源: eefocus关键字:定时计数器  T0作 手机看文章 扫描二维码
随时随地手机看文章
1. 实验任务 
用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示
2. 电路原理图 

图4.15.1
3. 系统板上硬件连线 
(1.       把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
(2.       把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。 
4. 程序设计内容 
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定TMOD=00000001B,即TMOD=01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0=(216-50000) / 256
TL0=(216-50000) MOD 256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。
5. 程序框图 

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
图4.15.2 
6. 汇编源程序(查询法) 
SECOND            EQU 30H 
TCOUNT           EQU 31H 
                            ORG 00H 
START:               MOV SECOND,#00H 
                           MOV TCOUNT,#00H 
                            MOV TMOD,#01H 
                            MOV TH0,#(65536-50000) / 256 
                           MOV TL0,#(65536-50000) MOD 256 
                            SETB TR0 
DISP:                  MOV A,SECOND 
                            MOV B,#10 
                           DIV AB 
                            MOV DPTR,#TABLE 
                            MOVC A,@A+DPTR 
                           MOV P0,A 
                            MOV A,B 
                            MOVC A,@A+DPTR 
                           MOV P2,A 
WAIT:                 JNB TF0,WAIT 
                            CLR TF0 
                            MOV TH0,#(65536-50000) / 256 
                           MOV TL0,#(65536-50000) MOD 256 
                            INC TCOUNT 
                            MOV A,TCOUNT 
                           CJNE A,#20,NEXT 
                            MOV TCOUNT,#00H 
                            INC SECOND 
                           MOV A,SECOND 
                            CJNE A,#60,NEX 
                           MOV SECOND,#00H 
NEX:                   LJMP DISP 
NEXT:                LJMP WAIT 
TABLE:              DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 
                            END 
7. C语言源程序(查询法) 
#include  
  
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 
                               0x66,0x6d,0x7d,0x07, 
                               0x7f,0x6f,0x77,0x7c, 
                               0x39,0x5e,0x79,0x71,0x00}; 
unsigned char second; 
unsigned char tcount; 
  
void main(void) 

  TMOD=0x01; 
  TH0=(65536-50000)/256; 
  TL0=(65536-50000)%256; 
  TR0=1; 
  tcount=0; 
  second=0; 
  P0=dispcode[second/10]; 
  P2=dispcode[second%10]; 
  while(1) 
    { 
      if(TF0==1) 
        { 
          tcount++; 
          if(tcount==20) 
            { 
              tcount=0; 
              second++; 
              if(second==60) 
                { 
                  second=0; 
                } 
              P0=dispcode[second/10]; 
              P2=dispcode[second%10];              
            } 
          TF0=0; 
          TH0=(65536-50000)/256; 
          TL0=(65536-50000)%256; 
        } 
    } 

1.      汇编源程序(中断法) 
SECOND                     EQU 30H 
TCOUNT                    EQU 31H 
                                     ORG 00H 
                                     LJMP START 
                                     ORG 0BH 
                                     LJMP INT0X 
START:                        MOV SECOND,#00H 
                                     MOV A,SECOND 
                                     MOV B,#10 
                                     DIV AB 
                                     MOV DPTR,#TABLE 
                                     MOVC A,@A+DPTR 
                                     MOV P0,A 
                                     MOV A,B 
                                     MOVC A,@A+DPTR 
                                     MOV P2,A 
                                     MOV TCOUNT,#00H 
                                     MOV TMOD,#01H 
                                     MOV TH0,#(65536-50000) / 256 
                                     MOV TL0,#(65536-50000) MOD 256 
                                     SETB TR0 
                                     SETB ET0 
                                     SETB EA 
                                     SJMP $ 
INT0X: 
                                     MOV TH0,#(65536-50000) / 256 
                                     MOV TL0,#(65536-50000) MOD 256 
                                     INC TCOUNT 
                                     MOV A,TCOUNT 
                                     CJNE A,#20,NEXT 
                                     MOV TCOUNT,#00H 
                                     INC SECOND 
                                     MOV A,SECOND 
                                     CJNE A,#60,NEX 
                                     MOV SECOND,#00H 
NEX:                                     MOV A,SECOND 
                                     MOV B,#10 
                                     DIV AB 
                                     MOV DPTR,#TABLE 
                                     MOVC A,@A+DPTR 
                                     MOV P0,A 
                                     MOV A,B 
                                     MOVC A,@A+DPTR 
                                     MOV P2,A 
NEXT:                          RETI 
                   
TABLE:                        DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 
                                     END 
2.      C语言源程序(中断法) 
#include  
  
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 
                               0x66,0x6d,0x7d,0x07, 
                               0x7f,0x6f,0x77,0x7c, 
                               0x39,0x5e,0x79,0x71,0x00}; 
unsigned char second; 
unsigned char tcount; 
  
void main(void) 

  TMOD=0x01; 
  TH0=(65536-50000)/256; 
  TL0=(65536-50000)%256; 
  TR0=1; 
  ET0=1; 
  EA=1; 
  tcount=0; 
  second=0; 
  P0=dispcode[second/10]; 
  P2=dispcode[second%10]; 
  while(1); 

  
void t0(void) interrupt 1 using 0 

  tcount++; 
  if(tcount==20) 
    { 
      tcount=0; 
      second++; 
      if(second==60) 
        { 
          second=0; 
        } 
      P0=dispcode[second/10]; 
      P2=dispcode[second%10];              
    } 
  TH0=(65536-50000)/256; 
  TL0=(65536-50000)%256; 
}
关键字:定时计数器  T0作 引用地址:15. 定时计数器T0作定时应用技术(一)

上一篇:16. 定时计数器T0作定时应用技术(二)
下一篇:14. 4×4矩阵式键盘识别技术

推荐阅读最新更新时间:2024-03-16 15:11

STM32F107定时器4用作外部计数器
不用配置引脚为输入模式,TIM_TIxExternalCLK1Source_TI2为PB7引脚 void TIM4_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0;
[单片机]
AVR单片机定时计数器学习笔记分享
  定时计数器的结构与应用定时计数器(Timer/Counter)常用于计数、延时、测量 周期、频率、脉宽、提供定时脉冲信号等。在实际应用中,对于转速,位移、速度、流量等物理量的 测量,通常也是由传感器转换成脉冲电信号,通过使用定时计 数器来测量其周期或频率,再经过计算处理获得。   AVR的定时计数器接口功能: 通过定时计数器与比较匹配寄存器相互配合,生成占空比 可变的方波信号,即脉冲宽度调制输出PWM信号,可用于 D/A、马达无级调速控制、变频控制等。本文主要介绍的是AVR单片机定时/计数器学习笔记,具体的跟随小编来了解下。      AVR单片机定时/计数器学习笔记   定时/计数器1(16位)有普通模式、CTC模式、
[单片机]
AVR单片机<font color='red'>定时</font><font color='red'>计数器</font>学习笔记分享
AVR/Arduino定时/计数器、中断入门
在Arduino中,可以使用AnalogWrite来使用硬件产生490Hz/980Hz的pwm波,并可根据参数来设定占空比。不了解这个的同学可以去AnalogWrite学习下,SecretsOfArduinoPWM也是讲了Arduino在avr的定时/计数器上做的封装,我们这里并不讲Arduino相关,而是讲AVR的定时/计数器,如何产生更多PWM波和定时/计数器的中断使用。 AVR Timer/Counter(以下统称Timer) 以ATmega358p为例,其内部拥有一个16位计时器,两个8位计时器,下图则为16位计时器的大致图解: 对于没有接触过avr内部的Arduino同学来说,这张图看不出来任何意思,别急,这些都是AV
[单片机]
AVR/Arduino<font color='red'>定时</font>/<font color='red'>计数器</font>、中断入门
增强定时计数器和PWM输出功能
1.1 引言 随着计算机技术和电力电子技术的发展,变频驱动技术凭借其优异的性能,在当今交流调速领域的应用越来越广。 变频驱动主要使用的驱动波形主要有SPWM和SVPWM两种。SPWM原理简单、实现容易,是现在使用最广的一种变频驱动波形。但其有一个致命的弱点是其电源利用率不高(只有86%)、谐波成分大。因此,在新近开发的产品中其应用逐渐被性能优异的SVPWM所取代。 SVPWM是一种电压利用率、低谐波成分的变频驱动波形,还有开关次数少、功率管功耗小等特点。同时,SVPWM还能很好的结合矢量控制算法、以最大限度的发挥设备的性能。因此被越来越多的变频设备所采用。 1.2 芯片简介 SPMC75系列MCU是凌阳
[单片机]
增强<font color='red'>定时</font><font color='red'>计数器</font>和PWM输出功能
用51单片机定时计数器控制LED1s闪烁一次
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 void Timer0()//使用定时计数器所做的处理函数,用做定时器 { TMOD=0x01;//定时器0,方式1 TH0=0xFC;//定时1ms的初值 TL0=0x18;//定时1ms的初值 ET0=1;//打开定时计数器0使能控制位 EA=1;//打开总中断 TR0=1;//打开定时计数器0的启动控制位 } void main()//主函数 { Timer0();//调用函数 while(1); } void ledxs()interrupt 1//中断执行内容函数,用定时器
[单片机]
单片机定时器与单片机计数器
  本文主要介绍单片机芯片解密的相关基础知识:单片机计数器和单片机定时器。   一、计数概念的引入   在介绍单片机计数器和定时器之前,先从选票的统计谈起:画“正”。这就是计数,生活中计数的例程处处可见。例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等,再举一个工业生产中的例程,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的办法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就能知道走过的线有多长了。   二、单片机计数器的容量   从一个生活中的例程看起:一个水盆在
[单片机]
PLC中编写定时器和计数器的自复位功能
CTU:加法计数器 分析:当计数值达到5,Q输出M300.0=1,在下一周期时执行复位 指令,使得计数值清零,之后Q输出M300.0=0,实现自复位计数器 并产生脉冲。M300.0有一个从1变0的过程。 计数器自复位程序 CTD减法计数器 了解内容:减计数器和加减计数器。要先装载LD,再减。每当0.0从“0”变为“1”, CV减少1;当MD4=0时,Q=1,此后每当CD从“0”变为“1”, Q保持输出“1”,CV继续减少1直到达到计数器指定的整数类型的最小值。 在任意时刻,只要I0.2=1时,Q输出“0”,CV立即停止计数并回到PV值。 C TD减法计数器 TON:接通延时 定时器 按下启动按钮, 电机 运行5秒自动停
[嵌入式]
PLC中编写<font color='red'>定时</font>器和<font color='red'>计数器</font>的自复位功能
51单片机定时/计数器T0、T1的组成与功能简介
1、 主体结构 1)16位加法 计数器 ,由高8位(THi)和低8位(TLi)SFR组成。 2)在用作计数器时,引脚P3。4(T0)和P3。5(T1)分别是两个计数器的外部脉冲输入端。 3)引脚P3。2(/INT0)和P3。3(/INT1)在位GATE=1时可用作T0、T1的门控信号。 4)SFR-TCON和TMOD控制T0和T1的运行状态和工作方式。 2、 控制寄存器TCON(地址88H) D7~D0:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 高4位与定时/计数器有关,低4位用于控制外部中断。 TFi-定时/计数器溢出标志位;计数溢出时,硬件自动置1,在中断允许条件下,是向CPU请求中断的
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved