OpenEdv-开源电子网

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

求助!!关于例程22温度传感器的扩展

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-4-13
在线时间
0 小时
发表于 2011-4-25 13:09:00 | 显示全部楼层 |阅读模式

我把例程22温度传感器扩展到2个,一个是焊在开发板上,就用了例程里的设定,另一个我准备接在PC4口,但不知道为什么第二个温度传感器总是不能初始化。。。
已经把第二个传感器接在PA0口验证过电路没有问题,哪位高手能帮忙看看工程里什么出了问题,是哪里没有使能吗??

//Mini STM32开发板范例代码22
//红外遥控 实验
//正点原子@ALIENTEK
//2010.6.17 
       
int main(void)
{    
 short temp;
 short temp2;           
   Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
 uart_init(72,9600); //串口1初始化    
 LCD_Init();   //初始化液晶
 LED_Init();         //LED初始化  
  OINT_COLOR=RED;//设置字体为红色   
 LCD_ShowString(60,50,"Mini STM32"); 
 LCD_ShowString(60,70,"DS18B20 TEST"); 
 LCD_ShowString(60,90,"ATOM@ALIENTEK");
 LCD_ShowString(60,110,"2010/6/17");
 while(DS18B20_Init())//初始化DS18B20,兼检测18B20
 {
  LCD_ShowString(60,130,"DS18B20 Check Failed!");
  delay_ms(500);   
  LCD_ShowString(60,130,"Please Check!        ");
  delay_ms(500);
  LED0=!LED0;//DS0闪烁
 }
    LCD_ShowString(60,130,"DS18B20 Ready!     "); 
  OINT_COLOR=BLUE;//设置字体为蓝色   
 LCD_ShowString(60,150, "Temperate:   . C"); 
    while(DS18B20_2_Init())//初始化DS18B20_2,兼检测18B20_2
    {
        LCD_ShowString(60,180,"DS18B20_2 Check Failed!");
        delay_ms(500);       
        LCD_ShowString(60,200,"Please Check!        ");
        delay_ms(500);
        LED1=!LED1;//DS1闪烁
    }
    LCD_ShowString(60,180,"DS18B20_2 Ready!     "); 
    POINT_COLOR=BLUE;//设置字体为蓝色     
    LCD_ShowString(60,200, "Temperate:   . C"); 
 while(1)
 {  
  temp=DS18B20_Get_Temp();
  if(temp<0)
  {
   temp=-temp;
   LCD_ShowChar(140,150,'-',16,0);//显示负号 
  }      
  LCD_ShowNum(148,150,temp/10,2,16);//显示温度值  
  LCD_ShowNum(172,150,temp%10,1,16);//显示温度值
  //printf("t1:%d\n",temp);
  delay_ms(200);
  LED0=!LED0;
  temp2=DS18B20_2_Get_Temp();
  if(temp2<0)
  {
   temp2=-temp2;
   LCD_ShowChar(140,200,'-',16,0);//显示负号 
  }      
  LCD_ShowNum(148,200,temp2/10,2,16);//显示温度值  
  LCD_ShowNum(172,200,temp2%10,1,16);//显示温度值
  //printf("t1:%d\n",temp);
  delay_ms(200);
  LED1=!LED1;
 }     
}

#include "ds18b20_2.h"
#include "delay.h"          
//Mini STM32开发板
//DS18B20_2 驱动函数
//正点原子@ALIENTEK
//2010/6/17 

//复位DS18B20_2
void DS18B20_2_Rst(void)   
{                
 DS18B20_2_IO_OUT(); //SET PC4 OUTPUT
    DS18B20_2_DQ_OUT=0; //拉低DQ
    delay_us(750);    //拉低750us
    DS18B20_2_DQ_OUT=1; //DQ=1
 delay_us(15);     //15US
}
//等待DS18B20_2的回应
//返回1:未检测到DS18B20_2的存在
//返回0:存在
u8 DS18B20_2_Check(void)    
{  
 u8 retry=0;
 DS18B20_2_IO_IN();//SET PC4 INPUT 
    while (DS18B20_2_DQ_IN&&retry<200)
 {
  retry++;
  delay_us(1);
 }; 
 if(retry>=200)return 1;
 else retry=0;
    while (!DS18B20_2_DQ_IN&&retry<240)
 {
  retry++;
  delay_us(1);
 };
 if(retry>=240)return 1;    
 return 0;
}
//从DS18B20_2读取一个位
//返回值:1/0
u8 DS18B20_2_Read_Bit(void)     // read one bit
{
    u8 data;
 DS18B20_2_IO_OUT();//SET PC4 OUTPUT
    DS18B20_2_DQ_OUT=0;
 delay_us(2);
    DS18B20_2_DQ_OUT=1;
 DS18B20_2_IO_IN();//SET PV4 INPUT
 delay_us(12);
 if(DS18B20_2_DQ_IN)data=1;
    else data=0; 
    delay_us(50);          
    return data;
}
//从DS18B20_2读取一个字节
//返回值:读到的数据
u8 DS18B20_2_Read_Byte(void)    // read one byte
{       
    u8 i,j,dat;
    dat=0;
 for (i=1;i<=8;i++)
 {
        j=DS18B20_2_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }         
    return dat;
}
//写一个字节到DS18B20_2
//dat:要写入的字节
void DS18B20_2_Write_Byte(u8 dat)    
 {            
    u8 j;
    u8 testb;
 DS18B20_2_IO_OUT();//SET PC4 OUTPUT;
    for (j=1;j<=8;j++)
 {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_2_DQ_OUT=0;// Write 1
            delay_us(2);                           
            DS18B20_2_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_2_DQ_OUT=0;// Write 0
            delay_us(60);            
            DS18B20_2_DQ_OUT=1;
            delay_us(2);                         
        }
    }
}
//开始温度转换
void DS18B20_2_Start(void)// ds1820 start convert
{                       
    DS18B20_2_Rst();   
 DS18B20_2_Check(); 
    DS18B20_2_Write_Byte(0xcc);// skip rom
    DS18B20_2_Write_Byte(0x44);// convert
}
//初始化DS18B20_2的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在     
u8 DS18B20_2_Init(void)
{
 RCC->APB2ENR|=1<<4;    //使能PORTC口时钟
 GPIOC->CRL&=0XFFF0FFFF;//PORTC.4 推挽输出
 GPIOC->CRL|=0X00030000;
 GPIOC->ODR|=1<<4;      //输出1
 DS18B20_2_Rst();
 return DS18B20_2_Check();

//从ds18b20_2得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_2_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
 short tem;
    DS18B20_2_Start ();                    // ds1820 start convert
    DS18B20_2_Rst();
    DS18B20_2_Check(); 
    DS18B20_2_Write_Byte(0xcc);// skip rom
    DS18B20_2_Write_Byte(0xbe);// convert    
    TL=DS18B20_2_Read_Byte(); // LSB  
    TH=DS18B20_2_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;   
}

#ifndef __DS18B20_2_H
#define __DS18B20_2_H
#include "sys.h"  
//Mini STM32开发板
//DS18B20 驱动函数
//正点原子@ALIENTEK
//2010/6/17 

//IO方向设置
#define DS18B20_2_IO_IN()  {GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=8<<4;}
#define DS18B20_2_IO_OUT() {GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=3<<4;}
////IO操作函数             
#define DS18B20_2_DQ_OUT PCout(4) //数据端口 C4
#define DS18B20_2_DQ_IN  PCin(4)  //数据端口 C4
    
u8 DS18B20_2_Init(void);//初始化DS18B20_2
short DS18B20_2_Get_Temp(void);//获取温度
void DS18B20_2_Start(void);//开始温度转换
void DS18B20_2_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_2_Read_Byte(void);//读出一个字节
u8 DS18B20_2_Read_Bit(void);//读出一个位
u8 DS18B20_2_Check(void);//检测是否存在DS18B20_2
void DS18B20_2_Rst(void);//复位DS18B20_2   
#endif

温度传感器.rar

1.99 MB, 下载次数: 421

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-4-25 14:50:55 | 显示全部楼层
#define DS18B20_2_IO_IN()  {GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=8<<4;}
#define DS18B20_2_IO_OUT() {GPIOC->CRL&=0XFFF0FFFF;GPIOC->CRL|=3<<4;}
这两句不对.都是后半部分不对.
提示:每个IO口占4个位.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2011-4-13
在线时间
0 小时
 楼主| 发表于 2011-4-25 15:12:33 | 显示全部楼层
发现了,居然为了这问题纠结了一天。。。哎。。。
多谢原子大哥~~
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2011-2-1
在线时间
8 小时
发表于 2011-6-12 12:19:08 | 显示全部楼层
我也遇到,PA0改PA14时初始化不通过,每个IO口占4个位是什么意思,具体怎么改?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-6-12 12:34:06 | 显示全部楼层
回复【4楼】jdoushi:
---------------------------------
这个你看看 STM32参考手册,GPIO的描述部分吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2011-2-1
在线时间
8 小时
发表于 2011-6-12 16:16:10 | 显示全部楼层
看了还是不知道,
JTAG_Set(JTAG_SWD_DISABLE);
//IO方向设置
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=8<<14;}
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=3<<14;}
////IO操作函数    
#define DS18B20_DQ_OUT Aout(14) //数据端口 PA0 
#define DS18B20_DQ_IN  Ain(14)  //数据端口 PA0 

RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
GPIOA->CRH&=0XF0FFFFFF;//PORTA.0 推挽输出
GPIOA->CRH|=0X03000000;
GPIOA->ODR|=1<<14;      //输出1
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-6-12 16:30:34 | 显示全部楼层
关键你要理解一个IO口的模式是由4个bit控制的就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2011-2-1
在线时间
8 小时
发表于 2011-6-12 17:17:30 | 显示全部楼层
谢谢,好了
//IO方向设置 
#define DS18B20_IO_IN()  {GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=0x08000000;} 
#define DS18B20_IO_OUT() {GPIOA->CRH&=0XF0FFFFFF;GPIOA->CRH|=0x03000000;} 

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 15:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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