历史上的今天
返回首页

历史上的今天

今天是:2025年01月21日(星期二)

正在发生

2020年01月21日 | 编程实现单片机ds18b20温度测量及显示系统

2020-01-21 来源:51hei

  • 利用开发板上的ds18b20传感器测量当前温度,利用数码管输出当前温度值。

实现结果:

测试结果显示当前摄氏温度25.3度。

实现原理:

(1)独立数码管

数码管分为共阳极和共阴极数码管,

通过控制数码管中的8个二极管,来显示数字。

(2)多位共阴数码管和共阳数码管

本项目使用的是6位共阴数码管。

数码管控制主要通过段锁存和位锁存控制显示要显示的数字如温度。段锁存是指6位共阴极数码管段输出端连接锁存器74HC573的输出端,锁存器的输入端连接单片机接口P0。位锁存是指6位数码管位置输出端连接锁存器74HC573的输出端,锁存器的输入端连接单片机接口P0。段锁存器片选端接单片机接口P2.6,位锁存器片选端接单片机接口P2.7。

连接图如下:





程序分析:温度传感器DS18B20接单片机P2.2,段锁存接P2.6,位锁存接P2.7,unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

显示段码值0~9,Unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

分别对应相应的数码管点亮,即位码。

温度传感器的程序有测温的程序,测得的温度通过数码管显示出来。其中使用了延时和中断子程序。

  • 用液晶屏1602实现温度显示。

  • 利用按键实现摄氏温度和华氏温度的转换,并显示。

实现结果:

按下S2,显示摄氏温度如下

按下S2,显示华氏温度如下



实现原理:

在之前的温度显示模块加入按键功能程序,利用两种温度转换公式华氏温度=(摄氏温度*9/5)+32实现转换。

相关程序如下:

void display(uint temp,uint hstemp)                                          //显示程序

{


   if(s2==0)                           

   {


   ser=temp/10;

   SBUF=ser;

   A1=temp/100;

   A2t=temp%100;

   A2=A2t/10;

   A3=A2t%10;

   dula=0;

   P0=table[A1];                            //显示百位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7e;

   wela=1;

   wela=0;

   delay(1);


   dula=0;

   P0=table1[A2];                            //显示十位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7d;

   wela=1;

   wela=0;

   delay(1);


   P0=table[A3];                            //显示个位

   dula=1;

   dula=0;


   P0=0x7b;

   wela=1;

   wela=0;

   delay(1);

   }

   if(s3==0)

   {

             

   ser1=hstemp/10;

   SBUF=ser1;

   A11=hstemp/100;

   A21t=hstemp%100;

   A21=A21t/10;

   A31=A21t%10;

   dula=0;

   P0=table[A11];                            //显示百位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7e;

   wela=1;

   wela=0;

   delay(1);


   dula=0;

   P0=table1[A21];                            //显示十位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7d;

   wela=1;

   wela=0;

   delay(1);


   P0=table[A31];                            //显示个位

   dula=1;

   dula=0;


   P0=0x7b;

   wela=1;

   wela=0;

   delay(1);

   }

}


程序分析:s2,s3代表按键分别接在单片机P3.4,p3.5上,当按键按下时单片机相应接口显示低电平,松开显示高电平。当检测到S2按下时,显示摄氏温度。当检测到S3按下时,显示华氏温度。主程序如下:

if(s2==0)

  {

  SendByte(A1*10+A2);

  SendStr(".");

  SendByte(A3);


  }

  if(s3==0)

  {            

                SendByte(A11*10+A21);

                 SendStr(".");

  SendByte(A3);

  }

  • 利用串口将当前温度值发送至电脑,电脑端利用串口助手进行接收和显示。

实现原理:

连接好串口或者usb转串口至电脑,下载该程序,打开电源, 打开串口调试程序,将波特率设置为9600,无奇偶校验,晶振11.0592MHz,发送和接收使用的格式相同。

串口通讯程序包括串口初始化,输出字节函数,输出字符串函数,主函数。温度传感器测得的温度数值通过串口通讯程序输出显示在电脑上。

实现结果:

当按下S2按键,电脑显示如下:

发送和接收都是16进制,1B=1*16+11*1=27,2E代表小数点,01=1,所以显示温度27.2摄氏度。

当按下S3按键,电脑显示如下:

发送和接收都是16进制,51=5*16+1*1=81,2E代表小数点,03=3,所以显示温度81.3华氏。

单片机源程序如下:

//安装目录下的EXE文件打开后可在电脑上显示当前温度值

#include

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2;           //define interface

uint temp;             // variable of temperature

uchar flag1;            // sign of the result positive or negative

sbit dula=P2^6;

sbit wela=P2^7;

sbit s2=P3^4;

sbit s3=P3^5;

uchar A1,A2,A2t,A3,ser,A11,A21,A21t,A31,ser1;

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

                        0x87,0xff,0xef};



void SendStr(unsigned char *s);

/*------------------------------------------------

                    串口初始化

------------------------------------------------*/

void InitUART  (void)

{


    SCON  = 0x50;                                    // SCON: 模式 1, 8-bit UART, 使能接收 

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装

    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz 

    TR1   = 1;                  // TR1:  timer 1 打开                        

    EA    = 1;                  //打开总中断

    //ES    = 1;                  //打开串口中断

}        

void delay(uint count)      //delay

{

  uint i;

  while(count)

  {

    i=200;

    while(i>0)

    i--;

    count--;

  }

}

void DelayUs2x(unsigned char t)

{  

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{


while(t--)

{

     //大致延时1mS

     DelayUs2x(245);

              DelayUs2x(245);

}

}

///////功能:串口初始化,波特率9600,方式1///////

void Init_Com(void)

{

     TMOD = 0x20;

     PCON = 0x00;

     SCON = 0x50;

     TH1 = 0xFd;

     TL1 = 0xFd;

     TR1 = 1;

}


void dsreset(void)       //send reset and initialization command

{

  uint i;

  DS=0;

  i=103;

  while(i>0)i--;

  DS=1;

  i=4;

  while(i>0)i--;

}


bit tmpreadbit(void)       //read a bit

{

   uint i;

   bit dat;

   DS=0;i++;          //i++ for delay

   DS=1;i++;i++;

   dat=DS;

   i=8;while(i>0)i--;

   return (dat);

}


uchar tmpread(void)   //read a byte date

{

  uchar i,j,dat;

  dat=0;

  for(i=1;i<=8;i++)

  {

    j=tmpreadbit();

    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里

  }

  return(dat);

}


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

    {

      DS=0;

      i++;i++;

      DS=1;

      i=8;while(i>0)i--;

    }

    else

    {

      DS=0;       //write 0

      i=8;while(i>0)i--;

      DS=1;

      i++;i++;

    }


  }

}


void tmpchange(void)  //DS18B20 begin change

{

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);  // address all drivers on bus

  tmpwritebyte(0x44);  //  initiates a single temperature conversion

}


uint tmp()               //get the temperature

{

  float tt;

  uchar a,b;

  dsreset();

  delay(1);

  tmpwritebyte(0xcc);

  tmpwritebyte(0xbe);

  a=tmpread();

  b=tmpread();

  temp=b;

  temp<<=8;             //two byte  compose a int variable

  temp=temp|a;

  tt=temp*0.0625;

  temp=tt*10+0.5;

  return temp;

}


void readrom()          //read the serial

{

  uchar sn1,sn2;

  dsreset();

  delay(1);

  tmpwritebyte(0x33);

  sn1=tmpread();

  sn2=tmpread();

}



void delay10ms()            //delay

  {

    uchar a,b;

    for(a=10;a>0;a--)

      for(b=60;b>0;b--);

   }


void display(uint temp,uint hstemp)                                          //显示程序

{


   if(s2==0)                           

   {


   ser=temp/10;

   SBUF=ser;

   A1=temp/100;

   A2t=temp%100;

   A2=A2t/10;

   A3=A2t%10;

   dula=0;

   P0=table[A1];                            //显示百位

   dula=1;

   dula=0;


   wela=0;

   P0=0x7e;

   wela=1;

   wela=0;

推荐阅读

史海拾趣

Chip Quik公司的发展小趣事

Chip Quik公司在电子行业初创时,以其独特的芯片焊接技术脱颖而出。该公司研发了一种新型的低温焊接材料,能够在不损坏周围元件的情况下快速、准确地修复或更换芯片。这一创新技术迅速吸引了电子维修市场的关注,公司借此机会成功进入市场。

Amaze Electronics Pte Ltd公司的发展小趣事

在电子行业的快速发展中,Amaze Electronics Pte Ltd以其前瞻性的技术创新赢得了市场的认可。公司投入大量研发资源,成功开发出了一款高效能、低能耗的智能手机芯片。这款芯片不仅大幅提升了手机的运行速度,还显著降低了能耗,为用户带来了更流畅的使用体验。凭借这一技术创新,Amaze Electronics迅速在市场上脱颖而出,赢得了众多手机制造商的合作意向。

Artesyn Embedded Technologies公司的发展小趣事

随着5G技术的商用化,电子行业迎来了新的发展机遇。Artesyn Embedded Technologies敏锐地把握住了这一机遇,积极研发适应5G时代需求的电源和嵌入式计算解决方案。公司推出的新产品不仅满足了5G设备对高效、稳定电源的需求,也为公司在5G时代的发展奠定了坚实的基础。

Aydin Corp公司的发展小趣事

Aydin Corp公司诞生于电子行业的初期,当时的市场充满了机遇与挑战。创始人凭借对电子技术的深厚理解和对市场需求的敏锐洞察,决定投身于这一领域。初创时期,公司面临着资金短缺、技术瓶颈和市场竞争等多重困难。然而,通过不懈的努力和持续的创新,Aydin Corp逐渐在市场中站稳了脚跟。

Excelitas公司的发展小趣事

在当今社会,绿色环保和可持续发展已成为企业发展的重要趋势。Excelitas公司积极响应这一趋势,致力于研发和生产绿色环保的产品。通过采用环保材料和生产工艺,公司成功降低了产品的能耗和排放。同时,公司还积极参与环保公益活动,倡导绿色生活方式。这些举措不仅提升了公司的品牌形象,还为社会的可持续发展做出了积极贡献。

请注意,以上故事仅为基于假设和一般行业趋势构建的框架性描述,并不代表Excelitas公司的实际发展历程。如有需要,建议您查阅相关官方资料或新闻报道以获取更准确的信息。

General Microcircuits Corp公司的发展小趣事
对于温度敏感的电路,可以采用温度补偿技术来减小因温度变化引起的漂移。

问答坊 | AI 解惑

某一个放大电路在输入端加入的信号电压值不变

某一个放大电路在输入端加入的信号电压值不变…

查看全部问答>

能推荐个好的gps模块吗

最近要用gps模块做同步授时,哪位用过给推荐下。天线越小越好…

查看全部问答>

PCI封装 规范

各位高手好。 最近在做PCI卡,小弟请教一下您PCI卡的尺寸/规范,以及电路封装。 谢谢您的帮助。 我的邮箱:wangwei4611@163.com …

查看全部问答>

evc开发基于对话框的小程序,如何改变菜单的背景颜色?

evc开发基于对话框的小程序,如何改变菜单的背景颜色? 在WinCe5.0模拟器下跑。 …

查看全部问答>

linux c嵌入汇编编译报错

__asm__(\"ldw 0(%0), %%r0\" : : \"r\" (addr)); 就这段代码,是从内核中拿来用的。 20   21#define ARCH_HAS_PREFETCH   22static inline void prefetch(const void *addr)   23{   24  &nbs ...…

查看全部问答>

s7-200 如何实现正弦曲线的输出

PLC  西门子 S7-200 PLC经过PID调节,输出变频器的频率控制容器压力。 现在想在升压的过程中,让压力值按照正弦曲线上升,如何编程?请给个思路。…

查看全部问答>

directshow问题

各位大侠帮忙看看这个问题 http://topic.eeworld.net/u/20090210/18/09cb0f9d-cf2c-49c9-a84e-29d981e9a4e9.html …

查看全部问答>

請問哪有Tornado 2.2 for pcPentium的下載?

請問哪有Tornado 2.2 for pcPentium的下載?…

查看全部问答>

使用spi1端口怎么使mosi端口保持高低电平

                                 如题…

查看全部问答>

TI永磁同步BLDC电机控制FOC控制方案演示

$(\'swf_a8M\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMjk4NTk3Mjcy/v.sw ...…

查看全部问答>