ds18b20测温1602显示程序 不好使,有没有大神帮我看看,感谢
#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里面的数据看看,我之前貌似也试过这样的显示不出来。
- #include <reg51.h>
- #include<intrins.h>
- #define BYTE unsigned char
- #define DATAPORT P1
- #define LCDCLR 0x01
- sbit RS = P2^4;
- sbit RW = P2^5;
- sbit EN = P2^6;
- /****************************************************/
- /**
- * @brief 延时函数
- * @param[in] t-BYTE,需要延时的时间t*1ms
- */
- /****************************************************/
- void DelayMs(BYTE t)
- {
- BYTE i;
- BYTE j;
- BYTE k;
- for(i=0; i<t; i++)
- {
- for(j=0; j<10; j++)
- {
- for(k=0; k<31; k++);
- }
- }
- }
- bit LCD_Check_Busy(void)
- {
- DATAPORT = 0xff;
- RS = 0;
- RW = 1;
- EN = 0;
- EN = 1;
- _nop_();
- return (bit)(DATAPORT & 0x80);
- }
- void LCD_Write_Command(BYTE Command)
- {
- while(LCD_Check_Busy());
- RS = 0;
- RW = 0;
- EN = 1;
- DATAPORT = Command;
- EN = 0;
- _nop_();
- }
- void LCD_Write_Data(BYTE Data)
- {
- while(LCD_Check_Busy());
- RS = 1;
- RW = 0;
- EN = 1;
- DATAPORT = Data;
- EN = 0;
- _nop_();
- }
- void LCD_Write_Char(BYTE X,BYTE Y,char Char)
- {
- if(!Y)
- {
- LCD_Write_Command(0x80+X);
- }
- else
- {
- LCD_Write_Command(0xc0+X);
- }
- LCD_Write_Data(Char);
- }
- void LCD_Write_String(BYTE X,BYTE Y,BYTE *String)
- {
- if(!Y)
- {
- LCD_Write_Command(0x80+X);
- }
- else
- {
- LCD_Write_Command(0xc0+X);
- }
- while(*String!='\0')
- {
- LCD_Write_Data(*String);
- String++;
- }
- }
- void LCD_Clear()
- {
- LCD_Write_Command(LCDCLR);
- DelayMs(5);
- }
- void LCD_Initial()
- {
- LCD_Write_Command(0x38);
- DelayMs(5);
- LCD_Write_Command(0x38);
- DelayMs(5);
- LCD_Write_Command(0x38);
- DelayMs(5);
- LCD_Write_Command(0x38);
- LCD_Write_Command(0x08);
- LCD_Write_Command(0x01);
- LCD_Write_Command(0x06);
- DelayMs(5);
- LCD_Write_Command(0x0f);
- }
- void main()
- {
- LCD_Initial();
- LCD_Clear();
- LCD_Write_String(0,0,"zhuanghaiqiang");
- LCD_Write_Char(7,1,'z');
- LCD_Write_Char(8,1,'h');
- LCD_Write_Char(9,1,'q');
- while(1);
- }
你看一下我写的显示函数吧
觉得你应该先把显示搞定在说
初始化的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)
}
}
