完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
DS18B20介绍(转载)link
硬件电路 程序设计 #include "stm32f10x.h" #include "ds18b20.h" #define delay_us(X) delay((X)*72/5) void delay(unsigned int n) { while(n--); } void ds18b20_init_x(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); /* Configure Ports */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // void mode_input1(void ) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } void mode_output1(void ) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } // uint8_t ow_reset(void) //先复位 { uint8_t err; OW_DIR_OUT(); // pull OW-Pin low for 480us OW_OUT_LOW(); // disable internal pull-up (maybe on from parasite) //输出低电平 delay_us(400); //about 480us // set Pin as input - wait for clients to pull low OW_DIR_IN(); // input 输入引脚 delay_us(66); err = OW_GET_IN(); // no presence detect // nobody pulled to low, still high // after a delay the clients should release the line // and input-pin gets back to high due to pull-up-resistor delay_us(480-66); if( OW_GET_IN() == 0 ) // short circuit err = 1; return err; } uint8_t ow_bit_io( uint8_t b ) //低bit io { OW_DIR_OUT(); // drive bus low //输出 OW_OUT_LOW(); // 输入 delay_us(1); // Recovery-Time wuffwuff was 1 if ( b ) OW_DIR_IN(); // if bit is 1 set bus high (by ext. pull-up) //如果位为1,则设置总线高(通过外部上拉) #define OW_CONF_DELAYOFFSET 5 //OW配置延迟偏移量 delay_us(15-1-OW_CONF_DELAYOFFSET); if( OW_GET_IN() == 0 ) b = 0; // sample at end of read-timeslot //读取时序结束时的样本 delay_us(60-15); OW_DIR_IN(); return b; } uint8_t ow_byte_wr( uint8_t b ) //读取一个字节 { uint8_t i = 8, j; do { j = ow_bit_io( b & 1 ); //取最低位 (0xFF) b >>= 1; if( j ) b |= 0x80; //最高位进行置1. } while( --i ); return b; } // uint8_t ow_byte_rd( void ) { return ow_byte_wr( 0xFF ); } // unsigned int d***_read(void) { unsigned char th, tl; ow_reset(); //复位 ow_byte_wr(0xCC); //写入0xCC 跳过ROM操作指令 ow_byte_wr(0x44); //温度转换 ow_reset(); //复位 ow_byte_wr(0xCC); // 跳过ROM操作指令 ow_byte_wr(0xBE); // tl = ow_byte_wr(0xFF);//温度低位(低八位) th = ow_byte_wr(0xFF);//温度高位(高八位) return (th<<8)+tl;// 返回(拼接的高八位和低八位)整数,和小数 } /* 返回数值组成 b15-b11 符号位 b10-b4 整数位 b3-b0 小数(补码) 舍弃 主函数中返回值需要除以16.0 除以16是为了移除小数位(补码) 返回值除以16(2的四次方)等同于返回值<<4 除以16.0是为了进行浮点运算 */ main.c #include "led.h" #include "lcd.h" #include "usart.h" #include "dht11.h" #include "ds18b20.h" unsigned int dht11_Val,uiD***_Val; unsigned char ucled, ucSec1; unsigned char pucStr[21]; unsigned long ulTick_ms; void DHT_Proc(void); void DSB_Proc(void); int main(void) { SysTick_Config(72000); // 定时1ms(HCLK = 72MHz) LED_Init(); ucled=0; STM3210B_LCD_Init(); LCD_Clear(Blue); LCD_SetBackColor(Blue); LCD_SetTextColor(White); dht11_init(); ucled=0;//关闭所有LED ds18b20_init_x(); while(1) { LED_Disp(ucled); DHT_Proc(); DSB_Proc(); } } void DHT_Proc(void)//这里显示了dht11的温度为了做对比(湿度无所谓) { sprintf((char *)pucStr, " Humidity: %2d%%", dht11_Val>>24); LCD_DisplayStringLine(Line2, pucStr);//数据左移24位得到湿度数据高八位(整数位) sprintf((char *)pucStr, " DHTTem: %2dC", (dht11_Val>>8)&0xff); LCD_DisplayStringLine(Line4, pucStr);// &0xff的目的是为了只得到温度高八位数据(整数位) } void DSB_Proc(void) { sprintf((char *)pucStr, "DSBTem: %7.2fC", uiD***_Val/16.0);// /16.0是为了进行浮点运算, //(/16.0在整数中取小数部分) // uiD***_Val<<4; 等同于 uiD***_Val/16; //此处不能用,仅仅说明 LCD_DisplayStringLine(Line6, pucStr); } // SysTick中断处理程序 void SysTick_Handler(void) { ulTick_ms++; if(ulTick_ms%1500 == 0) //每1.5s读取一次 { dht11_Val = dht11_read(); uiD***_Val = d***_read(); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
569浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 18:05 , Processed in 1.717526 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号