|
這個程序的目的是通過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++);
}
}
不正常的顯示如圖所示
|
|