#include<reg52.h>
#define usi unsigned int //宏定义
#define usc unsigned char //宏定义
sbit duan=P2^6;
sbit wei=P2^7;
usc num,tt;
usc code table[]={ //代码表(数组)
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(usi z) //延时函数 放在主函数前不用声明 有参数,不能忘括号里的变量类型与名称
{
usi x,y;
for(x=z;x>0;x--) //这里不能>= 这个错误坑了我几个小时!!!
for(y=110;y>0;y--); //别再语句块分开的地方搞错了 是用分号不是逗号 诶~~~~~
}
void main()
{
num=0;
tt=0;
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65535-50000)/256; // "/"是求模运算 即能被几个整除
TL0=(65535-50000)%256; // "%"是求余运算 即整除后剩余
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0 也可以写成 TCON=0x01;
wei=1;
P0=0x00; //点亮所有数码管(共8位)
wei=0;
duan=1;
P0=0x3f; //数码管显示1
duan=0;
while(1)
{
if(tt==20)
{
tt=0;
num++;
if(num==16)
num=0;
duan=1;
P0=table[num];
duan=0;
//delay(1000);
}
}
}
void
time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}
你这一段是对中断的工作方式、初值、是否允许中断等进行设置,而工作在模式1时,定时/计数器是16位的,TH0和TL0是定时器0的初值,决定定时器0的计时时间,定时器的计时是从初值开始,每一个机械周期往上+1,直至达到65535,下一机械周期到来时+1为65536,16位2进制数满,溢出,使定时器0的溢出标志位硬件置1,单片机停止当前程序,转向执行中断程序。
这一段是你的中断程序,内容为:单片机定时器溢出中断后,重置定时器初值,并将变量tt加1,
在你的主函数中,有着这个while语句,单片机执行完上面对定时器0的初值的设定和数码管显示后就一直在这个语句里等待tt等于20,当tt等于20时,将tt重置为0并将变量num加1.
这是利用定时器0和中断实现的计时。
一周热门 更多>