#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义LED1管脚
u8 smg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void time0_init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void main()
{
time0_init();//定时器0中断配置
while(1);
}
void time0() interrupt 1 //定时器0中断函数
{
static u16 i; //定义静态变量i
static u8 a=0;
TH0=0XFc; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i%1000==0)
{
i=0;
P1=~smg_code[a];
a++;
}
if(a>9)
{
a=0;
}
}
主要讲一下中断函数里的代码
void time0() interrupt 1 //定时器0中断函数
{
static u16 i; //定义静态变量i
static u8 a=0;
TH0=0XFc; //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i%1000==0)
{
i=0;
P1=~smg_code[a];
a++;
}
if(a>9)
{
a=0;
}
}
常用在定时中断里的代码
static u16 i ;
i++;
if(i%1000==0){
i=0;
//要干的事
}
为什么要写这段代码呢?
首先定时器能定的最长时间是多少?
这里就由TH0和TL0决定,一共是16位(二进制)对吧,也就是十进制的65535,最多能计时 65.535毫秒。
如何计算时间的呢?
也就是单片机它会在1微秒的时间计时一次,总共能计65535次,当到65535时计满,就从0 重新计时,如此循环。
这段代码的作用就是能定时更长时间,
怎么做到的呢?
我们分析一下整个过程,这个定时器T0它配置的是定时1毫秒对吧,就是说每1毫秒会进入中断函数一次,进来后就加1,然后判断,判断是不是进来1000次了,不是 是不是要跳出中断函数,再过1毫秒再进入中断函数,再判断,当满足1000次时执行if里面的代码。
这里有几个细节,第一,每次进入中断函数要再次给TH0和TL0赋初值,保证在中断函数每次计时时间为1毫秒。 第二,变量i需要是静态变量,跳出中断函数也会保留i的大小,确保他每次进入中断函数知道自己是第几次进来的。 第三,当进来1000次时把置0,重新开始计算进来的次数。
不难看出,我这里定时是1秒。 整体功能是控制静态数码管显示,第1秒显示0,第二秒显示1等,当显示9后回到0重新开始显示。