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

📄 18b20fen.c

📁 结合pic18f452开发的单总线高精度温度传感器(DS18B20),精度为0.5。
💻 C
字号:
#include"pic18fxx2.h"
#include"lcd.h"
#define  uch unsigned char 
uch dis4[16]="DIGITALVOLTMETER";
uch dis5[16]="temper   .00c   ";
uch t;
#define DQ RC4                                //定义18B20数据端口 
#define DQ_DIR TRISC4                         //定义18B20D口方向寄存器 
#define DQ_HIGH() DQ_DIR =1                   //设置数据口为输入
#define DQ_LOW() DQ = 0; DQ_DIR = 0           //设置数据口为输出
 unsigned char  TLV=0 ;                        //采集到的温度高8位
 unsigned char  THV=0;                         //采集到的温度低8位
 unsigned char TZ=0;                           //转换后的温度值整数部分
 unsigned char TX=0;                           //转换后的温度值小数部分
//------------------------------------------------
//延时函数
void delay(char i) 
{
  while(i--);
 }
//------------------------------------------------
//系统初始化函数
void init()
{
  ADCON1=0X07;                                //设置A口为普通数字口
  TRISD=0X00;                                 //设置D口方向为输出
}
//复位DS18B20函数
reset(void)
{
  char presence=1;
  while(presence)
  { 
    DQ_LOW() ;                                //主机拉至低电平
    delay(195);                              //延时503us
    DQ_HIGH();                                //释放总线等电阻拉高总线,并保持15~60us
    delay(30);                               //延时70us
    if(DQ==1) presence=1;                     //没有接收到应答信号,继续复位
    else presence=0;                          //接收到应答信号
    delay(169);                              //延时430us
   }
}

//-----------------------------------------------
//写18b20写字节函数
void write_byte(uch val)
{
 uch i;
 uch temp;
 for(i=8;i>0;i--)
 {
   temp=val&0x01;                            //最低位移出
   DQ_LOW(); 
   ;
   ;
   ;
   ;
   ;                                    //从高拉至低电平,产生写时间隙
   if(temp==1)  DQ_HIGH();                   //如果写1,拉高电平
   delay(27);                               //延时63us
   DQ_HIGH(); 
   ;
   ;
   val=val>>1;                               //右移一位
  }
}

//------------------------------------------------
//18b20读字节函数
uch read_byte(void)
{
 uch i;
 uch value=0;                                //读出温度
 static bit j;
 for(i=8;i>0;i--)
 {
   value>>=1; 
   DQ_LOW();
   ;
   ;
   ;
   ;
   ;
   ;                                   //6us
   DQ_HIGH();                               //拉至高电平
   ; 
   ;
   ;  
   ; 
   ;                                  //4us
   j=DQ;
   if(j) value|=0x80;
   delay(27);                             //63us
  }
  return(value);
}

//-------------------------------------------------
//启动温度转换函数
void get_temp()
{ 
int i;
DQ_HIGH();
reset();                                 //复位等待从机应答 
write_byte(0XCC);                        //忽略ROM匹配 
write_byte(0X44);                        //发送温度转化命令  
DQ_HIGH();
reset();                                 //再次复位,等待从机应答 
write_byte(0XCC);                        //忽略ROM匹配 
write_byte(0XBE);                        //发送读温度命令 
TLV=read_byte();                         //读出温度低8 
THV=read_byte();                         //读出温度高8位 
DQ_HIGH();
 if(THV>0x07) 
{TLV=~TLV+1;
 THV=~THV;
  t=1;
 } 
  else
 t=0;                             //释放总线 
TZ=(TLV>>4)|(THV<<4);               //温度整数部分
TX=TLV<<4;                               //温度小数部分
;
;
}
void main()//主程序
{
  uchar t1,t2;
  char z;
  init(); 
   ADCON1=0X0E;
   INTCON=0X00;
   INTCON2=0X40;
   INTCON3=0X00;
   TRISD=0X00;
   lcd_init();
  while(1)
  {
   get_temp();
   lcd_pos(0);                //设置显示位置为第一行的第1个字符
     z = 0;
    while(dis4[z] != '\0')
     {                         //显示字符"DIGITALVOLTMETER"
       lcd_wdat(dis4[z]);
       z++;
     }

    lcd_pos(0x40);             //设置显示位置为第二行第1个字符
     z = 0;
    while(dis5[z] != '\0')
     {
       lcd_wdat(dis5[z]);      //显示字符" VOLTAGE:  .  V "
       z++;
     }
    t1=TZ/10+0x30;
    t2=TZ%10+0X30;
if(t==1)
{
lcd_pos(0x46);
   
lcd_wdat(0x2d);
}
   lcd_pos(0x47);
   lcd_wdat(t1);
   lcd_pos(0x48);
   lcd_wdat(t2);
}
}

⌨️ 快捷键说明

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