|  我把例程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_2void 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
 
 
 |