51单片机定时器用法之1秒定时程序设计
动画演示
在我们的DIY电子时钟里,需要用到单片机定时器来做秒的显示,说是显示,其实就是实现数码管上“:”点的闪烁。这里初步定义为每秒亮1次,亮0.5秒,灭0.5秒。实现显示秒的功能。这里也可以用DS1302的秒数据来做,但是实现起来麻烦,达到一样的效果,我们追求的是程序越简单越好,所以在此我们用单片机定时器来实现。
我们DIY时钟板子上的单片机为STC15W408AS,单片机自带IRC可调时钟和搞可靠复位,为了降低功耗(工作频率越低,功耗越小),本时钟采用12M的工作频率(烧写程序是在软件上选择),那当定时器工作在12T模式下时,一个机械周期就是1us。
接下来我们就该看看单片机的数据手册了。以下是今天我们需要关注的寄存器:
TCON位定义
TMOD寄存器位定义
T0工作方式设置
TCON为定时器T0和T1的控制寄存器,可以位寻址(直接操作位);TMOD是T0、T1工作方式控制寄存器,不可以位寻址(只能操作寄存器),高四位控制T1,低四位控制T0;定时器的工作方式由TOMD寄存器中的M1和M0选择,具体如上图。
本例中我们要用T0实现1秒的定时时间,这里我们用T0工作在方式0,也就是16位的自动重载方式(传统的51单片机只有8位的自动重载,需要做高精度的定时时最好用自动重载方式)。我们不需要外部中断来开启定时器,所以GATE位=0,T0工作在定时模式,CT=0,所以我们TMOD寄存器的值为0x00;在TCON寄存器里和T0相关的位有TF0和TR0;TF0=0:T0中断标志位,当定时器中断产生是,TF0自动置位,CPU相应中断后硬件自动清零;TR0=1:开启定时器,相当于定时器的开关。
除了这些寄存器外,定时器溢出后,也会产生中断,所以还需要去设置中断部分:
EA=1:,开启总中断,相当于中断总开关;ET0=1;开启定时器T0中断,相当于中断的子开关,只有中断的总开关和相应的子开关都开启后,CPU才能相应中断信号,具体请看中断部分数据手册。我们用的STC15W系列单片机属于增强型单片机,为了和传统51单片机兼容,还专门设有一个寄存器AUXR,此寄存器可设置T 0工作在1T还是12T模式,此处我们让T0工作在12T模式下,AUXR=0x00。最后就是定时器的初值寄存器了,我们需要定时的时间是500ms,16位的定时器再12M频率下最大定时时间为65535us,而我们需要的是500ms,明显达不到,那我们就需要做组合定时的方式,这里我们设定定时器的中断频率为10ms,那我们中断1次后在中断函数里将某个变量加1,当变量加到50的时候就是500ms,当变量加到100的时候就是1s了。这就是我们实现1s定时的思路。
具体实现程序如下:(因头条原因,代码图片无法加入,需要请移步关注微信公众号)
如上图中程序所示,定时器初始化时设置T0位16位自动重载模式,工作在12T模式,初值10ms,开启定时器,开启中断。这样定时器就工作了;在定时器中断函数里,每次进入中断后我们就给变量T_a自加1,当变量小于50的时候(小于500ms),让D=1(D即为我们电路中控制秒显示的那两个点,高电平有效),大于50小于100的时候D=0,关闭秒显示。这样一来就实现了秒显示在1秒内亮500ms,灭50ms了。上图中中断函数名后面的interrupt 1这是中断函数的入口地址,C语言中叫中断号(为小白说明,老司机略过),具体的个中断对应的入口地址对照表如下图(部分):
中断号对照表
单片机入门-C51语言采用定时器中断方法获取1秒精准定时解说
视频教程:
视频
单片机接通电源后将循环执行我们编制好的程序(一般称为主程序),当有外部设备或内部部件要求CPU为其服务时,计算机将被迫“中断”主程序的执行,并记录下暂停处程序地址(断点地址),然后转去为外部设备服务,即执行中断服务程序;在中断程序执行完毕后自动返回被迫中断主程序的地址,继续执行原主程序 一个单片机系统可能有多个中断源,而单片机CPU在某一时刻只能响应一个中断源的中断请求,当多个中断源同时向CPU发出中断请求时,则必须按照“优先级别”进行排队,CPU首先选定其中中断级别高的中断源为其服务,然后按排队顺序逐一服务,完毕后返回断点地址,继续执行主程序。
AT89C51具有五个中断源,分为内部中断源和外部中断源。外部中断源有两个,通常指由外部设备发出中断请求信号,从P3.2和P3.3 引脚输入单片机,用电平或边沿触发两种方式申请中断。 内部中断源有三个,两个定时器/计数器(T0,T1)中断源和一个串行口中断源,T0和T1的中断申请是在它们计数从全“1”变为全“0”溢出时自动向中断系统提出的。
本文采用定时器中断的方法先产生50毫秒的信号,计数20次得到1秒的时钟信号,作为后续电子钟设计的基础。
采用中断法的定时器/计数器的运用总结如下:
1。计算计数初值:
计数值=定时的时间/机器周期 50ms/1us=50000
初值X=最大计数值M-计数值; 65536-50000=15536 (0x3cb0)
2.TMOD寄存器的设置:
GATE C/T M1 M0 GATE C/T M1 M0
0 0 0 0 0 0 0 1 (0x01)
3.TCON寄存器的设置:
主要关注TR1/TR0 TR0=1
4.打开中断(含定时器中断和总中断)
5.中断服务函数的编程
相关问答
51 单片机 ,有8个流水灯,每个之间延迟 1秒 ,这个延迟用c程序编写怎么写?1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。2、#include"reg51.h"首先写出单片机的头函数。3、#include"int...
51 单片机 中R0,R1,R2.都表示的是什么,很多时候看不懂.比如说O...[最佳回答]这个叫做软件延时程序.由于单片机每执行一条指令都需要时间.上面的程序用文字描述:DELAY:MOVR5,#20;延时子程序,延时0.2秒这句是将十进制数20这...
单片机秒 表实验原理?利用单片机的定时器/计数器定时和记的原理,结合显示电路、LED数码管以及按键来设计计时器,具有00-99分钟计时及显示功能;具有开始、停止和复位功能,并由按键...
51 单片机 30 秒 倒计时,用数码管显示的,c程序,元件只有at89c51和数码管,没有其他的?数码管一般是电流驱动,跟电压关系不大,但是电压在数码管灭了时候会加到IO口上(即此时电压和IO口电压一致或略高),而IO口是不能提供10V电压的,可以找找双电...
不准 慢了10多 秒 单片机 晶振是12mhz-ZOL问答秒,其次你的中断里面执行的程序太长也会占用中断的。所以时间也会不准。你可以在中断里设置个标志位,然后在主程序中查询!定时不准,用单片机没法做到很准确的...
1T和12T 单片机 的区别?标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,...而...
什么是 单片机 时钟控制信号的最基本时间单位?单片机时钟控制信号的最基本时间单位是时钟周期(ClockCycle),也称为机器周期(MachineCycle)或指令周期(InstructionCycle)。时钟周期是单片机时钟振荡...
单片机 中断C编程問題,在中断按键按下后,要求P1^1管脚接的灯...1讨论回答(3)#include
用个引脚比较多的单片机就可以了。比如STC89C52等等。数码管用扫描方式,LCD如果用1602就直接写,也不会占用单片机多少时间。用个引脚比较多的单片机就可以了...
用汇编语言编写51 单片机 程序让LED灯亮0.5 秒 ,灭2秒无限循环?ORG0000HMOVSP,#60HE:CLRP1.0;P1.0LED亮ACALLDEL_1S;0.5秒SETBP1.0;P1.0LED灭ACALLDEL_2S;2....