这个程序的目的是通过P1.0口产生周期为两秒的方波,由外部中断0口输入方波并计数,从数码管中输出数字,外部中断1接开关,按第一下开始产生方波,计数并显示,按第二下停止计数,显示学号。我的程序的问题是按下开关,方波在产生了几下之后就不产生了,而且显示有问题,显示的时间变长(动态显示),不知道怎么回事,谁能解决一下?(共阴极数码管,六位)
#include<reg51.h>
#define uchar unsigned char
uchar number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极断码0到9
uchar student[6]={0x6f,0x7f,0x4f,0x4f,0x7d,0x06};//学号163389
uchar number_1[6]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//要显示的数字,他是计的数
uchar i=0,k=6;//k是数字的位数,先默认为六位,在后面的程序中再判断
unsigned long j=0;//j作为方波计数的数字
sbit P1_0=P1^0;//P1.0产生方波
void delay(uchar m);//声明延时函数
void main()
{
uchar m;//m作为循环的变量使用
TMOD=0x01;//使用定时器T0,方式一
TH0=0x3c;//
TL0=0xaf;//初值,50毫秒一中断
TR0=0;//先不启动T0,按下键在启动
EA=1;//总中断允许
ET0=1;//T0中断允许
EX0=1;//T1允许
IT0=1;//外部中断1触发方式跳沿
EX1=1;
IT1=1;//外部中断1,触发方式跳沿
while(1)
{
P2=0xfe;//P2最低位选中
if(TR0)//如果定时器开启
for(m=0;m<k;m++)
{
P0=number_1[m];//显示计的数字
delay(5);//动态显示,延时
P2=P2<<1|0x01;//下一位选通
}
else
for(m=0;m<6;m++)
{
P0=student[m];//如果不开启,就显示学号
delay(5);//延时一会
P2=P2<<1|0x01;//下一位选通
}
}
}
void timer_0() interrupt 1//定时器T0中断函数
{
TH0=0x3c;//重载
TL0=0xaf;
i++;
if(i==20)//如果计到1秒
{
i=0;//清零
P1_0=~P1_0;//P1.0取反产生方波
}
}
void int_1() interrupt 2//外部中断一中断函数
{
TR0=~TR0;//进入一次中断函数,一次开启,再一次不开启
}
void int_0() interrupt 0//外部中断0中断程序
{
unsigned long m=1000000,n=100000,c=10,d=1;//为了获得j的位数,先从最高位开始找,因为j最大是六位,所以m取七位,n取六位
uchar t,r;//t的目的是记录j相应位的数字
j++;//进入一次中断,及来一次下降沿,j加一
if(j==999999)//记到最大清零
j=0;
while(1)
{
t=j%m/n;//检查每一位,从高处检查,如果是零,就跳出,记录位数k
if(t!=0)
break;//跳出语句
k--;
m=m/10;
n=n/10;
}
for(r=0;r<k;r++)//现在确定了j的位数,计为k
{
t=j%c/d;//从低位开始记录各位数字
number_1[r]=number[t];//根据找到的数字,从number数组里拿出数字给到number1数组
c=c*10;//
d=d*10;//乘10,准备检查下一位
}
}
void delay(uchar m)//延时函数
{
uchar t;
while(m--)
{
for(t=0;t<120;t++);
}
}
不正常的显示如图所示
|