历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2019年02月18日 | 51单片机 定时器及其应用

2019-02-18 来源:eefocus

89c51单片机内部有两个16位的定时/计数器,即定时器T0和定时器T1,单片机的定时功能其实就是通过计数来实现的,当单片机每一个机器周期产生一个脉冲时,计数器就加一。定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器


如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535*((1/12)*12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms.


定时器的控制


89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON


工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式


具体各位的定义如下


当我们使用定时器功能时,就只用设置D0、D1、D4、D5的的值就可以了,其余位置0即可


我们在使用定时器时基本使用的是模式1和模式2,模式0与模式3基本不用,我就不进行描述了。


模式1


当TMOD的D5位置0,D4位置1时,即为定时器T1的模式一,该模式对应的是一个16位的定时器,寄存器TH1和TL1即为T1初值的高8位和低8位,定时时间为:(65536-T1的初值)*振荡周期*12


模式二


当TMOD的D5位置1,D4位置0时,即为定时器T1的模式二,该模式对应的是一个可以自动装载的8位定时器,当定时器计数满了(计数溢出时),会自动把TH1中的内容重新装载到TL1中,那么模式二计数的最长时间即为(257-T1的初值)*振荡周期*12


 定时器的控制寄存器TCON


TCON的各位定义如下



TF1:T1的溢出标志位,当T1溢出时,由硬件自动使TF1位置1,并向CPU申请中断。当CPU响应中断进入中断服务子程序后,TF1又被硬件自动清0,也可以用软件清0.


TF0:T0溢出标志位。其功能和操作情况同TF1


TR1:T1的运行控制位,当该位置1时,即启动定时器1当该位置0时,即关闭


TR0:T0的运行控制位,其功能及操作情况同TR1。


接下来我将用定时器来结合数码管制作一个0-9计时器


具体操作如下(定时器的初始化在程序最下面)


include


void T0INI() ;                           //定时器0初始化函数声明                       

unsigned int temp = 0,i = 0;    //中间变量

unsigned char leddata[]={        //定义一个字符型数组用来存放共阳极数码管数字显示

 

                0xC0,  //"0"

                0xF9,  //"1"

                0xA4,  //"2"

                0xB0,  //"3"

                0x99,  //"4"

                0x92,  //"5"

                0x82,  //"6"

                0xF8,  //"7"

                0x80,  //"8"

                0x90,  //"9"

                0x88,  //"A"

                0x83,  //"B"

                0xC6,  //"C"

                0xA1,  //"D"

                0x86,  //"E"

                0x8E,  //"F"

                0x89,  //"H"

                0xC7,  //"L"

                0xC8,  //"n"

                0xC1,  //"u"

                0x8C,  //"P"

                0xA3,  //"o"

                0xBF,  //"-"

                0xFF,  //熄灭

                0xFF  //自定义

 

                         };


void main()

{

       T0INI();

        while(1)

        {

            P2 = 0x0e;                  //位选段P20置0

            P0 = leddata[i];         //数码管显示

            if(TF0 == 1)             //当定时器计数溢出时

                    {

                            TH0 = 0X3c;           

                            TL0 = 0xb0;            //给定时器高8位和低8位重新赋值

                            temp++;                 //50ms加1

                    }

            

                if(temp == 20)               //计数到20次也就是一秒

                         i++;                      //数码管显示值加一

                    if(i == 10)

                         i = 0;           

        }

}  


void T0INI()    //定时器T0初始化

{

    IE = 0x82;                //cpu开总中断  ,定时器T0溢出中断允许 

    TCON = 0x10;        //打开定时器T0

    TMOD = 0x01;        //设置T0为工作模式1,16位定时计数器

    TH0 = 0X3c;

    TL0 = 0xb0;            //12Mhz定时50ms

}



推荐阅读

史海拾趣

创都(CAX)公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。创都公司深知这一点,因此在品质管理上投入了大量精力。公司建立了严格的质量管理体系,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都经过严格把关。此外,创都公司还积极引进先进的生产设备和技术,提升生产效率和产品质量。这些措施使得创都公司的产品在市场上享有良好的口碑,赢得了消费者的信任和喜爱。

Hama公司的发展小趣事

随着技术的不断成熟,H&D Wireless开始积极拓展市场。公司凭借其创新的物联网技术和解决方案,成功吸引了多个行业巨头的关注。2017年,H&D Wireless与全球知名汽车制造商Scania签署了为期12个月的物联网服务协议,为其Smart Factory提供Raven IoT Sensor Box827解决方案。这一合作不仅提升了Scania工厂的生产效率,还进一步验证了H&D Wireless在物联网领域的实力。

Crosspoint Solutions公司的发展小趣事

在电子行业的激烈竞争中,Crosspoint Solutions公司凭借一项革命性的技术创新脱颖而出。公司研发出一款高度集成的交叉点开关芯片,该芯片在数据传输速度和稳定性上均达到了行业领先水平。这一创新迅速吸引了各大电子设备制造商的注意,公司因此获得了大量订单,市场份额迅速扩大。

Array Microsystems Inc公司的发展小趣事

在追求经济效益的同时,Array Microsystems Inc也积极履行社会责任,关注可持续发展。公司致力于推广环保理念和技术应用,推动电子行业的绿色发展。同时,公司还积极参与公益事业和社会活动,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为其长期发展奠定了坚实的基础。

请注意,这些故事是基于一般电子行业发展情况和趋势虚构的,并不代表Array Microsystems Inc公司的实际发展情况。如果您需要了解该公司的真实发展情况,建议您查阅相关资料或咨询专业人士。

台湾富致(FUZETEC)公司的发展小趣事

自1983年Futaba的VFD产品被福特汽车公司采用后,其在美国三大汽车厂的市场占有率迅速达到100%。这一成就不仅证明了Futaba VFD产品在汽车行业的卓越性能和广泛应用,还推动了其在全球汽车市场上的快速扩张。VFD的抗震性能、良好的温差适应性以及高可靠性,使其在汽车仪表盘和抬头显示器等关键部件中扮演了重要角色。随着新能源汽车的兴起,Futaba的VFD技术也进一步适应市场需求,为新能源汽车提供了更加先进的显示解决方案。

Accuride公司的发展小趣事

作为一家专注于商用车零部件的公司,Accuride始终致力于技术创新和产品升级。其产品线涵盖了商用车车轮、卡车车身和底盘部件等多种零部件,且拥有多个知名品牌,如Accuride®、Gunite®、ImperialTM和BrillionTM等。通过不断研发和创新,Accuride成功提升了产品的质量和性能,赢得了客户的广泛认可。

问答坊 | AI 解惑

嵌入式系统开发要点全面剖析

无疑嵌入式系统开发是目前相当热门的领域,因为它涉及到的范围实在是太广了,从消费电子到工业应用,从8位的单片机到32位处理器,嵌入式系统俨然成为不可缺少的一环,且有愈演愈热之势。那么该如何学习和开发嵌入式系统呢?需要具备哪些知识和技能 ...…

查看全部问答>

学USB的一点心得

1、目标:用USB取代232。   原因:1、提高速度,2、适应没有232的电脑笔记本,3、上档次。 2、知识点:     1、USB协议,比起232协议难多了,需要数字通信的基础,难。     2、USB接口器件的硬件知识和编程,硬件易懂, ...…

查看全部问答>

!!!!急函数指针问题.请大侠帮忙解决.

定义: typedef struct _SUPPORTED_NIC // NIC vendor ID {     USHORT wVenId;                    // PCI Vendor ID     USHORT wDevId;  & ...…

查看全部问答>

想学驱动开发,应该买什么书看??

知道有本《windows驱动开发技术详解》  不知道怎么样??? 还有什么别的好书推荐吗??? 希望讲的深入浅出的,讲的透一点的书???? …

查看全部问答>

51下的PS2鼠标驱动程序

哪位大人做过啊,我把鼠标发送给单片机的数据,通过单片机的串口发送到PC机上查看,结果每帧只收到2字节的数据(原本应该有3字节的,中间一字节丢了),请问是什么原因呢? 如果哪位有这样的源码,麻烦发到我邮箱:mochen5460@163.com,由于公司里 ...…

查看全部问答>

我准备去配个主机箱,大家看看还贵啵?

显卡:MIS NX7300-TD128E 350元 主板:MIS P35-Ne02-FR   550元 CPU:Intel Core 2Duo E7200(盒) 800元 内存:Kingston 2GB DDR2 800+ (盒) 160元 硬盘:希捷 320G 7200 11.16(串口/5年 盒) 360元 机箱:世纪之星 风云9号 210元 共 ...…

查看全部问答>

最近想做个蓝牙方面的东西 希望坛友们能推荐个模块,可自定义要创建的连接类型

可自定义UUID,即可自定义要创建的连接类型,即L2CAPConnection连接的URL…

查看全部问答>

STM3210B-EVAL的USB上位机驱动那里可以下载?

那位大侠可以告诉我一下 谢谢!…

查看全部问答>