完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的代码:#include "ds18b20.h" #include "delay.h" void DS18B20_Rst(void) { DS18B20_IO_OUT(); // DS18B20_DQ_OUT=0; / delay_us(750); / DS18B20_DQ_OUT=1; //DQ=1 delay_us(60); //15US } 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; } u8 DS18B20_Read_Bit(void) // read one bit { u8 data; DS18B20_IO_OUT();//SET PG11 OUTPUT DS18B20_DQ_OUT=0; delay_us(2); DS18B20_DQ_OUT=1; DS18B20_IO_IN();//SET PG11 INPUT delay_us(12); if(DS18B20_DQ_IN)data=1; else data=0; delay_us(60); return data; } u8 DS18B20_Read_Byte(void) // read one byte { u8 i,j,dat; dat=0; for (i=1;i<=8;i++) { j=DS18B20_Read_Bit(); dat=(j<<7)|(dat>>1); } return dat; } 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 1 delay_us(2); DS18B20_DQ_OUT=1; delay_us(60); } else { DS18B20_DQ_OUT=0;// Write 0 delay_us(60); DS18B20_DQ_OUT=1; delay_us(2); } } } void DS18B20_Start(void)// ds1820 start convert { DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc);// skip rom DS18B20_Write_Byte(0x44);// convert } u8 DS18B20_Init(void) { DS18B20_Rst(); return DS18B20_Check(); } short ReadTemperature(void) { u8 temp; u8 TL,TH; short tem; DS18B20_Start (); // ds1820 start convert DS18B20_Rst(); DS18B20_Check(); DS18B20_Write_Byte(0xcc); DS18B20_Write_Byte(0xbe); TL=DS18B20_Read_Byte(); // LSB TH=DS18B20_Read_Byte(); if(TH>7) { TH=~TH; TL=~TL; temp=0; }else temp=1; tem=TH; tem<<=8; tem+=TL; tem=(double)tem*0.625; if(temp)return tem; else return -tem; } LCD1602: #include "lcd1602.h" #include "delay.h" #include "sys.h" u8 Dao_xu(u8 data) { u8 i = 0 ,temp = 0; for(i = 0; i < 8; i++) { temp += (((data >> i) & 0x01) << (7 - i)); } return temp; } /*------------------------------------------------ ------------------------------------------------*/ void LCD_Write_Com(unsigned char com) { LCD1602_RS=0; // delay_us(1); LCD1602_RW=0; delay_us(1); LCD1602_EN=1; delay_us(1); GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(com)); delay_us(100); LCD1602_EN=0; } /*------------------------------------------------ ------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) { LCD1602_RS=1; delay_us(1); LCD1602_RW=0; delay_us(1); LCD1602_EN=1; delay_us(1); GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(Data)); delay_us(100); LCD1602_EN=0; } /*------------------------------------------------ ------------------------------------------------*/ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } while (*s) { LCD_Write_Data( *s); s ++; // } } /*------------------------------------------------ ------------------------------------------------*/ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } /*------------------------------------------------ ------------------------------------------------*/ void LCD_Clear(void) { LCD_Write_Com(0x01); delay_ms(5); } /*------------------------------------------------*/ void LCD_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|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; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //³õʼ»¯GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_10; // LCD1602 RS-RW-EN GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //GPIOB LCD_Write_Com(0x38); delay_ms(5); LCD_Write_Com(0x38); delay_ms(5); LCD_Write_Com(0x38); delay_ms(5); LCD_Write_Com(0x08); delay_ms(5); LCD_Write_Com(0x01); delay_ms(5); LCD_Write_Com(0x06); delay_ms(5); LCD_Write_Com(0x0C); delay_ms(5); } main调用: temperature=ReadTemperature();// LCD_Write_Char(5,0,temperature/100);// LCD_Write_Char(6,0,temperature%100/10); 仿真的结果: 查了一下说是DS18B20对时序要求很严格,检查了一下没发现问题。 |
|
相关推荐
1个回答
|
|
上拉电阻接了么
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
884 浏览 1 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1429 浏览 2 评论
1748 浏览 3 评论
1348 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1476 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-22 15:51 , Processed in 0.552293 second(s), Total 44, Slave 37 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号