uli123 发表于 2012-9-27 21:23:48

求大神帮忙解决个有关单片机定时器的程序

我自己写了个程序,实在是找不出错误,麻烦哪位高手帮忙解答下!
要实现的功能是:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。用的芯片是STC89C58RD+,晶振是11.0592MHz,程序代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei=P2^7;
sbit duan=P2^6;
sbit led1=P0^0;
uchar n1=0,n2=0,n=0;
uchar shi=0,ge=0;
uchar code atm[]={
                           0x3f,0x06,0x5b,0x4f,
                   0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f
                        };
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
    for(j=110;j>0;j--)
       ;
}
void smg(uchar shi,uchar ge)
{
duan=1;
P0=atm;
duan=0;
P0=0xff;
wei=1;
P0=0x7f;
wei=0;
delay(5);   // 延时?
P0=0xff;
duan=1;
P0=atm;
duan=0;
P0=0xbf;
wei=1;
P0=0xbf;
wei=0;
delay(5);
}

void main()
{

TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
    smg(shi,ge);
}
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
n1++;
if(n1==4)
   {
       n1=0;
       led1=~led1;
        }
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
n2++;
if(n2==20)
{
    n=0;
       n++;
       if(n==60)
          {
           n=0;
                shi=n/10;
                ge=n%10;
          }
}
}

sf49ers 发表于 2012-9-27 22:48:59

T1中断里第一个n=0什么意思,紧接着n++永远等于1

cumtgao 发表于 2012-9-28 09:05:19

定时中断里 n == 20 后。里面并没有将n清零故n2会一直停在0这个数里

yao1 发表于 2012-9-28 10:22:16

n2 误清零 还有用1个中断就可以了 不要浪费中断

void T0_time() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;

n1++;
n2++;

if(n1>=4)
   {
         n1=0;
         led1=~led1;
   }

if(n2>=20)
{
         n2=0; //此处为n2 你写成n了
         n++;
         if(n>=60)
          {
                n=0;
                shi=n/10;
                ge=n%10;
          }
}

}

568581185 发表于 2012-9-28 10:24:36

LS正解。。

uli123 发表于 2012-9-28 17:24:01

我去试试看!谢谢各位高手,最近刚开始玩单片机,还不太懂,刚在这注册,不知有什么规则否?

uli123 发表于 2012-9-28 17:42:32

另外补充一下,n1用来控制发光管每200ms亮一次的变量,n是用来使shi,ge改变,使数码管每秒增加1(“shi”为“十位数”,“ge“为“个位数”),n2则用来控制一秒的时间,定时器初始赋值后50ms后溢出
页: [1]
查看完整版本: 求大神帮忙解决个有关单片机定时器的程序