完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`用数码管是可以显示出来温度的,然后改成数组,在1602上显示就只有0,不知道如何才能解决,下面是我的代码: #include "temp.h" /******************************************************************************* * 函 数 名 : Delay1ms * 函数功能 : 延时函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Delay1ms(uint y) { uint x; for( ; y>0; y--) { for(x=110; x>0; x--); } } /******************************************************************************* * 函 数 名 : Ds18b20Init * 函数功能 : 初始化 * 输 入 : 无 * 输 出 : 初始化成功返回1,失败返回0 *******************************************************************************/ uchar Ds18b20Init() { uchar i; DSPORT = 0; //将总线拉低480us~960us i = 70; while(i--);//延时642us DSPORT = 1; //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低 i = 0; while(DSPORT) //等待DS18B20拉低总线 { Delay1ms(1); i++; if(i>5)//等待>5MS { return 0;//初始化失败 } } return 1;//初始化成功 } /******************************************************************************* * 函 数 名 : Ds18b20WriteByte * 函数功能 : 向18B20写入一个字节 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds18b20WriteByte(uchar dat) { uint i, j; for(j=0; j<8; j++) { DSPORT = 0; //每写入一位数据之前先把总线拉低1us i++; DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始 i=6; while(i--); //延时68us,持续时间最少60us DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值 dat >>= 1; } } /******************************************************************************* * 函 数 名 : Ds18b20ReadByte * 函数功能 : 读取一个字节 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ uchar Ds18b20ReadByte() { uchar byte, bi; uint i, j; for(j=8; j>0; j--) { DSPORT = 0;//先将总线拉低1us i++; DSPORT = 1;//然后释放总线 i++; i++;//延时6us等待数据稳定 bi = DSPORT; //读取数据,从最低位开始读取 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/ byte = (byte >> 1) | (bi << 7); i = 4; //读取完之后等待48us再接着读取下一个数 while(i--); } return byte; } /******************************************************************************* * 函 数 名 : Ds18b20ChangTemp * 函数功能 : 让18b20开始转换温度 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds18b20ChangTemp() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0x44); //温度转换命令 //Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了 } /******************************************************************************* * 函 数 名 : Ds18b20ReadTempCom * 函数功能 : 发送读取温度命令 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds18b20ReadTempCom() { Ds18b20Init(); Delay1ms(1); Ds18b20WriteByte(0xcc); //跳过ROM操作命令 Ds18b20WriteByte(0xbe); //发送读取温度命令 } /******************************************************************************* * 函 数 名 : Ds18b20ReadTemp * 函数功能 : 读取温度 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int Ds18b20ReadTemp() { int temp = 0; uchar tmh, tml; Ds18b20ChangTemp(); //先写入转换命令 Ds18b20ReadTempCom(); //然后等待转换完后发送读取温度命令 tml = Ds18b20ReadByte(); //读取温度值共16位,先读低字节 tmh = Ds18b20ReadByte(); //再读高字节 temp = tmh; temp <<= 8; temp |= tml; return temp; } 主程序部分代码: #include "reg52.h" #include "lcd.h" #include "ds1302.h" #include "bluetooth.h" #include "temp.h" typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; u8 datas[6]; u8 idata strb[17] = {"TEP: . C "}; void main() { while(1) { LcdDisplay(Ds18b20ReadTemp()); LcdWriteCom(0x80+0x40); strb[4] = datas[0]; strb[5] = '0' + datas[1]; strb[6] = '0' + datas[2]; strb[7] = '0' + datas[3]; strb[9] = '0' + datas[4]; strb[10] = '0' + datas[5]; for (i = 0; i < 16; i++) { LcdWriteData(strb[i]); } } } void LcdDisplay(int temp) { float tp; if(temp< 0) //当温度值为负数 { //显示负 datas[0] = '-'; //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; } else { datas[0] = '+'; tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; } datas[1] = temp / 10000; datas[2] = temp % 10000 / 1000; datas[3] = temp % 1000 / 100; datas[4] = temp % 100 / 10; datas[5] = temp % 10; }` |
|
相关推荐
3个回答
|
|
我用数码管同时显示温度,发现数码管一个数都无法显示出来,还一直在跳,
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【每周推荐】采用11代Intel CPU,基于youyeetoo X1开发板搭建少儿AI智能STEAM积木平台
776 浏览 0 评论
2265 浏览 2 评论
【youyeetoo X1 windows 开发板体验】+ 影音处理和AI模型移植
2124 浏览 5 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 移植zbar的方法
1682 浏览 0 评论
2786 浏览 3 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
5518 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-19 15:51 , Processed in 0.824516 second(s), Total 71, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号