|
//這是一個用ds18b20測溫并用1602來顯示的一個程序,仿真可以正常顯示出來,但是就是實物出不來,調了對比度也還是這樣
#include <reg51.h>
#define u8 unsigned char
#define u16 unsigned int
sbit rs=P3^0;
sbit rw=P3^6;
sbit e=P3^7;
sbit dq=P3^4;
u8 code tab1[]={"temperature show"};
u8 code tab2[]={" Temp Now: . C "};
void delay(u16 t)
{ u16 x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------lcd1602----------------------------
void write_com(u8 com)//寫指令
{
rs=0;
P1=com;
delay(5);
rw=0;
e=1;
delay(5);
e=0;
}
void write_dat(u8 dat)//寫數據
{
rs=1;
P1=dat;
delay(5);
rw=0;
e=1;
delay(5);
e=0;
}
void lcd_init()//LCD初始化
{ u8 i;
e=0;
rw=0;
write_com(0x38);
delay(5);
//write_com(0x08);
write_com(0x0C);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(i=0;i<16;i++)
{
write_dat(tab1[i]);
delay(20);
}
write_com(0xc0);
for(i=0;i<16;i++)
{
write_dat(tab2[i]);
delay(50);
}
}
//-------------------------ds18b20-----------------------------
void ds_init()
{
u16 i;
dq=0;
i=103;
while(i>0)
i--; //延時大約480us~960us
dq=1;
i=4;
while(i>0)
i--; //延時大約60us~240us
}
bit read_dat() //讀一位數據
{
u16 i;
bit dat;
dq=0;
i++; //拉低大約1us左右
dq=1;
i++;
i++;
dat=dq; //讀回數據
i=8;
while(i>0)
i--; //延時45ms左右
return (dat);
}
u8 read_byte() //18b20讀一個字節函數
{
u8 i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=read_dat();//讀一位數據給j
dat=(j<<7)|(dat>>1);
}
return (dat);
}
void write1() //向18b20寫入1
{ u16 i;
dq=0;
i++;
i++; //延時15us左右
dq=1;
i=8;
while(i>0)
i--;
}
void write0() //向18b20寫入0
{ u16 i;
dq=0;
i=8;
while(i>0)
i--; //延時60us左右
dq=1;
i++;
i++;
}
void write_byte(u8 dat)//18b20寫一個字節函數
{
u8 j;
bit ceb;
for(j=1;j<=8;j++)
{
ceb=dat&0x01;
dat=dat>>1;
if(ceb)
{
write1();
}
else
{
write0();
}
}
}
void wenduzh() //18b20溫度轉換函數
{
ds_init(); //1、初始化
delay(1);
write_byte(0xcc); //跳過rom操作指令
write_byte(0x44); //溫度轉換命令
}
u16 cewendu()
{
u16 t;
float t1;
u8 a,b;
ds_init();
delay(1);
write_byte(0xcc);//跳過ROM
write_byte(0xbe);//讀暫存器第9字節ram
a=read_byte();//讀第一個字節存于a
b=read_byte();
t=b; //將整數部分賦給t
t<<=8;
t=t|a;//整數小數合并
t1=t*0.0625;
t=t1*10+0.5; //加0.5四舍五入
return t;
}
void display(u16 dat,u8 m)
{
u8 x,y,z;//定義溫度顯示數值的百位十位個位百分位
x=dat/100+'0'; //百位
y=(dat%100)/10;//十位
z=dat%10; //個位
write_com(m);
write_dat(x);
write_dat(y+0x30);
write_com(m+3);
write_dat(z+0x30);
}
void main()
{ u16 tt1=0;
lcd_init();
while(1)
{ wenduzh();
tt1=cewendu();
display(tt1,0xca);//0xca使得讀出來的溫度的數值放在:后面
delay(100);
}
}
|
|