历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2020年04月18日 | 单片机学习(三)定时器篇

2020-04-18 来源:eefocus

一、定时器介绍


定时/计数器T0和T1分别是由两个8位的专用寄存器组成,即定时/计数器T0由TH0和TL0组成,T1由TH1和TL1组成。此外,其内部还有2个8位的特殊功能寄存器TMOD和TCON,TMOD负责控制和确定T0和T1的功能和工作模式,TCON用来控制T0和T1启动或停止计数,同时包含定时/计数器的状态。 [1] 


TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。


TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除。


二、单片机的内部框图与定时器工作原理分析

从上面的图中红线可以看出由TMOD选择由那个定时器工作,工作于什么方式;

从上面的图中蓝线可以看出由TCON决定定时器是否启动;

从上面的图中黄线可以看出外部技术输入由TH和TL进行累计;

从上面的图中紫线可以看出当TH和TL计数溢出时会向TCON进行申请报告;

从上面的图中绿线可以看出所有的定时中断都由TCON向CPU进行中断申请;

从上面的图中黑线可以看出外部中断直接向CPU进行中断申请;


三、寄存器介绍

TCON:

TF0和TF1:定时器/计数器溢出标志位。


当定时器/计数器0(或定时器/计数器1)溢出时,由硬件自动使TF0(或TF1)置1,并向CPU申请中断。


CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。 


TR0和TR1:定时器/计数起运行控制位。  

TR0(或TR1)=0,停止定时器/计数器0(或定时器/计数器1)工作。

TR0(或TR1)=1,启动定时器/计数器0(或定时器/计数器1)工作。


TMOD:

GATE:门控位。  

GATE=0,只要用软件使TR0(或TR1)置1就能启动定时器/计数器0(或定时器/计数器1);

GATE=1,只有在(或)引脚为高电平的情况下,且由软件使TR0(或TR1)置1时,才能启动定时器/计数器0(或定时器/计数器1)工作。不管GATE处于什么状态,只要TR0(或TR1)=0定时器/计数器便停止工作。


C/T: 定时器/计数器工作方式选择位。

C/T =0,为定时工作方式;

C/T=1,为计数工作方式。  

M0、M1:工作方式选择位,确定4种工作方式。

IE:

EA = 1,CPU开放总中断;     

ET0 = 1,允许T0中断;

TR TL:定时器寄存器

注意:由于reg52.h的库定义了大部分的寄存器所以可以直接给TCON TMOD IE赋值操作或者是单独寄存器操作。


四、中断程序执行方法和定时计数公式

中断程序执行方法有直接中断和查询两种方法,查询即查询TF位是否置位为1

定时初值计算公式为:

定时时间=(计数最大值 – 计数初值)×机器周期 

机器周期T = 12/晶振频率


或者是用取模的方式

TH0=(计数最大值 – 定时时间)/256;

TL0=(计数最大值 – 定时时间)%256;


首先解析为什么要设定初值?

当设定定时器为16为计数器时,则计数最大值为2^16 = 65536;

TH和TL分别为8位,即TL每逢256进一位,所以除掉256就能看出TH进了多少位,取模则是余下多少位


举个例子,2位计数器最大计数为4,要将初值6分到两个2位计数器,由于低位逢四进1所以剩下2


即TL = 2然后高位是1即TH=1,按照上面的方法:2^4 = 16,2^2 = 4; TH = (16-(16-6))/4=1(整型不算小数);


TL = (16-(16-6))%4=2;可见结果是一样的。


一般的我们选取初值 TH0 = 0x3c,TLO = 0xb0,这时寄存器跑满时的时间为50ms,可以使这个过程进行20次,间隔也就是1s。


五、程序设计

//通过定时器中断实现数码管显示从0~59,间隔为1s


#include

sbit LED1 = P1^0;

#define DataPort P1     //宏定义,如果换接口,需要修改这里

sbit Seg_Latch = P2^2;   //段锁存

sbit Bit_Latch = P2^3;   //位锁存

unsigned char code Seg_Code[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //段码从0~9

unsigned char code Bit_Code[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //位码,控制8个LED灯

void delayls(void);

void Display(unsigned char m,unsigned char num,unsigned int n);

static unsigned int n = 0;

int main(void)

{

        unsigned char i;

        TMOD = 0x01;

        TH0 = 0x3c;

        TL0 = 0xb0;

        EA = 1;        //开中断

        ET0 = 1;

        //因为只有一个中断,所以IP不用设置

        TR0 = 1;   //开启定时器0,等待中断到来

        while(1)

        {

                Display(1,2,n);

        }

}


void T0_ISR(void) interrupt 1

{

        unsigned char i;

        

        EA = 0;   //屏蔽其他中断

        TH0 = 0x3c;   //重新赋值,保证每次都是 50ms

        TL0 = 0xb0;

        i++;

        if(i == 20)

        {

                i = 0;

           

                if(n < 60)

                {

                    n++;

                }

                else

                {

                    n = 0;

                }

        }

        

        EA = 1;

}


void Display(unsigned char m,unsigned char num,unsigned int n)   //m表示从第几个数码管开始控制,num表示到第几个数码管,n表示要显示的数字

{

        unsigned char i,j,a[5],l;


        a[0] = n / 10;

        a[1] = n % 10;


        for(j = m-1;j < num;j++)

        {

                DataPort = 0;   //初始化

                Seg_Latch = 1;  

                Seg_Latch = 0;  

                            

                DataPort = Bit_Code[j];  //送位码

                Bit_Latch = 1;    //位开门

                Bit_Latch = 0;    //关门

                

                DataPort = Seg_Code[a[j]];  //送段码

                Seg_Latch = 1;  //段开门

                Seg_Latch = 0;   //关门     


        }         


}

推荐阅读

史海拾趣

Babcock Inc公司的发展小趣事

Babcock深知技术创新是公司发展的核心动力。因此,公司始终保持着对技术研发的持续投入。通过不断引进先进设备、优化研发流程、加强团队建设等措施,Babcock的技术实力得到了不断提升。同时,公司还注重与高校和研究机构的合作,共同推动电子技术的创新发展。

Firadec公司的发展小趣事

背景:假设Firadec公司(此处为虚构名称)成立于20世纪90年代初,正值半导体技术快速发展的时期。公司创始人是一位在半导体领域有深厚造诣的科学家,他带领团队研发出了一种新型低功耗、高性能的集成电路技术。

发展:这项技术迅速获得了市场的认可,Firadec公司凭借这一创新产品迅速在电子行业崭露头角。公司不断加大研发投入,持续优化产品性能,逐渐在智能手机、平板电脑等消费电子领域占据了一席之地。

影响:随着技术的不断成熟和应用领域的拓展,Firadec公司的市场份额逐年提升,成为了电子行业中的佼佼者。其技术创新不仅推动了公司自身的发展,也为整个电子行业的进步做出了重要贡献。

Gore公司的发展小趣事
在需要精确控制电压和电流的工业控制系统中,三电平直流变换器能够提供稳定的电源输出。
Hirose Electric公司的发展小趣事
在隔离型中压大容量直流变换器中,可能存在直流偏磁问题,导致变压器磁路饱和、励磁电流增加、局部过热和噪声增大等问题。
Cyrix Corp公司的发展小趣事

Cyrix Corp公司成立于1988年,由Jerry Rogers和Tom Brightman创立。这两位创始人都是德州仪器的杰出思想家,他们雄心勃勃地希望挑战当时的芯片巨头英特尔。Cyrix的起步产品是高速x87数学协处理器,其性能比英特尔同类产品高出约50%,同时价格更为亲民。这一策略迅速赢得了市场的认可,Cyrix开始在芯片市场上崭露头角。

DEWALT公司的发展小趣事

DEWALT公司非常注重产品品质和用户体验。公司建立了严格的质量控制体系,确保每一件产品都符合高质量标准。同时,DEWALT还积极倾听用户反馈,不断改进产品和服务。这些努力使DEWALT公司的电动工具在市场上获得了广泛认可,并赢得了大量忠实用户。

问答坊 | AI 解惑

贴片式的MAX1898芯片在无PCB板的情况下如何焊接和调试呢?

想先用线搭个板子调试,单片机有管脚座,但是没想到MAX1898电源管理芯片那么小,放在2根牙签粗细的一个塑料管里,这要是我的焊接技术,所有管脚直接短接....有没有大虾介绍下经验阿.... [ 本帖最后由 zxpla 于 2010-4-15 12:54 编辑 ]…

查看全部问答>

●SQLSERVER CE不支持嵌套查询吗?●

如以下语句: SELECT id,name FROM 表A WHERE id = (SELECT MAX(id) FROM 表A) 这样的语句在2000里运行OK,但是在SQLSERVER CE里却报错。 是SQLSERVER CE不支持吗?有什么解决方案?…

查看全部问答>

单片机串口通信

小弟现在做一个与单片机串口通信有关的设计,具体如下:   主片:PC上连一个无线模块,并装有串口调试助手V2.2.   从片:单片机连一个无线模块,在P1口有8个带锁的按键.    前提:硬件连接没有问题. 要求:把P1口的P1 ...…

查看全部问答>

求国嵌视频

谁能提供国嵌的加密视频,不求免费,只求不贵。我的邮箱robot1126@126.com。…

查看全部问答>

再来一帖,这次是关于DSP的

想拿下c2000开发板,故发些DSP方面的相关书籍,有些还是英文的,给有能力的人看吧。…

查看全部问答>

怎样使cc2530设备重新搜索、加入网络?

cc2530设备开始时在网络中,通信正常。使用某种机制,设备得知自己所处的网络不存在了,此时怎样才能使设备重新搜索、并加入新的网络?…

查看全部问答>

Altium09器件库中IC部分索引为一个pdf文件中

将Altium.Designer09器件库中IC部分索引到一个pdf文件中,可以利用PDF阅读器的搜索功能搜索。 不知道有没有用途,反正我自己在用。 分卷压缩: https://download.eeworld.com.cn/detail/wangfuchong/13082 https://download.eeworld.com.cn/det ...…

查看全部问答>

指针用法

怎么样通过指向数组的指针来计算整个数组的长度呢?…

查看全部问答>

影响MOSFET管温度上升的相关因素

三极管有三个工作区:截止区、放大区和饱和区,而MOSFET对应的是关断区、饱和区和线性区。MOSFET线性区也叫三极区或可变电阻区,在这个区域,MOSFET基本上完全导通。    漏源间的导通电阻RDS(on)    MOSFET在导通时漏源之间 ...…

查看全部问答>

PCB设计黄金法则

PCB设计黄金法则       尽管目前半导体集成度越来越高,许多应用也都有随时可用的片上系统,同时许多功能强大且开箱即用的开发板也越来越可轻松获取,但许多使用案例中电子产品的应用仍然需要使用定制PCB。在一次性开发当中, ...…

查看全部问答>