|
這個(gè)程序的目的是通過P1.0口產(chǎn)生周期為兩秒的方波,由外部中斷0口輸入方波并計(jì)數(shù),從數(shù)碼管中輸出數(shù)字,外部中斷1接開關(guān),按第一下開始產(chǎn)生方波,計(jì)數(shù)并顯示,按第二下停止計(jì)數(shù),顯示學(xué)號。我的程序的問題是按下開關(guān),方波在產(chǎn)生了幾下之后就不產(chǎn)生了,而且顯示有問題,顯示的時(shí)間變長(動態(tài)顯示),不知道怎么回事,誰能解決一下?(共陰極數(shù)碼管,六位)
#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};//學(xué)號163389
uchar number_1[6]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//要顯示的數(shù)字,他是計(jì)的數(shù)
uchar i=0,k=6;//k是數(shù)字的位數(shù),先默認(rèn)為六位,在后面的程序中再判斷
unsigned long j=0;//j作為方波計(jì)數(shù)的數(shù)字
sbit P1_0=P1^0;//P1.0產(chǎn)生方波
void delay(uchar m);//聲明延時(shí)函數(shù)
void main()
{
uchar m;//m作為循環(huán)的變量使用
TMOD=0x01;//使用定時(shí)器T0,方式一
TH0=0x3c;//
TL0=0xaf;//初值,50毫秒一中斷
TR0=0;//先不啟動T0,按下鍵在啟動
EA=1;//總中斷允許
ET0=1;//T0中斷允許
EX0=1;//T1允許
IT0=1;//外部中斷1觸發(fā)方式跳沿
EX1=1;
IT1=1;//外部中斷1,觸發(fā)方式跳沿
while(1)
{
P2=0xfe;//P2最低位選中
if(TR0)//如果定時(shí)器開啟
for(m=0;m<k;m++)
{
P0=number_1[m];//顯示計(jì)的數(shù)字
delay(5);//動態(tài)顯示,延時(shí)
P2=P2<<1|0x01;//下一位選通
}
else
for(m=0;m<6;m++)
{
P0=student[m];//如果不開啟,就顯示學(xué)號
delay(5);//延時(shí)一會
P2=P2<<1|0x01;//下一位選通
}
}
}
void timer_0() interrupt 1//定時(shí)器T0中斷函數(shù)
{
TH0=0x3c;//重載
TL0=0xaf;
i++;
if(i==20)//如果計(jì)到1秒
{
i=0;//清零
P1_0=~P1_0;//P1.0取反產(chǎn)生方波
}
}
void int_1() interrupt 2//外部中斷一中斷函數(shù)
{
TR0=~TR0;//進(jìn)入一次中斷函數(shù),一次開啟,再一次不開啟
}
void int_0() interrupt 0//外部中斷0中斷程序
{
unsigned long m=1000000,n=100000,c=10,d=1;//為了獲得j的位數(shù),先從最高位開始找,因?yàn)閖最大是六位,所以m取七位,n取六位
uchar t,r;//t的目的是記錄j相應(yīng)位的數(shù)字
j++;//進(jìn)入一次中斷,及來一次下降沿,j加一
if(j==999999)//記到最大清零
j=0;
while(1)
{
t=j%m/n;//檢查每一位,從高處檢查,如果是零,就跳出,記錄位數(shù)k
if(t!=0)
break;//跳出語句
k--;
m=m/10;
n=n/10;
}
for(r=0;r<k;r++)//現(xiàn)在確定了j的位數(shù),計(jì)為k
{
t=j%c/d;//從低位開始記錄各位數(shù)字
number_1[r]=number[t];//根據(jù)找到的數(shù)字,從number數(shù)組里拿出數(shù)字給到number1數(shù)組
c=c*10;//
d=d*10;//乘10,準(zhǔn)備檢查下一位
}
}
void delay(uchar m)//延時(shí)函數(shù)
{
uchar t;
while(m--)
{
for(t=0;t<120;t++);
}
}
不正常的顯示如圖所示
|
|