基于8255的温度计单片机毕业设计.docx
《基于8255的温度计单片机毕业设计.docx》由会员分享,可在线阅读,更多相关《基于8255的温度计单片机毕业设计.docx(31页珍藏版)》请在冰豆网上搜索。
![基于8255的温度计单片机毕业设计.docx](https://file1.bdocx.com/fileroot1/2022-11/23/b0f43e48-aede-4033-a320-63edb976c342/b0f43e48-aede-4033-a320-63edb976c3421.gif)
基于8255的温度计单片机毕业设计
1课题任务、功能要求说明及总体方案………………………………………………10
1.1课题设计任务………………………………………………………………10
1.2功能要求说明…………………………………………………………………10
1.3方案的选择……………………………………………………………………10
1.4设计原理………………………………………………………………………11
2硬件系统的设计……………………………………………………………………13
2.1硬件系统各模块功能简要介绍………………………………………………13
2.2总体电路图、PCB图、元器件布局图………………………………………18
2.3元器件清单…………………………………………………………………18
3软件系统的设计……………………………………………………………………19
3.1使用硬件资源的情况……………………………………………………19
3.2各模块功能介绍………………………………………………………………19
3.3程序流程框图…………………………………………………………………19
3.4程序清单………………………………………………………………………22
4设计结论、仿真结果、误差分析……………………………………………………30
4.1设计结论及使用说明………………………………………………………30
4.2仿真结果………………………………………………………………………30
4.3误差分析………………………………………………………………………32
4.4设计体会………………………………………………………………………32
参考文献…………………………………………………………………………………34
致谢……………………………………………………………………………………35
附录一温度计总体电路图……………………………………………………………36
附录二PCB图………………………………………………………………………37
附录三元器件布局图…………………………………………………………………38
附录四元器件清单……………………………………………………………………39
1课题任务功能要求说明及方案选择
1.1课题设计任务
设计一个具有特定功能的数字温度计。
该数字温度计上电或按键复位后能自动显示系统提示符“P.”,进入准备工作状态。
测量温度范围0℃~99℃,测量精度小数点后一位,可以通过开始和结束键控制数字温度计的工作状态。
1.2功能要求说明
本次毕业设计所做的温度计所实现的功能有:
(1)在系统上电或按键复位后显示“P.”,进入准备工作状态。
(2)按开始键开始工作,按结束键系统停止工作。
1.3方案的选择
该系统主要由温度测量和数据采集两部分电路组成,实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。
(1)方案一
采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成,热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。
通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。
数据采集部分则使用带有A/D通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。
热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D转换电路,感温电路比较麻烦。
系统主要包括对A/D0809的数据采集,自动手动工作方式检测,温度的显示等,这几项功能的信号通过输入输出电路经单片机处理。
此外还有复位电路,晶振电路,启动电路等。
故现场输入硬件有手动复位键、A/D转换芯片,处理芯片为51芯片,执行机构有4位数码管、报警器等。
(2)方案二
采用数字温度芯片DS18B20测量温度,输出信号全数字化。
便于单片机处理及控制,省去传统的测温方法的很多外围电路。
且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。
在0—100摄氏度时,最大线形偏差小于1摄氏度。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。
这样,测温系统的结构就比较简单,体积也不大。
采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。
既可以单独对多DS18B20控制工作,还可以与PC机通信上传数据,另外AT89C51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用AT89C51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。
此温度控制系统先是DS18B20中数据经自身A/D转换后送入到单片机,然后经8255显示输出,如果需要修改温度参数或者是查看设置和其他功能,软件写入相关命令。
总体框图如图1.1所示。
图1.1DS18B20温度测温系统框图
从以上两种方案,容易看出方案一的测温装置可测温度范围宽、体积小,但是线性误差较大。
方案二的测温装置电路简单、精确度较高、实现方便、软件设计也比较简单,故本次设计采用了方案二。
1.4设计原理
此系统是为多子系统的综合性控制系统,设计过程中也是分块实现设计调试,最后进行综合实现,以下就从各子系统的工作原理进行分别进行说明。
如图1.2所示,首先器件上电复位,温度检测芯片DS18B20检测当前温度。
单片机从DS18B20中读出温度值,并与DS18B20非易失性存储器中的TH,TL值比较(其中TH为设定温度最高值,TL为设定温度最低值),经DS18B20显示输出当前温度值。
图1.2系统总体流程图
2硬件系统的设计
2.1硬件系统各模块功能简要介绍
2.1.1单片机主控制器AT89C51
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器,高性能CMOS8位微处理器。
AT89C51是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
外形及引脚排列如图2.1所示
主要特性:
·与MCS-51兼容
·4K字节可编程闪烁存储器
·寿命:
1000写/擦循环
·数据保留时间:
10年
·全静态工作:
0Hz-24MHz
·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路图2.1AT89C51引脚图
2.1.2可编程并行接口芯片8255
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚),如图2.2所示。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的
接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:
与CPU连接部分、与外设连接
部分、控制部分。
主要特性:
(1)一个并行输入/输出的LSI芯片,多功能的I/O
器件,可作为CPU总线与外围的接口.
(2)具有24个可编程设置的I/O口,即使3组8位的
I/O口为PA口,PB口和PC口.它们又可分为两组12
位的I/O口,A组包括A口及C口(高4位,PC4~PC7),
B组包括B口及C口(低4位,PC0~PC3).A组可设置为基本的I/O口,闪控(STROBE)的I/O闪控式,双向I/O3种模式;B组只能设置为基本I/O或闪控式
I/O两种模式,而这些操作模式完全由控制寄存器
的控制字决定。
图2.28255引脚图
2.1.3时钟电路模块
时钟电路由一个晶体振荡器12MHz和两个33pF的瓷片电容组成。
如图2.3所示,时钟电路用于产生单片机工作所需要的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就如一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地作。
图2.3时钟电路
单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
电容器C1和C2的作用是稳定频率和快速起振,电容值的范围在50pF~30pF,典型值为30pF。
晶振的频率通常选择两种6MHz和12MHz。
只要在单片机的XTAL1和XTAL2引脚外接晶体振荡器就构成了自激振荡器并在单片机内部产生时钟脉冲信号。
2.1.4复位电路模块
复位电路是使单片机的CPU或系统中的其他部件处于某一确定的初始状态,并从这上状态开始工作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位电路以重新启动。
本设计采用的是按键复位(如图2.4所示)。
按键复位是使复位端接电阻与VCC电源接通来实现的。
图2.4复位电路
2.1.5显示电路模块
本次设计中,采用LED四位一体——数码管,共有四个位控,八个段控,其中第一位为小数位,第二、三、四位分别为个、百位。
设计中采用共阳极接法,PB口做段控输出口,PA口做位控输出口,使用74LS244驱动。
此电路模块主要是用于显示温度,如图2.5所示。
图2.5显示电路
2.1.6温度传感模块
(1)DS18B20的介绍
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会发热烧毁,但不能正常工作;
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2.6所示。
DQ
图2.6DS18B20结构框图
(2)DS18B20的工作原理
DS18B20的测温原理:
器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20→发ROM功能命令→发存储器操作命令→处理数据。
(3)DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式。
为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
本设计采用电源供电。
双向数据传输口通过直接与单片机的I/O口相连,进行单片机控制DS18B20的初始化、读、写操作。
DS18B20与单片机的接口电路如图2.7所示。
图2.7DS18B20与单片机的接口电路
(4)温度传感模块的功能
DS18B20温度传感器负责采集外部环境的温度,通过单种线,由严格的时序控制将温度数据传给单片机。
2.1.7控制电路模块
在单片机控制电路中,可把单片机使用的键盘分为独立式和矩阵式两种。
独立式实际上就是一组独立的按键,这些按键可直接与单片机的I/O口连接,即每个按键独
占一条口线,这种接法简单。
矩阵式键盘也称行列式键盘,因为键的数目较多,所
以键按行列组成矩阵。
本设计中键盘数目较少,且为安装方便,因此在本设计中采
用独立式接法。
其中P3.2接的开始键,P3.3接的结束键。
如图2.8所示。
图2.8控制电路模块
2.2总体电路图、PCB图及元器件布局图
2.2.1总体电路图
总体电路图见附录一。
2.2.2PCB图
PCB图见附录二。
2.2.3元器件布局图
元器件布局图见附录三。
2.3元器件清单
元器件清单见附录四。
3软件系统的设计
3.1使用硬件资源的情况
本次数字温度计的设计使用到的硬件资源如下:
(1)P3.5口接ds18b20,P3.2为开始键,P3.3为结束键;
(2)P0口与8255总线接口电路相连,以最低两位地址作为8255的口选择端,对应A0和A1;
(3)P2.7作为连接8255片选信号接口;
(4)使用8255,四位LED显示器接口电路,PB口接数码管段控,PA口(PA1~PA3)接数码管位控;
3.2各模块功能简要介绍
3.2.1单片机主控制模块
功能:
AT89C52通过上电复位显示P.,按开始键后,启动DS18B20,然后读取DS18B20,将温度进行处理后经8255送给数码管,显示出对应温度值。
3.2.2温度传感器DS18B20模块
功能:
DS18B20通过对总线的控制进行初始化、写时序、读时序。
最后读出LSB、MSB字节中的温度数据。
通过总线传递给单片机。
3.2.3数码管显示模块
功能:
把从ds18b20读取的数据经过查表处理得到相应位断码后经8255把数据送到数码管显示出来。
3.3程序流程框图
(1)单片机主体控制流程框图3.1所示
(2)温度传感器DS18B20初始化程序流程图3.2所示。
(3)向温度传感器DS18B20写一字节程序流程图3.3所示。
(4)温度传感器DS18B20读出一字节程序流程图3.4所示。
(5)温度传感器DS18B20读取温度程序流程图3.5所示。
图3.1主程序流程图图3.2DS18B20初始化程序流程图
图3.3DS18B20写一字节程序流程图图3.4DS18B20读一字节程序流程图
图3.5DS18B20读取温度程序流程图
3.4程序清单
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#definePA0x7ffc//PA口位控
#definePB0x7ffd//PB口段控
#definecon0x7fff//控制字
sbitA8=P0^0;//地址线A0
sbitA9=P0^1;//地址线A1
sbitcs=P2^7;//片选;低电平有效
sbitwr=P3^6;//读端口
uinttemp;//温度数值
uchartplsb,tpmsb;//温度值低位、高位字节
sbitdate=P3^5;//数据通信线
ucharcodetableshi[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//数码管段选十位供阴1有效
ucharcodetablege[]=
{0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
//数码管段选个位带小数点,即dp=1
//ucharcodetablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//数码管位选
*******************************延时子程序*******************************
voiddelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
***************************DS18B20复位子程序****************************
voidinit()
{
uinti;
date=1;
delay
(1);
date=0;
i=100;//拉低约900us
while(i>0)i--;
date=1;//产生上升沿
i=4;
while(i>0)i--;
}
**************************等待应答脉冲子程序****************************
voidwait()
{
uinti;
while(date);
while(~date);//检测到应答脉冲
i=4;
while(i>0)i--;
}
*************************DS18B20读取一个位子程序************************
bitreadbit()
{
uinti;
bitb;
date=0;
i++;
date=1;
i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=date;
i=8;
while(i>0)i--;
return(b);
}
***************************DS18B20读取一个字节**************************
ucharreadbyte()
{
uchari,j,b;
b=0;
for(i=1;i<=8;i++)
{
j=readbit();
b=(j<<7)|(b>>1);//读出的数据最低位在最前面,这样刚好一个字节在DATE里
}
return(b);
}
*****************************DS18B20写一个字节子程序********************
voidwritebyte(ucharb)//
{
uinti;
ucharj;
bitbtmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1;//取下一位(由低位向高位)
if(btmp)//写1
{
date=0;
i++;i++;//延时,使得15us以内拉高
date=1;
i=8;
while(i>0)i--;//整个写1时隙不低于60us
}
else//写0
{
date=0;
i=8;
while(i>0)i--;//保持低在60us到120us之间
date=1;
i++;
i++;
}
}
}
*******************************温度转换子程序***************************
voidconvert()
{
init();//产生复位脉冲,初始化DS18B20
wait();//等待DS18B20给出应答脉冲
delay
(1);//延时
writebyte(0xcc);//跳过rom命令
writebyte(0x44);//convertT命令转换温度
}
*****************************DS18B20读取温度子程序**********************
uintreadtemp()
{
floattt;
init();//产生复位脉冲,初始化DS18B20
wait();//等待DS18B20给出应答脉冲
delay
(1);//延时
writebyte(0xcc);//跳过rom命令
ritebyte(0xbe);//readscratchpad读暂存器命令
tplsb=readbyte();//温度值低位字节(其中低4位为二进制的"小数"部分)
tpmsb=readbyte();//温度值高位字节(其中高5位为符号位)
temp=tpmsb;
temp<<=8;//合成一个字
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
returntemp;
}
******************************显示子程序********************************
voiddisplay(uinttemp)
{
ucharA1,A2,A3;
A1=temp/100;百位
A2=temp/10%10;十位
A3=temp%10;个位
wr=1;
XBYTE[PA]=0x20;//选通第一位数码管
wr=0;
delay
(1);
wr=1;
XBYTE[PB]=tableshi[A1];//显示百位
wr=0;
delay(10);
wr=1;
XBYTE[PA]=0x00;//关掉显示百位
wr=0;
wr=1;
XB