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

📄 tem_test.c

📁 温度传感器的详细说明
💻 C
字号:
/*----------------------------------www.ucdev.cn-----------------------------------------
                      ╔=======================================╗
                      ┆     ICE51-100开发板配套实验学习例程  ┆
                      ┆             Version 0.0.1            ┆
                      ┆                                      ┆
                      ┆               艾斯电子               ┆
                      ┆                                      ┆
                      ┆          http://www.ucdev.cn         ┆
                      ┆         E-mail:sales@ucdev.cn        ┆
                      ╚=======================================╝
*********************************** 程序功能说明 *******************************************
数码管显示当前温度
********************************************************************************************/

#include <reg52.h>
#define  uchar  unsigned char

sbit DQ =P3^7; //18B20数据线引脚

//数码管显示的段码表
//uchar code table[] ={0x84,0xBD,0xE0,0xB0,0x99,0x92,0x82,0xBC,0x80,0x90};
uchar code table[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                 //   0    1    2    3    4    5    6    7    8    9    
//uchar code table_d[]={0x04,0x3D,0x60,0x30,0x19,0x12,0x02,0x3C,0x00,0x10};
uchar code table_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
                  //   0    1    2    3    4    5    6    7    8    9    

uchar dispbuf[4]; //显示缓冲区   
uchar  temper[2];//存放温度的数组       

void seg_scan();               

/*****************************延时函数**************************/

void delay (unsigned int us)  
{
  while(us--);
}

void reset(void)   //复位
{
  uchar x=0;
  DQ = 1;
  delay(8);   //稍做延时
  DQ = 0;
  delay(80);   //精确延时 大于 480us
  DQ = 1;   //拉高总线
  delay(14);
  x=DQ;
  delay(20);
}
/**********************从DS18B20读一字节***************/
uchar readbyte(void) //读1字节
{
  uchar i=0;
  uchar dat=0;
  for (i=8;i>0;i--)
  {
    DQ = 0;
    dat>>=1;
    DQ = 1;
    if(DQ)
    dat|=0x80;
    delay(4);
   }
  return(dat);
 }
/***********************向DS18B20写一字节***********************/
void writebyte(unsigned char dat) //写1字节
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
   DQ = 0;
   DQ = dat&0x01;
   delay(5);
   DQ = 1;
   dat>>=1;
   }
 delay(4);
}
/***********************CPU读取温度值***************************/
void readtemp(void) //读取温度
{
  uchar a=0,b=0;
  reset();

  seg_scan();

  writebyte(0xCC); // 跳过序列号
  writebyte(0x44); // 启动温度转换
  reset();
 
  seg_scan();
  
  writebyte(0xCC);
  writebyte(0xBE); //读9个寄存器,前两个为温度

  seg_scan(); 

  a=readbyte();   //低位
  b=readbyte();   //高位

  seg_scan();

  temper[0]=a&0x0f;
  a=a>>4;         //低位右移4位,舍弃小数部分
  temper[1]=b<<4;         //高位左移4位,舍弃符号位
  temper[1]=temper[1]|a;
  }

/******************************显示*************************/

void seg_scan()
{    
  int i,j=0xFE;
  int dispdata;
  for(i=0;i<4;i++)
    {
     P2=j;
     dispdata=dispbuf[i];
     if(i==1)
       P0=table_d[dispdata];
     else
       P0=table[dispdata];
     delay(500);
     j=(j<<1)|0x01;
     if(j==0xEF)j=0xFE;
     }  
}

/*******************************主函数***********************/

main()
{ uchar i;
  uchar temp;
  float backbit;   
  for(i=0;i<4;i++)
   dispbuf[i] = 0;
  while(1){
       readtemp();//读18B20
       backbit = temper[0];//换成浮点数
       backbit = backbit * 6.25;//乘以0.0625*100
       temp = backbit;//取低2位整数部分
       dispbuf[3] = temp%10 ;
       
       temp = temp/10;
       dispbuf[2] = temp%10 ;
       
       temp = temper[1];//取整数部分
       dispbuf[1] = temp%10;
       
       temp = temp/10;
       dispbuf[0]= temp%10;
       
	   seg_scan(); //显示扫描 
  }
}

/********************************结束************************/

⌨️ 快捷键说明

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