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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1857|回復: 4
打印 上一主題 下一主題
收起左側

LCD1602顯示屏不能同時顯示溫度和重量,求大神幫忙看看

[復制鏈接]
跳轉到指定樓層
樓主
顯示屏只能顯示一個功能,在主函數中改變顯示的順序,哪個在前面只顯示哪個,下面是源程序,麻煩幫忙看一下是哪里有問題,謝謝






單片機源程序如下:
#include<reg51.h>
#include < intrins.h >
#define GapValue 1960
#define uchar unsigned char
#define uint   unsigned int
uchar m;


sbit HX711_DOUT=P2^1;         //HX711AD模塊IO端口設置
sbit HX711_SCK=P2^0;
unsigned long Weight_shuibei =0;
unsigned int t;
unsigned char *p,c;
long Weight_shui = 0;
bit Flag_ERROR = 0;
void Delay__hx711_us(void);                  //函數或者變量聲明
unsigned long HX711_Read(void);
void Get_shuibei();
void Get_Weight();

#define lcddata P0
sbit LCDRS = P2^7 ;     // 命令/數據選擇端  0為寫命令 1為寫數據      
sbit LCDRW = P2^6 ;                // lcd讀寫端
sbit LCDEN = P2^5 ;                //lcd使能端
void write_com(uchar com);
unsigned char code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;//lcd自定義字符

sbit DQ = P1^3;   //定義DS18B20端口DQ
bit presence;           //ds18b20 DQ被拉低 信號0允許,1禁止
uint cc,cc2;       //變量cc中保存讀出的溫度值
float cc1;
uchar flag;                   //flag為溫度值正負標志位,“1”表示溫度為負值,“0”表示為正值
unsigned char data   temp_data[2] = {0x00,0x00} ;  //存儲16位溫度


uchar code cdis0[ ] = "CHECKING...";
uchar code cdis1[ ] = "   DS18B20 OK   " ;
uchar code cdis5[ ] = "Temp: ";
uchar  cdis2[ ] = "+00.00";
uchar code cdis3[ ] = " DS18B20   ERR0R " ;
uchar code cdis6[ ] = "Volume:";
uchar  cdis7[ ] = "0000";
uchar code cdis8[ ] = "Volume:  over ml";
uchar code cdis9[ ] = "   HX711 OK   " ;




/*ms級別延時      */
void ddelay(uint ms)
{
uint i;
uchar j;
for(i=0;i<ms;i++)
   for(j=0;j<250;j++)
   {
    _nop_();          //一個機器周期,1us
    _nop_();          //適用于精度高的
    _nop_();
    _nop_();
   }
}

/**********************************lcd1602********************************************/
void delaylcd(uint z)
{uchar x,y;
for(x=z;x>0;x--)
  {for(y=110;y>0;y--);
  }
}

/*lcd1602初始化        */
/**********************************/
void lcd_init(void)
{
LCDRW=0;                 //低電平為寫
LCDEN=0;
write_com(0x38);                 //使用8位數據開關,顯示兩行,使用5*7字形

write_com(0x0c);                //顯示器開,光標關,字符不閃爍         0x0e 光標開

write_com(0x06);           //字符不動,光標自動右移動一位

write_com(0x01);          //清屏
}

/*寫命令to lcd        */
/**********************************/
void write_com(uchar com)//寫命令
{
  LCDRW=0;         //低電平為寫
  LCDRS=0;         //低電平為命令選擇
  lcddata=com;
  delaylcd(5);
  LCDEN=1;
  delaylcd(5);
  LCDEN=0;
}

/*寫數據to lcd             */
/**********************************/
void write_data(uchar  date)
{
LCDRW=0;  //低電平為寫
LCDRS=1;  //高電平為數據選擇
lcddata=date;
delaylcd(5);
LCDEN=1;
delaylcd(5);
LCDEN=0;
}

/*設定顯示位置             */
/********************************/
void lcd_pos(uchar pos)
{                                    //第一行第幾列直接寫pos為幾,第二行pos從0x40開始
   write_com(pos | 0x80) ;   //數據指針=80+地址變量
}

/*******************************ds18b20*******************************************/

/*us級延時,延時時間約4+2*i*/
void Delayus(uchar i)
{
  while(--i);
}
/*復位,每次讀寫之前都要進行復位*/
/**********************************/
bit ds_reset(void)
{
DQ = 1 ;       //DQ復位
Delayus(8) ;     //稍做延時

DQ = 0; //拉低約600us
Delayus(150);
Delayus(150);

DQ = 1;//產生上升沿,延時約15~60us
Delayus(30);

if(DQ==0) {presence=0;}         
else presence=1;
return(presence); //等待應答信號 0允許,1禁止
}

/*讀取數據一位            */
//---------------------------------
bit Read_bit()
{
uint i = 0;
bit b = 0;

DQ = 0; //產生讀時隙  
i++;         //維持低電平至少1us

DQ = 1; //1us以上后拉高
Delayus(2); //延時8us,DO下降沿15內ds18b20輸出的數據才有效


b = DQ; //讀取數據
Delayus(40);         //每個讀時隙至少持續60us

return(b);
}

/*讀取一個字節             */
//------------------------------------
uchar Read_byte()
{
uchar byte_read = 0;
uchar i, j;

for(i=0; i<8; i++)
  {
   j = Read_bit();
   byte_read = (j<<i) | byte_read; //低位讀起
  }

return(byte_read);
}

//-----------------------------------------
/*寫一個字節         */
void Write_byte(uchar byte_to_write)
{
uchar i = 0;
uchar j = 0;
bit write_bit = 0;

for(j=0; j<8; j++)
  {
   write_bit =         (byte_to_write & 0x01);
    if(write_bit == 1) //寫1
         {
          DQ = 0;  //產生寫時隙
         Delayus(3);           //延時15us

          DQ = 1;  //寫1
          Delayus(40);   //延時,寫時隙不得低于60us
         }
        else
         {
          DQ = 0;  //產生寫時隙
          Delayus(50);   //延時,保持低約60us~120us
          DQ = 1;  
          i++;
         }
   byte_to_write = byte_to_write >> 1;
  }
}
//-----------------------------------
/*讀取溫度,啟動溫度轉換*/
/*啟動溫度轉換*/
void start_convert()
{
ds_reset();          // 發出復位脈沖,每次操作都從復位開始
ddelay(1);
Write_byte(0xcc); //skip room命令,跳過序列號命令字
Write_byte(0x44); //啟動溫度轉換命令
}

/*讀取溫度值*/
void read_tempreture()
{
ds_reset();          // 發出復位脈沖,每次操作都從復位開始
ddelay(1);
Write_byte(0xcc); //skip room命令
Write_byte(0xbe); //讀取暫存器命令
temp_data[0] = Read_byte(); //存儲溫度低字節值 (整數部分低四位和小數部分) 先從低字節讀取
temp_data[1] = Read_byte(); //存儲溫度高字節值 (其中高五位為符號位)
}
//--------------------------------------
/* CHECKING...顯示              */
void lcd_display()
{
uchar   m ;
lcd_init() ;                 //初始化LCD
lcd_pos(0) ;                 //設置顯示位置為第一行的第1個字符
      m = 0 ;
     while(cdis0[m] != '\0')
      {                          //顯示字符
        write_data(cdis0[m]) ;
        m++ ;
      }
}

//--------------------------------------
/* DS18B20 OK 顯示菜單                 */
void Ook_Menu ()
{
     uchar   m ;
     lcd_init() ;                 //初始化LCD

     lcd_pos(0) ;                 //設置顯示位置為第一行的第1個字符
      m = 0 ;
     while(cdis1[m] != '\0')
      {                          //顯示字符
        write_data(cdis1[m]) ;
        m++ ;
      }
            
           
}

//-----------------------------------
/*DS18B20   ERR0R      顯示    */

void Error_Menu ()
{
      uchar   m ;
      lcd_init() ;                 //初始化LCD

      lcd_pos(0) ;                 //設置顯示位置為第一行的第1個字符
      m = 0 ;
      while(cdis3[m] != '\0')
      {                          
        write_data(cdis3[m]) ;           //顯示字符
        m++ ;
      }
}

//------------------------------------
/*Temp:      ℃顯示        */
/*Volume of water:          ml顯示        */
void temp_c()
{
  uchar m;
  lcd_init() ;
  lcd_pos(0);
  m=0;
  while(cdis5[m]!='\0')
  {
   write_data(cdis5[m]);
   m++;
  }
          lcd_pos(13);
          write_data(0xDF);                //°
        write_data(0x43);

        lcd_pos(0x40);
  m=0;
  while(cdis6[m]!='\0')
  {
   write_data(cdis6[m]);
   m++;
   }
   lcd_pos(0x40+14);
          write_data(0x6D);     //M
        write_data(0x6C);
}


//------------------------------------
/*溫度顯示                       */
void temperature_display()
{
  uchar m;
  flag=0;
  while(1)
  {
    ddelay(2);
    EA=0;                                //DS18B20讀寫數據按照嚴格的時序,最好不要被打斷,故把所有中斷關閉
        start_convert();                          //啟動溫度轉換
    ddelay(250);
        read_tempreture();                          //讀取溫度
    EA=1;
        cc=temp_data[1]*256.0+temp_data[0];
        if(temp_data[1]>0xF8)
                {flag=1;
                cc=~cc+1;
                }
                else flag=0;
        cc1=cc*0.0625;
        cc2=cc1*100;
        cdis2[1]=cc2/1000+0x30;
        if(cdis2[1]==0x30)
         {cdis2[1]=0x30;}
        cdis2[2]=cc2/100%10+0x30;
        cdis2[4]=cc2%100/10+0x30;
            cdis2[5]=cc2%10+0x30;
        if(flag==1)
           cdis2[0]='-';
        else
           cdis2[0]='+';

         lcd_pos(6) ;                 //設置顯示位置為第一行的第6個字符
         m=0;
     while(cdis2[m]!='\0')
      {                          //顯示字符
        write_data(cdis2[m]) ;
                m++;
          }                                                                  
   }
}






//****************************************************
//HX711延時函數
//****************************************************
void Delay__hx711_us(void)
{
        _nop_(); //空操作
        _nop_();
}

//****************************************************
//獲取水杯重量
//****************************************************
void Get_shuibei()
{
        Weight_shuibei = HX711_Read();        
}

//HX711  ok 顯示
void ok_Menu ()
{
     uchar   m ;
     lcd_init() ;                 //初始化LCD
         lcd_pos(0x40) ;
           m = 0 ;
     while(cdis9[m] != '\0')
      {                          //顯示字符
        write_data(cdis9[m]) ;
        m++ ;
      }        
}


/*HX711 overweight   顯示        */
void ov_Menu ()
{
     uchar   m ;
     lcd_init() ;                 //初始化LCD

     lcd_pos(0x40) ;                 //設置顯示位置為第一行的第1個字符
      m = 0 ;
     while(cdis8[m] != '\0')
      {                          //顯示字符
        write_data(cdis8[m]) ;
        m++ ;
      }
          lcd_pos(0);
  m=0;
  while(cdis5[m]!='\0')
  {
   write_data(cdis5[m]);
   m++;
  }
          lcd_pos(13);
          write_data(0xDF);                //°
        write_data(0x43);         
}

//****************************************************
//讀取HX711
//****************************************************
unsigned long HX711_Read(void)        //增益128
{
        unsigned long count;
        unsigned char i;
          HX711_DOUT=1;
        Delay__hx711_us();
          HX711_SCK=0;
          count=0;
        EA = 1;
          while(HX711_DOUT);
        EA = 0;
          for(i=0;i<24;i++)
        {
                  HX711_SCK=1;
                  count=count<<1;
                HX711_SCK=0;
                  if(HX711_DOUT)
                        count++;
        }
         HX711_SCK=1;
    count=count^0x800000;//第25個脈沖下降沿來時,轉換數據
        Delay__hx711_us();
        HX711_SCK=0;  
        return(count);
}


//****************************************************
//稱重
//****************************************************
void Get_Weight()
{
        Weight_shui = HX711_Read();
        Weight_shui = Weight_shui - Weight_shuibei;                //獲取凈重
        if(Weight_shui > 1)                        
        {        
                Weight_shui = (unsigned int)((float)Weight_shui/GapValue);         //計算水的實際重量                                                                                                                                                                                                                                                               
                if(Weight_shui > 1000)                //超重報警
                {        
                        Flag_ERROR = 1;
                }
                else
                {  
                        Flag_ERROR = 0;
                }
        }
        else
        {
                Weight_shui = 0;                        
        }        
}

//壓力顯示
void Volume_display()
{
        uchar m;
        Get_shuibei();                                //稱水杯重量
        while(1)
        {
                EA = 0;
                Get_Weight();                        //稱重
                EA = 1;
        //顯示當前重量
                if( Flag_ERROR ==0)        //超重或者負重情況下輸出error
                {        
                         cdis7[0]=Weight_shui/1000 + 0X30;
                         cdis7[1]=Weight_shui%1000/100 + 0X30;
                         cdis7[2]=Weight_shui%100/10 + 0X30;
                         cdis7[3]=Weight_shui%10 + 0X30;
                }               
                else        //以下是重量顯示各個位對應值進行換算
                {        
                          ov_Menu ();
                          ddelay(150);
                          if( Flag_ERROR ==0)
                          {        
                         cdis7[0]=Weight_shui/1000 + 0X30;
                         cdis7[1]=Weight_shui%1000/100 + 0X30;
                         cdis7[2]=Weight_shui%100/10 + 0X30;
                         cdis7[3]=Weight_shui%10 + 0X30;
                          }
                }
                lcd_pos(0x40+9) ;                 //設置顯示位置為第一行的第6個字符
         m=0;
     while(cdis7[m]!='\0')
      {                          //顯示字符
        write_data(cdis7[m]) ;
                m++;
          }               
        
        }
}



//****************************************************
//主函數
//****************************************************

void main()
{
        lcd_display();
        ddelay(1000);                 //延時,等待傳感器穩定
        ok_Menu ();                   //hx711 ok
  ds_reset();                   //ds18b20 初始化
  ddelay(1000);        
  if(presence==0)
    {
         Ook_Menu ();          //ds18b20 ok
         ddelay(1000);
                  temp_c();
                  Volume_display();                         //體積數據
                 ddelay(1000);
                 temperature_display();                   //溫度數據
    }         
  else
    {
         Error_Menu ();
        }                 


        
}

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

使用道具 舉報

沙發
ID:687694 發表于 2020-3-12 22:42 | 只看該作者
while(cdis2[m]!='\0')
while(cdis7[m]!='\0')
應該是在這兩句里無限循環了。
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-3-13 07:39 | 只看該作者
while(1)死循環不是隨便用的。樓主先把程序框架調整合理,再查找問題
void main()
{
        //初始化單片機
        //初始化外圍設備
        while(1)//正常運行時必須約束在此大循環中
        {
                //鍵控、設置
                //讀取DS18B20溫度數據
                //數據處理
                //刷新LCD
                //讀取HX711壓力數據
                //數據處理
                //刷新LCD
   }
}
回復

使用道具 舉報

地板
ID:692230 發表于 2020-3-13 18:12 | 只看該作者
wulin 發表于 2020-3-13 07:39
while(1)死循環不是隨便用的。樓主先把程序框架調整合理,再查找問題
void main()
{

好的謝謝
回復

使用道具 舉報

5#
ID:692230 發表于 2020-3-13 18:12 | 只看該作者
lovexulu 發表于 2020-3-12 22:42
while(cdis2[m]!='\0')
while(cdis7[m]!='\0')
應該是在這兩句里無限循環了。

好的,謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美乱大交xxxxx另类电影 | 不卡的av在线 | 亚洲黄色一级毛片 | 国产精品日日摸夜夜添夜夜av | 五月婷婷激情网 | 国产成人精品福利 | 国产精品综合视频 | 亚洲自拍一区在线观看 | 最新中文字幕久久 | 免费日韩网站 | 在线亚洲免费 | 久久精品中文字幕 | 国产精品视频久久 | 日韩精品免费在线 | 午夜在线视频 | 综合色影院 | re久久| 7777久久| 中文字幕一区二区在线观看 | 午夜三级视频 | 亚洲精品成人在线 | 成人欧美一区二区三区白人 | 国产毛片久久久久久久久春天 | 狠狠操av | 国产成人精品久久二区二区91 | 久久久久国产 | 99这里只有精品 | 国产精品久久久乱弄 | 一二区成人影院电影网 | 亚洲福利 | 九九热在线视频免费观看 | 男女性毛片 | 91高清视频在线观看 | 亚洲成人第一页 | 伊人最新网址 | 99热欧美| av黄色国产 | 一级毛片免费完整视频 | 久久久不卡网国产精品一区 | 青青久久| 天天天久久久 |