1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
蓝桥杯单片机CTD107 ds18b20
比赛时官方提供用驱动函数,但是不完整,需要修改相应的.c和.h文件, 第一步:修改单总线延时函数,只需要在延时函数中添加一行即可 void Delay_OneWire(unsigned int t) { t=t*12; //本行为添加 while(t--); } 第二步:修改.h文件,将#include "reg52.h"改为#include “common.h” 第三步:添加读取温度函数;uint16 read_temperature(); 读取温度分三步,1.启动温度转换,2.读取寄存器温度值,3.计算温度值 uint16 read_temperature() { uint16 HS,LS;//定义变量存储高八位和低八位 uint16 value;//温度值 Init_DS18B20();//初始化 Write_DS18B20(0xcc);//跳过ROM,因为只有一个DS18B20 Write_DS18B20(0x44);//启动温度转换 Delay_OneWire(200);//温度转换需要一定的数时间 Init_DS18B20();//初始化 Write_DS18B20(0xcc);//跳过ROM,因为只有一个DS18B20 Write_DS18B20(0xbe); LS=Read_DS18B20(); HS=Read_DS18B20(); value=(uint16)(((HS<<8)|LS)*0.0625); return value; } 以下为完整的.h文件 #ifndef _ONEWIRE_H #define _ONEWIRE_H **#include "common.h"//#include "reg52.h"** #define OW_SKIP_ROM 0xcc #define DS18B20_CONVERT 0x44 #define DS18B20_READ 0xbe //IC引脚定义 ***it DQ = P1^4; //函数声明 void Delay_OneWire(unsigned int t); void Write_DS18B20(unsigned char dat); bit Init_DS18B20(); unsigned char Read_DS18B20(); **uint16 read_temperature();** #endif 以下为完整的.c文件 #include "onewire.h" //单总线延时函数 void Delay_OneWire(unsigned int t) { t=t*12;//添加 while(t--); } //DS18B20芯片初始化 bit Init_DS18B20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } //通过单总线向DS18B20写一个字节 void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //从DS18B20读取一个字节 unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } uint16 read_temperature() { uint16 HS,LS;//定义变量存储高八位和低八位 uint16 value;//温度值 Init_DS18B20();//初始化 Write_DS18B20(0xcc);//跳过ROM,因为只有一个DS18B20 Write_DS18B20(0x44);//启动温度转换 Delay_OneWire(200);//温度转换需要一定的数时间 Init_DS18B20();//初始化 Write_DS18B20(0xcc);//跳过ROM,因为只有一个DS18B20 Write_DS18B20(0xbe); LS=Read_DS18B20(); HS=Read_DS18B20(); value=(uint16)(((HS<<8)|LS)*0.0625); return value; } |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9055 浏览 16 评论
4086 浏览 18 评论
1174浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 17:50 , Processed in 1.104318 second(s), Total 80, Slave 61 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号