博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ds18b20触摸没反应_求助DS18B20读不出正确的数据
阅读量:1535 次
发布时间:2019-04-21

本文共 3108 字,大约阅读时间需要 10 分钟。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

先贴上DS18B20的驱动,这个我是照着书抄的,可以确定没抄错,因为是初学所以想先用现成的。

下面的程序是DS18B20.c里的代码,是用来驱动18B20的。我的工程包含多个文件。

#include

#define uchar unsigned char

#define uint unsigned int

sbit DQ = P1^0; //DS18B20的DQ脚

void Delay(int num)

{

for (;num>0;num--);

}

void Init_DS18B20(void) //初始化18B20

{

unsigned char x=0;

DQ = 1;

Delay(8);

DQ = 0;

Delay(80);

DQ = 1;

Delay(14);

x=DQ;

Delay(20);

}

/******************************************************************************/

unsigned char ReadOneChar(void) //从18B20读取一个字节

{

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(4);

}

return(dat);

}

/******************************************************************************/

void WriteOneChar(unsigned char dat) 向18B20写入一个字节

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

Delay(5);

DQ = 1;

dat>>=1;

}

}

/******************************************************************************/

unsigned int ReadTemperature(void) //读取温度

{

unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0x44);

Init_DS18B20();

WriteOneChar(0xCC);

WriteOneChar(0xBE);

a=ReadOneChar();

b=ReadOneChar();

t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

t= tt*10+0.5;

return(t);

}

uchar printTemperature(void)

{

unsigned int i=0;

unsigned char a=0,b=0,c=0;

i=ReadTemperature();

a=i/100;

b=i/10-a*10;

i = a*10 + b;

return i;

}

下面的程序是main.c里的:

#include

#include

#define uint unsigned int

#define uchar unsigned char

extern void Init_UART(void);

extern void UART_T_CHAR(uchar);

extern void UART_T_STRING(uchar *);

extern unsigned int ReadTemperature(void);

extern uchar printTemperature(void);

uchar code string[]="Current Temperature Is:";

void delayms(uint t)

{

uint i,j;

for(i=t;i>0;i--)

for(j=100;j>0;j--);

}

void Init_MCU()

{

EX0=1;

EA=1;

}

void main()

{

uint tempr; //用于存储当前温度

uchar temp_char[3]="000"; //存储当前温度的字符数组

Init_MCU();

Init_UART();

while(1)

{

tempr=ReadTemperature();

/*tempr=tempr/10;

temp_char[1]=tempr%10+*0*;

temp_char[0]=(tempr-tempr%10)/10+*0*;

temp_char[2]=*\0*;*/ //以上4行是将数值型温度数据转换为对应的字符数组,因为现在在测试

UART_T_STRING(string); //这个程序,暂未使用

//UART_T_STRING(temp_char); //此语句也暂未使用

TI=1; //从此行起到TI=0;是为了测试DS18B20的驱动是否工作正常而临时加入的

printf("%d\n",tempr); //用printf函数将tempr的数值发送到上位机,如果DS18B20驱动正常,ze

while(!TI); //上位机可收到数值,给18B20加温,数值会变化。

TI=0;

delayms(5000);

}

}

void ISP_Download() interrupt 0 //该中断子程序通过使用外中断0,在INT0脚对地短接时将软复位MCU

{ //从而实现不冷启动也能下载程序

IAP_CONTR=0x60;

}

下面的程序是UART.c里的,用来驱动串口,向上位机发送温度数据,实测以下的代码没有问题

#include

#include

#define uint unsigned int

#define uchar unsigned char

void Init_UART(void)//初始化串口,12MHZ晶体,9600bps,使用定时器T1,8位自动重装模式,串口模式1.

{

PCON &= 0x7F;

SCON = 0x50;

AUXR |= 0x40;

AUXR &= 0xFE;

TMOD &= 0x0F;

TMOD |= 0x20;

TL1 = 0xD9;

TH1 = 0xD9;

ET1 = 0;

TR1 = 1;

}

void UART_T_CHAR(uchar T_c)//该子程序实现通过串口向上位机发送一个字符的功能

{

SBUF=T_c;

while(!TI);

TI=0;

}

void UART_T_STRING(uchar *string)//该子程序实现通过串口向上位机发送字符串的功能。

{

TI=1;

puts(string);

while(!TI);

TI=0;

}

程序就是以上了,因为现在处于测试18B20驱动是否正常的阶段,一些代码是临时加上去的,为了测试之用。

问题就是,串口助手收到的数值是-24577,而且不随温度变化,弄了一天,还是不知道怎么回事,我甚至都以为自己买成三极管了。希望各路大神帮忙看一下。

顺便手画一下DS18B20与单片机的连接

转载地址:http://xwtdy.baihongyu.com/

你可能感兴趣的文章
C++核心准则C.51:使用委托构造函数实现所有构造函数的共通动作
查看>>
C++核心准则C.52:合理使用继承的构造函数
查看>>
Python:Flask部署Nginx、gunicorn、gevent、flask、supervisor
查看>>
2020年新闻联播大盘点,我用Python带你回顾一下
查看>>
2021年必备的11款VS Code主题
查看>>
Python爬虫快速入门解析
查看>>
2020 HackerOne黑客报告:白帽收入最高竟是普通程序员的40倍
查看>>
Python网络爬虫入门篇---我爷爷都能看懂
查看>>
使用Scrapy网络爬虫框架小试牛刀,你学会了吗?
查看>>
Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程
查看>>
战火再起!字节跳动称腾讯封禁飞书系列产品
查看>>
三分钟从入门到精通---Python模块
查看>>
Eclipse 官宣,干掉 VS Code !
查看>>
5 年 Python ,总结的 10 条 Python 使用技巧
查看>>
还没抢到票?试下这个用 Python 写的最新抢票神器
查看>>
形象解释 Python 新手最容易犯的错误
查看>>
DIV元素响应键盘事件
查看>>
position:fixed 与IE中窗口定位
查看>>
IE 与 FF冲突与不同支持点汇总
查看>>
javascript代码这样写,美得像诗一样!
查看>>