⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20_4.c

📁 18B20温度传感器与风扇控制
💻 C
字号:
#include <aduc812.h>	 
#define  uchar unsigned char
#define  uint unsigned int

sbit DQ =P2^7;   //定义通信端口

//延时函数
void reset_data(void);
sbit  P3_4 = P3^4;

sbit  P2_5 = P2^5;
 
sbit CLK   =  P2^1;                //Declare for MAX7219;
sbit DIN   =  P2^0;
sbit LOAD  =  P2^6;

float tt=0;



delay(long int n);
send(uchar add,uchar dat);


Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(9);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(88); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(16);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(23);
}

//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(5);
 }
 return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
//delay(4);
}

//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;

Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;

tt= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(tt);
}


delay(long int n)
 {
     while(n!=0)
	 { n--; 
	 }
 }


void Configurate_UART(void)	 //配置串行口
{
    RCAP2H=0xff;		     //定时器2自动重新加载初值
 	RCAP2L=0xd7;			 //9600
	TH2=0xff;			     //定时器2初值
	TL2=0xd7;
	SCON=0x50;				 //串行口控制寄存器
	T2CON=0x34;				 //定时器2控制寄存器 作波特率发生器
}

send(uchar add,uchar dat)    //The subprogram for send the 16 bits
 {
 uchar ADS,m,n;
    LOAD=0;
    m=0;
      while(m<16)
       {
        if(m<8)
         ADS=add;
        else
         ADS=dat;
        for(n=8;n>=1;n--)
          {
           CLK=0;
           DIN=ADS&0x80;
           ADS=ADS<<1;
           CLK=1;
          }
           m=m+8;
       }
 LOAD=1;
}

main()
{


 unsigned int i=0,j=0,k=0;
 uchar Efan1,Efan2,Efan3;


//PLLCON=0x00;

send(0x0c,0x01);      //Enter normal mode
send(0x0a,0x0a);      //setup the light degree of diode
send(0x0b,0x02);      //setup the light number of LED
send(0x09,0xff);      //setup the decode number of LED
send(0x00,0x01);      //Enter the normal state
send(0x0f,0x00);      //come back from Test Mode


send(0x01,0x00);   
send(0x02,0x00); 
send(0x03,0x00);     

Configurate_UART();
  while(1)
  {



   i=ReadTemperature();//读温度



   j = i;
   k = j;
   j  = j %10;
   send(0x01,j);
   Efan3 = j;



	j = k;
	j=j / 100;
	send(0x03,j);
	
	Efan1 = j;
	Efan1<<=4; 
	
  	

   	j = k;
	j=(j % 100)/10;

	Efan2 = j;

	j=j|0x80;
	send(0x02,j); 


	Efan1=Efan1|Efan2;
  	SBUF=Efan1;
	while(TI==0);
	TI=0;

	SBUF=Efan3;
	while(TI==0);
	TI=0;

  	 	    
		if ((Efan1 > 0x06)|((Efan1 == 0x06)&&(Efan2 >= 0x05)))

	     	P2_5 = 0;
		   
		  
	  	if (((Efan1 < 0x06)||((Efan1 == 0x06)&&(Efan2==0x00))))
	  	P2_5 = 1;
		

	   delay(10000);
	   P3_4=~P3_4;



  }
}


 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -