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

📄 000000.c

📁 18B20程序
💻 C
字号:
#include<pic1687x.h>
#include<pic.h> //包含单片机内部资源预定义
#define uchar unsigned char 
#define uint unsigned int
#define DQ RB4//定义18B20端口
#define DQ_DIR  TRISB4//定义存储器方向
#define DQ_HIGH()  DQ_DIR=0;  DQ=1
#define DQ_LOW()   DQ=0
uchar recdata;
// 延时t毫秒 //
# pragma interrupt_level 1
void delay(uint t)
{
    uint i;
    while(t--)
    {
        for(i=0;i<125;i++)
        {;}
    }
} 
// 产生复位脉冲初始化DS18B20//
# pragma interrupt_level 1
void TxReset(void)
{
    uint i;
    DQ_LOW();
                          	//拉低约900us 
    i = 100;
    while (i>0)    i--;    
    
    DQ_HIGH();                // 产生上升沿
    i = 4;
    while (i>0)    i--;
}

// 读取数据的一位//
bit RdBit(void)
{
uint i;
static bit b;
DQ_LOW();
i++;
DQ_HIGH();
i++;i++;
DQ_DIR=0;         
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}

// 读取数据的一个字节 //
uchar RdByte(void)
{
    uchar i,j,b;
    b = 0;
    for (i=1;i<=8;i++)
    {
        j = RdBit();
        b = (j<<7)|(b>>1);
    }
    return(b);
}

 
// 写数据的一个字节//
# pragma interrupt_level 1
void WrByte(uchar b)
{
    uint i;
    uchar j;
    static bit btmp;
    for(j=1;j<=8;j++)
    {   btmp = b&0x01;
        b = b>>1;                // 取下一位(由低位向高位)
        if (btmp)
        {                        //写1//
            DQ_LOW();
            i++;i++;             // 延时,使得15us以内拉高
            DQ_HIGH();
            i = 8;
            while(i>0) i--;      // 整个写1时隙不低于60us 
           }
        else
        {                        //写0//
            DQ_LOW();            
            i = 8;
            while(i>0) i--;      // 保持低在60us到120us之间
            DQ_HIGH();
            i++;
            i++;
        }    
	}
}

// 启动温度转换 //
void convert(void)
{   TxReset();           // 产生复位脉冲,初始化DS18B20
    
    delay(1);           
    WrByte(0xcc);        // skip rom 命令
    WrByte(0x44);        // convert T 命令
}

// 读取温度值 //
# pragma interrupt_level 1
 uchar RdTemp(temp)
{   uint a,b;

    float wendu;
    TxReset();           // 产生复位脉冲,初始化DS18B20   
    delay(1);            // 延时
    WrByte(0xcc);        // skip rom 命令
    WrByte(0xbe);        // read scratchpad 命令
    a = RdByte();        // 温度值低位字节(其中低4位为二进制的“小数”部分)
    b = RdByte();        // 高位值高位字节(其中高5位为符号位) 
    DQ_HIGH();       
    temp=b;
    temp<<=8;
    temp=temp|a;
   // wendu=temp*0.0625;    
   //temp=wendu*10+0.5;

    return temp; 
}
//串口通信// 
# pragma interrupt_level 1
void interrupt zhongduan(void)
{ uchar buf[12];
  uchar recdata;
 // uint i;
    if(RCIF) //判断是否为串口接收中断
    {
       RCIF=0;
       recdata=RCREG; 
	}


   if(recdata=='A'&&TXIF!=0)
    TXREG=RdTemp();
   }  

 /*{    
    for(i=0;i<12;i++)
   { 
     buf[i]=x;
   } 
        TXREG=buf[i]; 
     }
   }*/


//主函数//
void main(void)
{ 
   TRISB4=0; 
   TRISC6=1;
   TRISC7=1;  
   //TXIF=0;         
   //RCIF=0;
   SPBRG=25;           	//波特率设为9600  
   SYNC=0;
   SPEN=1;    			//USART异步串行工作方式 
   TXEN=1;    			//USART工作于发送器工作状态 
   TXSTA=0X24; 			//使能串口发送,选择高速波特率
   RCSTA=0X90; 			//使能串口工作,连续接收  
   TXIE=1;
   GIE=1;    	
   RCIE=1;    			              		
   PEIE=1;    			
   while(1)
   { 
     delay(1);
   	 convert();
     delay(1000);
     RdTemp();
         
    }
}

⌨️ 快捷键说明

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