编程实现单片机ds18b20温度测量及显示系统

2020-01-21来源: 51hei关键字:编程  单片机  ds18b20  温度测量  显示系统
  • 利用开发板上的ds18b20传感器测量当前温度,利用数码管输出当前温度值。

实现结果:

河南11选5_[官网入口]测试结果显示当前摄氏温度25.3度。

实现原理:

(1)独立数码管

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

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

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

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

数码管控制主要通过段锁存和位锁存控制显示要显示的数字如温度。段锁存是指6位共阴极数码管段输出端连接锁存器74HC573的输出端,锁存器的输入端连接单片机接口P0。河南11选5_[官网入口]位锁存是指6位数码管位置输出端连接锁存器74HC573的输出端,锁存器的输入端连接单片机接口P0。河南11选5_[官网入口]段锁存器片选端接单片机接口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

[1] [2]
关键字:编程  单片机  ds18b20  温度测量  显示系统 编辑:什么鱼 引用地址:http://news.estoresdeals.com/mcu/ic486354.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于状态机的51单片机独立按键检测与消抖思路
下一篇:16x16音乐频谱(源代码 原理图)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR的C语言优秀编程风格
有一位编程大师,他写非结构化的程序,一位初学者刻意模仿他,也写非结构化的程序。河南11选5_[官网入口]当他让大师看他的进步时,大师批评了他的非结构化程序:“ 对一位编程大师合适的东西未必对一个初学者同样合适,在超越结构化之前,你必须理解编程之道。” 我个人认为作为一个初学者应该踏踏实实的打好程序设计的基础,不要急功近利,舍本逐末。河南11选5_[官网入口]我走过不少弯路,希望大家能和我一样能牢记编程大师的忠告:“对编程大师合适的东西未必对一个初学者同样合适”。本文所描述的优秀编程风格适合于大部分语言,文章中可能提到你不是很了解的概念,没有关系,你放心的读下去,当你使用AVR一个月之后,你什么都明白了。AVR c语言优秀编程风格文件结构模块化的程序应该是有一个很好
发表于 2020-02-04
MSP430单片机GPIO编程入门教程
在本教程中,我们将一起学习MSP430单片机GPIO的编程方法。本文也适用于Launchpad开发板上使用的MSP430x2xx器件,如MSP430G2553、MSP430G2231等。MSP430单片机上的大多数引脚被分组为最多8个端口, P1到P8。每个端口都是8位宽,并有8个相关的I / O引脚。这些引脚直接映射到相应的端口寄存器,因此可以独立操作I / O引脚。只有端口P1和P2中的引脚支持中断。 此外,每个I / O引脚还具有可配置的上拉和下拉电阻。 每个端口都有一组相关的寄存器,用来操作各个引脚。 位映射和端口分组如下所示:注意:在编程指南/数据手册中使用的引脚的命令约定是’Px.y’,其中’x’对应的是端口号
发表于 2020-02-04
MSP430单片机GPIO编程入门教程
MSP430编程器仿真器以及JTAG、SBW、BSL接口的区别
对于51系统来说,很容易理解编程器和仿真器。通俗的说,仿真器是用来调试仿真的,编程器是用来批量生产时对MCU进行烧写目标代码的。对于MSP430来说,无论仿真还是烧写程序一般可以通过:JTAG、SBW、BSL接口进行。JTAG、SBW接口可以用于仿真接口,BSL接口不能用于仿真。而编程器则三种接口都支持。所以并不能说JTAG只支持仿真不支持编程,这是概念错误,JTAG仅仅是一种接口协议而已。下面简单描述一下三种接口的区别:1、JTAG是边界扫描技术,其在430内部有逻辑接口给JTAG使用,内部有若干个寄存器连接到了430的内部数据地址总线上,所以可以用JTAG访问430内部的所有资源,包括对FLASH的读写操作。所以可以用
发表于 2020-02-04
PIC单片机编程 (点灯程序)
IO口控制方向寄存器 TRISA~TRISAE            比如 TRISB=0x00; //  1为输入,0为输出,这样就把portB端口全部设为输出数据寄存器 PORTA~PORTE            比如  PORTB=0x01; // 1为置高,0为置低,这样就把portB1口置高,其它portB口置低例:点灯程序#include<pic.h>__CONFIG (0x3B31);//  pic单片机需要进行寄存器配置,详见手册&nb
发表于 2020-01-31
STM8S103F单片机编程——在C文件中嵌入汇编代码
最近在使用STM8S103F单片机,需要在C程序中嵌入汇编代码。经过搜索,找到下面的解决方法。方法1:方法2:上面的内容摘自COSMIC的安装目录下,COSMICCXSTM8_32KDocsCXSTM8_UsersGuide.pdf
发表于 2020-01-31
STM8S103F单片机编程——在C文件中嵌入汇编代码
如何在ATE中集成对PIC单片机的编程烧写功能
做ATE,要对DUT内部的PIC单片机进行在线烧写,在网上看到别人的一个说法(作者 Claud Zhang),内容如下:---------------------------------------------------------一种简单高效低成本的Microchip MCU编程方法                                   Claud Zhang对于一些研发工程师来说,工厂的的MCU编程有时候是个比较头疼的问题.在研发
发表于 2020-01-30
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 estoresdeals.com, Inc. All rights reserved

页面底部区域 foot.htm