標(biāo)題: 這個(gè)超聲波測(cè)距儀程序只會(huì)顯示0000 [打印本頁(yè)]

作者: 左眼    時(shí)間: 2019-12-29 10:17
標(biāo)題: 這個(gè)超聲波測(cè)距儀程序只會(huì)顯示0000
#include"myhead.h"    //還有一部分是digdisplay(unsigned char wei,unsigned char duan)的封裝函數(shù),這一部分沒問題(我確定)

sbit Trig=P2^1;
sbit Echo=P2^0;   
bit flag=0;                  //定義一個(gè)中斷標(biāo)志位
u16 time,distance;

u8 n,date[4]={0,0,0,0};



void Count()
{
  time=TH0*256+TL0;
  distance=time*0.17;                    //算出距離單位是毫米       
  if(flag==1||distance>4500)                //說明超過超聲波測(cè)距儀測(cè)試范圍                         最小2厘米最大450厘米
  {
    flag=0;
    date[3]=12;
        date[2]=13;
        date[1]=13;
        date[0]=0;
  }
  else
  {

         date[3]=distance/1000;
         date[2]=distance%1000/100;
         date[1]=distance%100/10;
         date[0]=distance%10;
  }
         
}

void Int0() interrupt 1                   //標(biāo)志位的改變
{
   flag=1;
}

void Int1() interrupt 3        //做每隔100毫秒給超聲波測(cè)距儀發(fā)送啟動(dòng)命令
{
        TL1 = 0x18;                //設(shè)置定時(shí)初值
        TH1 = 0xFC;                //設(shè)置定時(shí)初值
        digdisplay(3,date[3]);
        digdisplay(2,date[2]);
        digdisplay(1,date[1]);
        digdisplay(0,date[0]);
   n++;
   if(n==100)                //200毫秒定時(shí)時(shí)間到
   {
     n=0;
    TL0 = 0;               
    TH0 = 0;       
         Trig=1;
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
         Trig=0;
   }
}
void main()
{
   TMOD=0x11;  //開啟定時(shí)器0,1
   TL0 = 0;                //設(shè)置定時(shí)初值                         時(shí)間 26470微秒
   TH0 = 0;                //設(shè)置定時(shí)初值                         最大距離 450厘米
   TF0=0;
   ET0=1;
   TL1 = 0x18;                //設(shè)置定時(shí)初值
   TH1 = 0xFC;                //設(shè)置定時(shí)初值
   TF1 = 0;                //清除TF1標(biāo)志
   TR1 = 1;                //定時(shí)器1開始計(jì)時(shí)
   ET1=1;
   EA=1;
   while(1)
   {
      while(!Echo);
          TR0=1;
          while(Echo);
          TR0=0;
          Count();                                //對(duì)測(cè)試出來(lái)的時(shí)間進(jìn)行處理
   }
}


作者: zhy123654    時(shí)間: 2019-12-29 22:43
主循環(huán)里沒有起動(dòng)函數(shù),while(!Echo);前面加啟動(dòng)函數(shù)
作者: 左眼    時(shí)間: 2019-12-30 12:03
zhy123654 發(fā)表于 2019-12-29 22:43
主循環(huán)里沒有起動(dòng)函數(shù),while(!Echo);前面加啟動(dòng)函數(shù)

啟動(dòng)函數(shù)在中斷3中,
作者: 左眼    時(shí)間: 2019-12-30 14:40
大家問題我找到了,沒想到在顯示部分(尷尬了),我的數(shù)碼管顯示程序是一次延時(shí)時(shí)間是1毫秒(共顯示四次也就是4毫秒),導(dǎo)致程序在中斷部分延時(shí)時(shí)間過長(zhǎng),縮短顯示函數(shù)的延時(shí)時(shí)間就行了,主程序沒問題可以參考一下,也可以用查詢式的方法,不用定時(shí)器1,這樣就不用考慮程序的中斷了,而且還解決了某些小問題。謝謝大家的解答了。
作者: 左眼    時(shí)間: 2019-12-30 14:43
問題出在顯示程序上,我的顯示程序延時(shí)時(shí)間過長(zhǎng)導(dǎo)致在中斷中的時(shí)間過長(zhǎng)了,縮短顯示程序的延時(shí)時(shí)間就可以了,謝謝大家對(duì)我問題的解答。十分感謝!
作者: 左眼    時(shí)間: 2019-12-30 14:44
左眼 發(fā)表于 2019-12-30 12:03
啟動(dòng)函數(shù)在中斷3中,

問題出在顯示程序上,我的顯示程序延時(shí)時(shí)間過長(zhǎng)導(dǎo)致在中斷中的時(shí)間過長(zhǎng)了,縮短顯示程序的延時(shí)時(shí)間就可以了,謝謝大家對(duì)我問題的解答。十分感謝!
作者: jizhongbiao    時(shí)間: 2019-12-30 16:44
正確的做法是用中斷+標(biāo)志實(shí)現(xiàn)延時(shí)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1