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

📄 1820.c

📁 利用PIC单片机和DS18B20实现了温度的测量
💻 C
字号:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ RC0
char buffer1[2];//the resut of temperature read from 18b20
char buffer;
unsigned int i,n;
void ini_io();
void write_1();
void write_0();
uchar read_18b20();
void write_18b20(uchar);
void handle_temperature();
void read_temperature();
void reset_18b20();
void delay_us(uchar t);//delay (t*3+7)us
/***************************/
void ini_io()
{
 TRISB=0;
 TRISC=0x01;
}
/********************/
void write_0()
{
  TRISC = 0x01;asm("nop");  
  TRISC=0;asm("nop");  
  DQ=0;
  delay_us(18);
  TRISC=0x01;
  asm("nop");asm("nop");
 }
/*************************/
void write_1()
{
  TRISC = 0x01;asm("nop"); 
  TRISC=0;asm("nop"); 
  DQ=0;
  delay_us(1);
 TRISC = 0x01 ;
  delay_us(20);
 }
/**************************/
void reset_pulse()
{

 TRISC=0;asm("nop");
 DQ = 0;
 delay_us(165);    //精确延时大于480us 
 TRISC=0x01;
 delay_us(10);
 while(DQ==1); 
 delay_us(26);     //延时70us
}
/***************************/
void write_18b20(uchar qq)
{ 
 for(i=0;i<8;i++)
{
  if((qq&0x1)==1)
   write_1();
  else 
   write_0();
   qq=qq>>1;
 }
}
/***************************/ 
 uchar read_18b20()
 {
  uchar date,tt;
  TRISC = 0x01;asm("nop"); 
 for(tt=8;tt>0;tt--)
 { 
   date>>=1;
  TRISC=0;asm("nop");  
   DQ=0;
   delay_us(1);
   asm("nop");asm("nop");asm("nop");asm("nop");
  TRISC = 0x01;asm("nop");   
   asm("nop");asm("nop"); asm("nop");asm("nop");
   if (DQ==1) date|=0x80;
   delay_us(20);
  }
  return date;
} 
/***********************/
 void read_temperature()
 {
   buffer=0xcc;
   write_18b20(buffer);
   buffer=0xbe;//read scratchpad 
   write_18b20(buffer);
   buffer1[0]=read_18b20();//the TL
   buffer1[1]=read_18b20();//the TH
   buffer=((buffer1[0]&0xf0)>>4)|((buffer1[1]&0x0f)<<4);
  }

/******************/
void delay_us( uchar  j) //精确延时3j+7个时钟周期
{						//注意j的值不能大于255
 	unsigned char i;
 	i = j;
   	while(--i)
      {
       ;
      }
}
/*************************/
void main()
{
 ini_io();
 while(1)
 {
  reset_pulse();
  buffer=0xcc;//skip rom 
  write_18b20(buffer);
  buffer=0x44; //start convert
  write_18b20(buffer);
  reset_pulse();
  read_temperature();
  PORTB=buffer;
  }
}

⌨️ 快捷键说明

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