第7讲江协讲述了关于定时器得内容
什么是定时器?
你可以把它当作一个闹钟,设计在单片机内部得辅助电路,其实定时器也是计数器,根据设置可以调整,后将讲。
定时器与delay有什么区别?
delay程序是硬让单片机(大脑)等执行下一步,等待过程中单片机运算单元被强行停止或者占用;使用定时器不需要单片机等待,如果现存有可运行得代码,单片机可以腾出手用于可运行代码,等定时器设定时间到达,再执行对应程序,这样可以使单片机运算资源得到充分运用。
通俗得讲delay需要大脑默念延时,过程中大脑被占部分干不了别的,定时器就像闹钟,如果还未到定时器触发的程序,大脑可以空出资源处理别得事情。
定时器需要什么进行计时/计数?
定时器需要一个心脏,跳一下记一次,这就是时钟,时钟分外部与内部,外部电路上晶振就是一种时钟,他会以固定频率震动,根据压电效应会在电路中形成周期电平震动形成上升沿与下降沿,单片机内部集成了分频系统规定时钟默认12个时钟周期记一次。
定时器到点会怎么样?
打别方,你在玩游戏,突然闹钟响了,你要去吃饭,吃完饭继续回来玩游戏,定时器到点后中断系统会打断你当前事情,让你去处理中断系统被设置的任务,处理完后回来执行原程序,这与程序优先级有关,中断系统与优先级绑定,且中断系统是很多电路都有的系统。
怎么控制定时器,中断系统?
通过寄存器,对对应位电平拉高与贬低,每一位电平高低控制着背后相连逻辑电路的运行模式,TCON寄存器控制定时器是否工作(TR)与是否向中断系统传输溢出型号(TF0),TMOD确认T0与T1时钟/计数器工作模式,GATE可以将外部引入端口作为定时器是否工作得控制端口之一,CT为控制定时器是(0)定时还是(1)计数作用,M1与M2控制定时器得工作模式,其余均为定时器得存储单元,中断寄存器,控制TF0溢出型号来自于高优先还是低优先,PT等控制TF0信号属于高优先还是低优先。
1.程序流水灯上代码详细展示:
这里我们先把定时器作为一个单独的头文件保存,通俗的说就是把闹钟保存下来,方便后续使用,每个端点怎么定义可以详看产品说明书中的中断系统寄存器说明。
#include <REGX52.H>//.c文件,因为里面包含了寄存器赋值,所以还需要在头文件的.c文件里面插入,自己设置建的头文件包含.c说明文件与.h说明文件两类,希望读者不要迷惑。
void time0init()
{
TMOD=0X01;//00000001
TH0 = (65535 - 46080) / 256;
TL0 = (65535 - 46080) % 256;
ET0 = 1; //
EA = 1;
TR0 = 1;
PT0 = 1;
}
#ifndef __TIME0_H__//.h文件
#define __TIME0_H__
void time0init();
#endif
主要代码:
#include <REGX52.H>
#include <INTRINS.H>
#include "time0.h"//新建立的时钟
#include "LCD1602.h"
#include "Delay.h"
void main()
{ P2_0 = 0;
time0init();
while (1)
{
}
int b = 0;
void timeopp() interrupt 1
{
b++;
TH0 = (65535 - 46080) / 256;
TL0 = (65535 - 46080) % 256;
if(b>20)
{
P2=_crol_(P2,1);
b = 0;
}
}
//作者没有将独立按键设置其中所以,最终的效果是,只要开机则灯会由左及右
2.钟表
接下来一个程序是关于时钟的计时程序
这里我直接用if else if语句嵌套,建议初学者细读,弄懂循环与选择的逻辑,这里实现的就是从秒开始计时,从sec到h,最多24个小时后就重置,58与23的数字设计是考虑到程序逻辑顺序的问题进行了满进前2位做判别取舍。
#include <REGX52.H>
#include <INTRINS.H>
#include "time0.h"
#include "LCD1602.h"
#include "Delay.h"
void main()
{ LCD_Init();
LCD_ShowString(1,1,"TIME");
LCD_ShowString(2,1,"00:00:00");
time0init();
while (1)
{
}
}
int a,b,c,d= 0;
void timeopp() interrupt 1
{
a++;
TH0 = (65535 - 46080) / 256;
TL0 = (65535 - 46080) % 256;
if(a>20)
{
if(b <= 58)
{ b++;
LCD_ShowNum(2,7,b,2);
}
else if(b>58)
{b=0;
LCD_ShowNum(2,7,b,2);
c++;
if(c <= 58)
{
LCD_ShowNum(2,4,c,2);
}
else if(c>58)
{
c=0;
LCD_ShowNum(2,4,c,2);
d++;
if (d <= 23)
{
LCD_ShowNum(2,1,d,2);
}
else if(d > 23)
{
a=0;
b=0;
c=0;
LCD_ShowString(2,1,"OUT");
}
}
}
a = 0;
}
}