DS18B20温度控制开关仿真

21ic官方微信-->
ds18b20温度控制器,怎么写才能控制温度控制到小数位
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
ds18b20+lcd设计温度控制器,显示温度能到小数位,控制温度不能到小数,怎么改才能到小数
oid data_pros()& & & & //数据处理函数
& & & & uint8&&& & & && &&&
& & & & uint8 temp_buf[2],humi_buf[2];
& & & & uint8 temphbuf[2],templbuf[2],humihbuf[2],humilbuf[2];
& & & && & & & //测量温度值
& & & & uint16&&//取小数点后两位有效数字
& & & & tempvalue=readtemp();& & & & //读取温度
& & & & DHT11_Read_Data(&temp,&humi);
& & & & temp_buf[0]=temp/10+0x30;& & & && &//LCD显示温度做准备
& & & & temp_buf[1]=temp%10+0x30;
& & & & humi_buf[0]=humi/10+0x30;& & & && &//LCD显示湿度做准备
& & & & humi_buf[1]=humi%10+0x30;
& & & & dio=a*0.0625;
& & & & k=dio*10000;//取小数点后两位有效数字
& & & & temphbuf[0]=temph/10+0x30;& & & && & //LCD显示上下限温度做准备
& & & & temphbuf[1]=temph%10+0x30;
& & & & templbuf[0]=templ/10+0x30;
& & & & templbuf[1]=templ%10+0x30;
& & & & humihbuf[0]=humih/10+0x30;& & & && & //LCD显示上下限湿度做准备
& & & & humihbuf[1]=humih%10+0x30;
& & & & humilbuf[0]=humil/10+0x30;
& & & & humilbuf[1]=humil%10+0x30;
& & & & if(mode==0)& & & & & & & && & //测量温度,湿度显示
& & & & & & & & lcd_init_display();& & & & & & & & & & & && &//LCD显示函数
& & & & & & & & wrc(0x85);& & & & & & & & & & & & & & & & & & & &&&//LCD显示温度位置
& & & & & & & & wrd(num[tempvalue%100/10]);& & & &&&//测量温度十位显示
& & & & & & & & wrd(num[tempvalue%100%10]);& & & &&&//测量温度个位显示
& & & & & & & & wrd('.');
& & & & & & & & wrd(num[k/1000]);&&//取小数点后两位有效数字
& & & & & & & & wrd(0xdf);
& & & & & & & & wrd('C');& & & & & & & &&&//测量温度符号
& & & & & & & & for(i=0;i&2;i++)
& & & & & & & & {
& & & & & & & & & & & & wrc(0Xc5+i);& & & && & //LCD显示湿度位置
& & & & & & & & & & & & wrd(humi_buf[i]); //测量湿度十个位显示& & & & & & & && &
& & & & & & & & }& & & &
& & & & & & & & for(i=0;i&3;i++)
& & & & & & & & {
& & & & & & & & & & & & wrc(0Xc7+i);& & & &&&//LCD显示符号位置
& & & & & & & & & & & & wrd(str5[i]);& & & & //测量湿度符号& & & & %RH&&
& & & & & & & & }& & & &
& & & & if(mode==1)& & & & & & & & & & & && &//温度上限显示
& & & & & & & & wrc(0x80);
& & & & & & & & for(i=0;i&6;i++)
& & & & & & & & {
& & & & & & & & & & & & wrd(str6[i]);& & & & & & & && &
& & & & & & & & }
& & & & & & & & wrd(temphbuf[0]);
& & & & & & & & wrd(temphbuf[1]);& & & & & & & & & & & &
& & & & if(mode==2)& & & & & & & & & & & && &//温度下限显示
& & & & & & & & wrc(0x80);
& & & & & & & & for(i=0;i&6;i++)
& & & & & & & & {
& & & & & & & & & & & & wrd(str7[i]);& & & & & & & && &
& & & & & & & & }
& & & & & & & & wrd(templbuf[0]);
& & & & & & & & wrd(templbuf[1]);& & & & & & & & & & & &
& & & & if(mode==3)& & & & & & & & & & & && &//湿度上限显示
& & & & & & & & wrc(0x80);
& & & & & & & & for(i=0;i&6;i++)
& & & & & & & & {
& & & & & & & & & & & & wrd(str8[i]);& & & & & & & && &
& & & & & & & & }
& & & & & & & & wrd(humihbuf[0]);
& & & & & & & & wrd(humihbuf[1]);& & & & & & & & & & & &
& & & & if(mode==4)& & & & & & & & & & & && &//湿度下限显示
& & & & & & & & wrc(0x80);
& & & & & & & & for(i=0;i&6;i++)
& & & & & & & & {
& & & & & & & & & & & & wrd(str9[i]);& & & & & & & && &
& & & & & & & & }
& & & & & & & & wrd(humilbuf[0]);
& & & & & & & & wrd(humilbuf[1]);& & & & & & & & & & & &
本帖子中包含更多资源
才可以下载或查看,没有帐号?
控制温度不能到小数,怎么改才能到小数?
对这点没有很理解?你想要如何控制呢?
DS18B20只是一个检测温度的,怎么控制温度?不太明白楼主的设计方法
中级工程师, 积分 3086, 距离下一级还需 1914 积分
中级工程师, 积分 3086, 距离下一级还需 1914 积分
中级工程师, 积分 3086, 距离下一级还需 1914 积分
中级工程师, 积分 3086, 距离下一级还需 1914 积分
控制温度不能到小数,怎么改才能到小数?
对这点没有很理解?你想要如何控制呢? ...
是显示驱动没显示
&&temp_buf[0]=temp/10+0x30;& && && & //LCD显示温度做准备
& && &&&temp_buf[1]=temp%10+0x30;
& && &&&humi_buf[0]=humi/10+0x30;& && && & //LCD显示湿度做准备
& && &&&humi_buf[1]=humi%10+0x30;
这里只有整数部分。
没有小数点显示,和小数部分。
你加上不就行了?
中级工程师, 积分 3152, 距离下一级还需 1848 积分
中级工程师, 积分 3152, 距离下一级还需 1848 积分
中级工程师, 积分 3152, 距离下一级还需 1848 积分
中级工程师, 积分 3152, 距离下一级还需 1848 积分
问题叙述 不够清晰,似乎包含2个问题:
1.使显示的精度达到小数位,这更传感器的选择有关,有的检测精度直到整数位,对于DS18B20来说起精度是可以达到的,需对检测的的小数部分加以处理来实现显示。
2.使温度的控制精度达到小数位,需适当地将小数部分也变成整数,以便进行判别对加热器进行控制。但更为重要的是加热器是有迟滞性的,只有引入PID调节或模糊控制等才能达到较高的控制精度,以确保精度可达小数位级别。
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
初级技术员, 积分 63, 距离下一级还需 37 积分
扫描二维码,随时随地手机跟帖
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
突出贡献奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章
技术新星奖章
人才类勋章
您需要登录后才可以回帖
热门推荐 /6博客分类:
#include "my51.h"
#include "smg.h"
#include "ds18b20.h"
void main()
//测试 ,6位数码管显示温度值
u16 temp=0;
temp=ds18b20_readTemperaData();
for(i=0;i&100;i++)
displaySMG(ds18b20_processTempData(temp));
_DS18B20_H
_DS18B20_H
extern u8 smgWela[7];
//数码管位选数据
sbit DQ=P2^2;
//总线定义
bool ds18b20_init();
//初始化函数
ds18b20_processTempData(u16 temp);//将temp数据处理成数码管可显示数据
ds18b20_readTemperaData();
ds18b20_readByte() ;
//读一个字节
void ds18b20_writeByte(u8 dat);
//mcu向18b20写一个字节
#include "ds18b20.h"
/******************************************************************
当主机总线t0时刻从高拉至低电平时就产生写时间隙
从to 时刻开始的1us之后,15us之前将所需写的位送到总线上
DSl820 在t0后的15-60us 对总线采样若低电平写入的位是0 ,若高电平写入的位是1
连续写2 个位之间的间隙应大于1us
写1,总时间大于60us,在t0开始延时1us就可以写1,15us之后ic来采样,采样时间最大45us
写0,总时间是60~120us,15~60us是ic在采样,120以外就没必要了,mcu总得释放总线吧
不管写1还是写0,大于60us的话,ic肯定已经采样完成了,那mcu就可以释放了
*******************************************************************/
void ds18b20_writeByte(u8 dat)
//mcu向ic写一个字节
for(i=0;i&8;i++)
//产生读写时序的起始信号
//要求至少1us的延时
DQ=dat & 0x01; //对总线赋值,从最低位开始写起
delayXus(10);//延时74us,写0在60~120us之间释放,写1的话大于60us均可释放
//释放总线,为下一次mcu送数据做准备,
//有效数据移动到最低位,2次写数据间隙至少需1us
/**************************************************************************
下降沿产生读时序
整个读时序必须至少有60us的持续时间,相邻两个读时序必须要有至少1us的恢复时间
DS18B20在读时序产生1us后输出数据到总线上,也有可能需要2~3个微秒,但不会更多
而要求主机释放总线和采样总线等动作要在15μs内完成,那么让mcu采样的最佳时机
是读时序产生后的5~13us之间,在15~60us这段时间是18b20的私有时间,它会在这段
时间内的任意时刻释放总线,是不稳定期,我们不要让mcu在这段时间里对总线操作
*******************************************************/
u8 ds18b20_readByte()
//mcu读一个字节
u8 i,value=0;
for(i=0;i&8;i++)
//起始信号
value&&=1;
//顺便延时3~4个机器周期
//mcu释放总线
_nop_();_nop_();_nop_(); //再延时3.3us
value|=0x80;//保存高电平数据,低电平的话不用保存,移位后默认是0
delayXus(8); //延时60.76us
u16 ds18b20_readTemperaData()
//读取温度值
u16 temp=0;
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过rom检测
ds18b20_writeByte(0x44);
//写指令:温度转换
//delayms(750);// 转换延时需要750ms以上,我们不等它
//首次转换未完成时,得到的初始化数据是85度,处理一下就可以了
//温度转换电路是硬件独立的,不会阻塞初始化功能
if(ds18b20_init())
ds18b20_writeByte(0xcc);
//写指令:跳过检测rom
ds18b20_writeByte(0xbe);
//写指令:读取温度值
temp=ds18b20_readByte();
//先读低8位数据
temp|=(u16)ds18b20_readByte()&&8; //再读高8位数据,然后合并
temp&= 0x0FFF; //高4位数据反正没用上,我们用来存放错误码
//调试代码
temp=0x2000; //错误码,初始化失败
//调试代码
temp=0x1000;
//错误码,初始化失败,可能器件损坏
bool ds18b20_init()
u8 checkState=0;
//总线初始状态
_nop_();_nop_();
//mcu先将总线拉低
delayXus(80);
//延时530us,要求480us~960us的低电平信号
//当ic接受到此复位信号后会回发一个存在信号
//mcu若要接收此存在信号则先要释放总线,让ic控制该总线
//当mcu释放总线后的15~60us之后,ic才向总线发一个低电平信号
//该信号存在时间为60~240us
//mcu释放总线
delayXus(10);
//mcu释放15~60us以上,(8+6*10)*1.085=73us,
//这时DS18B20已经拉低信号,大约60~240us应答保持时间,
checkState=DQ;
//在这段60~240us时间内,mcu采样是否有器件响应,0表示有响应
delayXus(70);
//延时464us,加上之前的73us,共537us
//虽然ic在拉低电平60~240us之后,会释放总线,但整个时间至少480us
//故我们共用时537us,这样是为了不影响后续的操作
if(checkState)
//checkstate为0说明有器件响应,为1无器件响应
return FALSE;
return TRUE;
//初始化成功
u8* ds18b20_processTempData(u16 temp) //返回数码管可直接显示的数据指针
if(0x0550==temp)
//如果初始化温度数据是85度的话
//亮灯报警,调试
smgWela[5]=18;
//当温度是85度,第6个数码管显示负号
//一般刚上电时能看到这个负号
if(1==(temp&0x0800))
//检测第11位是否为1,为1是负温度
temp&=0x07
//只取第0~10共11个位
temp=(~temp+1) & 0x07//将补码还原
smgWela[0]=18;
//第一个数码管显示18号元素,即负号
smgWela[0]=
//正温度的话这个数码管就不要显示了
temp=(u16)(temp*6.25);
//精度的1000倍,我们将小数点另外叠加显示
if(temp&=10000)
smgWela[1]=1;
//第二个数码管显示1,是百位上,100度以上啊
smgWela[1]=
//百位上是0的话不要显示这个0
smgWela[2]=temp%;
//第三个数码管 十位
smgWela[3]=temp%;
//第四个数码管 个位叠加小数点
smgWela[4]=temp%100/10;
//第五个数码管
smgWela[5]=temp%10;
//第六个数码管
smgWela[6]=0xf7;
//第4个数码管叠加小数点
return smgW
//返回数组
#ifndef _51SMG_H_
#define _51SMG_H_
#include &reg52.h&
#include "mytype.h"
sbit dula =P2^6;
//段选锁存器控制
sbit wela =P2^7;
//位选锁存器控制
#define dark 0x11//在段中,0x11是第17号元素,0x00是低电平,数码管不亮,即table[17]
#define dotDark 0xff//小数点全暗
void displaySMG(u8* pWela); //数码管显示函数,参数是数组指针
#include "smg.h"
#include "my51.h"
static u8 code table[]= {
//0~F外加小数点和空输出的数码管编码
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40
// . 空 负号
空为第17号元素
由于此表只能一次显示一个小数点,故已注释掉,仅供查询
例如想要第一个和第六个数码管小数点同时点亮,
则执行 pWela-&dot = 0xfe & 0xdf
u8 code dotTable[]={
//小数点位置,某一位置0时,小数点亮
0xfe , 0xfd , 0xfb ,
0xf7 , 0xef , 0xdf
u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一个是小数点位置控制
//P0口的数码管位选控制锁存器只用了低6位,我们保留高2位的数据,留作它用
void displaySMG(u8* pWela)
//控制6位数码管显示函数,不显示的位用参数dark
u8 preState=P0|0x3f;
//保存高2位状态,其中最高位是ADC0804的片选信号
wela=0;dula=0;_nop_();//先锁定数据,防止吴亮及位选锁存器高2位数据被改变
//由于数码管是共阴极的,阳极送低电平,灯不亮
dula=1;_nop_();
//段选数据清空并锁定
//共阴极数码管是阴极置高不亮,低6位置1,高2位保留
wela=1;_nop_();
//注:wela和dula上电默认为1
//位选锁定,初始保留高2位的数据,低6位置高不亮
for(i=0;i&6;i++)
//显示6位数码管
P0=table[pWela[i]]|(((1&&i) & pWela[6])?0x00:0x80);
dula=1;_nop_();
//送段数据,叠加小数点的显示,0x00点亮小数点
P0=preState&~(1&&i); //不影响高2位数据,低6位是数码管位选,低电平有效
wela=1; _nop_();
//送位选号
delayms(1);
//稍作延时,让灯管亮起来
//消除叠影及误亮,阴极置1不亮,低6位置1,高2位保留并锁定
wela=1; _nop_();
#ifndef _MY51_H
#define _MY51_H
#include &reg52.h&
//#include &math.h&
#include &intrins.h&
#include "mytype.h"
#define high 1
#define low
#define led P1
//灯总线控制
sbit led0=P1^0;
//8个led灯,阴极送低电平点亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //led锁存的状态,0锁定 ,1不锁定
sbit beep=P2^3;
void delayms(u16 ms);
void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#include "MY51.h"
void delayms(u16 ms)
//毫秒级软延时函数
for(i=i&0;i--)
for(j=113;j&0;j--)
/****************************************************************
若使用12分频模式的mcu,晶振频率为Hz
则每个机器周期用时12/.085微秒
keil4编译,在默认的8级优化方式下
参数us=0时,函数执行9个机器周期,即t=9*1.085=9.77 us
参数us!=0时,函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085 us
*****************************************************************/
void delayXus(u8 us) //微秒级软延时函数
//这种写法有利于减小us=0时的机器周期
浏览 15588
楼主,你的 "mytype.h"&& 文件呢?
#ifndef&& _MYTYPE_H
#define&& _MYTYPE_H
/////////////////////////////////////////////
typedef float&&&&&&&&&&&&&&&&&&&&&&&&&&&& f32&& ;
typedef double
&&&&&&&&&&&&&&&&& d64& ;
typedef float& const&&&&&&&&&&&&&&&&&& fc32 ;
typedef double& const&&&&&&&&&&&&&& dc64& ;
typedef volatile float&&&&&&&&&&&&&&& vf32&& ;
typedef volatile double&&&&&&&&&&&& vd64& ;
//typedef volatile float&&&& const&& vfc32&& ;
//typedef volatile double& const&& vdc64& ;
//////////////////////////////////////////////
typedef signed long& s32;
typedef signed short s16;
typedef signed char&& s8;
typedef signed long& const sc32;& /* Read Only */
typedef signed short const sc16;& /* Read Only */
typedef signed char& const sc8;&& /* Read Only */
typedef volatile signed long& vs32;
typedef volatile signed short vs16;
typedef volatile signed char& vs8;
//typedef volatile signed long& const vsc32;& /* Read Only */
//typedef volatile signed short const vsc16;& /* Read Only */
//typedef volatile signed char& const vsc8;&& /* Read Only */
typedef unsigned long& u32;
typedef unsigned short u16;
typedef unsigned char& u8;
typedef unsigned long& const uc32;& /* Read Only */
typedef unsigned short const uc16;& /* Read Only */
typedef unsigned char& const uc8;&& /* Read Only */
typedef volatile unsigned long& vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char& vu8;
//typedef volatile unsigned long& const vuc32;& /* Read Only */
//typedef volatile unsigned short const vuc16;& /* Read Only */
//typedef volatile unsigned char& const vuc8;&& /* Read Only */
typedef enum {FALSE = 0, TRUE = !FALSE} BOOL;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITS
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalS
////////////////////////////////////////////////////////////////////////////////////////////
#define bool BOOL
#define false FALSE
#define true& TRUE
typedef enum {CLOSE = 0, OPEN = !CLOSE} OPEN_CLOSE;
typedef enum {GND = 0, VCC = !GND} GND_VCC;
typedef enum {NO = 0, YES = !NO} YES_NO;
typedef enum {STOP = 0, START = !STOP} START_STOP;
typedef enum {LOCK = 0, UNLOCK = !LOCK} LCOK_UNLOCK;
////////////////////////////////////////////////////////////////////////////////////////////
#define U8_MAX&&&& ((u8)255)
#define S8_MAX&&&& ((s8)127)
#define S8_MIN&&&& ((s8)-128)
#define U16_MAX&&& ((u16)65535u)
#define S16_MAX&&& ((s16)32767)
#define S16_MIN&&& ((s16)-32768)
#define U32_MAX&&& ((u32)uL)
#define S32_MAX&&& ((s32))
#define S32_MIN&&& ((s32)-)
xouou_53320
浏览: 416637 次
void T0_Work()
//T0定时器调用的工作函数
lastSeries 写道前辈,是不是在工作以后连System ...
前辈,是不是在工作以后连System.out.println( ...
chuanwang66 写道不过改了iconv.exe路径也不 ...
正在学习,多谢分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'ds18b20温度传感器仿真程序
温度传感器仿真程序。
ds18b20温度传感器仿真程序下载
下载资料需要,并消耗一定积分。
下载此资料的人还喜欢:
技术交流、我要发言! 发表评论可获取积分! 请遵守相关规定。
本月热点资料
电子资料热门词基于DS18B20的温度检测原理图和PCB图下载
[问题点数:0分]
本版专家分:0
结帖率 36.47%
CSDN今日推荐
匿名用户不能发表回复!|
CSDN今日推荐& 大家看看、我的DS18B20温度显示不正确。但是仿真无误!
管理员:?人数:2449小组积分:26291简介:欢迎志同道合的单片机爱好者加入讨论,分享技术资料。小组公告小组暂无公告.??|????|??
需要确认注册邮箱后才能下载,
楼主??[其他]?
大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:379分
总积分:758分
发表于 22:25
这是C程序,如果有问题那就是数码管显示问题。但是我用STC12C2052AD做出来,P3.2就是读不出DS18B20的温度值。仿真的PROTEUS如下:请大家看看,在硬件和软件方方面都有什么问题!谢谢大家了!
lovencj 编辑于 15:59
1楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:937分
总积分:1876分
发表于 22:39
我没有看你的东西,我建议你先测试下你的数码管,随便给你数,看看数码管显示对不对?再上ds18b20来试试。
2楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:379分
总积分:758分
发表于 12:17
源程序还是贴出来吧!大家看看我没问题。仿真无误,但用STC12C2052AD就出现错误,好像读不了DS18B20。#include "reg51.h"char disp[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};char disp_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};sbit DQ = P3^2;?? //定义通信端口 sbit one = P3^7;? //定义十位sbit two = P3^5;? //定义个位sbit three = P3^4;//定义小数位//晶振12MHz? void delay_18B20(unsigned int i){?while(i--);}//初始化函数Init_DS18B20(void) {? unsigned char x="0";? DQ = 1;????????? //DQ复位? delay_18B20(8);? //稍做延时? DQ = 0;????????? //单片机将DQ拉低? delay_18B20(80); //精确延时 大于 480us? DQ = 1;????????? //拉高总线? delay_18B20(14);? x="DQ";??????????? //稍做延时后 如果x=0则初始化成功 x="1则初始化失败"? delay_18B20(20);}//读一个字节? ReadOneChar(void){?unsigned char i="0";?unsigned char dat = 0;?for (i=8;i&0;i--)? {??? DQ = 0; // 给脉冲信号??? dat&&=1;??? DQ = 1; // 给脉冲信号??? if(DQ)??? dat|=0x80;??? delay_18B20(4);? }??return(dat);}//写一个字节? WriteOneChar(unsigned char dat){?unsigned char i="0";?for (i=8; i&0; i--)?{? DQ = 0;? DQ = dat&0x01;? delay_18B20(5);? DQ = 1;? dat&&=1;?}}//读取温度ReadTemperature(void){?unsigned char a="0";?unsigned char b="0";?unsigned int? t="0";??Init_DS18B20();?WriteOneChar(0xCC); // 跳过读序号列号的操作?WriteOneChar(0x44); // 启动温度转换?delay_18B20(100);?Init_DS18B20();?WriteOneChar(0xCC); //跳过读序号列号的操作?WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度?a=ReadOneChar();?b=ReadOneChar();???//传感器返回值除16得实际温度值?//为了得到2位小数位,先乘100,再除16,考虑整型数据长度,?//技巧处理后先乘25,再除4,除4用右移实现?t = (b*256+a)*25;??return( t && 2? );}main(){??u?while(1)?{??//温度测量频率没有必要太高,太高反而影响数码显示??//所以用计数器加以控制??if(counter-- == 0)??{???tmp = ReadTemperature(); ??????counter = 20;??}??one = 1;??P1 = disp[tmp/1000%10];//显示十位??delay_18B20(1000);??one = 0;??two = 1;??P1 = disp_dot[tmp/100%10];//显示带点个位??delay_18B20(1000);??two = 0;??three =1;??P1 = disp[tmp/10%10];//显示小数位??delay_18B20(1000);??three =0;??}}参考了网上的某位大大的程序,在此感谢!仿真是对的,见图:??
3楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:379分
总积分:758分
发表于 13:15
是啊、现在显示正确、但是它老显示12.7°C。
4楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:379分
总积分:758分
发表于 13:16
Who can help me?
5楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:123分
总积分:244分
发表于 15:05
虽然你的程序我还没看~不过我觉得可能是延时的问题啊~~我们知道18B20是一种单总线的芯片~所有指令的输入和输出都是靠延时来控制实现的~所以我推荐你对照着PDF,用示波器!检查每条延时是否符合芯片各个指令的要求!相信问题能解决!我有空帮你看看程序~~不过你先看看我说的这个是否正确~~~不行我们再聊~~QQ
6楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:44897分
总积分:89448分
发表于 15:22
7楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
总积分:108分
发表于 18:35
8楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:432分
总积分:862分
发表于 21:54
应该是延时问题!仿真和硬件还是有差距的! 我们最近也在做这个作业!
9楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:582分
总积分:1178分
发表于 00:08
10楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:169分
总积分:262分
发表于 11:25
11楼??[其他]?
Re:大家看看、我的DS18B20温度显示不正确。但是仿真无误!
6年会员勋章目前未领取。领取条件:?凡是注册时间六年以上的活跃用户即可领取该勋章。
积分:304分
总积分:608分
发表于 16:00
不回复也不让看哪
--- 现有 12个主题,共 1页,目前第 1页 ---??
点击,立即回复。
EDN China官方微信
扫一扫关注,获取电子新知,设计灵感
IC厂商小组
在线研讨会
赞助商链接
2016 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。

我要回帖

更多关于 单片机pid温度控制 的文章

 

随机推荐