本帖最后由 annyW 于 2016-4-25 19:25 编辑
#include "STC15F2K60S2.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
uint temp1; //整型的温度数据
uint temp2; //整型的温度数据
sbit DS1=P0^5; //DS18B20温度传感器1的接口信号
sbit DS2=P0^2; //DS18B20温度传感器2的接口信号 z
sbit rs=P4^0; //1602的数据/指令选择控制线
sbit rw=P4^1; //1602的读写控制线
sbit en=P4^2; //1602的使能控制线
sbit lcdsel=P4^3;
uchar code table[]="Difference:";//温度差
void delayms(unsigned int xms)//延时函数,单位ms
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(unsigned char com)//写命令
{
rs=0; //选择指令寄存器
rw=0; //选择写
P2=com; //把命令字送入P2
delayms(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口
en=0;
}
void write_data(unsigned char dat)//写数据
{ rs=1; //选择数据寄存器
rw=0; //选择写
P2=dat; //把要显示的数据送入P2
delayms(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,数据送入1602的8位数据口
en=0;
}
void init_lcd()//液晶初始化
{
write_com(0x38); //8位数据,双列,5*7字形
write_com(0x0c); //开启显示屏,关光标,光标不闪烁
write_com(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
write_com(0x01); //清屏
}
void dsreset1(void) //DS18B201发送初始化及复位信号
{
uint i; //DS18B20 初始化
DS1=0;//DS18B20温度传感器1 初始化
i=103;
while(i>0)i--;
DS1=1;
i=4;
while(i>0)i--;
}
void dsreset2(void) //DS18B202发送初始化及复位信号
{
uint i; //DS18B20 初始化
DS2=0;//DS18B20温度传感器2 初始化
i=103;
while(i>0)i--;
DS2=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit1(void) //DS18B20温度传感器1读一位数据
{
uint i;
bit dat1;
DS1=0;i++; //i++ for delay 小延时一下
DS1=1;i++;i++;
dat1=DS1;
i=8;
while(i>0)i--;
return (dat1);
}
bit tmpreadbit2(void) //DS18B20温度传感器2读一位数据
{
uint i;
bit dat2;
DS2=0;i++; //i++ for delay 小延时一下
DS2=1;i++;i++;
dat2=DS2;
i=8;
while(i>0)i--;
return (dat2);
}
uchar tmpread1(void) //DS18B20温度传感器1读一个字节
{
uchar i,j,dat1;
dat1=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit1();
dat1=(j<<7)|(dat1>>1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat1); //将一个字节数据返回
}
uchar tmpread2(void) //DS18B20温度传感器2读一个字节
{
uchar i,j,dat2;
dat2=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit2();
dat2=(j<<7)|(dat2>>1);
//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat2); //将一个字节数据返回
}
void tmpwritebyte1(uchar dat1) //DS18B20温度传感器1写一个字节到DS18B20里
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat1&0x01;
dat1=dat1>>1;
if(testb) //写1 部分
{
DS1=0;
i++;i++;
DS1=1;
i=8;while(i>0)i--;
}
else
{
DS1=0; //写0 部分
i=8;while(i>0)i--;
DS1=1;
i++;i++;
}
}
}
void tmpwritebyte2(uchar dat2) //DS18B20温度传感器2写一个字节到DS18B20里
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat2&0x01;
dat2=dat2>>1;
if(testb) //写1 部分
{
DS2=0;
i++;i++;
DS2=1;
i=8;while(i>0)i--;
}
else
{
DS2=0; //写0 部分
i=8;while(i>0)i--;
DS2=1;
i++;i++;
}
}
}
void tmpchange1(void) //DS18B20温度传感器1发送温度转换命令
{
dsreset1(); //初始化DS18B20-1
delayms(2); //延时
tmpwritebyte1(0xcc); // 温度传感器1跳过读序列号命令
tmpwritebyte1(0x44); //温度传感器1发送温度转换命令
}
void tmpchange2(void) //DS18B20温度传感器2发送温度转换命令
{
dsreset2(); //初始化DS18B20-2
delayms(2); //延时
tmpwritebyte2(0xcc); // 温度传感器2跳过读序列号命令
tmpwritebyte2(0x44); //温度传感器2发送温度转换命令
}
uint tmp1() //读取DS18B20温度传感器1寄存器中存储的温度数据
{
float tt;
uchar a,b;
dsreset1();
delayms(2);
tmpwritebyte1(0xcc);
tmpwritebyte1(0xbe); //发送读取数据命令
a=tmpread1(); //连续读两个字节数据,读取低8位
b=tmpread1(); //读取高8位
temp1=b;
temp1<<=8; //两字节合成一个整型变量。
temp1=temp1|a;
tt=temp1*0.0625; //得到真实十进制温度值,因为DS18B20
//在寄存器中默认是12位,可以精确到0.0625 度,
//所以读回数据的最低位代表的是0.0625 度。
temp1=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
return temp1; //返回温度值
}
uint tmp2() //读取DS18B20温度传感器2寄存器中存储的温度数据
{
float tt;
uchar a,b;
dsreset2();
delayms(2);
tmpwritebyte2(0xcc);
tmpwritebyte2(0xbe); //发送读取数据命令
a=tmpread2(); //连续读两个字节数据,读取低8位
b=tmpread2(); //读取高8位
temp2=b;
temp2<<=8; //两字节合成一个整型变量。
temp2=temp2|a;
tt=temp2*0.0625; //得到真实十进制温度值,因为DS18B20
//在寄存器中默认是12位,可以精确到0.0625 度,
//所以读回数据的最低位代表的是0.0625 度。
temp2=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
return temp2; //返回温度值
}
void display(uint temp1,uint temp2) //LCD1602液晶屏显示程序
{
uchar A1,A2,A2t,A3,ser,B1,B2,B2t,B3,C1,C2,C2t,C3,C,num;
init_lcd();
ser=temp1/10; //分离出三位要显示的数字
SBUF=ser;
A1=temp1/100;//十位数字
A2t=temp1%100;
A2=A2t/10;//个位数字
A3=A2t%10;//小数位数字
write_com(0x80);
write_data('A');//显示A点温度
write_com(0x81);
write_data(':');//显示冒号
write_com(0x82);
write_data(A1+0x30);//显示十位
write_com(0x83);
write_data(A2+0x30);//显示个位
write_com(0x84);
write_data('.');//显示小数点
write_com(0x85);
write_data(A3+0x30);//显示小数位
ser=temp2/10; //分离出三位要显示的数字
SBUF=ser;
B1=temp2/100;//十位数字
B2t=temp2%100;
B2=B2t/10;//个位数字
B3=B2t%10;//小数位数字
write_com(0x80+8);
write_data('B');//显示B点温度
write_com(0x81+8);
write_data(':');//显示冒号
write_com(0x82+8);
write_data(B1+0x30);//显示十位
write_com(0x83+8);
write_data(B2+0x30);//显示个位
write_com(0x84+8);
write_data('.');//显示小数点
write_com(0x85+8);
write_data(B3+0x30);//显示小数位
//两点温度之差显示程序
if(temp2>temp1)//判断大小,确保温度差数值为正
C=temp2-temp1;
else
C=temp1-temp2;
ser=C/10;
SBUF=ser;
C1=C/100;
C2t=C%100;
C2=C2t/10;//个位数字
C3=C2t%10;//小数位数字
write_com(0x80+40);
for(num=0;num<11;num++)
write_data(table[num]);//显示两点温度差
write_com(0x80+51);
write_data(C2+0x30);//显示个位
write_com(0x80+52);
write_data('.');//显示小数点
write_com(0x80+53);
write_data(C3+0x30);//显示小数位
}
void main() //主函数
{ uchar n,m=0;
P4M1=0x00;
P4M0=0x00;
P2M0=0xff;
P2M1=0x00; //将P2设为推挽
do
{
tmpchange1(); //温度传感器1的温度转换函数
tmpchange2(); //温度传感器2的温度转换函数
// deal(temp1,temp2); //进行温度处理
display(tmp1(),tmp2());//调用温度显示函数,起到延时作用
}
while(1); //动态停机
}
请大神帮忙看一下,真的是十分感谢。。。。。。虽然我只有一个积分
-
一周热门 更多>