基于单片机的数字温度计设计.docx
- 文档编号:3853259
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:25
- 大小:260.42KB
基于单片机的数字温度计设计.docx
《基于单片机的数字温度计设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计设计.docx(25页珍藏版)》请在冰点文库上搜索。
基于单片机的数字温度计设计
单片机课程设计
题目基于单片机的数字温度计设计
系(部)电子与信息工程系
班级11级计算机科学与技术
姓名陈庄柱
学号2011222236
指导教师张兴辉
2014年12月1日
电子与信息工程系
单片机课程设计任务书
设计题目
基于单片机的数字温度计设计
已知技术参数和设计要求
1、线性平滑滤波器包括领域平均法(均值滤波器),非线性平滑滤波器有中值滤波器
2、参数type和parameters用于确定噪声的类型和相应的参数。
3、利用H(u,v)使F(u,v)的高频分量得到衰减,得到G(u,v)后再经过反变换就得到所希望的图像g(u,v)
设计内容与步骤
1、探求一种既能去除噪声又不至于使图像模糊的方法
2、利用单片机STC89C52单片机作为本系统的中控模板。
单片机可由DS18B20读出来的数据利用软件来进行处理,从而把数据传输到LED数码管显示模块中,实现温度的显示。
3、频域低通滤波具有更好的选择性,对噪声在一定范围内也可以起到抑制作用,同时也对图像的边缘细节和高频信息分量有更好的保持作用
设计工作计划与进度安排
1、图像平滑方法
2、图像平滑处理与调试
设计考核要求
1考勤10%
2作品60%
3课程设计总结报告30%
计算机教研室制
基于单片机的数字温度计设计
陈庄柱
安康学院计算机科学与技术11级陕西省安康市725000
摘要:
本设计选择82c52为核心控制元件,设计一个数字温度计。
随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术。
本文主要介绍了一个基于89S51单片机的测温系统,详细描述了利用数字温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感器DS18B20的数据采集过程。
对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,并可根据需要任意设定上下限报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。
AT89c52和DS18b20结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
关键字:
微电子技术,通信技术,单片机系统,数字温度计
1概述
1.1设计背景
随着人们生活水平的提高,单片机的应用也越来越广泛,在日常生活中,与温度有关的也常见,例如:
烧开水的锅炉需要测温度、家庭用的电磁炉需要测温度等等;所以数字温度计也普遍存在于人们的生活当中,而本电路就是结合这种思路和参考一些资料所设计的电路,这种电路可以很方便的应用到我们的现实生活中,为人们带来便利。
本文主要从单片机的应用上来实现温度的测量及显示。
1.2设计任务
1)测温范围-50℃—110℃
2)精度误差不大于0.1℃
3)LED数码直读显示
4)实现语音报数
5)可以任意设定温度的上下限报警功能
2系统总体方案
2.1设计思路方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。
而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。
2.2设计思路方案二
进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。
从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。
2.3设计方框图
温度计电路设计总体设计方框图如图2.3所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
图2-3上电+按钮电平复位电路原理图
2.4温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
1、独特的单线接口仅需要一个端口引脚进行通信;
2、多个DS18B20可以并联在惟一的三线上,实现多点组网功能
3、无须外部器件;
4、可通过数据线供电,电压范围为3.0~5.5V;
5、零待机功耗;
6、温度以9或12位数字;
7、用户可定义报警设置;
8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
9、负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
2.5AT89C52管脚说明
VCC:
电源
GND:
接地
P0口:
P0口是一个8位漏级开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0口端口写“1”时,引脚作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接受指令字节:
在程序效验时,输出指令字节。
程序效验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位是双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。
对P1口写“1”时,内部上拉电阻的原因,将输出电流ILL。
此外,与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输出(P1.1/T2EX),具体如下所示:
P1.0T2(定时/计数器2外部计数脉冲输入),时钟输出
P1.1T2EX定时/计数2捕获/重装载触发和方向控制
在Flash编程和校验时,P1口接收低8位地址字节。
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲级可驱动吸收或输出电流4个TTL逻辑电平。
对P2口写“1”时,通过内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL。
在访问外部好曾许存储器或用16位地址读取外部数据存储器时,P2口送出高8位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。
在Flash编程和校验时,P2口接收低8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,P3输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑电平。
对P3口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入端口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流ILL。
P3口除了作为一般、的I/O口线外,更重要的是它的第二功能,如下所示:
P3.0RXD(串行输入)
P3.1TXD(串行输出)
P3.2INT0(外部中断0)
P3.3INT1(外部中断1)
P3.4T0(定时器0外部输入)
P3.5T1(定时器1外部输入)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通
在Flash编程和校验时,P3口也接收一些控制信号。
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期以高电平将使用单片机复位。
ALE/PROG:
地址锁存器控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚(PROG)也使用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序储存器选通信号
(PSEN)是外部程序存储器选通信号。
当AT89C52
从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据储存器时,PSEN将不被激活。
/EAVPP:
访问外部程序存储器控制信号。
为使能从0000H—FFFFH的外部程序存储器读取指令,EA端必须保持低电平(接地)。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接受12伏VPP电压。
XTAL1:
振荡器反相放大器及内部时钟发生器的输入端。
TAL2:
振荡器反相放大器的输出端
3具体实现步骤
3.1主控制器
图3-1-1晶振电路
图3-1-2复位电路
单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
晶振采用12MHZ。
复位电路采用上电加按钮复位。
3.2显示电路
图3-2数码管显示电路
显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。
P2口的低四位作为数码管的位选端。
采用动态扫描的方式显示:
数码管显示电路
3.3温度传感器
图3-3温度传感器与单片机的连接
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
3.4报警温度调整按键
图3-4按键电路
本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。
均采用软件消抖。
3.5报警电路
图3-5报警电路
通过设置一个上限和下限温度,超出这个温度电路会发出蜂鸣
3.6温度上下限
图3-6温度上下限
通过这个装置来设置数字温度计的上下限温度
4程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDATA=P1^1;//DS18B20接入口
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极字型码
inttemp;//温度值
intss;//中间的一个变量
intdd;
intj;
uchardatab;//定时器中断次数
uchardatabuf[4];//字型显示中间变量
intalarmH=320;//默认报警值
intalarmL=100;
//定义开关的接入口
sbitk1=P2^5;//+
sbitk2=P2^6;//-
sbitk3=P2^7;//确认
sbitk4=P2^4;//切换
sbitbell=P1^0;//蜂鸣器
sbitHLight=P1^2;//正温指示灯
sbitLLight=P1^3;//负温度指示灯
sbitwarn=P1^4;//报警指示灯
sbitRed=P1^6;//温度上限设置指示灯
sbitGreen=P1^7;//温度下限设置指示灯
bitset=0;//初始化
bitFlag=0;//设置标志
intn;
//函数的声明区
voidkey_to1();
voidkey_to2();
voiddelay(uint);
voidkey();
voidShow();
//函数的定义区
/*延时子函数*/
voiddelay(uintnum)
{
while(num--);
}
//DS18b20温度传感器所需函数,分为初始化,读写字节,读取温度4个函数
Init_DS18B20(void)//传感器初始化
{
ucharx=0;
DATA=1;//DQ复位
delay(10);//稍做延时
DATA=0;//单片机将DQ拉低
delay(80);//精确延时大于480us//450
DATA=1;//拉高总线
delay(20);
x=DATA;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
}
ReadOneChar(void)//读一个字节
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//给脉冲信号
dat>>=1;
DATA=1;//给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
WriteOneChar(unsignedchardat)//写一个字节
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
intReadTemperature(void)//读取温度
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
return(t);
}
voiddisplay00()//*********显示负值子函数
{
dd=-(temp-1);
buf[1]=dd/100;
buf[2]=dd/100;
buf[3]=dd%100/10;
buf[0]=dd%10;
//动态显示
for(j=0;j<5;j++)
{
P2=0xff;//初始灯为灭的
P0=0x00;
P2=0xfd;//显示小数点
P0=0x80;//显示小数点
delay(100);
P2=0xff;//初始灯为灭的
P0=0x00;
P2=0xf7;//片选LCD1
P0=0x40;
delay(100);
P2=0xff;
P0=0x00;
P2=0xfb;//片选LCD2
P0=table[buf[2]];
delay(100);
P2=0xff;
P0=0x00;
P2=0Xfd;//片选LCD3
P0=table[buf[3]];
delay(100);
P2=0xff;
P0=0x00;
P2=0Xfe;
P0=table[buf[0]];//片选LCD4
delay(100);
P2=0xff;
}
}
//显示正值子函数
voiddisplay()
{
buf[1]=temp/1000;//显示百位
buf[2]=temp/100%10;//显示十位
buf[3]=temp%100/10;//显示个位
buf[0]=temp%10;//小数位
for(j=0;j<3;j++)
{
P2=0xff;//初始灯为灭的
P0=0x00;
P2=0xfd;//显示小数点
P0=0x80;//显示小数点
delay(300);
P2=0xff;//初始灯为灭的
P0=0x00;
P2=0xf7;//片选LCD1
P0=table[buf[1]];
delay(300);
P2=0xff;
P0=0x00;
P2=0xfb;//片选LCD2
P0=table[buf[2]];
delay(300);
P2=0xff;
P0=0x00;
P2=0Xfd;//片选LCD3
P0=table[buf[3]];
delay(300);
P2=0xff;
P0=0x00;
P2=0Xfe;
P0=table[buf[0]];//片选LCD4
delay(300);
P2=0xff;
}
}
voidkey()//按键扫描子程序
{if(k1!
=1)
{
delay(20);
if(k1!
=1)
{
while(k1!
=1)
{key_to1();
for(n=0;n<8;n++)
Show();
}
}
}
if(k2!
=1)
{
delay(20);
if(k2!
=1)
{
while(k2!
=1)
{key_to2();
for(n=0;n<8;n++)
Show();
}
}
}
if(k3!
=1)
{TR0=1;//复位,开定时
temp=ReadTemperature();
}
if(k4!
=1)
{delay(20);
if(k4!
=1)
{while(k4!
=1);
set=!
set;
if(set==0)
{Red=0;Green=1;}
else{Green=0;Red=1;}
}
}
}
voidkey_to1()
{
TR0=0;//关定时器
temp+=10;
if(temp>=1100)
{temp=-550;}
if(set==0)
{alarmH=temp;}
else{alarmL=temp;}
}
voidkey_to2()
{
TR0=0;
//关定时器
temp-=10;
if(temp<=-550)
{temp=1100;}
if(set==0)
{alarmH=temp;}
else{alarmL=temp;}
}
voidalarm(void)
{
if(temp>alarmH||temp {//bell=1; //delay(50); //bell=0; Flag=1; }else{Flag=0;} } logo()//开机的Logo {P0=0x40; P2=0xf7; delay(50); P2=0xfb; delay(50); P2=0Xfd; delay(50); P2=0Xfe; delay(50); P1=0xff;//关闭显示 } voidShow()//显示函数,分别表示温度正负值 {if(temp>=0) {HLight=1;LLight=0;display();} if(temp<0) {HLight=0;LLight=1;display00();} } voidmain() { TCON=0x01;//定时器T0工作在01模式下 TMOD=0X01; TH0=0XD8;//装入初值 TL0=0XF0; EA=1;//开总中断 ET0=1;//开T0中断 TR0=1;//T0开始运行计数 EX0=1;//开外部中断0 for(n=0;n<500;n++)//显示启动LOGo"----" {bell=1;warn=1;logo();} Red=0; while (1) { key(); ss=ReadTemperature(); Show(); alarm();//报警函数 if(Flag==1) {bell=! bell; warn=! warn;}//蜂鸣器滴滴响 else{bell=1; warn=1;} } } voidtime0(void)interrupt1using1//每隔10ms执行一次此子程序 {TH0=0X56; TL0=0XDC; temp=ss; } 5总电路及PCB图 5.1总电路图 图5-1总电路图 5.2PCB图 图5-2PCB图 6结论与不足 通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的。 但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。 而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。 所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。 参考文献: [1]马忠梅,张凯,等.单片机的C语言应用程序设计(第四版)北京航空航天大学出版社 [2]薛庆军,张秀娟,等.单片机原理实验教程 [3]廖常初.现场总线概述[J].电工技术,1999.北京航天航空大学出版社 [4]张毅刚,彭喜元,彭宇单片机原理及其应用 课程设计成绩评定表 出勤 情况 出勤天数 缺勤天数 成 绩 评 定 出勤情况及设计过程表现(20分) 论文(20分) 设计成果(60分) 总成绩(100分) 综 合 评 定 指导教师
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 温度计 设计