OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3387|回复: 2

我的18b20怎么读时一直是850,我只改了端口,其他什么都没有改

[复制链接]

8

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-19
在线时间
0 小时
发表于 2015-9-12 09:58:06 | 显示全部楼层 |阅读模式
5金钱
int main(void)
 {
u8 t=0;    
float temperature;       
char LCD_Buf[100];
 
delay_init();     //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级  
  LED_Init();     //LED端口初始化
KEY_Init();
LCD_Init(); //LCD初始化
uart_init(115200); //串口初始化为115200  
 
LCD_Clear(White);
LCD_SetTextColor(Red);   //设置文本颜色,保存在全部变量s_TextColor
LCD_SetTransparent(0);
LCD_DisplayString(0, 0, " Function     : JOYPAD TEST");  //在LCD指定文本行显示一个字符串
LCD_DisplayString(0, 15, " Move condition: ARMFLY");  //在LCD指定文本行显示一个字符串
LCD_DisplayString(0, 30, " Author       : You si qi");  //在LCD指定文本行显示一个字符串
LCD_DisplayString(0, 45, " Date         : 2015/9/11");  //在LCD指定文本行显示一个字符串

LCD_SetTextColor(Blue);

  while(DS18B20_Init()) //DS18B20初始化
{
LCD_DisplayString(0,60," DS18B20 Error");
delay_ms(200);
}

LCD_DisplayString(0,60," DS18B20 OK    ");
  LCD_DisplayString(0,75," Temp:   .  C");

while(1)
{
  if(t%10==0) //每100ms读取一次
{  
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
LCD_DisplayString(48,75,"-"); //显示负号
temperature=-temperature; //转为正数
}else LCD_DisplayString(48,75," "); //去掉负号

sprintf(LCD_Buf,"%.1f",temperature);
LCD_DisplayString(56,75,(uint8_t * )LCD_Buf); //显示  
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
LED0=!LED0;
}
}
 }
18b20.c
void DS18B20_Rst(void)   
{                 
DS18B20_IO_OUT(); //SET PG11 OUTPUT
    DS18B20_DQ_OUT=0; //拉低DQ
    delay_us(750);     //拉低750us
    DS18B20_DQ_OUT=1; //DQ=1 
delay_us(15);     //15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
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;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void)  
{
    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(50);           
    return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)     
{        
    u8 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(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) 
{                 
    DS18B20_Rst();   
DS18B20_Check();  
    DS18B20_Write_Byte(0xcc); // skip rom
    DS18B20_Write_Byte(0x44); // convert


//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在      
u8 DS18B20_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PORTG口时钟 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PORTG.11 推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);

  GPIO_SetBits(GPIOG,GPIO_Pin_8);    //输出1

DS18B20_Rst();

return DS18B20_Check();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
short tem;
    DS18B20_Start ();   // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();  
    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; //获得底八位
printf("%d",tem);
    tem=(float)tem*0.625; //转换     
if(temp)return tem; //返回温度值
else return -tem;    
}

18b20.h
//IO方向设置
#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFFFFF0;GPIOG->CRH|=8;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FF0;GPIOG->CRH|=3;}
////IO操作函数   
#define DS18B20_DQ_OUT PGout(8) //数据端口 PA0 
#define DS18B20_DQ_IN  Gin(8)  //数据端口 PA0 





 



人人为我,我为人人。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2015-9-12 10:44:35 | 显示全部楼层
这个东东移植时主要注意一下时序中的延时部分,对延时要求比较高!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-13 23:18:46 | 显示全部楼层
看代码ok啊,是我们开发板么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 03:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表