求大神帮忙解决个有关单片机定时器的程序
我自己写了个程序,实在是找不出错误,麻烦哪位高手帮忙解答下!要实现的功能是:用定时器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;
}
}
} T1中断里第一个n=0什么意思,紧接着n++永远等于1 定时中断里 n == 20 后。里面并没有将n清零故n2会一直停在0这个数里 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;
}
}
}
LS正解。。 我去试试看!谢谢各位高手,最近刚开始玩单片机,还不太懂,刚在这注册,不知有什么规则否? 另外补充一下,n1用来控制发光管每200ms亮一次的变量,n是用来使shi,ge改变,使数码管每秒增加1(“shi”为“十位数”,“ge“为“个位数”),n2则用来控制一秒的时间,定时器初始赋值后50ms后溢出
页:
[1]