完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 annyW 于 2016-4-25 19:25 编辑
#include "STC15F2K60S2.H" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uint temp1; //整型的温度数据 uint temp2; //整型的温度数据 ***it DS1=P0^5; //DS18B20温度传感器1的接口信号 ***it DS2=P0^2; //DS18B20温度传感器2的接口信号 z ***it rs=P4^0; //1602的数据/指令选择控制线 ***it rw=P4^1; //1602的读写控制线 ***it en=P4^2; //1602的使能控制线 ***it 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); //动态停机 } 请大神帮忙看一下,真的是十分感谢。。。。。。虽然我只有一个积分
|
|
相关推荐
1个回答
|
|
仿真调试下看是温度测量不变还是只有显示不变。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
852 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
592 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
705 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
926 浏览 2 评论
657 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:10 , Processed in 0.546745 second(s), Total 71, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号