久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3919|回復: 6
打印 上一主題 下一主題
收起左側(cè)

單片機超聲波測距仿真為什么LCD1602只亮卻沒有顯示?

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:899677 發(fā)表于 2021-5-4 22:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
50黑幣
原理圖和程序是買實物時送的,但我照原理圖搭了仿真,把hex文件導進去LCD沒有顯示,大哥們這是為啥?這是單片機程序:
#include <REG52.H>      //器件配置文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

sbit  RX = P2^1;
sbit  TX = P2^0;

sbit LCM_RW = P2^6; //定義LCD引腳
sbit LCM_RS = P2^5;
sbit LCM_E   =P2^7;
#define LCM_Data  P0

sbit K1= P3^2; //定義Keyboard引腳
sbit K2= P3^3;
uchar Slong=30;   // 報警距離值    如果需要修改報警距離,則改此處數(shù)值就可。
sbit speak=P1^7;   //蜂鳴器報警的口線定義

#define Busy    0x80 //用于檢測LCM狀態(tài)字中的Busy標識

void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Decode(unsigned char ScanCode);
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);

unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigned char code juli[] ={"The distance is"};
unsigned char code kaiji[] = {"             "};

unsigned char code ASCII[15] =  {'0','1','2','3','4','5','6','7','8','9','.','-','M','S'};

static unsigned char DisNum = 0; //顯示用指針               
unsigned int  time=0;
unsigned char  timer=0;
unsigned char pinlv=0;
unsigned char cishu=0;
unsigned long S=0;
bit      flag =0;
bit  flag_one=0;
bit  flag_two=0;
unsigned char disbuff[4]={ 0,0,0,0,};


#include "eeprom52.h"

void delayms(unsigned int ms)
{
   unsigned char i=100,j;
   for(;ms;ms--)
   {
       while(--i)
       {
          j=10;
          while(--j);
       }
   }
}

/******************把數(shù)據(jù)保存到單片機內(nèi)部eeprom中******************/
void write_eeprom()
{
   SectorErase(0x2000);
   byte_write(0x2001, Slong);
   byte_write(0x2060, a_a);
}

/******************把數(shù)據(jù)從單片機內(nèi)部eeprom中讀出來*****************/
void read_eeprom()
{

   Slong = byte_read(0x2001);
   a_a      = byte_read(0x2060);
}

/**************開機自檢eeprom初始化*****************/
void init_eeprom()
{
   read_eeprom();       //先讀
   if(a_a != 2)      //新的單片機初始單片機內(nèi)問eeprom
   {
       Slong = 30;
       a_a = 2;
       write_eeprom();
   }  
}



//寫數(shù)據(jù)
void WriteDataLCM(unsigned char WDLCM)
{
   ReadStatusLCM(); //檢測忙
   LCM_Data = WDLCM;
   LCM_RS = 1;
   LCM_RW = 0;
   LCM_E = 0; //若晶振速度太高可以在這后加小的延時
   LCM_E = 0; //延時
   LCM_E = 1;
}

//寫指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
{
   if (BuysC) ReadStatusLCM(); //根據(jù)需要檢測忙
   LCM_Data = WCLCM;
   LCM_RS = 0;
   LCM_RW = 0;  
   LCM_E = 0;
   LCM_E = 0;
   LCM_E = 1;
}

//讀數(shù)據(jù)
unsigned char ReadDataLCM(void)
{
   LCM_RS = 1;
   LCM_RW = 1;
   LCM_E = 0;
   LCM_E = 0;
   LCM_E = 1;
   return(LCM_Data);
}

//讀狀態(tài)
unsigned char ReadStatusLCM(void)
{
   LCM_Data = 0xFF;
   LCM_RS = 0;
   LCM_RW = 1;
   LCM_E = 0;
   LCM_E = 0;
   LCM_E = 1;
   while (LCM_Data & Busy); //檢測忙信號
   return(LCM_Data);
}

void LCMInit(void) //LCM初始化
{

    WriteCommandLCM(0x38);//設置模式
   WriteCommandLCM(0x0c);//不顯示光標
   WriteCommandLCM(0x06);//設置指針自加
   WriteCommandLCM(0x01);//清屏
}

//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
   Y &= 0x1;
   X &= 0xF; //限制X不能大于15,Y不能大于1
   if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
   X |= 0x80; //算出指令碼
   WriteCommandLCM(X, 1); //發(fā)命令字
   WriteDataLCM(DData); //發(fā)數(shù)據(jù)
}

//按指定位置顯示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
   unsigned char ListLength;

  ListLength = 0;
   Y &= 0x1;
   X &= 0xF; //限制X不能大于15,Y不能大于1
   while (DData[ListLength]>0x19) //若到達字串尾則退出
       {
          if (X <= 0xF) //X坐標應小于0xF
              {
                  DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
                 ListLength++;
                 X++;
              }
       }
}

//5ms延時
void Delay5Ms(void)
{
   unsigned int TempCyc = 5552;
   while(TempCyc--);
}

//400ms延時
void Delay400Ms(void)
{
   unsigned char TempCycA = 5;
   unsigned int TempCycB;
   while(TempCycA--)
       {
          TempCycB=7269;
          while(TempCycB--);
       };
}


void key()
{
      if(!K1)            //按下按鍵
          {
                delayms(5);       //延時去抖
                if(!K1)
                 {
                   Slong+=1;       //每按下一次,數(shù)值加10
                      write_eeprom();       //保存數(shù)據(jù)
                      flag_one=0;
           }
                 while(!K1);      //等待按鍵彈起
           }


            if(!K2)            //按下按鍵
          {
                delayms(5);       //延時去抖
                if(!K2)
                 {
                   Slong-=1;       //每按下一次,數(shù)值加10
                      write_eeprom();       //保存數(shù)據(jù)
                      flag_one=0;
           }
                 while(!K2);      //等待按鍵 彈起
           }


            if(flag_one==0)
              {
                 flag_one=1;
                 disbuff[0]=Slong%1000/100;
           disbuff[1]=Slong%1000%100/10;
           disbuff[2]=Slong%1000%10 %10;
                 DisplayOneChar(9, 1, ASCII[13]);    //顯示S
                 DisplayOneChar(10, 1, ':'); //顯示M
           DisplayOneChar(11, 1, ASCII[disbuff[0]]);
           DisplayOneChar(12, 1, ASCII[10]); //顯示點
           DisplayOneChar(13, 1, ASCII[disbuff[1]]);
           DisplayOneChar(14, 1, ASCII[disbuff[2]]);
           DisplayOneChar(15, 1, ASCII[12]); //顯示M

        }

}



warn()                //報警函數(shù)
   {
     if( S>Slong*4/5 && S<=Slong*5/5 )     //當距離小于等于設定的報警值時
        {
        pinlv=1;     //蜂嚀器報警等級
     }

         if( S>Slong*3/5 && S<=Slong*4/5 )     //當距離小于等于設定的報警值時
        {
        pinlv=2;     //蜂嚀器報警等級
     }

          if( S>Slong*2/5 && S<=Slong*3/5 )     //當距離小于等于設定的報警值時
        {
        pinlv=3;     //蜂嚀器報警等級
     }

          if( S>Slong*1/5 && S<=Slong*2/5 )     //當距離小于等于設定的報警值時
        {
        pinlv=4;     //蜂嚀器報警等級
     }

          if(  S<=Slong*1/5 )     //當距離小于等于設定的報警值時
        {
        pinlv=5;     //蜂嚀器報警等級
     }

         if(S>Slong)       //當距離大于設定的報警值時
        {
        pinlv=0;     // 蜂嚀器不報警。
     }
  }


/********************************************************/
void Conut(void)
   {
    time=TH0*256+TL0;
    TH0=0;
    TL0=0;

    S=(time*1.7)/100;     //算出來是CM
    if((S>=700)||flag==1) //超出測量范圍顯示“-”
    {
     flag=0;

     DisplayOneChar(0, 1, ASCII[11]);
     DisplayOneChar(1, 1, ASCII[10]); //顯示點
     DisplayOneChar(2, 1, ASCII[11]);
     DisplayOneChar(3, 1, ASCII[11]);
     DisplayOneChar(4, 1, ASCII[12]); //顯示M
    }
    else
    {
     disbuff[0]=S%1000/100;
     disbuff[1]=S%1000%100/10;
     disbuff[2]=S%1000%10 %10;
     DisplayOneChar(0, 1, ASCII[disbuff[0]]);
     DisplayOneChar(1, 1, ASCII[10]); //顯示點
     DisplayOneChar(2, 1, ASCII[disbuff[1]]);
     DisplayOneChar(3, 1, ASCII[disbuff[2]]);
     DisplayOneChar(4, 1, ASCII[12]); //顯示M
    }
   }
/********************************************************/
void zd0() interrupt 1       //T0中斷用來計數(shù)器溢出,超過測距范圍
  {
    flag=1;                        //中斷溢出標志
  }
/********************************************************/
void  StartModule()              //啟動模塊
  {
     TX=1;                                //啟動一次模塊
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     TX=0;
  }
/********************************************************/









/*********************************************************/
void main(void)
{

   unsigned char TempCyc;
   Delay400Ms(); //啟動等待,等LCM講入工作狀態(tài)
   LCMInit(); //LCM初始化
   Delay5Ms(); //延時片刻(可不要)
   DisplayListChar(0, 0, juli);
   DisplayListChar(0, 1, kaiji);
   //ReadDataLCM();//測試用句無意義
   //for (TempCyc=0; TempCyc<10; TempCyc++)
   Delay400Ms(); //延時
   init_eeprom();              //讀eeprom數(shù)據(jù)
   while(1)
   {
     TMOD=0x11;         //設T0為方式1,GATE=1;
   TH0=0;
   TL0=0;         
   TH1=0xf8;        //2MS定時
   TL1=0x30;
   ET0=1;             //允許T0中斷
   ET1=1;           //允許T1中斷
   TR1=1;           //開啟定時器
   EA=1;            //開啟總中斷  

   while(1)
     {
          key();
          if(flag_two==0)
          {
           flag_two=1;
        StartModule();
       while(!RX);      //當RX為零時等待
        TR0=1;              //開啟計數(shù)
        while(RX);          //當RX為1計數(shù)并等待
        TR0=0;              //關(guān)閉計數(shù)
       Conut();         //計算
          warn();
          }
   }
   }
}




void  zd3()  interrupt 3       //
  {
    TH1=0x3c;
    TL1=0xb0;
    cishu++;
    timer++;
   if(timer>=10) //500ms刷新一次
    {
      flag_two=0;
    }

    if(pinlv==0)  { speak=1; }

    if(pinlv==1)
    {
      if(cishu>=5)
             {
                  cishu=0;
           speak=~speak;
         }
    }

       if(pinlv==2)
    {
      if(cishu>=4)
             {
                  cishu=0;
           speak=~speak;
         }
    }

       if(pinlv==3)
    {
      if(cishu>=3)
             {
                   cishu=0;
           speak=~speak;
         }
    }

       if(pinlv==4)
    {
      if(cishu>=2)
             {
                  cishu=0;
           speak=~speak;
         }
    }


       if(pinlv==5)
    {
      if(cishu>=1)
             {
                  cishu=0;
           speak=~speak;
         }
    }


  }





求助1.PNG (59.56 KB, 下載次數(shù): 71)

仿真

仿真

求助3.png (293.76 KB, 下載次數(shù): 72)

原理圖

原理圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:96682 發(fā)表于 2021-5-5 02:31 來自觸屏版 | 只看該作者
這仿真 P0 未接上拉排阻
回復

使用道具 舉報

板凳
ID:390416 發(fā)表于 2021-5-5 09:08 | 只看該作者
關(guān)于超聲波和LCD1602的結(jié)合  去這里下載 鏈接:https://pan.baidu.com/s/1GNJywOm2PXB_lEb1Vy3qaQ
提取碼:1234
回復

使用道具 舉報

地板
ID:390416 發(fā)表于 2021-5-5 09:15 | 只看該作者
還有這個 LCD1602必須遵循比較嚴格的時間要求
http://www.zg4o1577.cn/bbs/dpj-205768-1.html
回復

使用道具 舉報

5#
ID:899677 發(fā)表于 2021-5-5 10:54 | 只看該作者
wc86110 發(fā)表于 2021-5-5 02:31
這仿真 P0 未接上拉排阻

我去接了,但是好像還是沒有顯示
回復

使用道具 舉報

6#
ID:904364 發(fā)表于 2021-5-5 18:04 | 只看該作者
vee引腳可調(diào)電阻的另一端接地試試
回復

使用道具 舉報

7#
ID:899677 發(fā)表于 2021-5-6 12:10 | 只看該作者
加了排阻,也把vee接地了,但是還是沒啥用,仿真和程序都發(fā)上來了

仿真.zip

127.71 KB, 下載次數(shù): 11

回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区黄色 | 日韩一区二区三区精品 | 亚洲精品免费在线 | 日韩精品一区二 | 国产91在线播放 | 国产亚洲欧美在线 | 日韩美女一区二区三区在线观看 | 久在线 | 欧美一区二区大片 | 国产午夜视频 | av在线免费观看网址 | 欧美精品在线一区二区三区 | 精品久久久网站 | 中文av字幕| 国产精品一区二区av | 免费在线一区二区 | 亚洲天堂av在线 | 欧美日韩在线一区二区三区 | 蜜桃视频一区二区三区 | 久久99精品久久久 | 理论片免费在线观看 | 亚洲一区二区三区免费观看 | 性一交一乱一透一a级 | 久久久久国产精品一区二区 | 日本韩国电影免费观看 | 久久亚洲欧美日韩精品专区 | 国产精品.xx视频.xxtv | 国产精品一区一区三区 | 欧美日韩在线精品 | 精品国产一区二区三区成人影院 | 在线永久看片免费的视频 | 精品欧美色视频网站在线观看 | 中国一级大毛片 | 精品久久久久久 | 久久国产视频一区 | 成年男女免费视频网站 | 中文字幕二区三区 | 羞羞视频免费在线观看 | 激情一区二区三区 | 99热热精品 | 久久综合一区二区 |