温度控制器的设计.docx
《温度控制器的设计.docx》由会员分享,可在线阅读,更多相关《温度控制器的设计.docx(14页珍藏版)》请在冰豆网上搜索。
温度控制器的设计
第一章课程设计要求及电路说明
1.1课程设计要求与技术指标
温度控制器的设计
设计要求与技术指标:
1、设计要求
(1)设计一个温度控制器电路;
(2)根据性能指标,计算元件参数,选好元件,设计电路并画出电路图;
(3)撰写设计报告。
2、技术指标
温度测量范围0—99℃,精度误差为0.1℃;LED数码管直读显示;温度报警指示灯。
1.2课程设计电路说明
1.2.1系统单元电路组成
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89S51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
1.2.2设计电路说明
主控制器:
CPU是整个控制部分的核心,由STC89C52芯片连同附加电路构成的单片机最小系统作为数据处理及控制模块.
显示电路:
显示电路采用4个共阳LED数码管,用于显示温度计的数值。
报警电路:
报警电路由蜂鸣器和三极管组成,当测量温度超过设计的温度时,该电路就会发出报警。
温度传感器:
主要由DS18B20芯片组成,用于温度的采集。
时钟振荡:
时钟振荡电路由晶振和电容组成,为STC89C52芯片提供稳定的时钟频率。
第二章课程设计及结果分析
2.1课程设计
2.1.1设计方案论证与比较
显示电路方案
方案一:
采用数码管动态显示
使用一个七段LED数码管,采用动态显示的方法来显示各项指标,此方法价格成本低,而且自己也比较熟悉,实验室也常备有此元件。
方案二:
采用LCD液晶显示
采用1602LCD液晶显示,此方案显示内容相对丰富,且布线较为简单。
综合上述原因,采用方案一,使用数码管作为显示电路。
测温电路方案
方案一:
采用模拟温度传感器测温
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二:
采用数字温度传感器
经过查询相关的资料,发现在单片机电路设计中,大多数都是使用传感器,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
综合考虑,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
2.1.2设计总体方案
根据上述方案比较,结合题目要可以将系统分为主控模块,显示模块,温度采集模块和报警模块,其框图如下:
报警电路
2.1.3数字温度计的硬件电路设计
控制电路
CPU是整个控制部分的核心。
在考虑经济性和满足需求的前提下,本系统选用宏晶公司生产的8位STC89C52单片机作为整个系统的控制中心。
STC89C52是宏晶公司生产的低功耗,高性能CMOS8位单片机,片内含4kbytes的可系统编程的Flash只读程序存储器,器件采用宏晶公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚,它集Flash存储器既可在线编辑(ISP)也可用传统方法进行编辑及通用8位微处理器于单片芯片中,功能强大STC89C52单片机可为您提供许多高性价比的应用场合。
本次设计中,由STC89C52芯片连同附加电路构成的单片机最小系统作为数据处理及控制模块,其中,使用P0口作为数码管显示电路数据传输口,P2.4、P2.5、P2.6分别作为数码管的位选接口,P2.0作报警控制接口,P2.2作DS18B20的总线接口。
其电路连接图如下:
温度传感器设计
引脚功能说明:
VDD:
可选电源脚,电源电压范围3~5.5V。
当工作于寄生电源时,此引脚必须接地。
DQ:
数据输入/输出脚。
漏极开路,常态下高电平。
GND:
为电源地
(1)存贮器
DS18B20的存贮器由一个高速暂存(便笺式)RAM和一个非易失性、电可擦除EEPROM组成,后者存贮高温度和低温度触发器TH和TL。
暂存存贮器有助于在单线通信时确保数据的完整性。
数据首先写入暂存存贮器,在那里它可以被读回。
当数据被校验之后,复制暂存存贮器的命令把数据传送到非易失性EEPROM。
这一过程确保了更改存贮器时数据的完整性。
高速暂存RAM的结构为9字节的存储器,结构如3.6图所示。
前2字节包含测得的温度信息。
第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时刷新。
第5字节为配置寄存器,其内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。
其中,低5位一直为1;TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式,在DS18B20出厂时,该位被设置为0,用户不要去改动;R1和R0决定温度转换的精度位数,即用来设置分辨率。
DS18B20分辨率
配置寄存器位定义
高速暂存的第6、7、8字节保留未用,表现为全逻辑1。
第9字节是前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
高速暂存RAM结构图
当DS18B20接受到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩张的二进制补码形式存储在暂存RAM的第1、2字节中。
单片机可以通过单线接口读出数据。
读数据是,低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
温度值格式如图所示:
低字节
高字节
温度数据值格式
图中,S表示符号位。
当S=0时,表示测得的温度值为正值,可以直接将二进制转换为十进制;当S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制值。
(2)DS18B20的测温原理
如图3.8所示,图中低温度系数振荡器的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数振荡器随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
DS18B20测温原理图
图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1和温度寄存器中,减法计数器和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数振荡器产生的脉冲信号进行减法计数,当减法计数器1的预置减到0时,温度寄存器的值将加1,减法计数器1的预置值将重新被装入,并重新开始对低温度系数振荡器产生的脉冲信号进行计数。
如此循环,知道减法计数器2计数到0时,停止温度计数器值的累加,此时温度寄存器中的数值就是所测温度值。
图中的斜率累加器用于补偿和修正测温过程的非线形性,直到温度寄存器达到被测温度值。
2.1.4软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图所示。
主程序流程图图3-13读温度流程图
读温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,
Proteus进行仿真
程序编写完以后,我们先对其进行仿真,初步验证电路图和程序的可行性和正确性。
Protel99SE软件
Protel99SE[5]共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。
2.2课程设计问题及解决方法
2.3结果分析
通过Proteus进行仿真,电路能够符合实验设计的要求。
第三章课程设计方案特点及体会
3.1课程设计方案特点
3.2心得体会
#include
#defineuintunsignedint
#defineucharunsignedchar//宏定义
sbitdula=P2^7;
sbitp35=P2^4;
sbitp36=P2^5;
sbitdp=P0^7;
sbitp37=P2^6;
sbitDQ=P2^2;//定义DS18B20总线I/O
sbitLING=P2^0;//定义响铃
signedcharm;//温度值全局变量
signedcharshangxian=99;//上限报警温度,默认值为99
signedcharxiaxian=0;//下限报警温度,默认值为0
ucharcodeLEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
/*****延时子程序*****/
voidDelay(uinti)
{
while(i--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//给脉冲信号
Delay(8);//稍做延时
DQ=0;//单片机将DS18B20总线拉低
Delay(80);//精确延时,大于480us
DQ=1;//拉高总线
Delay(14);
x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
}
/*****读一个字节*****/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;//右移1位并赋值
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;//与0x80位或运算
Delay(4);
}
return(dat);
}
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
voidTmpchange(void)//发送温度转换命令
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
}
/*****读取温度*****/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Tmpchange();
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//读低8位
b=ReadOneChar();//读高8位
t=b;
t<<=8;/左移8位并赋值
t=t|a;
tt=t*0.0625;
t=tt*100+0.5;//放大10倍输出并四舍五入
return(t);
}
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
{
uinta,b,c,e;
e=ReadTemperature();//获取温度值
a=e/1000;//计算得到十位数字
b=e/100-a*10;//计算得到个位数字
c=(e%100)/10;//计算得到小数点后一位
m=e/100;
if(m>shangxian||melseLING=1;
p35=0;p36=0;p37=0;
dula=1;
P0=LEDData[c];//显示小数点后一位
dula=0;
P0=0xff;
p35=1;p36=0;p37=0;
Delay(300);
p35=0;p36=0;p37=0;
dula=1;
P0=LEDData[b];//显示个位
dp=0;
dula=0;
P0=0xff;
p35=0;p36=1;p37=0;
Delay(300);
p35=0;p36=0;p37=0;
dula=1;
P0=LEDData[a];
dula=0;//显示十位
P0=0xff;
p35=0;p36=0;p37=1;
Delay(300);
p35=0;p36=0;p37=0;//关闭显示
}
/*****主函数*****/
voidmain(void)
{
ReadTemperature();
LING=1;
while
(1)
{
Disp_Temperature();
}
}