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

📄 wendu.c

📁 51系列单片机18b20温度传感器的C语言程序。
💻 C
字号:
//难点在于如何输出正确的数据

//问题是 怎么让串口发送一个数组数据??????????
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char 
sbit dq=P3^3;
sbit beep=P3^7;
uchar u[]={0x00,0x00,0x00,0x00};
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};
uchar code xiaoshu_table[]={0x00,0x06,0x12,0x18,0x25,0x31,0x37,0x43,0x50,0x56,0x62,0x68,0x75,0x81,0x87,0x93};
//uchar code baojingshujv[]="wendudaole";
uchar temp;
uchar xiaoshu;
uchar baojing;


void delay(uchar i) //90=592us;8=64us
{
  while(i--);
}

void us6delay()
{
  _nop_(); 
  _nop_();  
   
  
 }

void xianshi()
{  uchar gewei,shiwei,ling1,ling2,q=10;
   gewei=temp%10;
   shiwei=temp/10;
   ling1=xiaoshu/10;
   ling2=xiaoshu%10;
   baojing=gewei+shiwei*10;
  
   
while(q--){
   P2=0xfd;
   P0=(table[gewei]&0x7f);
   delay(80);
   P2=0xfe;
   P0=(table[shiwei]);
   delay(80);
/********* 

小数部分

**********/
  
  
  P2=0xfb;
  P0=(table[ling1]);
  delay(80);
  P2=0xf7;
  P0=(table[ling2]);
  delay(80);

}
 
}




bit reset() 
{ 
  bit flag;
  dq=1;
  _nop_(); 
  dq=0;
  delay(100);
  dq=1;//释放总线
  delay(8);
  flag=dq;
  delay(100);  //没延时就会一直处于低电平这里错了
 
  return flag;
}




void write_byte(uchar date) //低字节开始
{ uchar i;
  for(i=8;i>0;i--)
  { dq=1;
    _nop_();
    dq=0;
    _nop_(); 
    if(date&0x01)
    dq=1;
    else dq=0;
    delay(8);
    date>>=1;
  }

}


uchar read_byte()
{ uchar i,temp;
  for(i=8;i>0;i--)
  { temp>>=1;
    dq=1;
    _nop_();
    dq=0;
    _nop_();
    dq=1;  //释放总线
    us6delay();
    if(dq)
    temp|=0x80;
    delay(8);
    
  }

  return temp;
}

/***************************
数据转换是以16进制补码的方式存放的,有2个字节。是BCD码存放的。



**************************/
void fengming()
{ uchar i;
  for(i=180;i>0;i--)
  { beep=!beep;
    delay(20);
  }
}

uchar u123()
{ 
  while(reset()); //一直到产生低字节
  write_byte(0xcc);//跳过rom
  write_byte(0x44);//开始转化温度
  while(reset());
  write_byte(0xcc);
  write_byte(0xbe);
  u[0]=read_byte();
  u[1]=read_byte();
  u[2]=(u[0]>>=4)|(u[1]<<=4);
  
  temp=u[2];
  u[3]=u[0]&0x0f;
  xiaoshu=xiaoshu_table[u[3]%10];
  
  return temp;
}

void inti_chuankou()
{ EA=1;
  ES=1;
  //IE=0x90;
  TMOD=0x20; //定时器1工作于1
  TH1=0xfa;
  TL1=0xfa;
  TR1=1;
  SCON=0x40;
  PCON=0x80;
}

void main()
{ 
  
  inti_chuankou();
  
 while(1)
 {

	 u123();
	 xianshi();
	 if(baojing>=33)
	 { fengming();
      
         SBUF='a';
      
     }

 }



}


void time0() interrupt 4
{  if(TI)
   TI=0;

}

⌨️ 快捷键说明

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