数字温度计设计说明书.docx
《数字温度计设计说明书.docx》由会员分享,可在线阅读,更多相关《数字温度计设计说明书.docx(24页珍藏版)》请在冰点文库上搜索。
数字温度计设计说明书
《单片机》课程设计
说明书
专业名称:
电气工程及其自动化
班级:
093
学号:
20090202101
姓名:
张淑冠
指导教师:
姚广芹
日期:
2011年7月8日
单片机课程设计评阅书
题目
数字温度计
学生姓名
张淑冠
学号
20090202101
指导教师评语及成绩
指导教师签名:
年月日
答辩评语及成绩
答辩教师签名:
年月日
教研室意见
总成绩:
室主任签名:
年月日
摘要
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计是基于AT89S52单片机的温度测量系统。
通过对单片机技术基础及温度传感器使用方法的学习,本组利用Protel设计工作电路,并用PROTUES进行仿真后,焊接电路,这次课程设计综合利用所学单片机知识完成了一个单片机应用系统设计并仿真,焊接电路实现功能,从而加深对单片机软硬知识的深层次理解,获得初步的应用经验,为走出校门从事单片机应用的相关工作打下了一定的基础。
关键词:
单片机;AT89S52;温度计;数字控制
1课题描述…………………………………………………………………1
2设计过程…………………………………………………………………2
2.1数字温度计系统设计方框图………………………………………2
2.2单片机所实现功能说明……………………………………………2
2.3电路板各部分电路图及其原理……………………………………2
3测试………………………………………………………………………5
总结…………………………………………………………………………6
参考文献……………………………………………………………………7
附录1………………………………………………………………………8
附录2………………………………………………………………………9
1课题描述
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,用4位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。
开发工具:
protel
2设计过程
由于本设计是测温电路,进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
2.1数字温度计系统设计方框图
图2.1系统设计方框图
2.2单片机所实现功能说明
本次实训所设计的为数字温度计,能实现对温度的测试,所测温度由数码管以整数的形式显示。
同时可调所测温度的上下限,如果超出所测温度的限制,能够发出报警,报警信号由LED灯和蜂鸣器同时发出。
性能指标基本要求:
(1)能够显示当前室内温度,分辨率为1摄氏度。
(2)具有超限声光报警功能,能够通过按键设定报警温度的上限和下限。
控制器采用单片机AT89S52,温度传感器采用DS18B20,用数码管显示器实现温度显示
。
2.3电路板各部分电路图及其原理
(一)单片机AT89S52
图2.3.1单片机
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
(二)晶振和复位装置
图2.3.2a晶振图2.3.2b复位电路
(1)晶体振荡器,能产生振荡,其特点是固有频率十分稳定,而且震动具有多谐性,除了奇频震动外还有奇次谐波泛音震动。
性能上,晶振的品质因素Q和特性阻抗都非常高,而且接入系数很小,因此具有很高的频率稳定度。
(2)复位电路,与单片机第9引脚,也就是RST引脚相连,起复位作用,高电平有效
(三)温度传感器DS18B20
图2.3.3温度传感器
DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内,温范围-55℃~+125℃。
有三个引脚,其中1引脚接高电平,第3引脚接地,第2引脚接单片机的16引脚,即P3.6口以送入温度信号。
(四)报警电路——LED灯和蜂鸣器
图2.3.4aLED灯图2.3.4b蜂鸣器
此次所设计的数字温度计可以设置上下限,当超出上下限后能够报警,报警信号又LED灯和蜂鸣器同时发出。
其中LED灯要有一个上拉电阻和高电平相连,LED报警信号由单片机的P1.0口送出。
蜂鸣器采用无源连接,报警信号由单片机的P3.7引脚送出
(五)按键。
按键实现对温度计所测温度的上下限进行节。
图2.3.5按键
3测试
将制作好的数字温度计用USB线与电脑连接,把编的程序写入单片机中,测试温度计显示数据是否正确。
调节环境温度,利用温度计(事先准备一个)确定环境温度,观察数码管所显示的数据,并与温度计示数对比。
调节温度使温度达到声光报警温度,测试声光报警是否正常。
总结
课程设计的过程是艰辛的,但是收获却是很大的。
这次课程设计我主要是应用以前学习的编程以及单片机的一些知识,综合起来才完成了这个温度计的设计,虽然所设计器件很小,但是付出却是艰辛的。
首先,综合课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,对已有知识有了更进一步的理解和认识,再次,我在课程设计中碰到了很多的问题,我通过查阅相关书籍,资料,通过自己钻研,特别是得到了姚老师的谆谆教导,姚老师给予了我很大的帮助,不仅给了我思路上的开阔,还让我认识到了自己对以前所学知识的不足方面。
随着社会发展,单片机技术的迅速普及,以及飞速发展,人们对实时数字的要求越来越迫切,需求日益增加,单片机的应用无处不在,从小小的电子表,到大型的计算机都离不开单片机,因此我们更需要学习单片机工作原理的及其编程。
通过这次课程设计,我也发现了自身的很多不足之处,在以后的学习中,我会不断的完善自我,不断进取,能使自己在单片机运用这方面有一个大的发展。
参考文献
[1]张毅刚彭喜元彭宇《单片机原理及其应用》高等教育出版社
[2]王守忠赵明明索世文《51单片机应用开发速查手册》人民邮电出版社
[3]谢自美《电子线路综合设计》华中科技大学出版社
[4]夏继强《单片机应用设计培训教程—实践篇》北京航空航天大学出版社
[5]李广弟,朱月秀,王秀山《单片机基础》北京航空航天大学出版社
[6]王毅《单片机器件应用手册》人民邮电出版社
附录1总电路图
附录2程序
/**********************************
程序功能:
基于四眼兔子单片机学习板
的温度计
数码管显示温度,十位与个位
时间:
2010.3.14
***********************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
bitpresence;
bitflow0;
sbitled=P1^0;
sbitDQ=P3^6;//定义温度传感器
sbitled1=P2^0;
sbitled2=P2^1;
sbitled3=P2^2;
sbitled4=P2^3;
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;
sbitkey4=P3^5;
floati=0;
intdatt=0;
intaa=0;
intbb=0;
intcc=0;
intdd=0;
intwendu=30;
intwenduxia=25;
ucharge,shi,bai,xiao,xiao1;
sbitBEEP=P3^7;
unsignedcharcodetab[]=
{
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
};
unsignedcharinit[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
unsignedcharinit1[]=
{
0x12,0x12,0x12,0x12,0x12,0x12,0x33
};
voiddelayms(ucharxms)
{
while(xms--)
{
uchartime;
for(time=114;time>0;time--);
}
}
voiddisplay(void)
{
P0=tab[shi];
led4=0;
delayms
(1);
P2=0xff;
P0=tab[ge];
led3=0;
delayms
(1);
P2=0xff;
P0=0xc6;
led1=0;
delayms
(1);
P2=0xff;
P0=0x9c;
led2=0;
delayms
(1);
P2=0xff;
}
/**********************************************
延时微妙函数
************************************************/
voiddelayus(unsignedcharx)
{
unsignedchari;
while(x--)
{
for(i=0;i<14;i++)
{
;
}
}
}
voidbeep()
{uintj;
BEEP=0;
for(j=3;j>0;j--)
{delayms
(1);
BEEP=~BEEP;
}
BEEP=1;
}
/**********************************************************
us延时函数(8*1.085)*num
**********************************************************/
voidDelay(unsignedintnum)//延时函数
{
while(--num)
;
}
voidxianshi()
{intq;
charz;
for(z=5;z>0;z--)
{for(q=20;q>0;q--)
{P0=tab[aa];
led4=0;
delayms
(1);
P2=0xff;
P0=tab[bb];
led3=0;
delayms
(1);
P2=0xff;
P0=tab[cc];
led2=0;
delayms
(1);
P2=0xff;
P0=tab[dd];
led1=0;
delayms
(1);
P2=0xff;
}}
}
voidxianshi1()
{aa=0;
bb=0;
cc=wenduxia/10;
dd=wenduxia%10;
P0=tab[aa];
led4=0;
delayms
(1);
P2=0xff;
P0=tab[bb];
led3=0;
delayms
(1);
P2=0xff;
P0=tab[cc];
led2=0;
delayms
(1);
P2=0xff;
P0=tab[dd];
led1=0;
delayms
(1);
P2=0xff;
}
voidshengwen()
{
if(key1==0)
{
delayms(100);
;
if(key1==0)
{wendu++;
aa=wendu/10;
bb=wendu%10;
cc=0;
dd=0;
xianshi();
delayms(150);
}
}
}
voidjiangwen()
{
if(key2==0)
{delayms(100);
if(key2==0)
{wendu--;
aa=wendu/10;
bb=wendu%10;
cc=0;
dd=0;
xianshi();
delayms(150);
}
}
}
voidxianshixianzhi()
{
if(key3==0)
{delayms(100);
if(key3==0)
{aa=wendu/10;
bb=wendu%10;
cc=wenduxia/10;
dd=wenduxia%10;
xianshi();
delayms(150);
}
}
}
/****************************************
初始化18b20
****************************************/
uchards18b20_init(void)
{
DQ=0;//单片机发出低电平复位信号
Delay(60);//延时>480us
DQ=1;//释放数据线
Delay(8);//延时>64us,等待应答
presence=DQ;//接收应答信号
Delay(50);//延时>400us,等待数据线出现高电平
DQ=1;//释放数据线
return(presence);//返回presence信号
}
/**********************************************************
读一个字节数据
**********************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
DQ=1;
for(i=0;i<8;i++)
//一个字节8个bit
{
DQ=0;//给低脉冲信号
dat>>=1;
DQ=1;//释放总线
_nop_();
_nop_();
if(DQ)
//读总线电平状态
dat|=0x80;
//最高位置1
Delay(6);//延时>45us
DQ=1;//释放总线,表示此次读操作完成
}
return(dat);
}
/**********************************************************
写一个字节数据
**********************************************************/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=0;i<8;i++)
//一个字节8个bit
{
DQ=0;//给低脉冲信号
Delay
(1);//延时<15us
dat>>=1;//数据右移一位,最低位移入CY
DQ=CY;//写1bit数据
Delay(6);//延时>45us
DQ=1;//释放总线,表示此次写操作完成
}
}
/*****************************************
读温度函数
*****************************************/
voidread_temp(void)
{
uintd=1;
uchartemp1=0;
uchartemp2=0;
uintt=0;
floattt;
uintzong=0;
ds18b20_init();
WriteOneChar(0xcc);//跳过ROM匹配
WriteOneChar(0x44);//启动温度转换
ds18b20_init();
WriteOneChar(0xcc);//跳过ROM匹配
WriteOneChar(0xbe);//读温度寄存器
temp1=ReadOneChar();//温度低8位
temp2=ReadOneChar();//温度高8位
if(temp2>112)//判断温度正负,负温度时执行大括号内程序
{
temp1=(~temp1)+1;
if((~temp1)+1>=0xff)
{
temp2=(~temp2)+1;
}
else
temp2=(~temp2);
flow0=1;//温度是零下
}
else//温度值为零上
flow0=0;
t=temp2;
t<<=8;
t=t|temp1;
tt=t*0.0625*100;
datt=(int)tt;
bai=datt/10000;
shi=(datt%10000)/1000;
ge=datt%1000/100;
xiao=datt%100/10;
xiao1=datt%10;
if(xiao1>=5)//四舍五入计算小数点后一位
xiao++;
zong=bai*100+shi*10+ge;
if(zong>=wendu||zong<=wenduxia){led=0;beep();}
if(zongwenduxia)led=1;
}
voidshezhixiaxian()
{
if(key4==0)
{delayms(30);
if(key4==0)
{
while
(1)
{
if(key4==0)
{delayms(50);
if(key4==0)
{break;}}
if(key1==0)
{
delayms(50);
if(key1==0)
{wenduxia++;
aa=0;
bb=0;
cc=wenduxia/10;
dd=wenduxia%10;
xianshi();
}}
if(key2==0)
{
delayms(50);
if(key2==0)
{wenduxia--;
aa=0;
bb=0;
cc=wenduxia/10;
dd=wenduxia%10;
xianshi();
}
}
xianshi1();
}}}}
/**************************************************
主函数
**************************************************/
voidmain(void)
{
P2=0xff;
P0=0xff;
while
(1)
{read_temp();//读取温度值
display();
shengwen();
jiangwen();
xianshixianzhi();
shezhixiaxian();
}
}