微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ds18b20测温1602显示程序 不好使,有没有大神帮我看看,感谢

ds18b20测温1602显示程序 不好使,有没有大神帮我看看,感谢

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define lcd_po P2
uchar code table[]="temperature";
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit ds=P1^3;
uint temp;
float ftemp;
bit fg;

void delay_ms(uint time)
{
        uint i;
        for(time;time>0;time--)
                for(i=124;i>0;i--);
}
void delay_us(uint timeus)
{
        while(timeus--);
}
void lcd_wt(uchar lwt)
{
        rs=1;
        rw=0;
        en=0;
        _nop_();
        lcd_po=lwt;
        delay_ms(5);
        en=1;
        delay_ms(5);
        en=0;
}
void lcd_com(uint lcom)
{
        rs=0;
        rw=0;
        en=0;
        _nop_();
        lcd_po=lcom;
        delay_ms(5);
        en=1;
        delay_ms(5);
        en=0;
}
void lcd_init()
{
        en=0;
        lcd_wt(0x38);
        delay_ms(5);
        lcd_wt(0x06);
        delay_ms(5);
        lcd_wt(0x0c);
        delay_ms(5);
        lcd_wt(0x01);
        delay_ms(5);       
}
void ds_init()
{
        uint i;
        ds=1;
        delay_us(4);
        ds=0;
        delay_us(80);
        ds=1;
        i=20;
        while(ds==1)
        {
                if(i-- ==0)
              break;
        }
        i=100;
        while(ds==0)
        {
                if(i-- ==0)
                break;
        }
        delay_us(5);
        ds=1;               
}                                                                                                                                                                                                
void ds_wt(uchar b)
{
        uint i,j;
        bit btmp=0;
        for(j=0;j<8;j++)
        {
                btmp=b&0x01;
                b=b>>1;
                if(btmp)
                {
                        ds=0;
                        i++;i++;
                        ds=1;
                        i=8;
                        while(i)
                        {
                                i--;
                        }
                }else
                {
                        ds=0;
                        i=8;
                        while(i)
                        {
                                i--;
                        }
                        ds=1;
                        i++;i++;
                }
        }                               
}
uchar ds_read(void)
{
        uchar i,j,dat;
        dat=0;
        j=0;
        dat=0;
        for(i=0;i<8;i++)
        {
                ds=0;
                dat=dat>>1;
                ds=1;
                if(ds)
                {
                         dat=dat|0x80;
                }
                delay_us(10);
        }
        return dat;
}
uchar ds_getmath()
{
                uchar tl,th;
                ds_init();
                ds_wt(0xcc);
                ds_init();
                ds_wt(0x44);
                ds_init();
                ds_wt(0xcc);
                ds_init();
                ds_wt(0xbe);
                tl=ds_read();
                th=ds_read();
                temp=th;
                temp=temp<<8;
                temp=temp|tl;
                if(th<0x80)
                {
                        fg=0;
                }
                if(th>=0x80)
                {
                        fg=1;
                        temp=~temp+1;
                }
                ftemp=temp*0.0625;
                temp=ftemp*100+0.5;
                return temp;
}

void main()
{
        uint i;
        lcd_init();
        while(1)
        {
                ds_getmath();
                lcd_com(0x80);
                for(i=0;i<11;i++)
                {
                        lcd_wt(table[i]);
                        delay_ms(5);
                }
                lcd_com(0x80+0x40);
                if(!fg)
                {
                        lcd_wt('-');
                }
                if(temp/10000)
                {
                        lcd_wt(temp/10000%10);
                }
                if(temp/1000)
            {
                        lcd_wt(temp/1000%10);
                }
                if(temp/100)
                {
                        lcd_wt(temp/100%10);
                }
                if(temp/10)
                {
                        lcd_wt('0');
                        lcd_wt('.');
                        lcd_wt(temp/10%10);
                }
                if(temp/1)
                {
                        lcd_wt('0');
                        lcd_wt('.');
                        lcd_wt('0');
                        lcd_wt(temp%10);
                }
        }
}
1602不显示     温度不知道有没有测出来

哇,50积分

你1602的驱动显示可以吗?测试下18B20的时序是不是正确

驱动显示我觉得是对的,但是1602连第一行都没有显示,不知道问题出在哪里~~

先用实现简单显示才能知道是显示问题还是测温的问题啊

你先调试1602显示成功了再去调试18b20时序。你可以把你的1602程序另外建个工程调试

ds_read(void)你这个函数有问题吧。感觉没有读取总线上的数据吧

哦,错了,已经读了。看看是不是这样,ds_read(void)这个函数,ds=1;后加几个延时_nop_(); _nop_();_nop_();不马上读取ds上数据,给个数据传输时间,但是要控制在15微秒之内

我已经改了,但是还是没有作用  啊~~      应该是显示的程序出问题了~~~~因为上面的数组  都没有显示出来~~~~~就是一个白屏

好的好的,我去试试~~~

~~~~~~~~~~~~~~~~~~~~~~~·

1602的电路控制不对。

调整一下液晶屏的对比度,

你可以试一下用定时器定时扫描18B20里面的数据看看,我之前貌似也试过这样的显示不出来。

  1. #include <reg51.h>
  2. #include<intrins.h>
  3. #define BYTE        unsigned char

  4. #define DATAPORT P1
  5. #define LCDCLR 0x01

  6. sbit RS = P2^4;
  7. sbit RW = P2^5;
  8. sbit EN = P2^6;

  9. /****************************************************/
  10. /**
  11. *      @brief   延时函数
  12. *      @param[in] t-BYTE,需要延时的时间t*1ms
  13. */
  14. /****************************************************/
  15. void DelayMs(BYTE t)
  16. {
  17.         BYTE i;                                          
  18.         BYTE j;
  19.         BYTE k;
  20.         for(i=0; i<t; i++)
  21.         {
  22.                 for(j=0; j<10; j++)
  23.                 {
  24.                         for(k=0; k<31; k++);
  25.                 }
  26.         }
  27. }

  28. bit LCD_Check_Busy(void)
  29. {
  30.         DATAPORT = 0xff;
  31.         RS = 0;
  32.         RW = 1;
  33.         EN = 0;
  34.         EN = 1;
  35.         _nop_();
  36.         return (bit)(DATAPORT & 0x80);
  37. }

  38. void LCD_Write_Command(BYTE Command)
  39. {
  40.         while(LCD_Check_Busy());
  41.         RS = 0;
  42.         RW = 0;
  43.         EN = 1;
  44.         DATAPORT = Command;
  45.         EN = 0;
  46.         _nop_();
  47. }

  48. void LCD_Write_Data(BYTE Data)
  49. {
  50.         while(LCD_Check_Busy());
  51.         RS = 1;
  52.         RW = 0;
  53.         EN = 1;
  54.         DATAPORT = Data;
  55.         EN = 0;
  56.         _nop_();
  57. }

  58. void LCD_Write_Char(BYTE X,BYTE Y,char Char)
  59. {
  60.         if(!Y)
  61.         {
  62.                 LCD_Write_Command(0x80+X);
  63.         }       
  64.         else
  65.         {
  66.                 LCD_Write_Command(0xc0+X);
  67.         }
  68.         LCD_Write_Data(Char);
  69. }

  70. void LCD_Write_String(BYTE X,BYTE Y,BYTE *String)
  71. {
  72.         if(!Y)
  73.         {
  74.                 LCD_Write_Command(0x80+X);
  75.         }       
  76.         else
  77.         {
  78.                 LCD_Write_Command(0xc0+X);
  79.         }
  80.         while(*String!='\0')
  81.         {
  82.                 LCD_Write_Data(*String);
  83.                 String++;
  84.         }
  85. }

  86. void LCD_Clear()
  87. {
  88.         LCD_Write_Command(LCDCLR);
  89.         DelayMs(5);               
  90. }

  91. void LCD_Initial()
  92. {
  93.         LCD_Write_Command(0x38);
  94.         DelayMs(5);
  95.         LCD_Write_Command(0x38);
  96.         DelayMs(5);
  97.         LCD_Write_Command(0x38);
  98.         DelayMs(5);       
  99.         LCD_Write_Command(0x38);
  100.         LCD_Write_Command(0x08);
  101.         LCD_Write_Command(0x01);
  102.         LCD_Write_Command(0x06);
  103.         DelayMs(5);
  104.         LCD_Write_Command(0x0f);
  105. }
  106. void main()
  107. {
  108.         LCD_Initial();
  109.         LCD_Clear();
  110.         LCD_Write_String(0,0,"zhuanghaiqiang");
  111.         LCD_Write_Char(7,1,'z');
  112.         LCD_Write_Char(8,1,'h');
  113.         LCD_Write_Char(9,1,'q');
  114.         while(1);       
  115. }

复制代码


你看一下我写的显示函数吧

觉得你应该先把显示搞定在说

初始化的LCD_Write_Command(0x0f),你可以改回LCD_Write_Command(0x0c)。想了解1602的指令直接百度指令表

注意时序,时序延时

白屏的话应该是显示的问题,18b20时序错误也应该显示全F。
建议首先看看1602电路里有没有调节对比度的电位器,如果有调下对比度试试。
其次检查管脚定义的是不是正确的,如果排除了硬件问题,建议你下一个简单的1602例程试试,看是不是屏坏了。

你试试这个
#include "reg52.h"
#define uchar unsigned char
typedef bit BOOL ;
sbit rs = P2^6 ;
sbit rw = P3^6 ;
sbit ep = P2^7 ;
void delay(uchar ms)
{ // 延时子程序
uchar i ;
while(ms--)
{
for(i = 0 ; i<250;i++) ;
}
}
void longdelay(uchar s) //长延时
{
while(s--)
{
delay(60) ;
}
}
BOOL lcd_bz()//测试LCD忙碌状态
{
BOOL result ;
rs = 0 ;
rw = 1 ;
ep = 1 ;
result = (BOOL)(P0 & 0x80) ;
ep = 0 ;
return result ;
}
void write_cmd(uchar cmd)// 写指令
{
while(lcd_bz()) ;
rs = 0 ;
rw = 0 ;
ep = 0 ;
P0 = cmd ;
ep = 1 ;
ep = 0 ;
}
void write_addr(uchar addr)//写地址
{
write_cmd(addr|0x80) ;
}
void write_byte(uchar dat)//写字节
{
while(lcd_bz()) ;
rs = 1 ;
rw = 0 ;
ep = 0 ;
P0 = dat ;
ep = 1 ;
ep = 0 ;
}
void lcd_init()// 初始化
{
write_cmd(0x38) ;
delay(1);
write_cmd(0x08) ;
delay(1);
write_cmd(0x01) ;
delay(1);
write_cmd(0x06) ;
delay(1);
write_cmd(0x0c) ;
delay(1);
}
void display(uchar addr, uchar q)//在某一地址上显示一字节
{
delay(10) ;
write_addr(addr) ;
write_byte(q) ;
longdelay(2) ;
}
main()
{
lcd_init() ; // 初始化LCD
delay(10) ;
// lcd_wcmd(0x07) ; //entry mode set
delay(1) ;
while(1)
{
display(0x00,'R') ;//在第一个位置显示R
display(0x01,0x31)// 在第二个位置显示1,(1的ASCII码为31)
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top