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

📄 已调好.txt

📁 能测试温度并显示出来
💻 TXT
字号:
#include <reg52.h>
#include "intrins.h"                            //_nop_();延时函数用
#define  Disdata P0                            //段码输出口
#define  discan  P3                             //扫描口
#define uchar unsigned char
#define uint unsigned int

sbit DQ=P3^7;           //define interface 定义接口
sbit  DIN=P2^0;                              //LED小数点控制
uint temp;             // variable of temperature  定义一个变量

uchar flag1;            // sign of the result positive or negative 定
//义一个标志,标志温度是否还是正

//**************温度小数部分用查表法***********//
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//
uchar code dis_7[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6,0x9c};
//共阳LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"              
uchar code scan_con[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};    //列扫描控制字
uchar data temp_data[2]={0x00,0x00};             //读出温度暂放
uchar data display[7]={0x0c,0x0d,0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共5个数据和一个运算暂用

void delay(uint i)      //delay   延时子程序
{
    while(i--);
}


/*******************************************************************/
/*                          初始化ds18b2子函数*                      */
/*******************************************************************/
Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;                                         //DQ复位
 delay(8);                                       //稍做延时
 DQ = 0;                                         //单片机将DQ拉低
 delay(80);                                      //精确延时 大于 480us
 DQ = 1;                                         //拉高总线
 delay(14);
 x=DQ;                                           //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
}


/*******************************************************************/
/*                           读字节子函数                           */
/*******************************************************************/
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0;                                          // 给脉冲信号
  dat>>=1;
  DQ = 1;                                          // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return(dat);
}
/********************************************************************/
/*                            写字节子函数                                 */
/********************************************************************/
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
}

/*void tmpwritebyte(uchar dat)   //write a byte to ds18b20 给温度传感器写一个字节
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DQ=0;
      i++;i++;
      DQ=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DQ=0;       //write 0
      i=8;while(i>0)i--;
      DQ=1;
      i++;i++;
    }
  }
}*/

void tmpchange(void)                                        //DS18B20 begin change   发送温度转换命令
{
  Init_DS18B20();                                           //初始化DS18B20
  delay(200);                                                 //延时
  WriteOneChar(0xcc);                                       // 跳过序列号命令
  WriteOneChar(0x44);                                       //发送温度转换命令
}



/*void readrom()          //read the serial 读取温度传感器的序列号
{                      //本程序中没有用到此函数
  uchar sn1,sn2;
  Init_DS18B20();
  delay(1);
  WriteOneChar(0x33);
  sn1=ReadOneChar();
  sn2=ReadOneChar();
}*/

void delay10ms()            //delay           延时10MS子函数
  {
    uchar a,b;
    for(a=50;a>0;a--)
      for(b=60;b>0;b--);
   }
void display_led(uint tem)           //display       显示子函数
  {
  uchar n=0;
  uchar k;
  float tt;
  uchar a,b;
  Init_DS18B20();
  delay(1);
  WriteOneChar(0xcc);
  WriteOneChar(0xbe);                                      //发送读取数据命令
  a=ReadOneChar();                                         //连续读两个字节数据
  b=ReadOneChar();
temp_data[0]=a;
temp_data[1]=b;
 if(temp_data[1]>127) //正、负数判断
  {
    temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1; //负温度求补码
  }
  display[6]=temp_data[0]&0x0f;  //取低字节的低4位--小数部分
  display[2]=ditab[display[6]];  //存放小数部分
  display[6]=(((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4));//取整数部分
  display[5]=display[6]/100;     //取百位数
  display[6]=display[6]%100;     //
  display[4]=display[6]/10;      //取十位数
  display[3]=display[6]%10;      //取个位数

/******************符号位显示判断**************************/
  if(!display[5]) 
  {
    display[5]=0x0a;           //最高位为0时不显示
    if(!display[4])
  {
    display[4]=0x0a;        //次高位为0时不显示
  }
  }
  if(n){display[5]=0x0b;}      //负温度时最高位显示"-"

     for(k=0;k<6;k++)                     //4位LED扫描控制
  {
   Disdata=dis_7[display[5-k]];          //数据显示
   if ((5-k)==3){DIN=0;}
   else{DIN=1;}               //小数点显示
   discan=scan_con[k];                 //位选
   delay(190);
   discan=0xff;//延时
  }
   }

void main()                                 //主函数
{
  do
  {
    tmpchange();                           //温度转换,
    display_led();                        //显示温度值
  }
     while(1);
}

⌨️ 快捷键说明

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