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

📄 18b20.c

📁 温度传感器18B20的keil C51驱动程序
💻 C
字号:
/*
18B20通讯程序 温度
*/

#include <C8051F020.h> 

sbit DQ = P3^2;

void delayus(uint x)    // x us
{ 
    uint  a;

	x *= 3;

	TH0 = 0;
	TL0 = 0;
	TR0 = 1;
	do	a = TH0*256+TL0;
	while( a<x );
	TR0 =0; 
} 

bit reset(void)                //初始化18B20 
{ 
    static bit presence;       //定义一个应答信号   

	DQ=0;  
    delayus(500);                //置总线为低电平并保持至少480us 
         
    DQ=1;                       //等电阻拉高总线并保持15-60us 

    delayus(50);    
	//P3MDOUT &= ~4;  
    presence=DQ;                //接受应答信号 
    delayus(200);                 //延时60-240us 
    //P3MDOUT |= 4; 
    return(presence);         //返回应答信号 

} 

//**************  从18B20中读一个字节**************// 

uchar read_byte(void)        
{ 
    uchar idata i; 
    uchar idata value=0; 

    for (i=0;i<8;i++) 
    { 
        DQ=0; 
        DQ=1; 
        value>>=1;
        delayus(1);  

        if(DQ) value|=0x80;

        delayus(1); 
    }   
            
    return(value);           
} 

//*********************向18B20中 写一个字节**************// 

void write_byte(uchar val)     
{ 
    uchar idata i; 
   
    for (i=0;i<8;i++) 
    { 
        DQ=0; 
        delayus(1); 
        DQ = val & 0x01;
        delayus(3); 
        DQ=1; 
        val>>=1; 
    }  

}   


void startT(void)
{
	TR2 = 0;
	while (reset()) ;         //复位等待从机应答 
    write_byte(0XCC);         //忽略ROM匹配 
    write_byte(0X44);         //发送温度转化命令 
	TR2 = 1;
}         
float ReadTemperature(void)
{        
    uchar idata teml,temh; 
    int  idata tem;
    float idata ttt;
    

    //delayus(25000);    //延时100-300us 
    TR2 = 0;
    while( reset());          //再次复位,等待从机应答 
    delayus(500);         
    write_byte(0XCC);          //忽略ROM匹配 
    write_byte(0XBE);          //发送读温度命令 
    teml = read_byte();        //读出温度低8        
    temh = read_byte();        //读出温度高8位 
    tem=temh;
    tem<<=8;
    tem|=teml;
    ttt=(float)tem*0.0625;     

    DQ=1;                //释放总线 

	TR2 = 1;
    return (ttt) ;
} 
/*
void Delay( uint ms ) // 6M clock
{	
   uint  i;                         // millisecond counter

   for (i = 0; i < ms; i++) 
   {          
      TR0 = 0;                         // STOP Timer0
      TH0 = (-6000000/1000) >> 8;       // set Timer0 to overflow in 1ms
      TL0 = -6000000/1000;
      TR0 = 1;                         // START Timer0
      while (TF0 == 0);                // wait for overflow
      TF0 = 0;                         // clear overflow indicator
   }
}
main()
{
	extern void Init_Device(void);
 	
  	Init_Device();
	EA = 0;
	for(;;)
	{
		startT();  
		Delay(4000);

		ReadTemperature();
	}
} 	  	  */

⌨️ 快捷键说明

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