单片机的ds18b20程序
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程序相关推荐
- 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序
原标题:AVR单片机控制DS18B20的示例C程序 #include #include #include #include unsigned char data_H, data_L,wendu; un ...
- 18b20温度检测及其lcd显示_单片机使用DS18B20测量温度的程序
\ 单片机使用DS18B20测量温度的程序 //main.c #include #include #include "18B20.h" #include"disp.h&q ...
- 51单片机温度传感器DS18B20
51单片机温度传感器DS18B20 实现功能 插上DS18B20温度传感器,数码管显示检测的温度值 单片机型号:STC89C52 DS18B20介绍 1.DS18B20简介 DS18B20 是由 DA ...
- K_A11_002 基于STM32等单片机驱动DS18B20串口与OLED0.96双显示
K_A11_002 基于STM32等单片机驱动DS18B20 串口与OLED0.96双显示 一.资源说明 二.基本参数 1.参数 2.引脚说明 三.驱动说明 时序 对应程序: 四.部分代码说明 1.接 ...
- 基于51单片机的DS18B20温度控制加热降温系统设计
基于51单片机的DS18B20温度控制加热降温系统设计 1 开发环境 2 功能说明介绍 3 仿真图 4 程序 5 原理图 6 视频讲解 7 设计报告 7.1 设计目的 7.2 概述 7.3 国内外研究 ...
- 给单片机焼写程序需要什么东西_单片机怎么烧写程序
1.单片机怎么烧写程序 STC系列单片机为例:首先,需要安装keil软件和STC_ISP程序下载软件.先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给 ...
- c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解
描述 ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号.但是此电压信号必须转换成8.10 .12位或更高位数的数字才能进一步做计算.另外转换成位数多少表明 ...
- c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt
第3章节单片机c51语言程序的设计基本 第3章 单片机C51语言程序设计基础 3.1 语句与流程控制 3.2 函数 3.3 本章小结 3.4 实训三 简易十字路口交通信号灯控制 教学提示 教学要求 3 ...
- 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;
跪求,8255控制数码管,单片机c语言程序: 答案:3 信息版本:手机版 解决时间 2021-04-29 04:56 已解决 2021-04-28 12:39 8255 PA口--数码管的段选,82 ...
最新文章
- 开源软件License汇总
- python输出结果空格分割_python 输出列表元素实例(以空格/逗号为分隔符)
- mysql从某表中查询数据插入到另一表的处理
- PAT甲级1067 Sort with Swap(0, i):[C++题解]此题不是很懂!!
- 学python需要记笔记吗_自学python需要做什么笔记
- PHP爬虫音乐,PHPCrawl爬虫库实现抓取酷狗歌单
- 孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项
- windows搭建python开发环境方法_04 Windows下搭建 Python 开发环境 - Python 入门教程
- Appium python自动化测试系列之Capability介绍(五)
- python列表数据写入txt文件_Python将列表数据写入文件(txt, csv,excel)
- linux服务器家目录,linux服务器根目录空间不足
- 原来大家最拼命的时候是这样子的。
- 随机森林oob_score及oob判断特征重要性
- 云计算技术优势和商业优势是什么,主要有哪些特点?
- PaaS简介及国内PaaS平台
- ubuntu与centos哪个更适合做服务器。
- 微信小程序 # 高仿解忧杂货店小程序首页
- 数据结构ADT是什么
- spyder(anaconda3)进行汉化
- 蓝桥ROS机器人课程总结2022