定时中断对于初学者来说,相对还是比较难以把握的,不过根据本人十几年的学习经验,我知道这世界上的知识都是可以学会的,只要你有相应的基础,觉得难都是因为不会才觉得难,这话不矛盾的,学习的过程就是掌握基础的过程,基础掌握了,那么再继续学习,学会就只是时间上的问题了,这只是单纯的强调基础的重要性。学习需要的是有着充分的耐心和毅力,有了这些前提,我相信你肯定会发觉,这个过程其实是那么的美好。
#include《reg52》
sbitWEB1=P1^1;
sbitA=P1^0;
sbitL=P1^3;
sbitLED=P1^2;
voiddelay();
unsigned char codetable[]={
0X3F,0X06,0X5B,0X4F,0X66,
0x6d,0X7D,0X07,0X7F,0X6F,
0X77,0X7C,0X39,0X5E,0X79,
0X71};
int num=0;
int temp=0;
void main()
{
P0=0X00; //关闭点阵
L=0; //锁存
P0=0XFF; // 关闭LED灯
LED=0; //锁存
WEB1=1; //位选
P0=0XFE; //共有8个数码管,打开第一个数码管
WEB1=0; //锁存
EA=1;//中断总控制位,EA=1,CPU开放中断
ET0=1;//定时中断T0控制位,ET0=1,允许定时中断0中断
TMOD=0X01; //定时方式开启1,即方式2
TH0=(65536-50000)/256;//给定时器T0高八位赋值 ,50000为50us,65536=2^16;
TL0=(65536-50000)%6; //给定时器T0低八位赋值
TR0=1; //启动定时
while(1)
{
if(num==20) //中断20次,即1秒,进入循环
{
if(temp==15)
temp=0 ;
A=1; //段选
P0=table[temp]; //一个数码管有8个二极管,需要显示的数字
A=0; //锁存
//delay();
temp++;
num=0; //清0
}
}
}
voiddelay()
{
inta,b;
for(a=1500;a>=0;a--)
for(b=100;b>=0;b--);
}
voidexter0() interrupt 1//interrupt为中断函数关键字,说明这个函数是中断函数,中断函数不用函数声明
{//0表示51单片机的5个中断源的第一个,即INT0,外部中断0 ,1为定时中断
TH0=(65536-50000)/256; //每一次中断要给计数器赋值,因为计数器溢出后会清0
TL0=(65536-50000)%6;
num++;
}
|