完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我写的这段18B20的程序中,怎么也采集不到温度数值,可能是卡在初始化的while里了,感觉时序也没什么问题了,实在不知道什么原因,求大侠帮忙。
部分代码如下,(显示部分为1602的LCD,调试无误,不贴出来了) u8 Data; u16 temp; u8 value; float temperature; void delay_nus(unsigned long n) //经示波器验证,这个延时时间绝对精确 { unsigned long j; while (n--) {j=8; while (j--); } } void delay_nms(unsigned long n) //延时nms { while(n--) delay_nus(1100); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; //PC0到PC7表示LCD的DB0--DB7 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); } //18B20复位 void DS18b20_reset(void) { u8 DQ; GPIO_Configuration(); GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; delay_nus(10); GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ; delay_nus(500); //延时500us GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; //给18B20发出复位信号 delay_nus(45);//45us DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); //检测18B20发出的存在脉冲"0",判断复位是否成功 while(DQ!=0) { DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); } delay_nus(150); //延时150us GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; } //18B20写一字节 void write_byte(u8 val) { int i; u8 Data; GPIO_Configuration(); for (i=0; i<8; i++) { GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ; delay_nus(15); //延时15us Data = val & 0x01; //最低位保留 GPIO_Write(GPIOB,Data); delay_nus(45); //45us延时 val >>= 1; //右移一位 GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; } GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; } //18B20读一字节 u8 read_byte(void) { int i; u8 value=0; u8 DQ; GPIO_Configuration(); for (i=0; i<8; i++) { GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; delay_nus(2); //延时 2us value >>= 1; GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ; delay_nus(3); //3us GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; delay_nus(5); //5us DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0); if(DQ) value|=0x80; //若DQ为1则把数据1给value的最高位,然后value向右移 否则直接往右移 delay_nus(60); //60us } GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ; return(value); } //18B20启动温度转换 与 读取温度 u16 gettemperature(void) { u8 temp_data[2]; u16 temp; DS18b20_reset(); write_byte(0xCC); // 发Skip ROM命令 write_byte(0x44); // 发温度转换命令 delay_nms(2);//延时2ms write_byte(0xCC); // 发Skip ROM命令 write_byte(0xBE); //读RAM中9字节内容 temp_data[0]=read_byte(); //温度低8位 temp_data[1]=read_byte(); //温度高8位 temp=temp_data[1];//温度高字节 temp=temp<<8;//移到高8位中 temp=temp|temp_data[0];//16位温度值 temp=temp&0x07ff;//temp取后11位 temperature=temp*0.0625; //最终的温度数据 return temperature; } |
|
相关推荐
4个回答
|
|
直接用我们的代码吧!
|
|
|
|
我想自己尝试着写而已,你的代码是直接操作寄存器的,现在一时看起来有点吃力,我想到暑假的时候系统的学一下,现在做这个是完成一个任务。
|
|
|
|
还有你们那个DS18B20的程序,跟我之前一个板子的一模一样,怀疑你的程序被借用了。
|
|
|
|
其实我们的操作寄存器,也就是IO配置的时候需要修改.另外我们有寄存器版本的代码啊.可以参考.
我们代码不知道被多少地方借用呢,见怪不怪了. 本来就开源嘛,呵呵.只要借用者标明出处,就不错了. |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1592 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1531 浏览 1 评论
965 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
679 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1574 浏览 2 评论
1856浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
630浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
512浏览 3评论
522浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
495浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-17 21:21 , Processed in 0.870014 second(s), Total 86, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号