基于单片机的数字温度计设计Word格式文档下载.docx
《基于单片机的数字温度计设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计设计Word格式文档下载.docx(25页珍藏版)》请在冰点文库上搜索。
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”时,内部上拉电阻把端口拉高,此时可以作为输入端口使用。
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<
reg52.h>
#include<
intrins.h>
#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
//拉高总线
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>
i--)
DATA=dat&
0x01;
dat>
delay(8);
intReadTemperature(void)//读取温度
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
//跳过读序号列号的操作
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=0xf7;
//片选LCD1
P0=0x40;
P2=0xff;
P2=0xfb;
//片选LCD2
P0=table[buf[2]];
P2=0Xfd;
//片选LCD3
P0=table[buf[3]];
P2=0Xfe;
P0=table[buf[0]];
//片选LCD4
}
//显示正值子函数
voiddisplay()
{
buf[1]=temp/1000;
//显示百位
buf[2]=temp/100%10;
//显示十位
buf[3]=temp%100/10;
//显示个位
buf[0]=temp%10;
//小数位
3;
j++)
delay(300);
//片选LCD1
P0=table[buf[1]];
//片选LCD2
//片选LCD3
voidkey()//按键扫描子程序
{if(k1!
=1)
delay(20);
if(k1!
while(k1!
{key_to1();
for(n=0;
n<
8;
n++)
Show();
if(k2!
if(k2!
while(k2!
{key_to2();
for(n=0;
}
}
if(k3!
{TR0=1;
//复位,开定时
temp=ReadTemperature();
if(k4!
{delay(20);
{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()
temp-=10;
if(temp<
=-550)
{temp=1100;
{alarmH=temp;
else{alarmL=temp;
voidalarm(void)
if(temp>
alarmH||temp<
alarmL)
{//bell=1;
//delay(50);
//bell=0;
Flag=1;
}else{Flag=0;
logo()//开机的Logo
{P0=0x40;
delay(50);
P1=0xff;
//关闭显示
voidShow()//显示函数,分别表示温度正负值
{if(temp>
=0)
{HLight=1;
LLight=0;
display();
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;
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分)
综
合
指导教师