历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2021年07月21日 | 51单片机学习之路(四)-定时器

2021-07-21 来源:eefocus

写在前面:以下涉及到的程序及电路图不保证为最优方案,会存在很多不足之处,望谅解。另外,C51的内容是在整理很久之前所学的知识,可能会存在错误,欢迎指正。


正文

学习目标:学会使用51单片机中的定时器0。

学习内容:


用定时器0控制LED灯的亮灭

用定时器在数码管上实现计时

程序一:控制LED灯

功能要求:运行程序后连接在单片机上的LED灯以1s的频率闪烁。

定时器寄存器简单介绍

在本次内容中将使用定时器0,定时器1的使用方式与定时器0大体相同,以下简单介绍一下将要使用到的几个中断寄存器,具体介绍请以官方数据手册为准:

TMOD:定时器模式寄存器,大致分为4个模式:

00:定时器0或1选择13位定时/计数器模式,该模式下TL0只使用低5位,TH0整个8位全用,选择TR0控制,作为定时器使用;

01:定时器0或1选择16位定时/计数器模式,该模式下TL0和TH0的整个8位均全用,选择TR0控制,作为定时器使;

10:定时器0或1选择8位定时/计数器模式,该模式下只有TL0的整个8位参与实际计时,TH0的整个8位为重装做准备,该模式为自动重装模式,当溢出时TH0的值赋予TL0,选择TR0控制,作为定时器使用;

11:定时器0做双8位定时/计数器,TL0作为一个8位定时/计数器由定时器0控制,TH0作为一个8位定时/计数器由定时器1控制。


TH0、TL0:用作计数,其中TH0为高8位,TL0位低8位,从0 开始最大计数0xFFFF。


TR0:当TR0=1时,允许T0开始计数,即允许TH0和TL0计数;当TR0=0时,只有INT0输入高电平时,T0才可以计数。


ET0:T0溢出中断允许位,当ET0=1时,允许中断,反之禁止中断。


EA:总中断允许位,当EA=1时,开放中断,反之,禁止所有中断请求,即上述中断操作将全部失效。


中断优先级:定时器0优先级排在第二位,如图4-1:

在这里插入图片描述

图4-1 中断优先级查询(图片来自官方芯片手册 第6章 中断系统)


源程序


#include "reg52.h"


typedef unsigned char uchar;

typedef unsigned int uint;


sbit led = P2^0; //led灯端口

uint i; //计时变量


void main()

{

TMOD |= 0X01; //选择定时器0模式1,16位,TR0控制

TL0 = 0x18; //定时1ms,低8位

TH0 = 0XFC; //定时1ms,高8位

TR0 = 1; //允许计时

ET0 = 1; //溢出中断允许位,置1允许

EA = 1; //打开总中断


while(1);

}


void timer0() interrupt 1 //定时器0中断程序,定时器0优先级为1

{

TL0 = 0x18;

TH0 = 0XFC; //复位TH0和TL0

i++;

if(i == 1000) //当时间计够1s时,i清零,同时led灯状态取反

{

i = 0;

led = ~led; //状态取反,即灯亮时取反灭,灯灭时取反亮s

}

}


仿真图

在这里插入图片描述

程序二:数码管计时

功能要求:实现正计时0~F。

源程序


#include "reg52.h"


typedef unsigned char uchar;

typedef unsigned int uint;


#define display  P0 //定义数码管端口为P0

uint i; //计时变量

uchar temp; //数码管变量

uchar code smg[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //定义数码管显示内容0~15(F)


void main()

{

TMOD |= 0X01; //选择定时器0模式1,16位,TR0控制

TL0 = 0x18; //定时1ms,低8位

TH0 = 0XFC; //定时1ms,高8位

TR0 = 1; //允许计时

ET0 = 1; //溢出中断允许位,置1允许

EA = 1; //打开总中断


display = 0x3f; //初始化显示0

while(1)

{

if(i == 0) //当i清0时显示数据加1

{

display = smg[temp]; //显示数据随temp的自加而自增

}

}

}


void timer0() interrupt 1 //定时器0中断程序,定时器0优先级为1

{

TL0 = 0x18;

TH0 = 0XFC; //复位TH0和TL0

i++;

if(i == 1000) //当时间计够1s时,i清零,同时temp自加1

{

i = 0;

temp++;

if(temp == 16) //限制显示最大加到F

temp = 0;

}

}


仿真图

在这里插入图片描述

推荐阅读

史海拾趣

Britool Expert公司的发展小趣事

撰写5个关于电子行业里Britool Expert公司发展起来的相关故事,每个故事字数至少500字,可能内容过多,我可以为您提供1个故事的示例,如果需要更多故事,您可以在之后输入继续。


Britool Expert公司的发展故事之一:技术创新的突破

在电子行业的激烈竞争中,Britool Expert公司以其独特的技术创新策略脱颖而出。公司创立之初,就明确了以技术研发为核心的发展道路。在一次关键的技术研讨会上,公司的研发团队提出了一个前所未有的想法——开发一种新型的高效能芯片。

这个想法在当时看来极具挑战性,但团队成员们凭借着对技术的热爱和对市场的敏锐洞察,决心将这个想法变为现实。经过数月的艰苦努力,团队终于攻克了技术难关,成功研发出了这款芯片。这款芯片不仅性能卓越,而且成本大大降低,迅速在市场上获得了广泛的认可。

这一技术创新的突破,为Britool Expert公司打开了新的发展空间。公司借此机会,不断扩大生产规模,优化产品结构,逐渐在电子行业中树立了良好的口碑。随着技术的不断进步和市场的不断扩大,Britool Expert公司逐渐成为了电子行业中的佼佼者。

这个故事只是Britool Expert公司发展历程中的一个缩影。在公司的成长过程中,还有许多类似的技术创新故事。正是这些故事,构成了Britool Expert公司不断发展壮大的坚实基石。


若您想要探索更多内容,随时可以继续输入。

FCT electronic公司的发展小趣事

在电子行业的初期,FCT electronic公司由一群富有远见和激情的工程师创立。他们看到了挠性电路板在未来电子产品中的巨大潜力,并致力于研发出更高效、更可靠的挠性电路板解决方案。经过数年的不懈努力,FCT electronic公司终于研发出了具有革命性意义的挠性电路板技术,这一技术为公司在行业中树立了良好的口碑,也为公司的后续发展奠定了坚实的基础。

BNS Solutions公司的发展小趣事

在快速发展的过程中,BNS Solutions公司始终注重品质管理和品牌建设。公司建立了一套完善的质量管理体系,从原材料采购到产品生产、销售等各个环节都严格把控质量。同时,公司还注重品牌形象的塑造和维护,通过广告宣传、公关活动等方式不断提升品牌知名度和美誉度。这些举措使得BNS Solutions公司的产品在市场上具有更高的竞争力,赢得了消费者的信赖和喜爱。

Compound Photonics公司的发展小趣事

Compound Photonics公司成立于2007年,其初期发展并不顺利。然而,一个关键的转折点出现在公司收购Syntax-Brillian的专利之后。Syntax-Brillian是一家在微显示领域有着深厚技术积累的公司,其核心在于早年间收购的Colorado Microdisplays/Zight专利。这次收购使得Compound Photonics获得了进入微显示领域的重要技术基础,为后续的发展奠定了坚实的基础。

GD Rectifiers Ltd公司的发展小趣事

面对数字化时代的到来,GD Rectifiers Ltd主动拥抱变革,积极推进数字化转型。公司投入巨资建设了先进的数字化生产管理系统和客户关系管理系统,实现了生产过程的智能化和透明化。通过数据分析和挖掘技术,公司能够更准确地把握市场需求和客户需求的变化趋势,为产品研发和市场营销提供有力支持。同时,公司还加强了与供应商和客户的数字化连接和协作,提高了供应链的协同效率和响应速度。数字化转型的成功实施为GD Rectifiers Ltd注入了新的活力,进一步提升了公司的市场竞争力和行业地位。

Daburn公司的发展小趣事

Daburn公司自创立之初就致力于电子连接器的研发。在上世纪80年代,公司推出了一款新型的高性能连接器,该连接器采用了独特的材料和设计,大大提高了数据传输的效率和稳定性。这一技术突破让Daburn在行业中崭露头角,并吸引了大量客户的关注。随着技术的不断进步,Daburn逐渐扩展了其产品线,涵盖了线束、电缆组件和定制连接解决方案等多个领域。

问答坊 | AI 解惑

单片机C语言入门

:o   51单片机C编程,作为单片机入门的首选…

查看全部问答>

高通芯片,烧写方法有哪些?

网上和书上很多讲得都是三星的S3C2440之类的。 现在没有仿真器。也不知道下载哪个模拟器,有下载ADS的软件。 SJF2440软件可以用于高通的这个芯片吗? 上面讲得好乱,整理下: 就是现在手头上有个现成的产品。原来的软件有问题,或改正。但是他 ...…

查看全部问答>

请教pxa270+WIFI8686!!!

用的PXA270和USI的无线网卡 8686芯片组 接口用的SPI 通过打印信息看总是在读取芯片ID时候出错: Chip(exp, val)= (000bh), ffffh)   //期望是000B ,实际FFFF pxa_gspi_Init is fault !!!!!!!!!!!!! If_Initialize is fault !!!!!!! ...…

查看全部问答>

tilcon 支持不支持双屏显示

tilcon 支持不支持双屏显示…

查看全部问答>

调试lvds屏碰到的问题,黑色变成白色的了.

应该说lvds接上,时序ok了就没问题的,但是现在在做一个10寸的屏时颜色不对,普通lcd黑色的区域在lvds中却成了白色的,原先兰色的logo也变成了淡黄色,请问有知道的大概是什么原因?色温,rgb曲线?但是普通的lcd这些都是不可以调的…

查看全部问答>

关于给eboot添加USB下载功能

让eboot可以通过usb下载NK,有兄弟已实现的吗?给点提示吧! 我用的是nboot+eboot的启动方式,在网上也看了一些资料.问题主要出在中断上. 现在是按照下面的方法: eboot直接修改地址0x18的中断跳转指令,将它指向新的地址,指向自己的中断服务程 ...…

查看全部问答>

请问,pxa270 烧写wince 5时不能烧写至nand flash

请问,pxa270 烧写wince 5时不能烧写至nand flash: 出现以下错误: INFO: FlashErase: erasing flash A6600000 to A7C3FFFF.  Please wait... ................................................................................ .... ...…

查看全部问答>

实现第三步:安装KEIL, OLED成功显示

    装了Keil uVision3后,这几天都在琢磨怎么使用C8051F320,特别是仔细学习了怎么使用他的IO口。同时也在论坛看了很多人的帖子。     以前一直没有焊接OLED: 因为只有一片,而试验并口编程器的时候难免要反复的拆 ...…

查看全部问答>

NXP下载问题

前几天还是可以下载程序的,就是一两天没下载程序就变成这样了,有图,希望大家帮我解决下,大榭!!!!!!!!!!…

查看全部问答>

AD9834原理图(99se)

AD9834原理图(99se) 延续ADI DIY活动及瑞萨DIY活动…

查看全部问答>