完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include
#define uchar unsigned char #define uint unsigned int ***it LS138A = P2^2; //138译码器 ***it LS138B = P2^3; ***it LS138C = P2^4; ***it DQ = P2^5;//DS18B20数据口 ***it dula=P2^7; //段选位 ***it BELL = P2^6;//设置P2.6口,为控制蜂鸣器发声的引脚 void init_ds18b20(void); void delay(uint t); void write_byte(uchar dat); uchar read_byte(void); uchar readtemperature(void); void display(void); uchar code table[ ] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; void delay_50us(uint t) { uchar j; for(;t>0;t--) for(j=19;j>0;j--); } void main(void) { while(1) {float temp; display(); if(temp>=30) //蜂鸣器发生条件 { BELL=0; } else { BELL=1; } } } void delay(uint t) { while(t--); } void init_ds18b20(void) //初始化函数 { uchar n; DQ=1; //DQ先置高 delay(8);//延时 DQ=0; //发送复位脉冲 delay(80); //延时(>480us) DQ=1; //拉高数据线 ,释放总线 delay(8); n=DQ; delay(4); } void write_byte(uchar dat) //写函数 { uchar i; for(i=0;i<8;i++) { DQ=0; DQ=dat&0x01; //最低位开始写 delay(4); //延时40us DQ=1; dat>>=1;//右移一位 } delay(4); } uchar read_byte(void) //读函数 { uchar i,value; for(i=0;i<8;i++) { DQ=0; value>>=1; //右移一位,也起延时作用 DQ=1; if(DQ) //判断 value|=0x80; //读出来的数据放入高位,最后右移到低位 delay(4); } return value; } uchar readtemperature(void) //读温度函数 { uchar a,b; float c; init_ds18b20(); write_byte(0xcc);// 跳过ROM write_byte(0x44);//启动温度测量 delay(300); init_ds18b20(); //初始化 write_byte(0xcc);// 跳过ROM write_byte(0xbe);//读寄存器 a=read_byte(); //保存低位L b=read_byte(); //保存高位H //b<<=4; //b+=(a&0xf0)>>4; //c=(((b*256)+a)*0.0625*10+0.5); //delay(200); c=((b<<=4)+((a&0xf0)>>4))+((a&0x0f)*0.0625); c=c*10+0.5; return c; } void display(void) //显示函数 { uint temp; temp= readtemperature(); dula=1; 0 = table[temp/100]; dula=0; LS138A=1; LS138B=1; LS138C=0; delay_50us(20); dula=1; 0 = table[temp%100/10]|0x80; dula=0; LS138A=0; LS138B=1; LS138C=0; delay_50us(20); dula=1; 0=table[temp%10]; dula=0; LS138A=1; LS138B=0; LS138C=0; delay_50us(20); dula=1; 0=table[temp/100]; dula=0; LS138A=0; LS138B=0; LS138C=0; delay_50us(20); } 为何温度到达25.5时会清零,请大神解决,谢谢 |
|
相关推荐
5个回答
|
|
帮顶.
|
|
|
|
楼主的温度计算有错误吧,小数的计算和整数计算最好还是分开好点。
我是这样做的,先查表得到小数部分的数值,然后计算整数部分,显示的时候也是,先显示整数,再显示小数,发现这样做比较接近实际,我用的是12bit数据模式 |
|
|
|
|
|
|
|
c=((b<<=4)+((a&0xf0)>>4))+((a&0x0f)*0.0625);
c=c*10+0.5; 感觉计算复杂了,为什么最后会乘以10再加0.5 应该是整数小数分开算,整数要区分正负值的 0 = table[temp/100];这里是拷贝错误还是程序错误 |
|
|
|
ds18b20采用不同的精度,会有不同的量程,你可以试试改变精度,不过量程也不会这么小,你看看郭天祥的例程比较合适.
|
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:04 , Processed in 0.997358 second(s), Total 56, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号