目录第一章课程设计要求及电路说明 (3)1.1课程设计要求与技术指标 (3)1.2课程设计电路说明 (4)第二章课程设计及结果分析 (6)2.1课程设计思想 (6)2.2课程设计问题及解决办法 (6)2.3调试结果分析 (7)第三章课程设计方案特点及体会 (8)3.1 课程设计方案特点 (8)3.2 课程设计心得体会 (9)参考文献 (9)附录 (9)第一章课程设计要求及电路说明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液晶显示采用1602 LCD液晶显示,此方案显示内容相对丰富,且布线较为简单。
综合上述原因,采用方案一,使用数码管作为显示电路。
测温电路方案方案一:采用模拟温度传感器测温由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二:采用数字温度传感器经过查询相关的资料,发现在单片机电路设计中,大多数都是使用传感器,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
综合考虑,很容易看出,采用方案二,电路比较简单,软件设计也比较简单,故采用了方案二。
2.1.2设计总体方案根据上述方案比较,结合题目要可以将系统分为主控模块,显示模块,温度采集模块和报警模块,其框图如下:2.1.3数字温度计的硬件电路设计控制电路CPU 是整个控制部分的核心。
在考虑经济性和满足需求的前提下,本系统选用宏晶公司生产的8位STC89C52单片机作为整个系统的控制中心。
STC89C52是宏晶公司生产的低功耗,高性能CMOS8位单片机,片内含4k bytes 的可系统编程的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决定温度转换的精度位数,即用来设置分辨率。
R1 R0 分辨率/位温度最大转换时间/ms0 0 9 93.750 1 10 187.51 0 11 3751 1 12 750DS18B20分辨率配置寄存器位定义高速暂存的第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进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图所示。
读温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,Proteus 进行仿真程序编写完以后,我们先对其进行仿真,初步验证电路图和程序的可行性和正确性。
Protel99 SE软件Protel99 SE [5]共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。
2.2 课程设计问题及解决方法2.3结果分析通过Proteus 进行仿真,电路能够符合实验设计的要求。
第三章课程设计方案特点及体会3.1课程设计方案特点3.2心得体会#include <reg51.h>#define uint unsigned int#define uchar unsigned char //宏定义sbit dula=P2^7;sbit p35=P2^4;sbit p36=P2^5;sbit dp=P0^7;sbit p37=P2^6;sbit DQ=P2^2; //定义DS18B20总线I/Osbit LING=P2^0; //定义响铃signed char m; //温度值全局变量signed char shangxian=99; //上限报警温度,默认值为99signed char xiaxian=0; //下限报警温度,默认值为0uchar code LEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};/*****延时子程序*****/void Delay(uint i){while( i-- );}/*****初始化DS18B20*****/void Init_DS18B20(void){unsigned char x=0;DQ=1;// 给脉冲信号Delay(8); //稍做延时DQ=0; //单片机将DS18B20总线拉低Delay(80); //精确延时,大于480usDQ=1; //拉高总线Delay(14);x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay(20);}/*****读一个字节*****/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat=0;for (i=8;i>0;i--){DQ=0; // 给脉冲信号dat>>=1;//右移1位并赋值DQ=1; // 给脉冲信号if(DQ)dat|=0x80;//与0x80位或运算Delay(4);}return(dat);}/*****写一个字节*****/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;}}void Tmpchange(void) //发送温度转换命令{Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换}/*****读取温度*****/unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=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() //显示温度{uint a,b,c,e;e=ReadTemperature(); //获取温度值a=e/1000; //计算得到十位数字b=e/100-a*10; //计算得到个位数字c=(e%100)/10; //计算得到小数点后一位m=e/100;if(m>shangxian || m<xiaxian) LING=0; //温度不在范围内报警 else LING=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; //关闭显示}/*****主函数*****/void main(void){ReadTemperature();LING=1;while(1){Disp_Temperature();}}。