ds18b20对时序要求很高,所以一定要注意延时

下面是32单片机的程序

//复位DS18B20
void DS18B20_Rst(void)
{                 DS18B20_IO_OUT();     //SET PG11 OUTPUTDS18B20_DQ_OUT=0;     //拉低DQdelay_us(750);        //延时750usDS18B20_DQ_OUT=1;     //DQ=1 delay_us(15);       //15US
}//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
u8 DS18B20_Check(void)
{   u8 retry=0;DS18B20_IO_IN();    //SET PG11 INPUT     while (DS18B20_DQ_IN&&retry<200){retry++;delay_us(1);};    if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;      return 0;
}//从DS18B20读取一位
//返回1/0
u8 DS18B20_Read_Bit(void)
{u8 data;DS18B20_IO_OUT();  //SET PG11 OUTPUTDS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; DS18B20_IO_IN(); //SET PG11 INPUTdelay_us(12);if(DS18B20_DQ_IN)data=1;else data=0;  delay_us(50);           return data;
}//从DS18B20读取一个字节
u8 DS18B20_Read_Byte(void)
{        u8 i,j,dat;dat=0;for (i=1;i<=8;i++) {j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}                          return dat;
}//写一个字节到DS18B20
void DS18B20_Write_Byte(u8 dat)     {             u8 j;u8 testb;DS18B20_IO_OUT();   //SET PG11 OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT=0;   // Write 1delay_us(2);                            DS18B20_DQ_OUT=1;delay_us(60);             }else {DS18B20_DQ_OUT=0; // Write 0delay_us(60);             DS18B20_DQ_OUT=1;delay_us(2);                          }}
}//开始温度转换
void DS18B20_Start(void)
{                                          DS18B20_Rst();      DS18B20_Check();  DS18B20_Write_Byte(0xcc);  // skip romDS18B20_Write_Byte(0x44);    // convert
} //初始化DS18B20的DQ 同时检测DS18B20的存在
//返回1:不存在
//返回0:存在
u8 DS18B20_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_SetBits(GPIOC,GPIO_Pin_10);    //拉高DS18B20_Rst();return DS18B20_Check();
}  //从ds18b20得到温度值
//精度0.1C
short DS18B20_Get_Temp(void)
{u8 temp;u8 TL,TH;short tem;DS18B20_Start ();           // ds1820 start convertDS18B20_Rst();DS18B20_Check();    DS18B20_Write_Byte(0xcc);  // skip romDS18B20_Write_Byte(0xbe);    // convert      TL=DS18B20_Read_Byte();    // LSB TH=DS18B20_Read_Byte();     // MSB  USART_SendData(USART1, TL);delay_ms(10);USART_SendData(USART1, TH);if(TH>7){TH=~TH;TL=~TL; temp=0;                    //温度为负}else temp=1;                //温度为正        tem=TH;                  tem<<=8;    tem+=TL;                   tem=(float)tem*0.625;      if(temp)return tem;     else return -tem;
}

然后这里是51单片机的程序

这里我用的是12M晶振,延时程序如下

/*us延时,参数为1时约延时7us10时约延时50us100时约延时205us250时约延时480us
*/
void delay(uchar us) {while(us--);
}

然后下面就是对DQ信号线操作的程序

//复位ds18b20
void Init_ds18b20(void) {DQ = 1; delay(1); DQ = 0; delay(250); DQ = 1; delay(100);
}//读一个字节
uchar ReadoneByte() {uchar i;uchar dat = 0;for(i=8; i>0; i--) {DQ = 0;_nop_();dat >>= 1;DQ = 1;delay(1);if(DQ) dat |= 0x80;delay(10);}return dat;
}//写一个字节
void WriteoneByte(uchar dat) {uchar i;for(i=8; i>0; i--) {DQ = 0;_nop_();DQ = dat & 0x01;delay(10);DQ = 1;dat >>= 1;delay(1);}
}//获取温度值
int GetTempe() {int temp;uchar teml, temh;Init_ds18b20();WriteoneByte(0xcc);WriteoneByte(0x44);Init_ds18b20();WriteoneByte(0xcc);WriteoneByte(0xbe);teml = ReadoneByte();//先读低四位temh = ReadoneByte();//再读高四位temp = teml/16+temh*16;//这里只保留了整数,去掉了小数//temp <<= 8;//temp += teml;//t = temp * 0.625;return temp;
}

单片机的ds18b20程序相关推荐

  1. 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序

    原标题:AVR单片机控制DS18B20的示例C程序 #include #include #include #include unsigned char data_H, data_L,wendu; un ...

  2. 18b20温度检测及其lcd显示_单片机使用DS18B20测量温度的程序

    \ 单片机使用DS18B20测量温度的程序 //main.c #include #include #include "18B20.h" #include"disp.h&q ...

  3. 51单片机温度传感器DS18B20

    51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...

  4. K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示

    K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...

  5. 基于51单片机的DS18B20温度控制加热降温系统设计

    基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...

  6. 给单片机焼写程序需要什么东西_单片机怎么烧写程序

    1.单片机怎么烧写程序 STC系列单片机为例:首先,需要安装keil软件和STC_ISP程序下载软件.先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给 ...

  7. c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解

    描述 ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号.但是此电压信号必须转换成8.10 .12位或更高位数的数字才能进一步做计算.另外转换成位数多少表明 ...

  8. c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt

    第3章节单片机c51语言程序的设计基本 第3章 单片机C51语言程序设计基础 3.1 语句与流程控制 3.2 函数 3.3 本章小结 3.4 实训三 简易十字路口交通信号灯控制 教学提示 教学要求 3 ...

  9. 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;

    跪求,8255控制数码管,单片机c语言程序: 答案:3  信息版本:手机版 解决时间 2021-04-29 04:56 已解决 2021-04-28 12:39 8255 PA口--数码管的段选,82 ...

最新文章

  1. 开源软件License汇总
  2. python输出结果空格分割_python 输出列表元素实例(以空格/逗号为分隔符)
  3. mysql从某表中查询数据插入到另一表的处理
  4. PAT甲级1067 Sort with Swap(0, i):[C++题解]此题不是很懂!!
  5. 学python需要记笔记吗_自学python需要做什么笔记
  6. PHP爬虫音乐,PHPCrawl爬虫库实现抓取酷狗歌单
  7. 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
  8. windows搭建python开发环境方法_04 Windows下搭建 Python 开发环境 - Python 入门教程
  9. Appium python自动化测试系列之Capability介绍(五)
  10. python列表数据写入txt文件_Python将列表数据写入文件(txt, csv,excel)
  11. linux服务器家目录,linux服务器根目录空间不足
  12. 原来大家最拼命的时候是这样子的。
  13. 随机森林oob_score及oob判断特征重要性
  14. 云计算技术优势和商业优势是什么,主要有哪些特点?
  15. PaaS简介及国内PaaS平台
  16. ubuntu与centos哪个更适合做服务器。
  17. 微信小程序 # 高仿解忧杂货店小程序首页
  18. 数据结构ADT是什么
  19. spyder(anaconda3)进行汉化
  20. 蓝桥ROS机器人课程总结2022

热门文章

  1. Blockchain.com CEO:投资者获利颇丰,以太坊「杀手」们水平有限
  2. MT6169芯片资料,MT6169射频应用笔记及布局指南
  3. 油液磨粒监测设计方案
  4. 各大世界名牌大学课件下载地址
  5. c++解鸡兔同笼(3)
  6. 如何锁定计算机密码,如何设置电脑密码锁详细方法
  7. SpreadJS + GcExcel 一出,谁与争锋 全栈表格技术轻松应对复杂公式计算场景(一)
  8. 设计模式应用有感总结
  9. 游戏背景音乐的种类—主题曲
  10. Spark Standalone和yarn区别