打印

定时器中断的问题

[复制链接]
1282|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dfsa|  楼主 | 2011-11-15 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题1:一般在主函数中装定时器初值,有必要吗?我好像试了,不装也能正常运行。
问题2:如果在定时器1中关闭了定时器0,用TR0=1再次打开定时器0时,需要重新装定时器0的初值吗?还是TR0=1直接就进入定时器0的中断函数从头开始执行。我试过两次不同的结果,但之后一只调试不出先前不装初值的错误。
麻烦各位赐教!
题目如下:利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减直至765398并保持显示此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动,当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。
程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,
0x36,0x79,0x38,0x3f,
0x00};
sbit wela=P2^7;
sbit dula=P2^6;
bit flag,flag1,test;
uchar t1,t0,bai,shi,ge;
uint temp,shu;
void delay(uint z);
void init();
void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge);

void main()
{
init();
while(1)
{
if(flag1!=1)
{ display(7,6,5,bai,shi,ge); //显示765432,一直减到765398
test=0; }
else
{ display(10,11,12,12,13,14); //显示HELLO
test=1; }
}
}

void init()
{
shu=432;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
temp=0xfe;
P1=temp;
TMOD=0x11;
//TH0=(65536-50000)/256; //我一直都是不装初值的,好像没有什么错误
//TL0=(65536-50000)%256; //但一般的书上都是装初值的,所以比较困惑是否有必要
//TH1=(65536-50000)/256;
//TL1=(65536-50000)%256;
EA=1;
ET1=1;
ET0=1;
TR1=1;
TR0=1;
}

void display(uchar aa,uchar bb,uchar cc,uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[aa];
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay(1);

dula=1;
P0=table[bb];
dula=0;
wela=1;
P0=0xfd;
wela=0;
delay(1);

dula=1;
P0=table[cc];
dula=0;
wela=1;
P0=0xfb;
wela=0;
delay(1);

dula=1;
P0=table[bai];
dula=0;
wela=1;
P0=0xf7;
wela=0;
delay(1);

dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0xef;
wela=0;
delay(1);

dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0xdf;
wela=0;
delay(1);
}

void delay(uint z)
{
uchar x;
uint y;
for(x=0;x<75;x++)
for(y=0;y<Z;Y++);
}

void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
if(shu==398)
{
TR0=0;
TR1=0;
flag=1;
P1=0xff;
//TH0=(65536-50000)/256; //是否有必要再装一次初值?
//TL0=(65536-50000)%256;
//t0=0;
TR0=1;
}
}
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(flag!=1)
{
if(t0==10)
{
t0=0;
temp=_crol_(temp,1);
P1=temp;
}
}
else
{
if(t0%4==0)
P1=~P1;
if(t0==60)
{
TR0=0;
P1=0xff;
flag1=1;
}
}
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

2404

帖子

2

粉丝