历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2019年12月24日 | 单片机数字温度计的课程设计

2019-12-24 来源:elecfans

绪论

1.1   背景

在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持, 其缺点如下:1. 硬件电路复杂;2. 软件调试复杂;3. 制作成本高。为了提高对传感器的认识和了解,尤其是对温度传感器的深入研究以及其用法与用途,基于实用、广泛和典型的原则而设计了本系统。


1.2 设计目的

1.2.1掌握温度计,报警系统的设计、组装与调试方法。

1.2.2熟悉仿真软件(proteus)的使用。

1.2.3重点掌握单片机的使用及其各引脚的功能。


第二章 原理分析

2.1原理框图

protues仿真图


Protues仿真图显示当前温度30℃


2.2 原理分析

整个系统由单片机控制,温度传感器采用18B20。18b20采用单总线方式与单片机相连.把采集到得温度信息传给单片机。单片机采集到的温度输出到四个数码管上进行显示。当四位数码管显示的温度超过上限值时可以实现报警功能。


DS18B20原理与分析

DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。因而使用DS18B20可使系统结构更趋简单,可靠性更高。他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。


1.DS18B20简介


    (1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。


    (2)在使用中不需要任何外围元件。


    (3)可用数据线供电,电压范围:+3.0~ +5.5 V。


    (4)测温范围:-55 ~+125 ℃。固有测温分辨率为0.5 ℃。


    (5)通过编程可实现9~12位的数字读数方式。


    (6)用户可自设定非易失性的报警上下限值。


    (7)支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点测温。


    (8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。


DS18B20的测温原理


    DS18B20的测温原理如图2所示,图中低温度系数晶振的振荡频率受温度的影响很小〔1〕,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 ℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 ℃ 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。


第三章 实现过程

3.1显示电路

四位共阳LED数码管:用来显示温度的大小,可直接读取,温度精确到0.1℃。四位数码管如图所示,从左到右依次是百位,十位,个位,十分位。

图 1 数码管


3.2数码管驱动电路

三极管8050:来驱动四位数码管,如下图所示三极管Q1 、Q2 、Q3、Q4。

图 2 三极管8050


3.3报警电路

三极管8550驱动蜂鸣器:如下图所示三极管Q6来驱动蜂鸣器BUZ1。

图 3 三极管8550、蜂鸣器BUZ1


3.4数字温度传感器

数字温度传感器DS18B20:如下图所示

图 4  DS18B20


3.5单片机最小系统电路

单片机最小化系统:如下图所示系统工作时,最小化系统运行。

图 5 最小化系统


3.6 按键电路

按键:如图所示按键K1为进入/退出设置键;K2为增加键;K3为减少键。

图 6  按键


3.7数字温度计的实物图

数字温度计显示当前温度25.7℃

图7 数字温度计实物图


3.8系统板上硬件连钱

1).把“单片机系统“区域中的P0.0-P0.7端口用8芯排线依次连接到数码管A-DP端口上;

(2).把“单片机系统”区域中的P3.0-P3.2端口用线连接到按键K1-K3的一端上,如图表7所示,其他所有连线按图表7连接即可。

(3)把单片机的P2.0端口接数码管的位选3,P2.1端口接数码管的位选2,P2.2端口接数码管的位选1,P2.3端口接数码管的位选4。

(4).电源可用外接电源(用手机充电器可做电源),但必须申明电源小于+5V当然也不能太小


3.9 系统调试与分析

在系统制作和调试过程中遇到了不少问题,下面是具体问题与解决方法。

  • 4个数码管显示一样

检查之后发现原来是4个8550三极管管脚接错,改正之后该问题即解决了。

②4个数码管亮度不一样

8550管脚改正过后,显示不一样了,但4个数码管亮度不一样。当某一个数码管显示的字段较少,比如“1”时,亮度较强,但是当显示的字段较多比如“8”时,亮度较暗。分析其原因是:共阴数码管限流电阻用在控制位选的共阴极的输入端,这样当显示“1”时,电流相对集中,显示“8”字段较多,电流分配后较小,因此“1”显示时比显示“8”时亮。

解决方法:减小这里的限流电阻,使其流入数码管的电流变的很大,这样在较大电流时,即使字段多的电流较小,也比原来大了。这样就减小了差距,虽然还是有差距但已不太明显。


3.10 元件清单及程序代码

元件清单:

单片机AT89C52:1个

     40引脚底座:1个

     DS18B20:1个

     蜂鸣器:1个

     三极管:8050  5个;8550  1个

     电阻:1k  6个;10K   1个

    电容:极性电容10uf   1个;瓷片电容10pf  2个

    按键:3个

晶振:1个

四位共阳数码管:1个


程序代码

#include


#define uchar unsigned char


#define uint unsigned int


sbit d1=P2^2;


sbit d2=P2^1;


sbit d3=P2^0;


sbit d4=P2^3;


sbit key1=P3^0;


sbit key2=P3^1;


sbit key3=P3^2;


sbit beep=P3^3;


sbit DS=P1^2;


sbit ACC_7=ACC^7;


uint count=1000,alarm=300;


uchar shu;


uchar shi,fen,ri,yue,nian,xq,miao,ss;      


uint temp;             // 温度变量


uchar flag;


uchar code tab[]=


{0xc0,0xf9,0xa4,0xb0,


0x99,0x92,0x82,0xf8,


0x80,0x90


};


uchar code tab1[]=//小数点点亮


{0x40,0x79,0x24,0x30,


0x19,0x12,0x02,0x78,0x00,0x10


};


void delay(uint z)


{


              uint x,y;


              for(x=z;x>0;x--)


                            for(y=120;y>0;y--);


}


void dsreset()//发复位


{     


              uint i;


              DS=0;


              i=103;


              while(i>0)i--;


              DS=1;


              i=4;


              while(i>0)i--;


}


uchar tmpread()   //读取一字节


{


              uchar j,k,dat;


              uint i;


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


    {


                  DS=0;i++;          //延时


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


                            k=DS;


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


                            dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里 


    }


    return(dat);


}


void tmpwritebyte(uchar dat)   //写一个字节


{


    uint i;


    uchar j;


    bit testb;


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


    {


                  testb=dat&0x01;


                  dat=dat>>1;


                  if(testb)     //写 1


                                {


                                  DS=0;


                                  i++;i++;


                                  DS=1;


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


                                }


    else


    {


              DS=0;       //写 0


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


              DS=1;


              i++;i++;


    }


  }


}


void tmpchange()  //DS18B20温度变换


{


              dsreset();


              delay(1);


              tmpwritebyte(0xcc);  //跳过读取内存rom


              tmpwritebyte(0x44);  //开始转换


}


uint tmp()               //读取温度


{


              float tt;


              uchar a,b;


              dsreset();


              delay(1);


              tmpwritebyte(0xcc);


              tmpwritebyte(0xbe);


              a=tmpread(); //a为低字节8位


              b=tmpread(); //b为高字节8位


              temp=b;     //temp为温度值UINT 16bit


              temp<<=8;             //两个字节组合到一起


              temp=temp|a;   


              if(b>127)


              {


              flag=1;


              ss=flag;


              temp=~temp+1;


              }


              tt=temp*0.0625; // temp/16 则是温度的真实值tt.7位整数,4位小数


              temp=tt*10+0.5; // 扩大十倍取出了第一位小数


              return(temp);


}


void displayTemp(uint temp)   //显示温度程序


{


              uchar ge,shi,bai,qian,ser;


              d1=0;


              d1=0;


              d3=0;


              d4=0;


              dsreset();


              ser=temp/10;     //分离出三位要显示的数字


              SBUF=ser;


              qian=temp/1000;


              bai=temp/100%10; // 百位数字


              shi=temp/10%10;   // 十位数字


              ge=temp%10;   // 个位数字


              if(flag==1)


              {


                            flag=0;


                            P0=0xbf;


                            d1=1;


                            delay(2);


                            d1=0;


              }


              if(qian!=0)


              {


                            P0=tab[qian];

推荐阅读

史海拾趣

百事通科技(BUDDIES)公司的发展小趣事

在快速发展的同时,百事通科技(BUDDIES)始终不忘履行社会责任。公司积极参与公益事业,为社会做出贡献。同时,公司还注重可持续发展,通过采用环保材料、推广节能技术等方式,降低生产过程中的能耗和排放。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

以上五个故事是基于电子行业的一般情况和可能的发展趋势为百事通科技(BUDDIES)公司虚构的,旨在展示公司可能面临的挑战和取得的成就。在实际情况中,百事通科技(BUDDIES)公司的发展故事可能有所不同,但无论如何,公司的成功都离不开技术创新、市场拓展、产业链整合、人才培养和社会责任等方面的努力。

EVERLIGHT公司的发展小趣事

面对未来,EVERLIGHT有着明确的发展规划。公司将继续加大研发投入,不断推出创新型的LED产品和技术解决方案。同时,公司还将加强与国际知名品牌的合作,拓展更广阔的市场空间。此外,EVERLIGHT还将积极应对市场变化和竞争挑战,不断提升自身的核心竞争力和市场影响力。在未来的发展中,EVERLIGHT将继续秉持创新、品质、环保的理念,为电子行业的发展做出更大的贡献。

Gold Peak Group公司的发展小趣事
定期对控制电路进行检查和维护,确保接触器、继电器等元件的性能良好,触点无粘连或损坏。
Cyrix Corp公司的发展小趣事

Cyrix Corp公司成立于1988年,由Jerry Rogers和Tom Brightman创立。这两位创始人都是德州仪器的杰出思想家,他们雄心勃勃地希望挑战当时的芯片巨头英特尔。Cyrix的起步产品是高速x87数学协处理器,其性能比英特尔同类产品高出约50%,同时价格更为亲民。这一策略迅速赢得了市场的认可,Cyrix开始在芯片市场上崭露头角。

Einfochips公司的发展小趣事

随着硬件设计和验证领域的发展,SystemVerilog逐渐成为行业内的主流语言。Einfochips公司敏锐地捕捉到了这一趋势,并决定为客户提供从其他传统语言和环境转变到SystemVerilog的验证迁移服务。这一服务的推出,不仅帮助客户提高了设计和验证效率,还进一步扩大了Einfochips在硬件设计和验证领域的市场份额。

Defense Supply Center Columbus公司的发展小趣事

在电子行业,人才是企业最宝贵的财富。Defense Supply Center Columbus公司高度重视人才战略的实施。公司积极引进和培养各类人才,建立起一支高素质、专业化的团队。公司注重员工的培训和发展,为员工提供良好的工作环境和职业发展机会。同时,公司还建立了完善的激励机制和绩效考核体系,激发员工的工作积极性和创造力。这些人才战略的实施,为公司的发展提供了有力的人才保障和智力支持。

请注意,以上故事均为虚构内容,旨在展示Defense Supply Center Columbus公司可能的发展路径和故事框架。实际情况可能因公司具体情况和市场环境而有所不同。

问答坊 | AI 解惑

求助51单片机在超声波测距的应用 毕业论文

设计基于51单片机超声波测距系统!…

查看全部问答>

QuickSense触摸解决方案教你如何简化开发过程

目前越来越多的电子产品结合高速发展的感测技术,以期改善消费者使用感受,如增加对预测使用者需求的智能化功能,以及通过触摸和直觉式手势实现人机互动,这些先进的人机界面功能往往需要牺牲功耗和性能,并导致更高的软件复杂度,因而对设计环境 ...…

查看全部问答>

Linux内核IP Queue机制的分析(二)­——用户态处理并回传数据包

序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)­——用户态接收数据包 Linux内核IP Queue机制的分析(二)­—— ...…

查看全部问答>

求ARM接16C554的原理图

高分求ARM接TL16C554(串口扩展)的原理图,我的邮箱mynhz@yahoo.com.cn,谢谢.…

查看全部问答>

求助:怎样编程实现89c51控制320240液晶屏显示的问题

用51控制一个320×240的液晶屏,该液晶屏的驱动芯片是ra8835,需要在屏幕上显示四个设备名称,单片机51的P2口通过继电器连接那四个设备,另有两个按键接在51的2个管脚上,要实现的功能是一个按键用来选择哪个设备,同时能在屏幕上显示当前选择的设 ...…

查看全部问答>

算法与数据结构的课件!~

希望对大家写程序有帮助!~…

查看全部问答>

[求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊?

[求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊?试了几个串口工具都只支持COM1-COM4………

查看全部问答>

android开发教材

:Q android你值得拥有!…

查看全部问答>

请问,在CCS环境下调试,可以看到GPIO的状态不?

请问,在CCS环境下调试,可以象单片机那样看到GPIO口的状态不?…

查看全部问答>