0
点赞
收藏
分享

微信扫一扫

【蓝桥杯竞赛】18b20 温度传感器(函数)

我阿霆哥 2022-03-30 阅读 52

main.c 


#include "STC15F2K60S2.H"
#include "bsp_init.H"
#include "bsp_led.H"
#include "timer.H"
#include "bsp_seg.H"
#include "bsp_key.H"
#include "onewire.h"


#include "STDIO.H"
// led --------专用
unsigned  char  ucled;
//声明函数------专用
void     Key_Pro(void);
void	 Seg_Pro(void);		
void	 Led_Pro(void);	
//减速   ------专用
unsigned  char  Key_Mm;
unsigned  char  Seg_Mm;
unsigned  char  Led_Mm;

//数码管-----专用
unsigned  char  Seg_sss[10];
unsigned  char  Seg_buf[8];
unsigned  char  Pos=0;

//按键-------专用
unsigned  char  Key_k1;
unsigned  char   Key_hig,key_low;
unsigned  char  os=0;

//--------------------------------------------------------------
void  main()
{
    Off_Ws ();  // 关闭外设

	Timer1Init();
	EA = 1;
   
	
	while(1)
	{
	 Key_Pro();
	 Seg_Pro();			
	}

}


void tm1_isr() interrupt 3    //定时器中断  1ms
{
	if(++Key_Mm ==10) Key_Mm= 0;
	if(++Seg_Mm ==100) Seg_Mm= 0;
	if(++Led_Mm ==300) Led_Mm= 0;

	

    Seg_Vip(Seg_buf,Pos);
    if(++Pos==8)  Pos=0;
}



//------------------------------------------------------
void     Key_Pro(void)
{   if(Key_Mm==0) return ;Key_Mm=1;   //用于按键处理-----减速

	Key_k1 = Key_Read();    //这地方是按键处理模式(现在用是矩阵键盘------调用函数)
	key_low = Key_k1 & ( Key_hig  ^ Key_k1);
	Key_hig = Key_k1 ;      //电平检测
	
	
	
}



void	 Seg_Pro(void)
{  if(Seg_Mm==0) return ;Seg_Mm=1;   //用于数码管显示----减速


	sprintf(Seg_sss,"%06.4f",(unsigned int )rd_temperature()/16.0);  //要   /16.0  ,也就是16倍

 
Seg_ring(Seg_sss,Seg_buf);
}

子函数:

  • /*
      程序说明: 单总线驱动程序
      软件环境: Keil uVision 4.10 
      硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
      日    期: 2011-8-9
    */
    #include "onewire.h"
    
    sbit DQ = P1^4;  //单总线接口
    
    //单总线延时函数
    void Delay_OneWire(unsigned int t)  //STC89C52RC
    {
    	t*=12;//-----------------------------------------------这里要自己加  t*=12    ;-----------------------------
    	while(t--);
    }
    
    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    }
    
    //从DS18B20读取一个字节
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
      
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;
    		DQ = 1;
    		if(DQ)
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	return dat;
    }
    
    //DS18B20设备初始化
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	
      	DQ = 1;
      	Delay_OneWire(12);
      	DQ = 0;
      	Delay_OneWire(80);
      	DQ = 1;
      	Delay_OneWire(10); 
        initflag = DQ;     
      	Delay_OneWire(5);
      
      	return initflag;
    }
    //-----------------------------------------------上面官方有给,下面是自己要写的代码-----------------------------
    
    unsigned int rd_temperature(void)
    {
    	unsigned char   low;
    	unsigned char   hig;
    	init_ds18b20();      //初始化 
    	Write_DS18B20(0xcc);//  跳过rom
    	Write_DS18B20(0x44);//功能指令(转换温度)
    	
    	init_ds18b20();      //初始化 
    	Write_DS18B20(0xcc);//  跳过rom
    	Write_DS18B20(0xbe);	//读暂存器 指令
    	
    low = 	Read_DS18B20();	
    hig = 	Read_DS18B20();	
    	return (( hig<<8) | low);    //高位和低位组合;得到16位;值  (  /16.0  )  
    }
    
  • 头文件

    
    #include "STC15F2K60S2.H"
    
    unsigned int rd_temperature(void);  
    
    

    硬件图:

 

  • 芯片资料

     

     

 

 

 简单来说就是三大步骤:

1:初始化

2:Rom指令

3.功能指令

 

 

举报

相关推荐

0 条评论