标题:
DS1820温度测量1602显示的单片机源码
[打印本页]
作者:
17853687527
时间:
2018-7-10 16:54
标题:
DS1820温度测量1602显示的单片机源码
利用51单片机,DS1820温度传感器可以实现实时温度检测。
图6.jpg
(118.46 KB, 下载次数: 16)
下载附件
具体实物
2018-7-10 16:47 上传
单片机源程序如下:
///无线模块板
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^5;
sbit k2=P3^4;
sbit k3=P3^3;
sbit k4=P3^2;
sbit DQ=P3^7; //ds18b20
// 1602
sbit lcden=P0^5;
sbit lcdrs=P0^7;
sbit lcdrw=P0^6;
sbit bell=P3^6;
uint a[19];
uint wendu=0;
uint time=0;
uchar fen=0;
uchar miao=0;
//////// 1602
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P2=date;
delay1ms(5);
lcden=1;
delay1ms(5);
lcden=0;
}
void write_str(uchar *str)
{
while(*str!='\0') //未结束
{
write_data(*str++);
delay1ms(1);
}
}
void init_1602()
{
// uchar num;
uchar table[16]={0};
uchar table1[16]={0};
lcdrw=0;
lcden=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
/* for(num=0;num<16;num++)
{
write_data(table[num]);
delay1ms(10);
}
write_com(0x80+0x40);
for(num=0;num<16;num++)
{
write_data(table1[num]);
delay1ms(10);
}
*/
}
///// //// ds18b20
bit init_DS18B20()
{
uchar num;
bit flag;
DQ=1;
for(num=0;num<2;num++); //先拉高
DQ=0;
for(num=0;num<200;num++); // 480-960us powerup
DQ=1;
for(num=0;num<20;num++); // >60us wait
flag=DQ; // 响应
for(num=0;num<150;num++); // 60-240us ds18b20存在信号
DQ=1;
return flag;
}
void DS18B20_WR_CHAR(uchar byte) // 先写低位
{
uchar num;
uchar num1;
for(num1=0;num1<8;num1++)
{
DQ=0; //拉低
_nop_(); //下拉1us
_nop_();
DQ=byte&0x01;
for(num=0;num<20;num++); // >60us wait
byte>>=1;
DQ=1; //拉高
_nop_();
_nop_();
}
}
uchar DS18B20_RD_CHAR() //先读低位
{
uchar num;
uchar num1;
uchar byte=0;
for(num1=0;num1<8;num1++)
{
DQ=0; //拉低
_nop_();
DQ=1;
for(num=0;num<1;num++); // <10us
byte>>=1;
if(DQ==1)
byte|=0x80;
else
byte|=0x00;
DQ=1; //拉高
_nop_();
_nop_();
for(num=0;num<20;num++); // >60us
}
return byte;
}
uint DS18B20_WENDU()
{
uchar temperaturel=0,temperatureh=0;
uint temperature=0;
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0x44);
delay1ms(500);
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0xBE);
_nop_();
temperaturel=DS18B20_RD_CHAR();
temperatureh=DS18B20_RD_CHAR();
temperature=(temperatureh*256+temperaturel)*0.625;
init_DS18B20();
}
return temperature;
}
}
void xianshi()
{
fen=time/60;
miao=time%60;
write_com(0x80);
write_str("time temp ");
write_com(0x80+0x40);
write_data(fen/10+48);
write_data(fen%10+48);
write_data(':');
write_data(miao/10+48);
write_data(miao%10+48); // 0xdf
write_data(0x20); // 0xdf
write_data(0x20); // 0xdf
write_data(0x20); // 0xdf
write_data((wendu/100)%10+48);
write_data((wendu/10)%10+48);
write_data('.');
write_data(wendu%10+48);
write_data(0xdf); // 0xdf
write_data('c');
}
///////
main()
{
uchar i=0;
init_1602();
delay1ms(1000);
if( init_DS18B20()==0)
{
wendu=DS18B20_WENDU();
}
delay1ms(1000);
while(1)
{
if( init_DS18B20()==0)
{
wendu=DS18B20_WENDU();
}
xianshi();
if(k1==0)
{
time=0;
bell=0;
delay1ms(50);
bell=1;
delay1ms(200);
while(time<721&&k4)
{
if( init_DS18B20()==0)
{
wendu=DS18B20_WENDU();
}
xianshi();
delay1ms(190); //200
if(time==0){a[0]=wendu;}
if(time==60){a[1]=wendu;}
if(time==120){a[2]=wendu;}
if(time==180){a[3]=wendu;}
if(time==240){a[4]=wendu;}
if(time==300){a[5]=wendu;}
if(time==315){a[6]=wendu;}
if(time==330){a[7]=wendu;}
if(time==345){a[8]=wendu;}
if(time==360){a[9]=wendu;}
if(time==375){a[10]=wendu;}
if(time==390){a[11]=wendu;}
if(time==405){a[12]=wendu;}
if(time==420){a[13]=wendu;}
if(time==480){a[14]=wendu;}
if(time==540){a[15]=wendu;}
if(time==600){a[16]=wendu;}
if(time==660){a[17]=wendu;}
if(time==720){a[18]=wendu;}
time++;
}
time--;
bell=0;
delay1ms(50);
bell=1;
}
if(k2==0)
{
i=0;
bell=0;
delay1ms(50);
bell=1;
while(k1)
{
if(k4==0&&i<18)
{
i++;
bell=0;
delay1ms(50);
bell=1;
delay1ms(300);
}
if(k3==0&&i>0)
{
i--;
bell=0;
delay1ms(50);
bell=1;
delay1ms(300);
}
if(i==0){time=0;wendu=a[0];}
if(i==1){time=60;wendu=a[1];}
if(i==2){time=120;wendu=a[2];}
if(i==3){time=180;wendu=a[3];}
if(i==4){time=240;wendu=a[4];}
if(i==5){time=300;wendu=a[5];}
if(i==6){time=315;wendu=a[6];}
if(i==7){time=330;wendu=a[7];}
if(i==8){time=345;wendu=a[8];}
if(i==9){time=360;wendu=a[9];}
if(i==10){time=375;wendu=a[10];}
if(i==11){time=390;wendu=a[11];}
if(i==12){time=405;wendu=a[12];}
if(i==13){time=420;wendu=a[13];}
if(i==14){time=480;wendu=a[14];}
if(i==15){time=540;wendu=a[15];}
if(i==16){time=600;wendu=a[16];}
if(i==17){time=660;wendu=a[17];}
if(i==18){time=720;wendu=a[18];}
xianshi();
delay1ms(500);
}
bell=0;
delay1ms(50);
bell=1;
time=0;
while(!k1);
delay1ms(600);
}
}
}
复制代码
所有资料51hei提供下载:
326 温度测量1602显示.rar
(31.37 KB, 下载次数: 25)
2018-7-10 16:51 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hyyzzby
时间:
2019-5-6 18:18
感谢大佬分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1