找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4990|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)計(jì)數(shù)與數(shù)碼管顯示問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這個(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++);
}
}
不正常的顯示如圖所示


5LBWE3MG0KLBDQ{I5S8F3~V.png (268.11 KB, 下載次數(shù): 58)

5LBWE3MG0KLBDQ{I5S8F3~V.png

F`M{{92F4KCH42JPL_7SX%H.png (269.33 KB, 下載次數(shù): 78)

F`M{{92F4KCH42JPL_7SX%H.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:301728 發(fā)表于 2018-5-31 21:15 | 只看該作者
改好了,原來是在外部中斷0每次記錄j的位數(shù)時(shí),忘了在中斷服務(wù)程序的開頭處寫上k=6,不然若第一次記錄了k=1,下一次就會繼續(xù)減,成了別的數(shù)了,不再可以記錄位數(shù)了。

評分

參與人數(shù) 1黑幣 +70 收起 理由
admin + 70 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表