数字温度计课程设计.docx
《数字温度计课程设计.docx》由会员分享,可在线阅读,更多相关《数字温度计课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
数字温度计课程设计
单片机原理及系统课程设计
专业:
电气工程及其自动化
班级:
姓名:
学号:
指导教师:
评语:
平时(40)
修改(30)
报告(30)
总成绩
兰州交通大学自动化与电气工程学院
2012年7月1日
基于51单片机数字温度计设计
1数字温度计的设计要求与设计方案
1.1基本设计要求
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89C52,测温传感器使用DS18B20,用1602液晶实现温度显示,能准确达到以上要求。
1.2性能指标
(1)基本范围-50℃-110℃;
(2)精度误差小于0.5℃;
(3)液晶LCD显示;
(4)可以设定温度的上下限报警功能。
2数字温度计系统的硬件设计
2.1数字温度计硬件框图
数字温度计系统硬件框图如图2.1所示。
图2.1系统的硬件框图
2.2AT89C52单片机
AT89C52单片机引脚配置图,如图2.2所示。
图2.2AT89C52引脚配置截图
2.3总设计图
数字温度计系统的硬件总设计图如图2.3所示。
图2.3总设计图
如图2.3所示,AT89C52的时钟电路是单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。
通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取33pF)。
构成一个稳定的自激振荡器。
AT89C52的按键复位操作,若要复位,只要按图中的RESET键,电源VCC经电阻分压,在RESET端产生一个复位高电平。
显示电路对于现实电路我们采用LCD1602液晶显示。
故障状态指示电路本设计采用发光二级管以及蜂鸣器对运行方式进行指示,可清楚看到系统的故障状态。
3数字温度计系统的软件设计及系统整体流程
3.1总体流程图
数字温度计系统总体流程图如图3.1所示。
图3.1主流序流程图
3.2子程序流程图
数字温度计系统子程序主要包含:
读温度子程序、转换温度子程序、计算温度子程序。
3.2.1读温度子程序流程图
读温度子程序流程图如图3.2所示。
图3.2读温度子程序流程图
3.2.2转换温度子程序流程图
转换温度子程序流程图如图3.3所示。
图3.3转换温度子程序流程图
3.2.3计算温度子程序流程图
计算温度子程序流程图如图3.4所示。
图3.4计算温度子程序流程图
4设计体会与小结
通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念。
本设计主要完成了一款简单的数字温度计设计,温度通过LCD屏显示出来。
实现温度测试的基本功能要求。
在1周的课程设计中我学会了很多的东西。
经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些成绩,同时也存在一些不足。
对于本次的课程设计还有很大提升空间,目前仅完成的是基本功能实现,还有很多的扩展功能可以提升。
在这次课程设计中我发现,凡事都要自己去动下手,去实践一下,遇到困难,永远不要沮丧气馁,只有这样才能让自己进一步的去学会新的东西和知识。
在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识。
参考文献
[1]李群芳,张士军,黄建.单片微型计算机与接口技术[M].北京:
电子工业出版.2008.
[2]丁元杰,吴大伟.单片微机习题集与实验指导书[M].机械工业出版社.2004.
[3]张友德,赵志英,涂时亮.单片微型机原理[M].上海:
复旦大学出版社.2005.
附录A源程序
//使用1602LCD显示DS18B20转换的温度值
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitRS=P3^0;//数据/命令选择端(H/L)
sbitLCDEN=P3^2;//使能端
sbitdeng=P1^6;//超过温度限制指示灯
sbitbeep=P1^7;//超过温度限制报警器
ucharhigh=30;//最高温度
ucharlow=10;//最低温度
unsignedcharr;
voiddelayUs()//短延时
{
_nop_();
}
voiddelayMs(uinta)//长延时
{
uinti,j;
for(i=a;i>0;i--)
for(j=100;j>0;j--);
}
//第一行开始地址为0x80,第二行开始地址为0xc0;
//写命令:
RS=0,RW=0;
voidwriteComm(ucharcomm)
{
RS=0;
P2=comm;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
//写数据:
RS=1,RW=00
voidwriteData(uchardat)
{
RS=1;
P2=dat;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(1);
}
//初始化函数
//显示模式,固定指令为00111000=0x38,16*2显示,5*7点阵,8位数据接口
//显示开/关及光标设置00001100=0x0c
//指令1:
00001DCB:
D:
开显示/关显示(H/L);C:
显示光标/不显示(H/L),B:
光标闪烁/不闪烁(H/L)
//指令2:
000001NS:
//N=1,当读/写一个字符后地址指针加1,且光标也加1;N=0则相反
//S=1,当写一个字符,整屏显示左移(N=1)或右移(N=0),但光标不移动;S=0,整屏不移动
voidinit()
{
writeComm(0x38);//显示模式
writeComm(0x0c);//开显示,关光标
writeComm(0x06);//写字符后地址加1,光标加1
writeComm(0x01);//清屏
}
voidwriteString(uchar*str,ucharlength)
{
uchari;
for(i=0;i{
writeData(str[i]);
}
}
/*****************************DS18B20*******************************/
sbitds=P3^7;
//初始化DS18B20
//让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动
voiddsInit()
{
//对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于为8us
unsignedinti;
ds=0;
i=100;//拉低约800us,符合协议要求的480us以上
while(i>0)i--;
ds=1;//产生一个上升沿,进入等待应答状态
i=4;
while(i>0)i--;
}
voiddsWait()
{
unsignedinti;
while(ds);
while(~ds);//检测到应答脉冲
i=4;
while(i>0)i--;
}
//向DS18B20读取一位数据
//读一位,让DS18B20一小周期低电平,然后两小周期高电平,
//之后DS18B20则会输出持续一段时间的一位数据
bitreadBit()
{
unsignedinti;
bitb;
ds=0;
i++;//延时约8us,符合协议要求至少保持1us
ds=1;
i++;i++;//延时约16us,符合协议要求的至少延时15us以上
b=ds;
i=8;
while(i>0)i--;//延时约64us,符合读时隙不低于60us要求
returnb;
}
//读取一字节数据,通过调用readBit()来实现
unsignedcharreadByte()
{
unsignedinti;
unsignedcharj,dat;
dat=0;
for(i=0;i<8;i++)
{
j=readBit();
//最先读出的是最低位数据
dat=(j<<7)|(dat>>1);
}
returndat;
}
//向DS18B20写入一字节数据
voidwriteByte(unsignedchardat)
{
unsignedinti;
unsignedcharj;
bitb;
for(j=0;j<8;j++)
{
b=dat&0x01;
dat>>=1;//写"1",将DQ拉低15us后,在15us~60us内将DQ拉高,即完成写1
if(b)
{
ds=0;
i++;i++;//拉低约16us,符号要求15~60us内
ds=1;
i=8;while(i>0)i--;//延时约64us,符合写时隙不低于60us要求
}
else//写"0",将DQ拉低60us~120us
{
ds=0;
i=8;while(i>0)i--;//拉低约64us,符号要求
ds=1;
i++;i++;//整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了
}
}
}
//向DS18B20发送温度转换命令
voidsendChangeCmd()
{
dsInit();//初始化DS18B20,无论什么命令,首先都要发起初始化
dsWait();//等待DS18B20应答
delayMs
(1);//延时1ms,因为DS18B20会拉低DQ60~240us作为应答信号
writeByte(0xcc);//写入跳过序列号命令字SkipRom
writeByte(0x44);//写入温度转换命令字ConvertT
}
//向DS18B20发送读取数据命令
voidsendReadCmd()
{
dsInit();
dsWait();
delayMs
(1);
writeByte(0xcc);//写入跳过序列号命令字SkipRom
writeByte(0xbe);//写入读取数据令字ReadScratchpad
}
//获取当前温度值
intgetTmpValue()
{
unsignedinttmpvalue;
intvalue;//存放温度数值
floatt;
unsignedcharlow,high;
sendReadCmd();
//连续读取两个字节数据
low=readByte();
high=readByte();
//将高低两个字节合成一个整形变量
//计算机中对于负数是利用补码来表示的
//若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value
tmpvalue=high;
tmpvalue<<=8;
tmpvalue|=low;
value=tmpvalue;
//使用DS18B20的默认分辨率12位,精确度为0.0625度,即读回数据的最低位代表0.0625度
t=value*0.0625;
//将它放大10倍,使显示时可显示小数点后一位,并对小数点后第二位进行4舍5入
//如t=11.0625,进行计数后,得到value=111,即11.1度
//如t=-11.0625,进行计数后,得到value=-111,即-11.1度
value=t*10+(value>0?
0.5:
-0.5);//大于0加0.5,小于0减0.5
returnvalue;
}
//显示温度
voiddisplay(intv)
{
unsignedcharcount;
unsignedchardatas[]={0,0,0,0};
unsignedinttmp=abs(v);
datas[0]=tmp/1000;
datas[1]=tmp%1000/100;
datas[2]=tmp%100/10;
datas[3]=tmp%10;
r=tmp/10;
writeComm(0xc0+3);
if(v<0)
{
writeString("-",2);
}
else
{
writeString("+",2);
}
if(datas[0]!
=0)
{
writeData('0'+datas[0]);
}
for(count=1;count!
=4;count++)
{
writeData('0'+datas[count]);
if(count==2)
{
writeData('.');
}
}
}
/******************************报警*******************************/
voidBEEP()//报警
{if((r>=high&&r<129)||r{
beep=!
beep;
deng=1;
}
else
{beep=1;
deng=0;
}
}
/******************************DS18B20*******************************/
voidmain()
{
uchartable[]="NowTemperature";
delayMs
(1);
sendChangeCmd();
init();
writeComm(0x80);
writeString(table,16);
while
(1)
{
delayMs(1000);//温度转换时间需要750ms以上
writeComm(0xc0);
display(getTmpValue());
sendChangeCmd();
BEEP();
}
}
附录B运行图示
(1)正常温度显示
温度计正常温度显示如图1所示。
图1正常温度显示
(2)报警温度显示
温度计报警温度显示如图2所示。
图2报警温度显示