初学菜鸟问题,理清定时器中断C程序
时间:10-02
整理:3721RD
点击:
下面这段程序的功能是1s改变一次共阴数码管示数,
从TR0=1开始就开始加数了对吧,同时程序不断运行,运行到数加满就停下来,执行中断服务,中断服务结束再回到主函数.对吧?
问题:
1.假如主函数运行结束(没有while(1)的话)还没加满是不是就不执行中断服务了?
2.下面理清程序执行的顺序,希望你能帮我看看有没有细节的问题:
程序中当计时器加满溢出,不断加数,并开始执行中断服务,中断服务程序(如下)中又把TH0,TL0重新赋值,原来的计时结束,重新开始新的计时,然后tt自加1,完了就返回主函数判断if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务,tt自加,完了就返回主函数判断 if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务 ....直到tt==100,就改变一次数码管示数.然后tt清0,与此同时定时器还在加数,直到下一次tt==100,于是就达到一秒钟变一次数码管示数的效果了.这个过程有问题没有?
void time0() interrupt 1{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
/****************程序********************/
#define uchar unsigned char
/****************************************/
//数码管接在P0口
sbit dula=P2^6;//数码管段选锁存器
sbit wela=P2^7;//数码管位选锁存器
uchar num,tt;
uchar code table[]={//数码管数字123456789abcdef对应编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/****************************************/void main()
{
num=0;
tt=0;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
wela=1;
P0=0xfe;//11111110
wela=0;
dula=1;
P0=0x3f;//数码管显示0
dula=0;
while(1)
{
if(tt==100)//1s改变一次数码管示数
{
tt=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
}
/***************************************/
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
从TR0=1开始就开始加数了对吧,同时程序不断运行,运行到数加满就停下来,执行中断服务,中断服务结束再回到主函数.对吧?
问题:
1.假如主函数运行结束(没有while(1)的话)还没加满是不是就不执行中断服务了?
2.下面理清程序执行的顺序,希望你能帮我看看有没有细节的问题:
程序中当计时器加满溢出,不断加数,并开始执行中断服务,中断服务程序(如下)中又把TH0,TL0重新赋值,原来的计时结束,重新开始新的计时,然后tt自加1,完了就返回主函数判断if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务,tt自加,完了就返回主函数判断 if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务 ....直到tt==100,就改变一次数码管示数.然后tt清0,与此同时定时器还在加数,直到下一次tt==100,于是就达到一秒钟变一次数码管示数的效果了.这个过程有问题没有?
void time0() interrupt 1{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
/****************程序********************/
#define uchar unsigned char
/****************************************/
//数码管接在P0口
sbit dula=P2^6;//数码管段选锁存器
sbit wela=P2^7;//数码管位选锁存器
uchar num,tt;
uchar code table[]={//数码管数字123456789abcdef对应编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/****************************************/void main()
{
num=0;
tt=0;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
wela=1;
P0=0xfe;//11111110
wela=0;
dula=1;
P0=0x3f;//数码管显示0
dula=0;
while(1)
{
if(tt==100)//1s改变一次数码管示数
{
tt=0;
num++;
if(num==16)
num=0;
dula=1;
P0=table[num];
dula=0;
}
}
}
/***************************************/
void time0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
tt++;
}
问题1.main()有死循环相当于在单片机ROM里有效程序结尾加了个jmp跳回指令,类似goto。如果没有死循环,IP往指执行ROM里那些nop,一样会当TF位有置位后进去中断服务函数。朋友你汇编指令学了就会好很多,理解。
2.目测单片机复位后闪显0后乱码。看你的代码应该硬件结构是共DATAPORT,两片573之类的锁存,应该有8个数码管。只能用动态扫描显示,你不扫位码怎么会正常显示。
1.哦~学习了
2.嗯~是有两个锁存器, 它只亮一个数码管啊,我说的那个过程,有问题木有
wela=1;
P0=0xfe;//11111110
wela=0;
谢谢前辈,给你拜年了