刚学单片机,有个中断的问题想请教下
题目要求是:用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管的前两位59s循环计时。
我写的程序:
/* 用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
用定时器1的方式1实现数码管的前两位59s循环计时。 */
#include<reg52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //编码数码管
0X3F,0X06,0X5B,0X4F,
0X66,0X6D,0X7D,0X07,
0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71};
sbit led1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num0,num1,num,shi,ge;
void display(uchar,uchar);
void delayms(uint);
void main()
{
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TMOD=0X11; //设置定时器工作模式,T0,T1均为方式1
TR0=1; //启动定时器0
TR1=1; //启动定时器1
TH0=(65536-50000)/256; //定时器0装入初值
TL0=(65536-50000)%256;
TH1=(65536-50000)/256; //定时器1装入初值
TL1=(65536-50000)%256;
while(1)
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge)
{
dula=1; //数码管十位
P0=table[shi];
dula=0;
P0=0XFF;
wela=1;
P0=0XFD;
wela=0;
// delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0XFF;
wela=1;
P0=0XFE;
wela=0;
// delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//定时器0
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num0++;
if(num0==4)
{
num0=0;
led1=~led1;
}
}
//定时器1
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
if(num1==20)
{
num1=0;
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
}
}
实验结果是:发光二极管不亮,数码管前两位显示8.8.
求大神指点指点!
终于改好了,发光二极管自己亮的,数码管送段选前应关闭位选。
改好后程序:
/* 用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁,
用定时器1的方式1实现数码管的前两位59s循环计时。 */
#include<reg52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ //编码数码管
0X3F,0X06,0X5B,0X4F,
0X66,0X6D,0X7D,0X07,
0X7F,0X6F,0X77,0X7C,
0X39,0X5E,0X79,0X71};
sbit led1=P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num0,num1,num,shi,ge;
void display(uchar,uchar);
void delayms(uint);
void main()
{
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TMOD=0X11; //设置定时器工作模式,T0,T1均为方式1
TR0=1; //启动定时器0
TR1=1; //启动定时器1
TH0=(65536-50000)/256; //定时器0装入初值
TL0=(65536-50000)%256;
TH1=(65536-50000)/256; //定时器1装入初值
TL1=(65536-50000)%256;
while(1)
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge)
{
// P0=0XFF;
dula=0;
wela=1;
P0=0XFE;
wela=0;
P0=0XFF;
dula=1; //数码管十位
P0=table[shi];
dula=0;
delayms(5);
// P0=0XFF;
dula=0;
wela=1;
P0=0XFD;
wela=0;
P0=0XFF;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//定时器0
void T0_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num0++;
if(num0==4)
{
num0=0;
led1=~led1;
}
}
//定时器1
void T1_time() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
if(num1==20)
{
num1=0;
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
}
}
应该对num0=0,num1=0,shi=0,ge=0赋初值
书上说不赋初值也可以,郭天祥的《新概念51单片机C语言教程》
代码有问题 建议认真理清思路。
数码管送段选前应关闭位选。
应该是循环扫描 任何时候都只有一位数码管处于选通状态
程序中不要用大于1MS以上的延时