/*******************************************************************************
--------------------------------------------------------------------------------
* 实 验 名 : TDS显示试验
* 实验说明 : LCD1602显TDS。
* 连接方式 : 见连接图
* 注 意 :
*******************************************************************************/
#include
#include"lcd.h"
#include"temp.h"
unsigned char code buf3[]={"evaluation\:Suggested filtering\n\n"};
unsigned char code buf2[]={"evaluation\:Slight solute in water\n\n"};
unsigned char code buf1[]={"evaluation\: less solute in water\n\n"};
unsigned char code buf4[]={"Warning\n\n"};
long caculate_TDS(int temp);
void LcdDisplay(int temp);
void TDSDisplay(int temp);
void send();
void PutString(unsigned char *TXStr);
unsigned int count;
sbit key=P1^4;
sbit key1=P1^3;
unsigned int FreResultFlag;
unsigned int FreNum;
/*******************************************************************************
* 函数名 : Timer0
* 描 述 : 中断程序,定时时间到后重新赋值开始定时,同时将LED的状态取反.
********************************************************************************/
void time0(void) interrupt 1
{
unsigned char i;
TH0=(65536-46083)/ 256;
TL0=(65536-46083)% 256;
i++;
if(i==20)
{
i=0;
count=TH1*256+TL1;
TH1=0x00;
TL1=0x00;
}
}
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出: 无
*******************************************************************************/
void main()
{
unsigned char flag=1;
TMOD=0x51;
TH0=(65536-46083)/ 256;
TL0=(65536-46083)% 256;
TH1 = TL1 = 0;
EA=1;
ET0=1;
TR0 = 1;
TR1 = 1;
LcdInit(); //初始化LCD1602
LcdWriteCom(0x88); //写地址 80表示初始地址
LcdWriteData('C');
while(1)
{
//LcdDisplay();
// Delay1ms(1000);//1s钟刷一次
if( FreResultFlag )
{
FreNum = ( TH1 * 256 + TL1);
TH1 = 0;
TL1 = 0;
FreResultFlag = 0;
TR1 = 1;
TR0 = 1;
LcdDisplay(Ds18b20ReadTemp());
TDSDisplay(caculate_TDS(Ds18b20ReadTemp()));
send();
UsartConfiguration();
}
}
}
/*******************************************************************************
* 函数名 : LcdDisplay()
* 函数功能 : LCD显示读取到的温度
* 输入 : v
* 输出: 无
*******************************************************************************/
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0)//当温度值为负数
{
LcdWriteCom(0x80); //写地址 80表示初始地址
LcdWriteData('-'); //显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?.5,还是在小数点后面。
}
else
{
LcdWriteCom(0x80); //写地址 80表示初始地址
LcdWriteData('+'); //显示正
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
LcdWriteCom(0x82); //写地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
LcdWriteCom(0x83); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
LcdWriteCom(0x84); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0x85); //写地址 80表示初始地址
LcdWriteData('.'); //显示 ‘.’
LcdWriteCom(0x86); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //显示小数点
LcdWriteCom(0x87); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
}
/*******************************************************************************
* 函数名 : TDSDisplay()
* 函数功能 : LCD显示读取到的
* 输入 : v
* 输出: 无
*******************************************************************************/
void TDSDisplay(int TDS) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0, 0}; //定义数组
// float tp;
// if(temp< 0)//当温度值为负数
// {
// LcdWriteCom(0x80+0x40); //写地址 80表示初始地址
// LcdWriteData('-'); //显示负
// //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
// temp=temp-1;
// temp=~temp;
// tp=temp;
// temp=tp*0.0625*100+0.5;
// //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
// //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
// //算由?.5,还是在小数点后面。
//
// }
//else
// {
// LcdWriteCom(0x80+0x40); //写地址 80表示初始地址
// LcdWriteData('+'); //显示正
// tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
// //如果温度是正的那么,那么正数的原码就是补码它本身
// temp=tp*0.0625*100+0.5;
// //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
// //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
// //算加上0.5,还是在小数点后面。
// }
datas[0] = TDS / 100000;
datas[1] = TDS % 100000 / 10000;
datas[2] = TDS % 10000 / 1000;
datas[3] = TDS % 1000 / 100;
datas[4] = TDS % 100 / 10;
datas[5] = TDS % 10 ;
LcdWriteCom(0x81+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[0]); //百位
//LcdWriteData('2');
LcdWriteCom(0x82+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[1]); //十位
//LcdWriteData('2');
LcdWriteCom(0x83+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[2]); //个位
LcdWriteCom(0x84+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[3]); //
LcdWriteCom(0x85+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[4]); //显示小数点
LcdWriteCom(0x86+0x40); //写地址 80表示初始地址
LcdWriteData('0'+datas[5]); //显示小数点
}
/*******************************************************************************
* 函数名 : TDSDisplay()
* 函数功能 : 计算TDS值
* 输入 : 温度
* 输出: 无
*******************************************************************************/
long caculate_TDS(float temp)
{
unsigned long TDS;
float Kt=0;
double Ks=0;
Ks=0.0324*count;
//Kt=1000000/count;
temp=temp*0.0625*100+0.5;
//temp=temp/100+(int)temp%100*0.01;
if(temp<10&&temp>=1)
{
Kt=Ks*(0.00169*temp+0.5583);
}
else if(temp<20&&temp>=10)
{Kt=Ks*(0.018*temp+0.5473);
}
else if(temp<30&&temp>=20)
{Kt=Ks*(0.00189*temp+0.5281);
}
else
{Kt=Ks*(0.022*temp+0.45);
}
TDS=0.55*Kt;
return Ks;
}
/*******************************************************************************
* 函 数 名定义 : PutString()
* 描 述 : 发送字符串
*******************************************************************************/
void PutString(unsigned char *TXStr)
{
while(*TXStr!=0)
{
SBUF=*TXStr;
while(TI==0);
TI=0;
TXStr++;
}
}
/*******************************************************************************
* 函 数 名定义 : send()
* 描 述 : 发送测量的温度,TDS
*******************************************************************************/
void send()
{
unsigned int shi,gewei,TD1,testno,testnoshi,testnoge;
unsigned int NO[6];
unsigned int i ,x;
unsigned int TD[8];
char str1[5];
unsigned int TE[8];
if(key==0)
{
while(!key);
testno++;
testnoshi=testno/10;
testnoge=testno%10;
NO[0]='N';
NO[1]='O';
NO[2]='\:';
NO[3]=testnoshi+0x30;
NO[4]=testnoge+0x30;
NO[5]='\n';
for(x=0;x<6;x++)
{
SBUF =NO[x];
while(!TI);
TI = 0;
}
str1[0]='\n';
str1[1]='T';
str1[2]='D';
str1[3]='S';
str1[4]='=';
for(x=1;x<5;x++)//??揟DS=?
{
SBUF = str1[x];
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………