作者在 2020-03-30 21:47:39 发布以下内容
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^4;//temp
sbit RS=P2^6;
sbit RW=P2^5;
sbit EN=P2^7;
uchar code str1[]={" temperature: "};
uchar code str2[]={""};
uchar data disdata[5];
uint tvalue;
uchar tflag;
void delay1ms (uint ms)
{
uint i,j;
for (i=0; i<ms; i++)
for(j=0; j<100;j++);
}
void wr_com(uchar com) //写命令
{
delay1ms(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(uchar dat)
{
delay1ms(1);;
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void display(uchar*p)
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
void init_play()
{
lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
void delay_18B20(uint i)
{
while(i--);
}
void ds1820rst()
{
uchar x=0; //?
DQ=1;
delay_18B20(4);
DQ=0;
delay_18B20(100);
DQ=1;
// x=DQ;
delay_18B20(40);
}
uchar ds1820rd() //read data ok
{
uchar i=0;
uchar dat=0;
for(i=8; i>0; i--){
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata) //write data
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
uint read_temp(){
uchar a,b;
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0x44); //start 转换
ds1820rst();
ds1820wr(0xcc);
ds1820wr(0xbe); //read temp
a=ds1820rd(); //l
b=ds1820rd(); //h
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0; //+ temp
else{
tvalue=~tvalue+1;
tflag=1; //- temp
}
tvalue=(tvalue*(0.625)+0.5); // 0.0625*10=0.625
return(tvalue);
}
void ds1820disp(){
uchar flagdat;
disdata[0]=tvalue/1000+'0'; //100
disdata[1]=tvalue%1000/100+'0'; //10
disdata[2]=tvalue%100/10+'0'; //1
disdata[3]=tvalue%10+0x30; //0.1
if(tflag==0)
{ //+
flagdat=0x20;//+ no disp
}
else
{ flagdat=0x2d; } //-
if(disdata[0]==0x30)
{
disdata[0]=0x20;// 0 no disp
if(disdata[1]==0x30)
{
disdata[1]=0x20;// 0 no disp
}
}
wr_com(0xc0);
wr_dat(flagdat);
wr_com(0xc1);
wr_dat(disdata[0]);
wr_com(0xc2);
wr_dat(disdata[1]);
wr_com(0xc3);
wr_dat(disdata[2]);
wr_com(0xc4);
wr_dat(0x2e); //.
wr_com(0xc5);
wr_dat(disdata[3]);
}
void main(){
init_play();
while(1){
read_temp();
ds1820disp();
}
}