| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- #include "ds18b20.h"
- #include "gd32f30x_libopt.h"
- #include "SysTick.h"
- #include "main.h"
- #define DS18B20_IO_IN() do { \
- gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_1); \
- }while(0);
- #define DS18B20_IO_OUT() do { \
- gpio_init(GPIOC,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_1); \
- gpio_bit_set(GPIOC,GPIO_PIN_1);\
- }while(0);
-
- //#define DS18B20_DQ_OUT PGout(11)
- //#define gpio_input_bit_get(GPIOC,GPIO_PIN_1) PGin(11)
- //复位DS18B20
- void DS18B20_Rst(void)
- {
- DS18B20_IO_OUT(); //SET PG11 OUTPUT
- gpio_bit_reset(GPIOC,GPIO_PIN_1); //拉低DQ
- DelayNus(750); //拉低750us
- gpio_bit_set(GPIOC,GPIO_PIN_1); //DQ=1
- DelayNus(15); //15US
- }
- uint8_t DS18B20_Check(void)
- {
- uint8_t retry=0;
- DS18B20_IO_IN(); //SET PG11 INPUT
- while (gpio_input_bit_get(GPIOC,GPIO_PIN_1) && retry<200)
- {
- retry++;
- DelayNus(1);
- };
- if(retry>=200)return 1;
- else retry=0;
- while (!gpio_input_bit_get(GPIOC,GPIO_PIN_1) && retry<240)
- {
- retry++;
- DelayNus(1);
- };
- if(retry>=240)return 1;
- return 0;
- }
- //从DS18B20读取一个位
- //返回值:1/0
- uint8_t DS18B20_Read_Bit(void)
- {
- uint8_t data;
- DS18B20_IO_OUT(); //SET PG11 OUTPUT
- gpio_bit_reset(GPIOC,GPIO_PIN_1);
- DelayNus(2);
- gpio_bit_set(GPIOC,GPIO_PIN_1);
- DS18B20_IO_IN(); //SET PG11 INPUT
- DelayNus(12);
- if(gpio_input_bit_get(GPIOC,GPIO_PIN_1))data=1;
- else data=0;
- DelayNus(50);
-
- return data;
- }
- //从DS18B20读取一个字节
- //返回值:读到的数据
- uint8_t DS18B20_Read_Byte(void)
- {
- uint8_t i,j,dat;
- dat=0;
- for (i=1;i<=8;i++)
- {
- j=DS18B20_Read_Bit();
- dat=(j<<7)|(dat>>1);
- }
- return dat;
- }
- //写一个字节到DS18B20
- //dat:要写入的字节
- void DS18B20_Write_Byte(uint8_t dat)
- {
- uint8_t j;
- uint8_t testb;
- DS18B20_IO_OUT(); //SET PG11 OUTPUT;
- for (j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if (testb)
- {
- gpio_bit_reset(GPIOC,GPIO_PIN_1); // Write 1
- DelayNus(2);
- gpio_bit_set(GPIOC,GPIO_PIN_1);
- DelayNus(60);
- }
- else
- {
- gpio_bit_reset(GPIOC,GPIO_PIN_1); // Write 0
- DelayNus(60);
- gpio_bit_set(GPIOC,GPIO_PIN_1);
- DelayNus(2);
- }
- }
- }
- //开始温度转换
- void DS18B20_Start(void)
- {
- DS18B20_Rst();
- DS18B20_Check();
- DS18B20_Write_Byte(0xcc); // skip rom
- DS18B20_Write_Byte(0x44); // convert
- }
-
- uint8_t DS18B20_Init(void)
- {
- gpio_init(GPIOC,GPIO_MODE_OUT_OD,GPIO_OSPEED_50MHZ,GPIO_PIN_1); //设置GPIO输出模式及速度 SDA
- gpio_bit_set(GPIOC,GPIO_PIN_1);
-
- DS18B20_Rst();
- return DS18B20_Check();
- }
- static uint8_t count = 0;
- short DS18B20_Get_Temp(void)
- {
- sts_data_t *sts_d = get_sts();
- uint8_t temp = 0;
- uint8_t TL=0,TH=0;
- short tem=-550;
- DS18B20_Start (); // ds1820 start convert
- DS18B20_Rst();
- if(DS18B20_Check())
- {
- count++;
- if(count == 3)
- {
- sts_d->m_data.temprature_flag = 0;
- count = 0;
- }
- return tem;
- }else
- {
- sts_d->m_data.temprature_flag = 1;
- }
- DS18B20_Write_Byte(0xcc); // skip rom
- DS18B20_Write_Byte(0xbe); // convert
- TL=DS18B20_Read_Byte(); // LSB
- TH=DS18B20_Read_Byte(); // MSB
-
- if(TH>7)
- {
- TH=~TH;
- TL=~TL;
- temp=0; //温度为负
- }else temp=1; //温度为正
- tem=TH; //获得高八位
- tem<<=8;
- tem+=TL; //获得底八位
- tem=(float)tem*0.625; //转换
- if(temp)return tem; //返回温度值
- else return -tem;
- }
-
|