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