最近我做一个温度显示计,传感器用的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());
}
}