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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機使用ds18b20和lcd12864時cd顯示就只有0和16

[復制鏈接]
跳轉到指定樓層
樓主
ID:900557 發表于 2021-4-4 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我在做一個溫控浴缸的diy,但是在測溫時lcd上只顯示0和16再無其他變化。lcd我是用的串行口的方式連接的PSB,GND,BLK接地,VCC,RS,BLA接+5V。
麻煩幫助一下指出問題,謝謝。

單片機程序如下:
#include<reg52.h>

#define uchar unsigned char
#define uint  unsigned int

sbit reshui=P3^5;
sbit lengshui=P3^6;
sbit zenjia=P3^3;
sbit jianshao=P3^4;                                                                                                                                                                          
sbit kaishi=P1^1;
sbit jieshu=P1^2;

sbit wendu=P3^7;


sbit EN=P2^7;
sbit RW=P2^6;


uint a,c;
uchar b=0,d=0;


//舵機初始化
void delay(uint i)
{
for(;i>0;i--);
}

void duoji()
{
         TMOD=0x22;
        TH0=0x9C;TL0=0x9C;
        TH1=0x9C;TL1=0x9C;
        EA=1;
        ET0=1;ET1=1;
         
}

void delay1ms(uint y)
{
          uint x;
        for(;y>0;y--)
        {
          for(x=110;x>0;x--);
        }
}
//傳感器初始化
uchar ds18b20int()         
{
         uchar i=0;
        wendu=0;
        i=70;
        while(i--);           //642us
        wendu=1;
        i=0;
        while(wendu)
        {
           delay1ms(1);
           i++;
           if(i>5)
           {
                   return 0;
           }
        }
        return 1;
}

void ds18b20write(uchar dat)//  寫命令
{
        uchar i,j;
        for(j=0;j<8;j++)
        {
                wendu=0;
                i++;
                wendu=dat&0x01;
                i=6;
                while(i--);        //68us
                wendu=1;
                dat>>=1;
        }
}

uchar ds18b20read()          //讀命令
{
         uint i,j;
        uchar cun,byte;
        for(j=8;j>0;j--)
        {
                 wendu=0;
                i++;
                wendu=1;
                i++;
                i++;
                cun=wendu;
                byte=(byte>>1)|(cun<<7);
                i=4;
                while(i--);               
        }
        return cun;
}


void ds18b20chang()  //rom指令   轉換
{
           ds18b20int();
          delay1ms(1);
          ds18b20write(0xcc);        //發送溫度變換指令
          ds18b20write(0x44);        //進行溫度變換,儲存溫度到rom
}

void ds18b20readzhiling()         //rom指令   讀取
{
          ds18b20int();
          delay1ms(1);
          ds18b20write(0xcc);        
          ds18b20write(0xbe);
}

float ds18b20readwendu()         //rom指令   溫度讀取
{
          int temp=0;
          float tp;
          uchar high,low;
          ds18b20chang();
          ds18b20readzhiling();
          high=ds18b20read();
          low=ds18b20read();
          temp=high;
          temp<<=8;
          temp|=low;         
          if(temp<0)
          {                  
                 temp=temp-1;
                 temp=~temp;
                 tp=temp;
                 temp=tp*0.0625;
               
          }
          else
          {                                   
                 tp=temp;
                 temp=tp*0.0625;
                 
          }
           return temp;
}



void Delay_ms(unsigned char n)
{
           unsigned char  i,j;
    for(i=0;i<n;i++)
    for(j=0;j<123;j++);
}

void LCD_sendbyte(unsigned char dat)
{
   unsigned char i;
   for(i=0;i<8;i++)
         {
                EN=0;
                if(dat&0x80)
                RW=1;
                else RW=0;
                EN=1;
                dat=dat<<1;;         //左移一位         
         }
}

void LCD_write_com(unsigned char com)
{        
           LCD_sendbyte(0xf8);                 //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(0),0
           LCD_sendbyte(0xf0&com);      //取高四位,數據分兩次傳送,每個字節的內容被送入兩個字節,高四位放在第一個字節的高四位                                 
          LCD_sendbyte(0xf0&(com<<4));  //低四位放在第二個字節的高四位           
          Delay_ms(1);                               //串行不支持讀操作,不可檢測忙操作,這里用延時替代
}

void LCD_write_dat(unsigned char dat)
{      
           LCD_sendbyte(0xfa);        
           LCD_sendbyte(0xf0&dat);      
           LCD_sendbyte(0xf0&(dat<<4));            
           Delay_ms(1);  
}

void LCD_init(void)
{        
         LCD_write_com(0x30);    //選擇基本指令集            
        LCD_write_com(0x0c);    //開顯示,無游標,不反白   
         LCD_write_com(0x01);    //清除顯示屏幕,把DDRAM位址計數器調整為00H  
         Delay_ms(1);                   //清屏操作時間較長1.6ms 因此加此延時
         LCD_write_com(0x02);    //清DDRAM位址歸位,此處貌似與清屏重復  
        LCD_write_com(0x06);    //設定光標右移,整體顯示不移動  
}

void LCD_Setaddress(unsigned char x,unsigned char y) //地址從第1行第1列開始不從0開始
{            
          unsigned char addr;
          switch(x)
          {
           case 1: addr=0x80+y-1;
                   break;
            case 2: addr=0x90+y-1;
                   break;
           case 3: addr=0x88+y-1;
                   break;
           case 4: addr=0x98+y-1;
                   break;
           default : break;
          }
           LCD_write_com(addr);   //字符顯示開始地址
}

void LCD_Putstring( unsigned char x, unsigned char y, unsigned char *pData )
{
         LCD_Setaddress(x,y);
         while(*pData)
         {
           LCD_write_dat( *pData++ );
         }
}

void lcd_putint( unsigned char x, unsigned char y, unsigned int Data )
{
        unsigned char a,b,c,d,e;
        unsigned int Datas;
        Datas=Data*100+0.5;
        a=Datas/10000;
        b=Datas%10000/1000;
        c=Datas%1000/100;
        d=Datas%100/10;
        e=Datas%100%10;
//a=Data/10000;b=Data%10000/1000;c=Data%1000/100;d=Data%100/10;e=Data%10;
        LCD_Setaddress(x,y);
        LCD_write_dat(a+48);
        LCD_write_dat(b+48);
        LCD_write_dat(c+48);
        LCD_write_dat(0x2e);
        LCD_write_dat(d+48);
        LCD_write_dat(e+48);
}


void main(void)
{
        uint i=0;
        float m,n;
        duoji();
        LCD_init();
        while(1)
        {
                if(kaishi==0)
                {
                        m=0;
                        delay(2000);
                        if(kaishi==0)
                        {
                                c=15;a=15;
                                TR1=1;TR0=1;
                        }
                    while(!kaishi);                        
                }
                else
            TR1=0;TR0=0;
                if(zenjia==1)
                {
                           m=m+5;
                }
                if(jianshao==1)
                {
                       m=m-5;
                }
                if(n>m)
                {
                         delay(2000);
                          a=a-1;
                          c=c+1;
                          TR0=1;TR1=1;
                }
                if(n<m)
                {
                          delay(2000);
                          a=a+1;
                          c=c-1;
                          TR0=1;TR1=1;
                }
                if(n==m)
                {
                        delay(2000);
                        a=a;
                         c=c;
                         TR0=1;TR1=1;
                }
                if(jieshu==0)
                {
                        delay(2000);
                        if(jieshu==0)
                        {
                                c=5;a=5;
                                TR1=1;TR0=1;
                        }
                    while(!jieshu);                        
                }
                else
            TR1=0;TR0=0;
                n=ds18b20readwendu();
                LCD_Putstring(1,1, "當前溫度");
                lcd_putint(1,5, n);
                LCD_Putstring(2,1, "預設溫度");
                lcd_putint(2,5, m);
        }
        


}

void timer_0(void) interrupt 1 using 0
{
         b++;
        if(b<a)
        {
                reshui=1;
        }
        if(b>a)
        {
                reshui=0;
        }
        if(b==200)
        {
                b=0;
        }
                 TH0=0x9C;TL0=0x9C;
}


void timer_1(void) interrupt 3 using 0
{
        d++;
        if(d<c)
        {
                lengshui=1;
        }
        if(d>c)
        {
                lengshui=0;
        }
        if(d==200)
        {
                d=0;
        }
    TH1=0x9C;TL1=0x9C;
}




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

使用道具 舉報

沙發
ID:517951 發表于 2021-4-5 08:24 | 只看該作者
可以把n=ds18b20readwendu(); 改成n=0xfc90;  這個值對應轉換后的溫度是-55度(或者其他對應數值也可以)如果顯示不正確就找液晶顯示器部分的代碼,如果顯示正確,就要看下18B20初始化或者讀數部分的代碼的問題。 我做電子日歷,溫度顯示用液晶屏,測溫就是18B20,調試代碼debug就是這么干的,希望對你有用。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:900557 發表于 2021-4-5 14:22 | 只看該作者
rayin 發表于 2021-4-5 08:24
可以把n=ds18b20readwendu(); 改成n=0xfc90;  這個值對應轉換后的溫度是-55度(或者其他對應數值也可以) ...

謝謝老哥
回復

使用道具 舉報

地板
ID:900557 發表于 2021-4-5 15:02 | 只看該作者
好的,非常感謝
回復

使用道具 舉報

5#
ID:900557 發表于 2021-4-5 16:10 | 只看該作者
問題找到了,是讀命令的返回值錯誤,應該返回byte,我寫成了cun
回復

使用道具 舉報

6#
ID:997450 發表于 2022-1-17 19:36 | 只看該作者
812839019 發表于 2021-4-5 16:10
問題找到了,是讀命令的返回值錯誤,應該返回byte,我寫成了cun

溫度為負值時,計算時不是按位取反再加1嗎??

  if(temp<0)
          {                  
                 temp=temp-1;
                 temp=~temp;
                 tp=temp;
                 temp=tp*0.0625;
           }

我的判斷溫度為負值條件是這樣的
if(temp & 0xf800 == 0xf800)

當然,也許你是在其他地方處理了,我只看了這一部分
回復

使用道具 舉報

7#
ID:997450 發表于 2022-1-22 08:32 | 只看該作者
yeyuemyl 發表于 2022-1-17 19:36
溫度為負值時,計算時不是按位取反再加1嗎??

  if(temp

我錯了,對于負值,溫度轉換出來的好像就是負的,然后減一再取反
                                                                 if(Data <0)
                                                                 {
                                                                                LCD_write_dat(45);
                                                                                Data=~(Data-1);
                                                                 }
                                                                 else                                                                 
                                                                         LCD_write_dat(0x20);
                                                                 
                                                                 Data=Data*0.0625*100;//12345
                                                                LCD_write_dat(Data/10000+0x30);
                                                                LCD_write_dat(Data/1000%10+0x30 );
                                                                LCD_write_dat(Data/100%10+0x30 );
                                                                LCD_write_dat(0x2e);
                                                                LCD_write_dat(Data/10%10+0x30);
                                                                LCD_write_dat(Data%10+0x30 );

Data是溫度轉換后返回的16位數
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩av第一页 | 精品精品视频 | 亚洲国产视频一区 | 久久久久久久国产 | 成人影院网站ww555久久精品 | 欧美国产激情二区三区 | 天堂中文资源在线 | 国产精品久久久亚洲 | 久久久久久免费毛片精品 | 欧美一区二区三区小说 | 黄网站涩免费蜜桃网站 | 国产精品一区视频 | 国产1区2区在线观看 | 国产在线精品一区二区三区 | 亚洲欧美一区二区三区视频 | 精品国产一区二区在线 | 黑人巨大精品欧美一区二区免费 | 黄视频网站免费观看 | 欧美一级在线观看 | 欧美久久久久久久久 | 久久99久久98精品免观看软件 | 2018天天干天天操 | 欧美在线播放一区 | 成人国产精品久久 | 欧美日韩一区二区三区四区 | 久久青 | 九九久久在线看 | 一级一级毛片免费看 | 国产精品国产三级国产aⅴ中文 | 国产亚洲精品久久久久久豆腐 | 亚洲精品福利在线 | 自拍第一页 | 亚洲国产欧美国产综合一区 | 黄色在线观看国产 | 国产视频黄色 | 日本精品一区 | 精品久久久久久久久亚洲 | 视频三区| 久久久精品一区二区三区 | 久久久久久www | 日日夜夜天天干 |