18B20温度传感器用的比较多,最近公司搬迁,其他的传感器都还在包装里。本来想用F030nucleo板,忙糊涂了,SWD引脚接错了,不能下载程序,然后找到很久之前买的红牛板,接18B20传感器。图1所示:
18B20的引脚定义如图2所示:
直接进入正题,这款温度传感器是一根总线的连接方式,所以使用起来也比较方便。数据引脚需要一个上拉电阻4.7K。手头暂时都是贴片电阻,直插的只有2K的功率电阻,临时使用一下。 工作流程是:初始化,ROM操作指令,存储器操作指令,数据传输。其时序如图3,图4所示:
数据转换及读取主程序如下所示: - u8 DS18b20_read_byte(void) //读字节
- {
- u8 i;
- u8 data=0;
- for(i=0;i<8;i++)
- {
- data >>=1;
- GPIO_ConfigurationOUT();
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
- Delay_nms(15);
- GPIO_ConfigurationIN();
- Delay_nms(50);
- if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14))
- data=data|0x80;
- else
- data&=0x7f;
- Delay_nms(600);
-
- }
- return data;
-
- }
-
- void DS18b20_write_byte(u8 dat) //写字节
- {
- u8 i;
- u8 one_bit;
- for(i=0;i<8;i++)
- {
- one_bit = dat&0x01;
- dat = dat>>1;
- GPIO_ConfigurationOUT();
- GPIO_ResetBits(GPIOB,GPIO_Pin_14);
- Delay_nms(125);
- if(one_bit)
- {
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
- Delay_nms(300);
- }
- else
- {
- Delay_nms(300);
- GPIO_SetBits(GPIOB,GPIO_Pin_14);
- // GPIO_ResetBits(GPIOC,GPIO_Pin_13);
- }
- Delay_nms(80);
- }
- }
-
- u16 get_temperature(void) //得到温度数据
- {
- u8 a,b;
- u16 temp;
- DS18b20_reset();
- DS18b20_write_byte(0xCC);
- DS18b20_write_byte(0xBE);
-
- a = DS18b20_read_byte();
- b = DS18b20_read_byte();
- temp = (u16)b<<8 |a;
- return temp;
-
- }
- void temperature_convert(void)
- {
- DS18b20_reset();
- DS18b20_write_byte(0xCC);
- DS18b20_write_byte(0x44);
- }
- void init_18b20(void) //初始化
- {
- u16 temp;
- do
- {
- temperature_convert();
- Delay_ms(20000);
- temp = get_temperature();
- } while(temp==85);
- temperature_convert();
- }
-
- //u16 showdataT;
- void tem_process(void) //计算温度
- {
- u16 showdata;
- // u8 Tbuf[2];
- temperature_convert();
- Delay_nnms(0xAFFFF);
- Delay_nnms(0xAFFFF);
- showdata = get_temperature();
- showdataT = showdata*0.0625*10+0.5-10; //计算温度
- }
复制代码
本程序通过定时器定时200mS读一次温度,数据显示如图5所示:
27.1度符合室内温度,是用手按住,温度会上升,符合预期。 主程序部分根据芯片定义好要使用的引脚,main函数按照传统定义即可。
|