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

📄 chengxu.txt

📁 pic16f629 与18B20 温度程序
💻 TXT
字号:
/***************************************
程序功能:温度显示
***************************************/
#include <pic.h>
void delay(unsigned char time)
  {
   unsigned char m,n;
     for(n=0;n<time;n++);
      for(m=0;m<2;m++); 
 }     
void Delay(void)  //延时,动态显示
{
   unsigned int i;
 for(i=4000;i>0;i--);
}
/***********************************************************
写一位数据子程序
************************************************************/
void write_bit(unsigned char bitval)
  {
      GPIO4=1;		//拉低DQ以开始一个写时序
      GPIO4=0;
    if(bitval==1)
       {
		// _nop_();
         GPIO4=1; 	//如要写1,则将总线置高
        }
      delay(6);  	//延时90us供DA18B20采样
      GPIO4=1;		//释放DQ总线
//	 _nop_();
//	 _nop_();
     }
/***********************************************************
写一字节数据子程序
***********************************************************/
void write_byte(unsigned char val)
 {
  unsigned char i;
  unsigned char temp;
  for(i=0;i<8;i++)		//写一字节数据,一次写一位
      {
     //   _nop_();
       temp=val>>i;		//移位操作,将本次要写的位移到最低位
       temp=temp&1;
       write_bit(temp);		//向总线写该位
       }
   delay(10);			//延时120us后
  }
/***********************************************************
读一位数据子程序
***********************************************************/
unsigned char read_bit(void)
 {
  unsigned char i,value_bit;
   GPIO4=0;			//拉低DQ,开始读时序
 //  _nop_();
   GPIO4=1;			//释放总线
  value_bit=GPIO4;
  return(value_bit);
  }
/***********************************************************
读一字节数据子程序
***********************************************************/
unsigned char read_byte(void)
  {
   unsigned char i;
   unsigned char value=0;
   for(i=0;i<8;i++)
      {
       if(read_bit())		//读一字节数据,一个时序中读一次,并作移位处理
         value|=0x01<<i;
       delay(15);		//延时80us以完成此次都时序,之后再读下一数据
       }
   return(value);
  }
/***********************************************************
复位子程序
***********************************************************/
unsigned char reset(void)
  { 
   unsigned char  presence;
   GPIO4=1; 
   delay(2);
   GPIO4=0;			    //拉低DQ总线开始复位
   delay(40);			//保持低电平480us
   GPIO4=1;			    //释放总线
   delay(8);			//等待芯片应答信号 75us
   presence=GPIO4;			//获取应答信号
   delay(4);	    	//延时以完成整个时序
   return(presence);	//返回应答信号,有芯片应答返回0,无芯片则返回1
  }

void main(void)
{  
unsigned char i,j,temper_low,temper_hi,temper,k=0,m=0;
double point=0,temper_=0;
  TRISIO=0X00;
  CMCON=0x07;
  GPIO=0XFF;
  GPIO1=0;
  GPIO2=0;
 // PSA=1;
 // PS0=0;
 // PS1=0;
//  PS2=1;
 while(1)
 { 
  PSA=1;
  PS0=0;
   PS1=0;
   PS2=1;
    Delay();
    Delay();
   CMCON=0x07;
   while(reset()!=0);
   i=0xcc;		//发送设备定位命令
   write_byte(i);
   CLRWDT();
   i=0x44;		//发送开始转换命令
   write_byte(i);
   delay(15);		//延时
   while(reset()!=0);//0为无反馈信号,再次复位
   i=0xcc;		//设备定位
   write_byte(i); 
   i=0xbe;		//读出缓冲区内容
   write_byte(i);
   CLRWDT();
   temper_low=read_byte();	//先读出高位
   temper_hi=read_byte();  	//后读出低位
   i=temper_hi<<4;	    	//舍弃高四位的符号位
   m=temper_low;
   CLRWDT();
   j=temper_low>>4;			//舍弃低四位的小数值
   m&=0x0f;
  if(m>=0x08)
 {  point=(m&0x07)*0.0625;
   point+=0.5;}
  else
   point=(m&0x07)*0.0625;
  temper=i|j;				//组合为一个字节0~127
   k+=1;
if(k>78)
{ 
  temper_=temper+point;
   if( temper_>42.1)
  {
    GPIO1=0;  
    GPIO2=1;           
    //Delay();
    Delay();
    GPIO1=1;              //红灯闪
//	Delay();
    Delay();
      }
  else
 {
      GPIO1=0; 
   // GPIO0=0;                //红灯亮
     //GPIO1=0; 				
     GPIO2=0;
   }
   CLRWDT();
    k=78;
}
}
}  

⌨️ 快捷键说明

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