新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2016-5-13
- 在线时间
- 12 小时
|
1金钱
void GPIOC11_IN()//设置PC11输入状态
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void GPIOC11_OUT()//设置PC11输出状态
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_DeInit(GPIOC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void DS18B20_Start()
{
GPIOC11_OUT();
GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉至低电平
delay_us(500);
GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
GPIOC11_IN();
delay_us(65);
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11))
USART_SendData(USART1,0X39);//DS18B20没有响应
else
while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11));//等待响应结束
GPIOC11_OUT();
GPIO_SetBits(GPIOC,GPIO_Pin_11);//拉至低电平
}
void DS18B20_Write(u8 k)
{
u8 i,temp;
GPIOC11_OUT();
for(i=0;i<8;i++)
{
temp = k&0x01;
k = k>>1;
GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉为低电平
delay_us(2);
if(temp == 0x01)
GPIO_SetBits(GPIOC,GPIO_Pin_11);
delay_us(60);
GPIO_SetBits(GPIOC,GPIO_Pin_11);
delay_us(5);
}
}
u8 DS18B20_Read()
{
u8 i,k,temp;
k = 0;
for(i=0;i<8;i++)
{
GPIOC11_OUT();
GPIO_ResetBits(GPIOC,GPIO_Pin_11);//拉为低电平
delay_us(2);
GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
GPIOC11_IN();
delay_us(5);
temp = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11);
k = k+(temp<<7);
if(i != 7)
k = k>>1;
delay_us(60);
GPIOC11_OUT();
GPIO_SetBits(GPIOC,GPIO_Pin_11);//释放总线
}
return k;
}
int main()
{
u8 a,b,c;
u8 t1,t2,d1,d2,d3;
u16 t;
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
USART_Configuration();
SysTick_Configuration();
while(1)
{
delay_us(1000000);
DS18B20_Start();
DS18B20_Write(0xcc);//跳过ROM
DS18B20_Write(0x44);//温度变换
delay_us(1000000);//延时1s
DS18B20_Start();
DS18B20_Write(0xcc);//跳过ROM
DS18B20_Write(0xbe);//读暂存器
t1 = DS18B20_Read();//LSB
t2 = DS18B20_Read();//MSB
t = t2;
t = (t<<8)|t1;
if(t&0x8000==0x8000)
t = (~t)+1;
t = t>>4;
d1 = t/100;
d2 = (t%100)/10;
d3 = (t%100)%10;
USART_SendData(USART1,0x30+d1);
delay_us(1000000);
USART_SendData(USART1,0x30+d2);
delay_us(1000000);
USART_SendData(USART1,0x30+d3);
delay_us(1000000);
}
}
主要程序就是上面几个,测出来温度是000,麻烦大神们看下
|
|