基于STM32与DS18B20的温度采集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011992534/article/details/50885312
#include "Headfile.h"


void Beep_Init()//蜂鸣器初始化
{
 GPIO_InitTypeDef GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_13;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;
 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;


 GPIO_Init(GPIOC,&GPIO_InitStructure);


}


void Key_Init()//按键初始化
{
 GPIO_InitTypeDef GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 |GPIO_Pin_5;
 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU ;
 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;


 GPIO_Init(GPIOA,&GPIO_InitStructure);
}


#define  MODE       GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)//模式切换按键
#define  CANCEL     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)//处理警报按键
#define  ADD      GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)	//加按键
#define  SUB      GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)	 //减按键


int Temperature_High=100,Temperature_Low=0;
uint8_t flag=0;
uint8_t High_Set=1,Cancel=0;
void KeyScan()
{
   
if(MODE==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(MODE==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(MODE==0);//如果确认按下按键等待按键释放,没有释放则一直等待
     	 if(High_Set==1)  High_Set=0;
		 else High_Set=1;
		 LCD_clear();
	   }
	  }


if(CANCEL==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(CANCEL==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(CANCEL==0);//如果确认按下按键等待按键释放,没有释放则一直等待
		if(flag==1)  flag=0;
		else flag=1;
		LCD_clear();
	   }
	  }


if(ADD==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5-20ms
     if(ADD==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(ADD==0);//如果确认按下按键等待按键释放,没有释放则一直等待
        if(High_Set==1) Temperature_High+=1;
		else Temperature_Low+=1;
		LCD_clear();
	   }
	  }


if(SUB==0)  //如果检测到低电平,说明按键按下
    {
	 delay_ms(5); //延时去抖,一般5·20ms
     if(SUB==0)     //再次确认按键是否按下,没有按下则退出
	   {
        while(SUB==0);//如果确认按下按键等待按键释放,没有释放则一直等待
       	if(High_Set==1) Temperature_High-=1;
		else Temperature_Low-=1;
		LCD_clear();
	   }
	  }


}


 int temper=0;
uint8_t Danger_Flag=0;
void State_Check()
{
if((temper>Temperature_High)||(temper<Temperature_Low))  Danger_Flag=1;
else Danger_Flag=0;
}








uint16_t Cnt=0;
int main()
{
SystemInit();//系统时钟配置
delay_init(72);//系统延时函数初始化
Usart_Init(115200);//串口初始化
Beep_Init();//蜂鸣器初始化
LCD_Init();//显示屏初始化
Key_Init();//按键初始化
ds18b20_start();//温度传感器初始化
delay_ms(200);
while(1)
 {
  temper=ds18b20_read(); //温度采集
  KeyScan();//按键扫描
  State_Check();//报警检测
 LCD_write_english_string(0,0,"NowTemp:");   write_number(50,0,temper);LCD_write_english_string(70,0,"%C");//当前温度
 


  if(High_Set==1)    LCD_write_english_string(20,1,"Set_High");//模式显示
  else              LCD_write_english_string(20,1,"Set_Low");


   
  LCD_write_english_string(0,2,"High");  LCD_write_english_string(40,2,"Low"); //温度上、下限 
 
  write_number(0,3,Temperature_High);             write_number(50,3,Temperature_Low);
 
  if(flag==1)   LCD_write_english_string(25,4,"Sorting"); //状态显示
  else 
  {
   if(Danger_Flag==1)   LCD_write_english_string(25,4,"Danger~~~~");
   else  LCD_write_english_string(25,4,"OKay!!!");
  
  }
 Cnt++;
 if(Cnt>=100)
 {
  Cnt=0;
 }
 if(Cnt>=50)
   {
 if(Danger_Flag==1&&flag==0) 	 PCout(13)=1;//产生警报
   }
 else 
   {
   	PCout(13)=0;


   }
   
 }
}


#include "Headfile.h"
#include "DS18B20.h"


 


#define EnableINT()  
#define DisableINT() 


#define DS_PORT   GPIOA
#define DS_DQIO   GPIO_Pin_1
#define DS_RCC_PORT  RCC_APB2Periph_GPIOA
#define DS_PRECISION 0x7f   //精度配置寄存器 1f=9位; 3f=10位; 5f=11位; 7f=12位;
#define DS_AlarmTH  0x64
#define DS_AlarmTL  0x8a
#define DS_CONVERT_TICK 1000


#define ResetDQ() GPIO_ResetBits(DS_PORT,DS_DQIO)
#define SetDQ()  GPIO_SetBits(DS_PORT,DS_DQIO)
#define GetDQ()  GPIO_ReadInputDataBit(DS_PORT,DS_DQIO)
 
 
//static unsigned char TempX_TAB[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};




void Delay_us(u32 Nus) 
{  
 SysTick->LOAD=Nus*9;          //时间加载       
 SysTick->CTRL|=0x01;             //开始倒数     
 while(!(SysTick->CTRL&(1<<16))); //等待时间到达  
 SysTick->CTRL=0X00000000;        //关闭计数器 
 SysTick->VAL=0X00000000;         //清空计数器      
}  


 


unsigned char ResetDS18B20(void)
{
 unsigned char resport=0;
 SetDQ();
 Delay_us(50);
 
 ResetDQ();
 Delay_us(500);  //500us (该时间的时间范围可以从480到960微秒)
 SetDQ();
 Delay_us(40);  //40us
 //resport = GetDQ();
 while(GetDQ());
 Delay_us(500);  //500us
 SetDQ();
 return resport;
}


void DS18B20WriteByte(unsigned char Dat)
{
 unsigned char i;
 for(i=8;i>0;i--)
 {
   ResetDQ();     //在15u内送数到数据线上,DS18B20在15-60u读数
  Delay_us(5);    //5us
  if(Dat & 0x01)
   SetDQ();
  else
   ResetDQ();
  Delay_us(65);    //65us
  SetDQ();
  Delay_us(2);    //连续两位间应大于1us
  Dat >>= 1; 
 } 
}




unsigned char DS18B20ReadByte(void)
{
 unsigned char i=0,Dat=0;
 SetDQ();
 Delay_us(5);
 for(i=8;i>0;i--)
 {
   Dat >>= 1;
    ResetDQ();     //从读时序开始到采样信号线必须在15u内,且采样尽量安排在15u的最后
  Delay_us(5);   //5us
  SetDQ();
  Delay_us(5);   //5us
  if(GetDQ())
    Dat|=0x80;
  else
   Dat&=0x7f;  
  Delay_us(65);   //65us
  SetDQ();
 }
 return Dat;
}




void ReadRom(unsigned char *Read_Addr)
{
 unsigned char i;


 DS18B20WriteByte(ReadROM);
  
 for(i=8;i>0;i--)
 {
  *Read_Addr=DS18B20ReadByte();
  Read_Addr++;
 }
}




void DS18B20Init(unsigned char Precision,unsigned char AlarmTH,unsigned char AlarmTL)
{
 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(WriteScratchpad);
 DS18B20WriteByte(AlarmTL);
 DS18B20WriteByte(AlarmTH);
 DS18B20WriteByte(Precision);


 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(CopyScratchpad);
 EnableINT();


 while(!GetDQ());  //等待复制完成 ///////////
}




void DS18B20StartConvert(void)
{
 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(StartConvert); 
 EnableINT();
}


void DS18B20_Configuration(void)
{
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_APB2PeriphClockCmd(DS_RCC_PORT, ENABLE);


 GPIO_InitStructure.GPIO_Pin = DS_DQIO;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //开漏输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //2M时钟速度
 GPIO_Init(DS_PORT, &GPIO_InitStructure);
}




void ds18b20_start(void)
{
 DS18B20_Configuration();
 DS18B20Init(DS_PRECISION, DS_AlarmTH, DS_AlarmTL);
 DS18B20StartConvert();
}




float ds18b20_read(void)
{
 unsigned char TemperatureL,TemperatureH;
float Temperature;
uint8_t fg=1;


 DisableINT();
 ResetDS18B20();
 DS18B20WriteByte(SkipROM); 
 DS18B20WriteByte(ReadScratchpad);
 TemperatureL=DS18B20ReadByte();
 TemperatureH=DS18B20ReadByte(); 
 ResetDS18B20();
 EnableINT();


	{
		TemperatureL=~TemperatureL;					//补码转换,取反加一
		TemperatureH=~TemperatureH+1;       
		fg=0;      						//读取温度为负时fg=0
	}
	Temperature = TemperatureL/16+TemperatureH*16;      	//整数部分	
	DS18B20StartConvert();
	if(fg==0) Temperature*=-1; 
	return  Temperature;


}


 


 



猜你喜欢

转载自blog.csdn.net/u011992534/article/details/50885312