欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    基于热敏电阻的数字温度计_毕业设计论文.doc

    • 资源ID:3923129       资源大小:371KB        全文页数:23页
    • 资源格式: DOC        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于热敏电阻的数字温度计_毕业设计论文.doc

    科信学院单片机应用系统(三级)项目设计说明书(2012/2013学年第二学期)题 目 : 基于热敏电阻的数字温度计 _专业班级 : 电子信息工程1021 设计周数 : 两周 设计成绩 : 2013年6月28日基于热敏电阻的数字温度计目录1实验设计目的22系统软件设计22.1软件总体流程设计22.2系统设计及主要程序32.2.1系统主函数32.2.2汉显lcd1286442.2.3时钟芯片DS130262.2.4ADC0832112.3上位机设计及主要代码142.3.1SerialPort 组件142.3.2串口操作152.3.3数据的接收152.3.4保存数据与清空数据173系统硬件电路设计173.1恒温桥电路173.2信号放大电路183.3A/D转换电路183.4控制电路193.5显示电路204总结与展望20参考文献211实验设计目的 随着以知识经济为特征的信息化时代的到来人们对仪器仪表的认识更加深入,温度作为一个重要的物理量,是工业生产过程中最普遍,最重要的工艺参数之一。随着工业的不断发展,对温度的测量的要求也越来越高,而且测量的范围也越来越广,对温度的检测技术的要求也越来越高,因此,温度测量及其测量技术的研究也是一个很重要的课题。 本系统的温度测量采用的就是热阻效应。温度测量模块主要为温度测量电桥,当温度发生变化时,电桥失去平衡,从而在电桥输出端有电压输出,但该电压很小。将输出的微弱电压信号通过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 intvoid 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 intvoid 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_READvoid 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_INCvoid 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_INCvoid 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 intvoid 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+)ucCurtimei = 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 本系统最重要的模块,是实现本项目数字温度计系统基本功能的核心模块,在本模块中传递出0255共256个数字,然后通过分段计算得出温度。本模块代码中还加入了串口通信,串口初始化为方式二,9600比特率。主要代码实现如下:#include "ADC0832.h"#include "intrins.h"#include"lcd12864.h"#define uchar unsigned char#define uint unsigned int uchar l_temp; unsigned char LcdBuf110=""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-) LcdBuf1i=temp%10+48; temp/=10; if(temp < 0 ) w= -temp; for(i=6;w>0;i-) LcdBuf1i=w%10+48; w/=10; if(i>=0&&temp<0) if(temp > -10) LcdBuf1i = '0' i-; LcdBuf1i = '-' i-; for(;i>=0;i-) LcdBuf1i=' ' for(i=0;i<5;i+) LcdBuf1i=LcdBuf1i+1; if(LcdBuf14=' ')LcdBuf14='0' LcdBuf15='.' 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,它是最常用的温度传感器之一,它具有较好的长期稳定性,利用适当的

    注意事项

    本文(基于热敏电阻的数字温度计_毕业设计论文.doc)为本站会员(哈尼dd)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开