#include<stdio.h>
#include "DS18b20.h"
#include "customdef.h"
#include "lcd1602.h"
#define MAXNUM 4 //定义最多有4个 DS18B20
void DS18B20_delayms(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*
void DS18B20_delayus(unsigned int us)
{
while(--us);
}
*/
/**初始化DS18B20**/
bit InitDS18B20ACK(){
bit ACK;//用来判断DS18B20是否初始化成功
EA = 0;
DS18B20_IO = 0;
DS18B20_delayms(1);
DS18B20_IO = 1;
DS18B20_delayms(1);
DS18B20_IO = 0;
DS18B20_delayms(1);
ACK = DS18B20_IO;
DS18B20_IO = 1;
DS18B20_delayms(1);
while(!DS18B20_IO);//等待脉冲结束
EA = 1;
return ACK;
}
/**向DS18B20写入一个字节的数据**/
void writeToDs18b20(uchar dat){
uchar mask;
EA = 0;//关闭总中断开关
for(mask = 0x01; mask != 0; mask <<= 1){
DS18B20_IO = 0;
_nop_();
_nop_();
if((mask & dat) == 0){
DS18B20_IO = 0;
}else{
DS18B20_IO = 1;
}
delay_10us(6);
DS18B20_IO = 1;
}
EA = 1;//开启中断
}
/**向DS18B20读取一个字节的数据**/
uchar readeToDs18b20(){
uchar readData;
uchar mask;
EA = 0;
for(mask = 0x01; mask !=0; mask <<= 1){
DS18B20_IO = 0;
_nop_();
_nop_();
DS18B20_IO = 1;
_nop_();
_nop_();
if(!DS18B20_IO){
readData &= ~mask;//读取0
}else{
readData |= mask;//读取1
}
DS18B20_delayms(1);
//delay_10us(6);
}
EA = 1;
return readData;
}
/**启动DS18B20进行温度的采集以及转换,并返回读取成功与否**/
bit startDs18b20(){
bit ACK;
ACK = InitDS18B20ACK();//总线初始化是否完成
if(ACK == 0){
writeToDs18b20(0xcc);//跳过ROM的验证操作
writeToDs18b20(0x44);//启动温度的转换
//DS18B20_delayms(500); //上电转换需要延时足够长时间,否则会读出默认值85 会造成main里面后续任务一直等待,改为通过变量控制。
}
return ACK;//ACK == 0 启动成功,1就不成功
}
/**读取DS18B20中的温度转换,并返回读取成功与否,而已还需要吧温度回去**/
bit getTempForDs18b20(int *temp){
bit ACK;
uchar MSB,LSB;
ACK = InitDS18B20ACK();
if(ACK == 0){
writeToDs18b20(0xcc);//跳过ROM的验证操作
writeToDs18b20(0xbe);//发送一个读取的命令
DS18B20_delayms(5);
LSB = readeToDs18b20();
MSB = readeToDs18b20();
*temp = ((int)MSB << 8) + LSB;
}
return ACK;
}
/*************************************************************************************************************************
*函数 : s16 DS18B20_ReadDesignateTemper(u8 pID[8])
*功能 : 读取指定ID的DS18B20温度
*参数 : pID:DS18B20 ID,必须事先知道,如果不知道请启动ROM搜索
*返回 : 温度值
*依赖 : 底层宏定义
*作者 : cp1300@139.com
*时间 : 2013-04-17
*最后修改时间 : 2013-04-17
*说明 : 温度值扩大了100倍,温度值是个有符号数.
*************************************************************************************************************************/
int DS18B20_ReadDesignateTemper(u8 pID[8])
{
bit ACK;
uchar MSB,LSB;
int retdata;
int temp;
ACK = InitDS18B20ACK();
if(ACK == 0)
{
writeToDs18b20(0x55); //发送序列号匹配命令
for(retdata = 0;retdata < 8;retdata ++) //发送8byte的序列号
{
writeToDs18b20(pID[retdata]);
}
DS18B20_delayms(1);
//writeToDs18b20(0xcc);//跳过ROM的验证操作
writeToDs18b20(0xbe);//发送一个读取的命令
DS18B20_delayms(5);
LSB = readeToDs18b20();
MSB = readeToDs18b20();
temp = ((int)MSB << 8) + LSB;
temp *=6.25;
}
return temp;
}
/**us延时函数**/
void delay_10us(uchar count){
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(count--);
}
/**整形转换成字符类型,参数:传入你要转换的数据,返回字符串的长度**/
uchar IntToString(uchar *str,int changeDat){
uchar len_str = 0,i = 0;//记录字符串的长度
uchar temp_buf[6];
if(changeDat < 0){
changeDat = -changeDat;//赋值为负数
*str++ = '-';
len_str++;
}
do{
temp_buf[i++] = changeDat % 10;
changeDat /= 10;
}while(changeDat > 0);
len_str = len_str + i;//得到最新的长度
while(i--){
*str++ = temp_buf[i] + '0';//对于转换成字符串
}
*str = '\0';//字符串接收标志位的添加
return len_str;
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
SCON = 0x50; //配置串口为模式 1
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x20; //配置 T1 为模式 2
TH1 = 256 - (11059200/12/32)/baud; //计算 T1 重载值
TL1 = TH1; //初值等于重载值
ET1 = 0; //禁止 T1 中断
ES = 1; //使能串口中断
TR1 = 1; //启动 T1
}
/**串口数据提交**/
void TXD_Dat(uchar dat){
SBUF = dat;
while(!TI);
TI = 0;
}
/*************************************************************************************************************************
*函数 : __inline void DS18B20_WriteBit(u8 bit)
*功能 : 向DS18B20写一位数据
*参数 : 数据,只发送最低位
*返回 : 无
*************************************************************************************************************************/
void DS18B20_WriteBit(uchar mydata)
{
DS18B20_IO = 0;
_nop_();
_nop_();
if((0x01 & mydata) == 0){
DS18B20_IO = 0;
}else{
DS18B20_IO = 1;
}
delay_10us(6);
DS18B20_IO = 1;
}
uchar DS18B20_ReadBit(void)
{
uchar retdata = 0;
DS18B20_IO = 0;
_nop_();
_nop_();
DS18B20_IO = 1;
_nop_();
_nop_();
if(DS18B20_IO) //读取数据,读取后大约延时40-45us
retdata = 0x01;
//delay_10us(4);
delay_10us(4);
return retdata;
}
/* _nop_();
_nop_();
DS18B20_IO = 1;
_nop_();
_nop_();
if(!DS18B20_IO){
readData &= ~mask;//读取0
}else{
readData |= mask;//读取1
}
DS18B20_delayms(1);
*/
/*************************************************************************************************************************
*函数 : __inline u8 DS18B20_Read2Bit(void)
*功能 : 读取DS18B20 2bit数据
*参数 : 无
*返回 : 数据
*************************************************************************************************************************/
uchar DS18B20_Read2Bit(void)
{
uchar i,retdata = 0;
for(i = 0;i < 2;i ++)
{
retdata <<= 1;
if(DS18B20_ReadBit())
retdata |= 1;
}
return retdata;
}
/*************************************************************************************************************************
*函数 : u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
*功能 : 搜索DS18B20 ROM
*参数 : pID:DS18B20 ID缓冲区指针
Num:DS18B20数目,必须事先知道
*返回 : 搜索到的DS18B20数目
*说明 : 程序必须事先知道DS18B20数目,搜索的数目只会小于这个数目
代码移植于互联网
*************************************************************************************************************************/
u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
{
unsigned char k,l,chongtuwei,m,n;
unsigned char zhan[(MAXNUM)]= {0x00 }; //一定要初始化为0,否则会概率性搜错
unsigned char ss[64];
bit ACK;
uchar MSB,LSB;
uchar dis1111[16];
u8 num = 0;
l=0;
chongtuwei=0;
do
{
ACK = InitDS18B20ACK();
writeToDs18b20(0xf0);//搜索rom
//DS18B20_WriteData(0xf0);
for(m=0;m<8;m++)
{
unsigned char s=0;
for(n=0;n<8;n++)
{
k=DS18B20_Read2Bit();//读两位数据
k=k&0x03;
s>>=1;
if(k==0x01)//01读到�
没有合适的资源?快使用搜索试试~ 我知道了~
51单片机采集多路ds18b20温度
共61个文件
lst:11个
obj:9个
c:8个
需积分: 5 4 下载量 49 浏览量
2024-01-31
15:21:18
上传
评论 2
收藏 149.88MB ZIP 举报
温馨提示
51单片机采集多路ds18b20温度
资源推荐
资源详情
资源评论
收起资源包目录
多路ds18b20温度采集.zip (61个子文件)
多路ds18b20温度采集
keilkilll.bat 399B
User
customdef.h 576B
main.c 3KB
keil5_c51v954a.zip 74.84MB
App
DS18B20
DS18B20.c 9KB
DS18b20.h 2KB
Lcd1602
lcd1602.c 5KB
lcd1602.h 981B
LED
led.h 415B
led.c 567B
KEY
key.c 499B
key.h 231B
ADC0832
ADC0832.c 2KB
ADC0832.h 895B
MOTOR_BISTEPPER
motor_b.c 925B
motor_b.h 255B
Delay
delay.h 656B
delay.c 744B
Objects
多路ds18b20温度采集.build_log.htm 2KB
微景观.hex 11KB
微景观 43KB
多路ds18b20温度采集.lnp 279B
多路ds18b20温度采集.hex 18KB
motor_b.obj 3KB
微景观.build_log.htm 2KB
delay.obj 1KB
智能花盆.build_log.htm 2KB
智能花盆.lnp 257B
微景观.lnp 253B
STARTUP.obj 819B
智能花盆.hex 18KB
多路ds18b20温度采集 54KB
DS18B20.obj 22KB
智能花盆 54KB
lcd1602.obj 10KB
ADC0832.obj 4KB
main.obj 13KB
key.obj 2KB
AT24C02.obj 8KB
STARTUP.A51 6KB
Libraries
DebugConfig
Target_1_STM32F103ZE.dbgconf 7KB
Obj
Objects
Listings
DS18B20.lst 17KB
微景观.m51 43KB
多路ds18b20温度采集.m51 50KB
delay.lst 2KB
main.lst 6KB
AT24C02.lst 4KB
ADC0832.lst 4KB
key.lst 2KB
超声波测距.m51 53KB
motor_b.lst 3KB
智能花盆.m51 50KB
智能晾衣架.m51 24KB
STARTUP.lst 14KB
lcd1602.lst 10KB
DHT11.lst 5KB
led.lst 2KB
多路温度采集.uvgui.Administrator 69KB
多路温度采集.uvopt 9KB
多路温度采集.uvproj 16KB
keil5_c51v954a
c51v954a.exe 76.9MB
共 61 条
- 1
资源评论
流浪法师解剖鱼
- 粉丝: 150
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 安卓与STM32硬件开发项目,实现安卓端控制家庭灯,窗帘,门.zip
- java-leetcode题解之第972题最接近原点的K个点.zip
- java-leetcode题解之第347题前K个高频元素.zip
- java-leetcode题解之第215题数组中的第K个最大元素.zip
- java-leetcode题解之第641题设计循环双端队列.zip
- java-leetcode题解之第1284题转化为全零矩阵的最少反转次数.zip
- java-leetcode题解之第1311获取已观看视频.zip
- java-leetcode题解之第621题任务调度器.zip
- java-leetcode题解之第622题设计循环队列.zip
- java-leetcode题解之第51题N皇后.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功