欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機LCD1602顯示的溫度計液晶屏只顯示格子

  [復制鏈接]
跳轉到指定樓層
樓主
ID:824378 發表于 2020-9-28 21:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 一君呀 于 2020-9-28 22:03 編輯

想做一個溫度顯示計,傳感器用的DS18b20,程序寫完了在開發板上試了結果液晶屏上是這個樣子,不知道是咋回事,有人能幫忙看一下么,拜托了這里是程序

第一次寫,可能有很多漏洞什么的,還請多多指教

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

typedef unsigned char u8;
typedef unsigned int u16;

#define LCD1602 P0


sbit DS = P3^7;      //定義DS18B20的端口
sbit RS = P2^6;                 //lcd1602寄存器
sbit RW = P2^5;                  //讀寫
sbit EN = P2^7;                   //片選



void delay_us(u16 i)         //微秒延時函數        ,不精確延時,i=1大約為10us
{
    while(i--);
}

void delay1ms(u16 ms)                 //1毫秒延時函數
{
    u16 i,j;
        for (i=0;i<ms;i++);
        for(j=0;j<120;j++);
}

void delay(u16 x)       //延時函數
{
        u16 i;
        for(i=x;i>0;i--);
}


u8 DS18B20_CS()                 //DS18B20初始化
{
    bit x;
    u8 i = 0;                  
    DS = 0;                                //拉低總線
        i = 70;
        while(i--);      //延時642us
        DS = 1;
        i = 0;
        delay_us(7);
        x = DS;
        delay_us(15);
        DS = 1;
        _nop_();
    return(x);
}

void DS18B20_XSX(u8 i)        //DS18B20寫時序
{
    u8  y;
        for(y=0;y<8;y++)
           {
             DS = 1;                                
                 _nop_();
                 DS = 0;
                 DS = i&0x01;
                 delay_us(7);
                 DS = 1;
                 _nop_();
                 _cror_(i,1);           
           }
}

u8 DS18B20_DSX()            //讀時序
{
     u8 x,y,z;
         for(x=0;x<8;x++)
           {
               DS = 0;
                   _nop_();
                   DS = 1;
                   _nop_();
                   y = DS;
                   delay_us(7);
                   DS = 1;
                   _nop_();
                   z = (y<<7)|(z>>1);        //從最低位開始讀取,循環8位
           }
           return(z);
}

void DS18B20_change()       //轉換溫度
{
     DS18B20_CS();
         delay1ms(1);
         DS18B20_XSX(0xcc);
     DS18B20_XSX(0x44);
}

void DS18B20_FS()           //發送溫度
{
      DS18B20_CS();
          delay1ms(1);
          DS18B20_XSX(0xcc);
          DS18B20_XSX(0xbe);   
}

int DS18B20_DQ()                 //讀取溫度
{
     int temp = 0;
         u8 H,L;
         DS18B20_change();
         DS18B20_FS();
         L=DS18B20_DSX();  //從低8位開始讀
         H=DS18B20_DSX();   //高8位
         temp = H;
         temp<<=8;
         temp |= L;
         return temp;   
}

void LCD1602_com(u8 com)                 //LCD1602寫指令函數
{
           RS = 0;
           RW = 0;
           EN = 0;
           P0 = com;
           delay1ms(1);
           EN = 1;
           delay1ms(5);
           EN = 0;
}

void LCD1602_dat(u8 dat)     //寫數據函數
{
     P0 = dat;       //送出時序
         RS = 1;
         RW = 0;
         EN = 1;
         delay(200);
         EN = 0;
}

void LCD1602_init()                //初始化
{
     LCD1602_com(0x01);   //初始化
         LCD1602_com(0x38);     //清屏
         LCD1602_com(0x0c);      //開顯示。不顯示光標
         LCD1602_com(0x06);     //地址加1寫入數據時光標右移
     LCD1602_com(0x87);                  //起始位置
}

void LCD1602_disp(int temp)                //顯示函數
{
     u8  table[] ={0,0,0,0};
         float i;         
         LCD1602_com(0x80);
         i = temp;
         temp = i*0.0625*10+0.5;
         table[0]=temp/100;
         table[1]=temp/10%10;
         table[2]=temp%10;
         LCD1602_com(0x87);    //顯示第一位數的位置
         LCD1602_dat('0'+table[0]);
         LCD1602_com(0x88);       //顯示個位
         LCD1602_dat('0'+table[1]);
         LCD1602_com(0x89);      //顯示小數點
         LCD1602_dat('.');
         LCD1602_com(0x0A);      //小數后一位
         LCD1602_dat('0'+table[2]);
         delay(50);
}

void main()
{
     LCD1602_init();
         LCD1602_com(0x88);
         while(1)
         {
              LCD1602_disp( DS18B20_DQ());
         }
}

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

使用道具 舉報

沙發
ID:824378 發表于 2020-9-28 22:03 | 只看該作者
這個是不是要自己頂貼啊,希望有人能幫看看吧
回復

使用道具 舉報

板凳
ID:213173 發表于 2020-9-29 07:31 | 只看該作者
一君呀 發表于 2020-9-28 22:03
這個是不是要自己頂貼啊,希望有人能幫看看吧

ds18b20溫度LCD顯示 仿真.zip (155.78 KB, 下載次數: 23) 可以用這個程序測試你的板子,消除黒塊可能要調整LCD的對比度。

回復

使用道具 舉報

地板
ID:584814 發表于 2020-9-29 09:06 | 只看該作者
改成這:        LCD1602_com(0x8A);      //小數后一位
回復

使用道具 舉報

5#
ID:88256 發表于 2020-9-29 09:27 | 只看該作者
1602的對比度調節正常嗎?
回復

使用道具 舉報

6#
ID:584814 發表于 2020-9-29 17:21 | 只看該作者
0x8A,是絕對移位的指令;
0x0A,有關閉顯示的功效;
1602是個很容易上手的東東,但自定義字符只有8個且分辨率呵呵。用得多的話可以搞個4+2線標準的程序用著方便,這東東上電后調節對比度貌似都可以顯示小方塊。
回復

使用道具 舉報

7#
ID:824378 發表于 2020-9-29 19:53 | 只看該作者
hhdsdy 發表于 2020-9-29 09:27
1602的對比度調節正常嗎?

調過的,出來都是亂碼
回復

使用道具 舉報

8#
ID:824378 發表于 2020-9-29 19:59 | 只看該作者
man1234567 發表于 2020-9-29 09:06
改成這:        LCD1602_com(0x8A);      //小數后一位

改了,現在只顯示00.0,在第8.9.10.11位
回復

使用道具 舉報

9#
ID:801172 發表于 2020-9-29 20:15 | 只看該作者
顯示屏貌似有點漏光
回復

使用道具 舉報

10#
ID:807522 發表于 2020-9-29 21:39 | 只看該作者
你可以試試電位器調下  程序我看沒有什么問題
回復

使用道具 舉報

11#
ID:584814 發表于 2020-9-30 01:59 | 只看該作者
一君呀 發表于 2020-9-29 19:59
改了,現在只顯示00.0,在第8.9.10.11位

全部是0說明讀溫度沒成功,只是顯示已完成調試。建議:
1、普中的板子自帶程例,可先用哪怕不懂;
2、各器件都也有說明書,應先讀必須認真;
3、這類程序本站也多現成的,下載可借用。
PS:感覺程序里的時序有點任性
回復

使用道具 舉報

12#
ID:824378 發表于 2020-10-7 22:09 | 只看該作者
man1234567 發表于 2020-9-30 01:59
全部是0說明讀溫度沒成功,只是顯示已完成調試。建議:
1、普中的板子自帶程例,可先用哪怕不懂;
2、 ...

好的,謝謝
回復

使用道具 舉報

13#
ID:816988 發表于 2020-10-21 16:26 | 只看該作者
也感覺DS18B20初始化的時序寫得有點瑕疵,可以找壇子里寫得比較標準的程序借鑒一下
回復

使用道具 舉報

14#
ID:832750 發表于 2020-10-21 16:31 | 只看該作者
要修改:LCD1602_com(0x8A);      //小數后一位
回復

使用道具 舉報

15#
ID:387641 發表于 2020-10-22 16:08 | 只看該作者
1602沒收到指令的,先斷開DS18b20,發固定字符表其中一個給1602看看通信是否正常
回復

使用道具 舉報

16#
ID:518902 發表于 2020-10-22 18:54 | 只看該作者
你可以試試電位器調下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表