标题:
实现稳定的单片机ds1820一线多点测温系统,C51源码,12864液晶显示温度值
[打印本页]
作者:
cm7626
时间:
2017-4-7 22:59
标题:
实现稳定的单片机ds1820一线多点测温系统,C51源码,12864液晶显示温度值
美国DALAS公司的温度传感器ds1820芯片具有高灵敏度、易用性、编程布线简单等优点,被应用到工控行业的各种产品中。
本C51源码能够实现稳定的一线多点测温系统,液晶显示温度值。结合硬件的通信即可实现远程多点测温。本c51的ds1820的c语言驱动程序通过实践使用,程序效率高、稳定准确,可直接使用。
且本原码包括了FYD12864液晶显示源码,为FYD12864液晶初使用者提供了一个实例。
//DS1820 C51 子程序
//这里以11.0592M晶振为例,不同的晶体速度可能需要调整延时的时间
#include<reg52.h>
#include<lcd.h>
#include <absacc.h>
/////////////**********先为液晶初始化函数变量声明**********///////////
void WRD(uchar DATA); //写lcd数据子函数声明
void WRI(uchar com) ; //写lcd指令子函数声明
void RD(uchar INDATA) ; //读lcd数据子函数声明
void CHEBF(); //读lcdBF子函数声明
void lcdinitialdat() ; //写lcd数据初始化声明
void delaylong(int n) ; //延迟声明
void delay(void);
void locatecursor(uchar H,uchar L); //定位游标,行H,列L (最大可到四行八列)
uchar bdata state;
sbit BF=state^7;
uchar idata DDRAM; //设定DDRAM地址第一行80~87,第二行90~97,
//第三行为88-8F,第四行为98-9F
uchar idata basfuncset ; /*0X30基本指令,8位数据 0X34 扩充指令,8位数据*/
uchar idata shiftcursorr=0X14;//游标移位:为14H时,游标右移
uchar idata shiftcursorl=0X10; //游标移位:为10H时,游标左移
//18H时为显示左移(在一三行之间或二四行之间),游标跟移;
//1CH时为显示右移,游标跟移
uchar idata page; //页号
////////////////////////////////////////////////////////////////////////////////////////////
sbit DQ =P1^1;//根据实际情况定义端口
typedef unsigned int uint;
void tmdelay(uchar useconds) ;
uchar tm_initial(void) ;
void read_char(void) ;
void write_char(char val) ;
void Read_Temperature(uchar no) ;
uchar temdate[2][2]=
{0,0, //NO1温度值的低字节和高字节
0,0}; //NO2温度值的低字节和高字节
uchar tempkey[2][8]=
{0X28,0X8F,0XF3,0X85,0,0,0,0X60, //NO1
0X28,0X52,0XA4,0X85,0,0,0,0X2A}; //NO2
uchar dy=0;
uchar value = 0;
uchar temint=0;
uint temdot=0;
//////////////////////////////////////////////main staet////////////////////////////////////////////////
main()
{ uchar k=0;
delaylong(500) ; /////此处必须延时300ms以上,500时为约大于1秒
//delaylong(350) ; //779ms
lcdinitialdat() ;//写lcd数据初始化
delay() ;
while(1)
{k=0;
while(k<2)
{temint=0;temdot=0;
Read_Temperature(k);
locatecursor(k+1,1); //从第2行首列显示
WRD('T');WRD('E'); WRD('M');WRD(0X30+k);WRD(':');
temint=((temdate[k][1]<<4)|(temdate[k][0]>>4));
temdot=temdate[k][0]&0X0F;
temdot=temdot*625;
temint+=temdot/10000;
WRD(0X30+temint/100);WRD(0X30+temint%100/10);WRD(0X30+temint%10);
WRD('.');
WRD(0X30+(temdot%10000/1000));WRD(0X30+temdot%1000/100);
WRD(0X30+(temdot%100/10));WRD(0X30+temdot%10);
k++;
}
}
}//end main
///////////////////////////////////////////////end main/////////////////////////////////////////////
//延时
void tmdelay(uchar useconds)
{
while(useconds>0)useconds--;
}
/*tmdelay(1) ;//16.28us//增加一个就加6.5us
tmdelay(2) ;//22.78us
tmdelay(3) ;//29.30us
tmdelay(4) ;//35.81us
tmdelay(70) ;//465.49
tmdelay(74) ;//491.54
tmdelay(80) ;//530.60
tmdelay(115) ;//150us */
//复位
uchar tm_initial(void) ///对的
{
uchar answer=1;
NOANSWE:
DQ = 0; //pull DQ line low
tmdelay(74); // leave it low for 490us
DQ = 1; // allow line to return high
tmdelay(12); // wait >60us for answer pulse
if(DQ==1) {answer=1;goto NOANSWE;}
else if(DQ==0)answer=0;
//locatecursor(1,5);
//WRD(0X30+answer);
tmdelay(40) ;//>250us
DQ=1;
return(answer); //0表示有DS18B20应答,1表示没有应答
}
//从 1-wire 总线上读取一个字节
void read_char(void)
{
uchar i;
value=0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 1;
dy++;dy++;
DQ = 0; // pull DQ low
dy++;dy++;dy++;dy++;dy++; // wait 1-15us for data in bus
DQ=1; dy++; //pull high
//tmdelay(1);
if(DQ==1)
{value|=0x80;
}else{;}
tmdelay(18) ;//>120us
}
//return(value);
}
//向 1-WIRE 总线上写一个字节
void write_char(uchar val)
{
uchar i;
locatecursor(3,1);
for (i=8; i>0; i--) // writes uchar, one bit at a time
{
//DQ = 1;
//tmdelay(1);
DQ = 0; // pull DQ low to start timeslot
tmdelay(1);
if(val&0X01==1)
{DQ = 1;tmdelay(12); }
else {DQ=0;tmdelay(12); DQ=1;tmdelay(1); }
//tmdelay(10); // hold value for remainder of timeslot
val=val>>1;
}
DQ = 1;
tmdelay(1);
}
///////读DS18B20的64bit的KEY
//读取温度
void Read_Temperature(uchar no)
{
uchar j=0;
value=0;
if(tm_initial()==1) goto noanswer;
write_char(0X55); // 匹配 ROM
//写暂存存储器(4EH)、读暂存存储器(BEH)、复制暂存存储器(48H)、温度变换(44H)、重
//新调出EERAM(B8H)和读电源供电方式(B4H)命令
while(j<8)
{
write_char(tempkey[no][j]);
j++;
}
write_char(0x44); // Start Conversion
delaylong(355) ; //>780ms// 延时一段时间,等待AD转换结束,默认12位则>750ms
if(tm_initial()==1) goto noanswer;
write_char(0X55); // 匹配 ROM
j=0;
while(j<8)
{
write_char(tempkey[no][j]);
j++;
}
write_char(0xBE); // Read Scratch Pad
read_char(); //first temperatue low
temdate[no][0]=value;
read_char(); //then temperatue high
temdate[no][1]=value;
//tm_initial();
//write_char(0xCC); //Skip ROM
//return temp.x/2;
noanswer:;
} //////////////////////////end Read_Temperature(void) ////////////////////
///////////////////////////
/***************************现为各液晶子函数体******************/////
void WRD(uchar DATA) //写lcd数据子函数
{
CHEBF();
ADWRD=DATA;
ADWRD=DATA;
}
void WRI(uchar com) //写lcd指令子函数
{
CHEBF();
ADWRI=com;
ADWRI=com;
}
void CHEBF() //读lcdBF子函数
{
state=ADRI;
while(BF)
{
state=ADRI;
}
}
void lcdinitialdat() //写lcd数据初始化
{
WRI(0X30) ; //RE=0基本指令设定
delay();
WRI(0X30) ; //延迟39us
delay();
WRI(stadis2); //游标开,反白允许
//WRI(0X0E); //游标开,反白不允许
//WRI(stadis1); //游标关,反白不允许
delay(); //延迟39us
WRI(clrdis) ; //清除显示
delay(); //延迟39us
WRI(inpointcursorup); //AC+1
delay(); //延迟39us
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
(49.89 KB, 下载次数: 156)
下载附件
2017-4-7 23:59 上传
下载:
C51源码能够实现稳定的一线多点测温系统,液晶显示温度值.rar
(259.6 KB, 下载次数: 57)
2017-4-7 22:59 上传
点击文件名下载附件
多点测量温度
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1