定时器计数器的应用提高

发布者:玉米哥哥最新更新时间:2017-01-09 来源: eefocus关键字:定时器  计数器 手机看文章 扫描二维码
随时随地手机看文章

定时器0的应用提高


方式0的使用:


示例代码:使用方式0使得led灯一秒钟闪烁



//这个程序比较简单,需要明白的是定时器0方式0是一个1

//13位的计数器,所以最大的数为2的13次方,8192,并且TL0中的高三位没有用

//因此除以的也不是256,而是32,定时器0方式00需要注意的是,最大数字因为是8192

//因此定时5000为定时5ms,定时一秒要进入中断200次

#include

#define uint unsigned int

#define uchar unsigned char

uchar num;

sbit led = P1^0;

void main()

{

    TMOD = 0x0;

    TH0 = (8192-5000)/32;

    TL0 =(8192-5000)%32;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

    while(1);

}


void t0()interrupt 1

{

    TH0= (8192-5000)/32;

    TL0= (8192-5000)%32;

    num++;

    if(num==200)

    {

        num=0;

        led = ~led;

    }


}


方式2的使用:(8位自动重装的8位定时器)


使用方式2的优点:方式2适合用来做特别精确的脉冲信号发生器,因为其中只有一个8位计数器,THX高八位常数缓冲器,当TLX八位溢出的适合,THX将自动的填充到TLX中,从而避免了反复重装初值带来的精度误差,由于使用方式2要求高精度,所以晶振也必须是12M的晶振,这样才能精确的计时;


示例代码:使用方式2使得led灯一秒钟闪烁



//因为定时器0方式2是一个8位自动重装的定时器,所以初值一般是6   

//这是因为装入6的话,THX=250,TLX=250,这样一次定时的时间是2.5毫秒

//由于是自动重装,所以,定时器0方式-不用重装初值

//这里的num是uint的类型,这里要注意

#include

#define uint unsigned int

#define uchar unsigned char

uint num;

sbit led = P1^0;

void main()

{

    TMOD = 0x02;

    TH0 = 6;

    TL0 =6;

    EA = 1;

    ET0 = 1;

    TR0 = 1;

    while(1)

    {

        if(num==4000)

        {

            num=0;

            led = ~led;

        }


    }

}


void t0()interrupt 1

{

    num++;

}


方式3的使用:

方式3只适用于定时器T0,当T1设置位方式3时,定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0,这里注意的是,由于定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所以方式3使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器


示例代码:使用方式3中的低8位使得led灯一秒钟闪烁,高八位使得led灯0.5秒闪烁



/*方式3只适用于定时器T0,当T1设置位方式3时,

定时器T1不计数,方式3将T0分成两个独立的8位计数器TL0和TH0o注意的是,?

哨定时器方式3相当于是两个计数器,所以,这时候TH0这个计数器将占用T1的中断请求位,所

苑绞?使用的时候,T1不要使用中断,在这种情况下,T1通常是用来当作是串行口的波特率发生器*/

#include

#define uint unsigned int

#define uchar unsigned char

uint num1,num2;

sbit led1 = P1^0;

sbit led2 = P1^1;

void main()

{

    TMOD = 0x03;

    TH0 = 6;

    TL0 =6;


    EA = 1;

    ET0 = 1;

    ET1 =1;

    TR0 = 1;

    TR1 = 1;

    while(1)

    {

        if(num1>=4000)

        {

            num1=0;

            led1 = ~led1;

        }

        if(num2 >= 2000)

        {

            num2=0;

            led2 = ~led2;

        }


    }

}


void TL0_timer()interrupt 1

{

    TL0 = 6;

    num1++;

}


void TH0_timer() interrupt 3

{

    TH0 = 6;

    num2++;

}



综合程序:


//利用计数器0工作方式1,用一根导线,连接GND引脚,用另外的一根导线   

//去接触T0(P3^4),没接触一下,计数器技术一次,然后将说记录的数值显示在

//数码管的前两位,然后计数满100清零

#include

#define uchar unsigned char 

#define uint unsigned int

sbit dula = P2^6;

sbit wela = P2^7;

uchar code table[] ={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

                    0x7f,0x6f,0x77,0x7c,

                    0x39,0x5e,0x79,0x71};

void delayms(uint);

void display(uchar shi,uchar ge)

{

    dula =1;

    P0 = table[shi];

    dula =0;

    P0 = 0xff;

    wela = 1;

    P0 = 0xfe;

    wela = 0;

    delayms(5);


    dula = 1;

    P0 = table[ge];

    dula = 0;

    P0 = 0xff;

    wela = 1;

    P0 = 0xfd;

    wela = 0;

    delayms(5);

}


void delayms(uint xms)

{

    uint i,j;

    for(i = xms;i>0;i--)

        for(j=110;j>0;j--);

}



uint read()

{

    uchar t1,th1,th2;

    uint val;

    while(1)

    {

        th1 = TH0 ;

        t1 = TL0;

        th2 = TH0 ;

        if(th1 == th2)

            break;

            

    }


    val = th1*256+t1;

    return val;

}


void main()

{

    uchar a,b;

    uint num;

    TMOD = 0x05;

    TH0 = 0;

    TL0 = 0;

    TR0 = 1;

    while(1)

    {

        num = read();

        if(num>100)

            {

                num = 0;

                TH0 = 0;

                TL0 = 0;

            }

         a = num/10;

         b = num%10;

         display(a,b);

    }

}


关键字:定时器  计数器 引用地址:定时器计数器的应用提高

上一篇:单片机其他外围设备的使用
下一篇:继电器,红外接专题

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

avr定时器做的正弦波
实物照片如下 RC电路的电阻为1K与10K时的波形分别如下 仿真图片如下: 程序如下: #include iom16v.h #include macros.h #define uchar unsigned char uchar auc_SinParam = { 128,134,140,147,153,159,165,171,177,182,188,193,198,204,208,213, 218,222,226,230,233,237,240,242,245,247,249,251,252,253,254,254, 254,254,253,252,251,250,248,246,24
[单片机]
avr<font color='red'>定时器</font>做的正弦波
STM32的定时器有两种捕获模式
一个定时器最多能同时捕获几路PWM波? 我只需要得到PWM的高电平宽度,PWM的频率是50HZ STM32的定时器有两种捕获模式 PWM输入模式和普通输入模式 在PWM输入模式下,一个定时器只能同时捕获一路PWM波 在普通输入模式下,理论上是可以同时捕获4路PWM波 即,在定时器中断中改变触发模式(上升沿、下降沿) 然后寄存器两次的差值即近似为高电平长度
[单片机]
MAX6369–MAX6374引脚可设置看门狗定时器
在MAX6369- MAX6374的引脚可选的看门狗定时器,微处理器(微处理器)和信号系统运行时,在正常操作中,微处理器要反复切换前选定看门狗超时周期的看门狗输入.如果微处理器不提供有效的看门狗输入,该系统不执行预期指示。看门狗输出脉冲可用于重置微处理器或中断系统警告处理错误。   在MAX6369- MAX6374是灵活的看门狗定时器,可以提高通过代码执行错误通报系统的可靠性。该系列产品提供多种引脚可选的看门狗定时选择,以匹配的系统定时应用广泛:   看门狗启动延迟:延迟之前提供了一个初步的看门狗计时器启动。   看门狗超时周期:正常运行后,在初始启动看门狗超时时间延迟。   看门狗输出/定时选项:开漏(100毫秒)或推拉式
[模拟电子]
MAX6369–MAX6374引脚可设置看门狗<font color='red'>定时器</font>
定时器应用例子源码
#include stdio.h #include reg51.h // 0 - 9 的编码 unsigned char code table = { 0x11,0xb7,0x29,0x23,0x87,0x43,0x41,0x37,0x01,0x03,0x00 } ; unsigned int count2 ; //第1-6 位的片选线 unsigned char code dig = { 0x7f,0xfd,0xdf,0xf7,0xef,0xfb } ; unsigned char buffer ,val ; unsigned char count1,scan,i,ch,KeyVal,modify,OverTime ; bi
[单片机]
MSP430F149的看门狗定时器
程序: //看门狗定时器,溢出后执行中断服务函数 #include msp430x14x.h void main(void) { P6DIR |= BIT2;P6OUT |= BIT2; //关掉电平转换 (不必纠结) WDTCTL = WDT_ADLY_250; // 看门狗定时器,辅助时钟延迟250ms IE1 |= WDTIE; // 中断允许寄存器,打开看门狗定时器 P3DIR |= BIT4; // Set P3.4 to output direction _BIS_SR(LPM3_bits +
[单片机]
MSP430F149;二、TIMEA
前面讲了几个寄存器,现在说说定时器A的三种功能 定时器 定时器主要是配置tatcl 在TASSELx 选择时钟源(这里X是因为有两位来控制,或者查询IAR里面的430的头文件找简单的书写方式,有对应的 #define) 这边我一般都是是选用ACLK,到时候用外部中断唤醒CPU 对应时钟就是分频,选择IDx(1/2/4/8) 选择MCx,来控制16位计数器计数模式。 这里面会用到寄存器中的TACCR0,这是一个16位的寄存器,可以存0~65536之中的任意值,(一般根据计算机器周期等等的,输入一个值,来使TAR计数器累加到咱们计算出啦的数字后产生中断)比如,我知道计数器数数字数到32768需要一秒时间,那我就可以在taccr
[单片机]
MSP430F149;二、TIMEA
单片机定时器/计数器基本原理
本文主要学习定时器/计数器的基本概念。首先从日常生活中的计数和定时的概念入手,来理解定时器/计数器功能的实现逻辑。一个比较重要的知识点是溢出,当定时器/计数器计满时,会产生 溢出 的动作,进而产生中断。同时,还可以进一步了解实现定时或计数的三种主要的方法。 一、定时/计数的基本概念 定时和计数是日常生活和生产中最常见和最普遍的问题。 定时器和计数器功能基本上都是使用相同的逻辑实现的,而且这两个功能都包含输入的计数信号,本质上都是对脉冲计数。计数器用来计数并指示在任意间隔内输入信号(事件)的个数,而定时器则对规定间隔内输入的信号个数进行计数,用来指示经历的时间。 在单片机中,定时/计数器作定时功能用时,对机器周期计数(由单片机的
[单片机]
单片机<font color='red'>定时器</font>/<font color='red'>计数器</font>基本原理
pic单片机教程之13位程序计数器存储器的组成
  单片机的两种存储器模块:程序存储器与数据存储器。每个存储模块都有自己的数据总线,能在同一时间戳内对模块同时进行数据存储与指令操作。   程序存储器构成   中档系列单片机有一个13位的程序计数器,可以寻址8K 14位的程序存储空间。程序存储器总线宽度(指令字)为14位。由于所有的指令均为单字指令,所以一个具有8K 14位程序存储器的器件可以存储8K条指令。很易于确定是否有充足的程序存储空间来实现应用程序。   中档系列单片机把程序存储器分成4页,每页2K字(0h - 7FFh,、800h - FFFh、1000h - 17FFh和1800h - 1FFFh)。图6-1所示为程序存储器映射和一个8级深度硬件堆栈。实际
[单片机]
pic单片机教程之13位程序<font color='red'>计数器</font>存储器的组成
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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