基于热敏电阻数字温度计课程设计

时间:2020-08-15 00:12:00 浏览量:

单片机应用系统(三级)项目 设计说明书 (2012/2013学年第二学期) 题 目 :
基于热敏电阻的数字温度计 __ 专业班级 :
电子信息工程 学生姓名 :
指导教师 :
设计周数 :
两周 设计成绩 :
2013年X月X日 目录 1实验设计目的 2 2系统软件设计 2 2.1软件总体流程设计 2 2.2系统设计及主要程序 3 2.2.1系统主函数 3 2.2.2汉显lcd12864 4 2.2.3时钟芯片DS1302 6 2.2.4ADC0832 11 2.3上位机设计及主要代码 14 2.3.1SerialPort 组件 14 2.3.2串口操作 15 2.3.3数据的接收 15 2.3.4保存数据与清空数据 17 3系统硬件电路设计 17 3.1恒温桥电路 17 3.2信号放大电路 18 3.3A/D转换电路 18 3.4控制电路 19 3.5显示电路 20 4总结与展望 20 参考文献 21 1实验设计目的 随着以知识经济为特征的信息化时代的到来人们对仪器仪表的认识更加深入,温度作为一个重要的物理量,是工业生产过程中最普遍,最重要的工艺参数之一。随着工业的不断发展,对温度的测量的要求也越来越高,而且测量的范围也越来越广,对温度的检测技术的要求也越来越高,因此,温度测量及其测量技术的研究也是一个很重要的课题。  本系统的温度测量采用的就是热阻效应。温度测量模块主要为温度测量电桥,当温度发生变化时,电桥失去平衡,从而在电桥输出端有电压输出,但该电压很小。将输出的微弱电压信号通过OP07放大,将放大后的信号输入AD转换芯片,  进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。

单 片 机 显示 模 块 电 源 模 块 测 温 模 块 信号 放大 模块 AD 转 换 模 块 图1-1系统框图 2系统软件设计 2.1软件总体流程设计 软件设计采用c语言编程,运用模块化程序设计思想,对不同功能模块的程序进行分别编程,以便移植或调用,这样使软件层次结构清晰,有利于软件的调试修改。

数字温度计系统软件部分采用模块化设计思想,将系统分为主程序、初始化处理模块、中断检测模块、延时处理模块、数据处理模块、显示模块,其软件系统的主程序实现流程如下图所示:
开 始 DS1302时钟信息采集 数据处理 12864显示 结 束 系统初始化 PT100温度采集 图2-1系统软件流程 2.2系统设计及主要程序 2.2.1系统主函数 程序的入口,分别调用了其他头文件,实现了lcd12864汉显的显示,DS1302时钟芯片时间的运行,ADC0832模数转换。主要代码实现如下:
#include “reg52.h“ #include “intrins.h“ #include “lcd12864.h“ #include “DS1302.h“ #include “ADC0832.h“ #define uchar unsigned char #define uint unsigned int void main( void ) { Com_Init(); v_Lcd12864Init_f() ; v_Lcd12864PutString_f( 1,0, “年“) ; v_Lcd12864PutString_f( 3,0, “月“) ; v_Lcd12864PutString_f( 5,0, “日“) ; v_Lcd12864PutString_f( 1,1, “时“) ; v_Lcd12864PutString_f( 3,1, “分“) ; v_Lcd12864PutString_f( 5,1, “秒“) ; v_Lcd12864PutString_f( 5,2, “℃“); while(1){ Run_DS1302(); displayADC (); send(); _nop_; } } 2.2.2汉显lcd12864 主要实现汉显lcd12864接收时钟芯片DS1302与A/D转换模块传递来的温度与时间,并显示在液晶屏上。主要代码实现如下:
#include“lcd12864.h“ #include “intrins.h“ #define uchar unsigned char #define uint unsigned int void v_Lcd12864CheckBusy_f( void ) //忙检测函数 { unsigned int nTimeOut = 0 ; SET_INC SET_READ CLR_EN SET_EN while( ( io_LCD12864_DATAPORT & 0x80 ) && ( ++nTimeOut != 0 ) ) ; CLR_EN SET_INC SET_READ } void v_Lcd12864SendCmd_f( unsigned char byCmd ) //发送命令 { v_Lcd12864CheckBusy_f() ; SET_INC SET_WRITE CLR_EN io_LCD12864_DATAPORT = byCmd ; _nop_(); _nop_(); SET_EN _nop_(); _nop_(); CLR_EN SET_READ SET_INC } void v_Lcd12864SendData_f( unsigned char byData ) //发送数据 { v_Lcd12864CheckBusy_f() ; SET_DATA SET_WRITE CLR_EN io_LCD12864_DATAPORT = byData ; _nop_(); _nop_(); SET_EN _nop_(); _nop_(); CLR_EN SET_READ SET_INC } void v_DelayMs_f( unsigned int nDelay ) //延时 { unsigned int i ; for( ; nDelay > 0 ; nDelay-- ) { for( i = 125 ; i > 0 ; i-- ) ; } } void v_Lcd12864Init_f( void ) //初始化 { v_Lcd12864SendCmd_f( 0x30 ) ; //基本指令集 v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x01 ) ; //清屏 v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x06 ) ; //光标右移 v_DelayMs_f( 50 ) ; v_Lcd12864SendCmd_f( 0x0c ) ; //开显示 } void v_Lcd12864SetAddress_f( unsigned char x, y ) //地址转换 { unsigned char byAddress ; switch( y ) { case 0 : byAddress = 0x80 + x ; break; case 1 : byAddress = 0x90 + x ; break ; case 2 : byAddress = 0x88 + x ; break ; case 3 : byAddress = 0x98 + x ; break ; default : break ; } v_Lcd12864SendCmd_f( byAddress ) ; } void v_Lcd12864PutString_f( uchar x, uchar y, uchar *pData ) { v_Lcd12864SetAddress_f( x, y ) ; while( *pData != '\0' ) { v_Lcd12864SendData_f( *pData++ ) ; } } 2.2.3时钟芯片DS1302 主要为汉显12864提供时间输出。主要代码实现如下:
#include“DS1302.h“ #include“intrins.h“ #include“lcd12864.h“ #define uchar unsigned char #define uint unsigned int void v_RTInputByte(uchar ucDa) // 功能 : 往DS1302写入1Byte数据 { uchar i; ACC = ucDa; T_RST = 1; for(i=8; i>0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC >> 1; } } uchar uc_RTOutputByte(void)//从DS1302读取1Byte数据 { uchar i; T_RST = 1; for(i=8; i>0; i--) { ACC = ACC >>1; T_IO=1; ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } void v_W1302(uchar ucAddr, uchar ucDa) //往DS1302写入数据 ucAddr: DS1302地址, ucDa: 要写的数据 { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); // 写地址 _nop_(); _nop_(); v_RTInputByte(ucDa); // 写1Byte数据 T_CLK = 1; T_RST = 0; } uchar uc_R1302(uchar ucAddr) //读取DS1302某地址的数据 ucAddr: DS1302地址 { uchar ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); //写地址,命令 _nop_(); _nop_(); ucDa = uc_RTOutputByte(); //读1Byte数据 T_CLK = 1; T_RST = 0; return(ucDa); //ucDa :读取的数据 } void v_BurstW1302T(uchar *pSecDa) //往DS1302写入时钟数据 { uchar i; v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作 T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); //0xbe:时钟多字节写命令 for(i=8; i>0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制 { v_RTInputByte(*pSecDa); //写1Byte数据 pSecDa++; } T_CLK = 1; T_RST = 0; } void v_BurstR1302T(uchar *pSecDa) //读取DS1302时钟数据 { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbf); //0xbf:时钟多字节读命令 for(i=8; i>0; i--) { *pSecDa = uc_RTOutputByte(); //读1Byte数据 pSecDa++; } T_CLK = 1; T_RST = 0; } void v_BurstW1302R(uchar *pReDa) //往DS1302寄存器数写入数据 pReDa: 寄存器数据地址 { uchar i; v_W1302(0x8e,0x00); //控制命令,WP=0,写操作 T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xfe); //0xbe:时钟多字节写命令 for(i=31; i>0; i--) //31Byte 寄存器数据 { v_RTInputByte(*pReDa); //写1Byte数据 pReDa++; } T_CLK = 1; T_RST = 0; } void v_BurstR1302R(uchar *pReDa) //读取DS1302寄存器数据 pReDa: 寄存器数据地址 { uchar i; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xff); //0xbf:时钟多字节读命令 for(i=31; i>0; i--) //31Byte 寄存器数据 { *pReDa = uc_RTOutputByte(); //读1Byte数据 pReDa++; } T_CLK = 1; T_RST = 0; } /* * 输入 : pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B */ void v_Set1302(uchar *pSecDa) //设置初始时间 { uchar i; uchar ucAddr = 0x80; v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作 for(i=7; i>0; i--) { v_W1302(ucAddr, *pSecDa); // 秒 分 时 日 月 星期 年 pSecDa++; ucAddr += 2; } v_W1302(0x8e, 0x80); //控制命令,WP=1,写保护 } void v_Get1302(uchar ucCurtime[]) //读取DS1302当前时间 ucCurtime: 保存当前时间地址。

BCD码 { uchar i; uchar ucAddr = 0x81; for(i=0; i<7; i++) { ucCurtime[i] = uc_R1302(ucAddr); //格式为: 秒 分 时 日 月 星期 年 ucAddr += 2; } } uchar dectobcd(uchar dec) //DEC码转换为BCD码 { uchar bcd; bcd = 0; while(dec >= 10) { dec -= 10; bcd++; } bcd <<= 4; bcd |= dec; return bcd; } uchar bcdtodec(uchar bcd) //BCD码转换为DEC码 { uchar data1; data1 = bcd & 0x0f; //取BCD低4位 bcd = bcd & 0x70; //剔除BCD的最高位和低4位。

data1 += bcd >> 1; data1 += bcd >> 3; //用位移代替乘法运算 return data1; } void Write_DS1302Init(void) //写入数据 初始化 { v_W1302(0x8e,0); v_W1302(0x80,0x50); //写入秒 v_W1302(0x8e,0); v_W1302(0x82,0x59); //写入分 v_W1302(0x8e,0); v_W1302(0x84,0x07); //写入小时 v_W1302(0x8e,0); v_W1302(0x86,0x08); //写入日 v_W1302(0x8e,0); v_W1302(0x88,0x06); //写入月 v_W1302(0x8e,0); v_W1302(0x8a,0x05); //写入星期 v_W1302(0x8e,0); v_W1302(0x8c,0x13); //写入年 } void Run_DS1302() { uchar sec, min, hour, day, month, year , week; v_W1302(0x8f, 0); sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 v_W1302(0x8f, 0); min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 v_W1302(0x8f, 0); hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时 v_W1302(0x8f, 0); day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 v_W1302(0x8f, 0); month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月 v_W1302(0x8f, 0); year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年 v_W1302(0x8f,0); week = bcdtodec(uc_R1302(0x8b)); //读出 星期 v_Lcd12864SetAddress_f(0,0) ; v_Lcd12864SendData_f( year /10 % 10 + 48 ) ; v_Lcd12864SendData_f( year% 10 + 48 ) ; v_Lcd12864SetAddress_f(2,0) ; v_Lcd12864SendData_f( month / 10 % 10 + 48 ) ; v_Lcd12864SendData_f( month % 10 + 48 ) ; v_Lcd12864SetAddress_f(4,0) ; v_Lcd12864SendData_f( day / 10 % 10 + 48 ) ; v_Lcd12864SendData_f( day % 10 + 48 ) ; v_Lcd12864SetAddress_f(6,0); v_Lcd12864SendData_f( week + 48); v_Lcd12864SetAddress_f(0,1) ; v_Lcd12864SendData_f( hour /10 % 10 + 48 ) ; v_Lcd12864SendData_f( hour % 10 + 48 ) ; v_Lcd12864SetAddress_f(2,1) ; v_Lcd12864SendData_f( min /10 % 10 + 48 ) ; v_Lcd12864SendData_f( min % 10 + 48 ) ; v_Lcd12864SetAddress_f(4,1) ; v_Lcd12864SendData_f( sec /10 % 10 + 48 ) ; v_Lcd12864SendData_f( sec % 10 + 48 ) ; } 2.2.4ADC0832 本系统最重要的模块,是实现本项目——数字温度计系统基本功能的核心模块,在本模块中传递出0~255共256个数字,然后通过分段计算得出温度。本模块代码中还加入了串口通信,串口初始化为方式二,9600比特率。主要代码实现如下:
#include “ADC0832.h“ #include “intrins.h“ #include“lcd12864.h“ #define uchar unsigned char #define uint unsigned int uchar l_temp; unsigned char LcdBuf1[10]=““; uchar ADC0832_Read(uchar ch) { uchar i; uchar ADC_buff=0; ADC0832_CS = 1; ADC0832_DIO = 1; //启动位 ADC0832_CLK = 0; ADC0832_CS = 0; _nop_(); ADC0832_CLK = 1; _nop_(); ADC0832_CLK = 0; ADC0832_DIO = 1; //送 SGL/DIF 位 _nop_(); ADC0832_CLK = 1; _nop_(); ADC0832_CLK = 0; if(ch==0) ADC0832_DIO = 0; //送转换通道值 else ADC0832_DIO = 1; ADC0832_CLK = 1; _nop_(); ADC0832_CLK = 0; _nop_(); ADC0832_DIO = 1; //释放DIO端口,转由ADC控制 for(i=0;i<8;i++){ _nop_(); ADC0832_CLK = 0; _nop_(); ADC0832_CLK = 1; _nop_(); if(ADC0832_DIO==1) ADC_buff=ADC_buff+1; //读取8位数据 ADC_buff=ADC_buff<<1; } _nop_(); _nop_(); ADC0832_CS = 1; ADC0832_CLK = 1; return ADC_buff; //返回转换值 } unsigned int ADC0832da_to_Volage(unsigned char da) { unsigned int Volage; float tt; tt=da*4.95/255; Volage= tt*100+0.5; return Volage; } void displayADC () { char i; int w; int temp ,temp2,l_temp1; unsigned long res; uint l_v; l_temp = ADC0832_Read(0); l_v = ADC0832da_to_Volage(l_temp); v_Lcd12864SetAddress_f(0,3) ; l_temp1 = l_temp * 2; res=(float)(2550000+110000*(512-l_temp1)/30)/(2550-11*(512-l_temp1)/30); temp=(float)(res*10000-10000000)/3851-545; temp2 = temp; if(temp >= 0) { for(i=6;temp>0;i--) { LcdBuf1[i]=temp%10+48; temp/=10; } } if(temp < 0 ) { w= -temp; for(i=6;w>0;i--) { LcdBuf1[i]=w%10+48; w/=10; } } if(i>=0&&temp<0) { if(temp > -10) { LcdBuf1[i] = '0'; i--; } LcdBuf1[i] = '-'; i--; } for(;i>=0;i--) LcdBuf1[i]=' '; for(i=0;i<5;i++) LcdBuf1[i]=LcdBuf1[i+1]; if(LcdBuf1[4]==' ')LcdBuf1[4]='0'; LcdBuf1[5]='.'; v_Lcd12864PutString_f( 0,2,LcdBuf1 ); } void Com_Init(void) //串口初始化 { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; //波特率9600=11.0592*1000000/12/(0x100-0xfd)/32 TL1 = 0xFd; TR1 = 1; } void send_char_com( unsigned char ch) //发送一个字符 { SBUF=ch; while (TI== 0 ); TI= 0 ; } void send_string_com( unsigned char *str, unsigned int strlen) //向串口发送一个字符串,strlen为该字符串长度 { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } void send() { send_string_com(LcdBuf1, 10); } 2.3上位机设计及主要代码 上位机即简易的串口小助手,主要用于对串口的管理及对下位机数据的接收。本程序有C#编写,方便简洁。

2.3.1SerialPort 组件 在 Visual Studio 2008 开发工具中,可以不再采 用第三方控件的方法来设计串口通讯程序。NET Framework 2.0 类库包含了 SerialPort 类,方便地实现了所需要串口通讯的多种功能,可以实现MSComm 编程方法快速转换到以 SerialPort 类为核心的串口通讯。本上位机选用固定串口COM1,波特率为9600,器件属性如图2-2所示:
图2-2设置串口属性 2.3.2串口操作 在程序中添加一个打开串口按钮btnOpen,btnOpen.Text 初始化为“打开串口”。在btnOpen 响应函数中加入以下代码:
private void btnOpen_Click(object sender, EventArgs e) { if (btnOpen.Text == “打开串口“) { btnOpen.Text = “关闭串口“; serialPort1.Open(); } else { btnOpen.Text = “打开串口“; serialPort1.Close(); } } 设置窗体响应事件,代码如下:
private void Form1_Load(object sender, EventArgs e) { btnOpen.Text = “打开串口“; } 这时该程序已经具有开关串口的作用,可以用单片机虚拟串口互连方法方法进行串口测试。

2.3.3数据的接收 数据接收大体有两种方案:1、主动定时读取;
2、事件响应驱动。

事件响应驱动这种方式是串口通信上位机制作的主要方式,其采用中断思想而成,当串口输入缓冲区中的字节数据大于某个设定的个数时,触发串口输入中断,这时在中断程序中读取串口输入缓冲区中的数据,具有实时性和灵活性,是个常用的较好的方法。本程序也是采用这种方法来进行串口输入缓冲区的实时数据读取。

.NET 中封装了SerialPort 类表示串行端口资源。

命名空间:
System.IO.Ports 程序集:
System(在System.dll 中) 除了前面用到的串口常规属性设置(BuadRate,PortName),这里用到了一个新的串口属性:ReceivedBytesThreshol 获取或设置DataReceived 事件发生前内部输入缓冲区中的字节数。这个ReceiveBytesThreshold 属性即是设置串口输入缓冲区中的数据字节大于 ReceiveBytesThreshold 时触发DataReceived 事件。主要代码如下:
string serialReadString; private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { serialReadString = serialPort1.ReadExisting(); this.rTB_receive.Invoke ( new MethodInvoker ( delegate { this.rTB_receive.AppendText(serialReadString); } ) ); } 此时接收功能已经实现,如图2-3所示:
图2-3上位机接收数据 2.3.4保存数据与清空数据 本模块仅为完善上位机功能,程序简单,主要代码实现如下:
private void btnSave_Click(object sender, EventArgs e) { try { System.IO.FileStream objfile; saveFileDialog1.ShowDialog(); objfile = System.IO.File.Create(@saveFileDialog1.FileName); objfile.Close(); objfile.Dispose(); System.IO.StreamWriter objfil = new System.IO.StreamWriter(@saveFileDialog1.FileName); objfil.Write(rTB_receive.Text); objfil.Close(); objfil.Dispose(); } catch { MessageBox.Show(“数据未保存!“); } } private void btnClear_Click(object sender, EventArgs e) { rTB_receive.Clear(); } 3系统硬件电路设计 系统由五大部分组成:(1)测温电桥温量电路;
(2)数据采集,滤波,放大,AD转换电路;
(3)单片机AT89C51控制及数据计算电路;
(4)电源电路;
(5)温度实时显示电路。

3.1恒温桥电路 本次课程设计的测温电路为测温电桥,测温电桥的主要部分是热敏电阻。

本次设计采用的是正温度系数的热电阻PT100,它是最常用的温度传感器之一,它具有较好的长期稳定性,利用适当的数据处理设备就可以传输、显示并记录其温度输出。因为热敏电阻的阻值和温度呈正比关系,我们只需将已知电流流过该电阻就可以得到与温度成正比的输出电压。Pt100是电阻式温度传感器,测温的本质其实是测量传感器的电阻,通常是将电阻的变化转换成电压或电流等模拟信号,然后再将模拟信号转换成数字信号,再由处理器换算出相应温度。

测温电路原理图如图3-1所示:
图3-1测温电路原理图 电桥原理图如图3-2所示:
图3-2电桥原理图 3.2信号放大电路 本次课程设计,放大模块采用的是LM324放大集成电路。LM324是四运放集成电路,它采用14脚双列直插塑料封装,外形如图所示。它的内部包含四组形式完全相同的运算放大器,除电源共用外,四组运放相互独立。

3.3A/D转换电路 此次课程设计的A/D转换电路,负责将放大后的模拟电压信号转化为可供单片机识别的数字信号。此次课程设计选用ADC0832芯片。

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。

  正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。电路原理图如图3-3所示:
图3-3A/D转换电路 由于ADC0832是8位分辨率,返回的数值在0~255之间,对应模拟数值为0~5V,因此每一档对应的电压值约为0.0196V。

3.4控制电路 AT89C51单片机最小系统由AT89C51单片机及其外围电路组成,是数字温度计系统的核心。AT89C51单片机在高温环境中稳定性好,支持在线编程ISP,无需专用的编程器,方便调试.AT89C51单片机对很多嵌入式控制应用提供了一个高灵活有效的解决方案。它的作用是控制TLC2543进行模数转换、形成必要的时序、进行数据计算以及控制数码管显示。

AT89C51单片机各个引脚分布如图3-4所示:
图3-4AT89C51单片机引脚图 3.5显示电路 显示电路采用的是12864液晶显示模块。带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;
其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

4总结与展望 本人在此次课程设计里主要负责串口通信、上位机设计与温度输出公式。

经过一个多星期的制作,我们的作品终于成功出炉。这是继大二相对较简单的课程设计后一次真正的挑战。当我们拿到题目时,便知道这与大二时的有着本质的区别。题目的复杂程度远高于从前,虽然看起来需要实现的功能不多,但是要使温度严格达到要求的精度还是有相当的困难,这与电路图的设计,以及程序的写法上有很大的关系,稍有不慎,就会使最后得到的温度值不准确,并且误差较大。所以我们精心设计了原理图,还研究了多种热敏电阻的原理与适用范围,在多次修正与测试后才得到了现在相对较完美的结果。

为了体现我们与别人的不同,我们尽量使作品的功能齐全,并使用多种方式完成设计,并且易于操作与实现。在完成基本功能的前提下,我们完成了上位机的设计,并尝试用查表法实现温度的输出(虽然查表法没有成功),尽管花费了很多时间与精力,但是看到最终所有的功能都实现了,我们都感到十分欣慰与欢喜。特别是串口通信这里,由于是第一次接触,要将一个完全不懂的东西搞懂,实属不易。C语言的学习与使用,使我进步了不少,这对于我来说是很重要的提高。

我会吸取这次的经验,希望下次我能做的更好! 参考文献 [1] 秦志强. C51单片机应用与C语言程序设计[M]. 电子工业出版社, 2009-9-1. [2] 谢维成, 杨加国, 董秀成. 单片机原理与应用及C51程序设计[M]. 清华大学出版社, 2009-9-1. [3]Maxim Integrated Products. PT100温度变送器的正温度系数补偿[EB/OL]. 2010[]. http://d1.ourdev.cn/bbs_upload782111/files_30/. 项目设计 评 语 项目设计 成 绩 指导教师 (签字) 年 月 日

推荐访问:热敏电阻 温度计 课程设计 数字

《基于热敏电阻数字温度计课程设计.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:

文档为doc格式

一键复制全文 下载 投诉