单片机课程设计(论文)-数字温度计设计 (2).doc_第1页
单片机课程设计(论文)-数字温度计设计 (2).doc_第2页
单片机课程设计(论文)-数字温度计设计 (2).doc_第3页
单片机课程设计(论文)-数字温度计设计 (2).doc_第4页
单片机课程设计(论文)-数字温度计设计 (2).doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理及应用实习数字温度计设计目 录一 引言1二 硬件设计 2三 软件设计 9四 调试过程及问题分析 12五 结论 13六 参考文献 14附件1 15附件2 29一、引言随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,当然,学习单片机的原理及应用已经成为我们电子类专业大学生所必须的课程。而本文所介绍的是一种基于单片机控制的数字温度计。所采用的元器件db18b20与传统的温度计相比,具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。更加增强了其实用性和操作性。lcd12864液晶显示模块是12864 点阵的汉字图形型液晶显示模块,可显示汉字及图形,具有多种功能:光标显示、画面移位、睡眠模式等。数字温度计选用stc89c52rc型单片机作为作为其主控器件,dsl8b20作为测温传感器通过液晶显示器lcd12864调用数据,实现温度显示。通过dsl8b20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,能够快速精确的显示数据。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,该温度计还能直接采用测温器件测量温度,从而简化数据传输与处理过程。最终由lcd12864液晶显示显示出db18b20所测温度。结果精确可调为0.5,分辨率为0.0625。二、硬件设计(一)、系统硬件设计方案根据系统功能要求,构造如下图所示的系统原理结构框图。ds18b20温度数据采集stc89cs52rc初始化lcd12864驱动显示温度图1 系统原理结构框图1、 单片机的选择stc89c52rc是新一代超强抗干扰/高速/低功耗的单片机,指令代码完全兼容传统8051单片机,12时钟/机械周期和6时钟/机械周期可以任意选择,其内核与at51系列单片机一样,但是其造价较之更低,功能更强。at51单片机小系统的电路图如下所示。单片机小系统电路1)、引脚说明stc89c52的内核和at51系列单片机一样,故引脚也相同:18:i/op1口(p1.0p1.7);9: 复位脚(rst/vpd);1017:i/op3口(p3.0=rxd,p3.1=txd,p3.2=-int0,p3.3=-int1,p3.4=t0,p3.5=t1,p3.6=-wr,p3.7=-rd);18、19:晶振(18=xtal2,19=xtal1);20: 地(vss);2128:i/op2口(p2.0p2.7); 29:-psen;30:ale/-prog;31:-ea/vpp3239:i/op0口(p0.7p0.0);40:+5v电源。注:引脚功能前加“-”,说明其是低电平有效。如p3.2=-int0。2)、内部功能1. i/o 口:输入/ 输出口经过特殊处理,很多干扰是从i/o 进去的,每个i/o 均有对vcc/ 对gnd二级管箝位保护。2. 电源:单片机内部的电源供电系统经过特殊处理,很多干扰是从电源进去的3. 时钟单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的4 . 空闲模式:典型功耗 2ma5.正常工作模式:典型功耗 4ma - 7ma单片机内部的时钟电路经过特殊处理,很多干扰是从时钟部分进去的6. 复位电路单片机内部的复位电路经过特殊处理,很多干扰是从复位电路部分进去的,stc89c51rc/rd+系列单片机为高电平复位。推荐外置复位电路为max810/stc810,stc6344,stc6345,813l,706p;也可用r/c 复位,10uf 电容/10k 电阻,22uf/8.2k 等。6.宽电压,不怕电源抖动5v: 6v - 3.4v 3v: 4v - 1.9v2、温度传感器介绍ds18b20温度传感器是美国dallas半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位的数字值读数方式。ds18b20内部结构主要由四部分组成:64位光刻rom、温度传感器、非挥发的温度报警触发器th和tl、配置寄存器。ds18b20可以程序设定912位的分辨率,精度为0.5c。可选更小的封装方式,更宽的电压适用范围。分辨率设定存储在eprom中,掉电后依然保存。而在此,我们设定12为分辨率,即温度分辨率0.0625。ds18b20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个ds18b20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; ds18b20采用脚pr35封装或脚soic封装,其内部结构框图如下图所示。c64 位rom和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器th低温触发器tl配置寄存器8位crc发生器vddds18b20内部结构根据ds18b20的通讯协议,主机控制ds18b20完成温度转换必须经过三个步骤:(1).初始化(2) 执行某个rom指令(3) 执行ram内存指令(4) 数据传输复位要求主cpu将数据线下拉480微秒,然后释放,ds18b20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主cpu收到此信号表示复位成功。ds18b20与单片机的接口电路3、液晶显示lcd12864液晶显示模块是12864 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标gb2312 码简体中文字库(16x16 点阵)、128 个字符(8x16 点阵)及64x256 点阵显示ram(gdram)。可与cpu 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。硬件原理图:1)、引脚说明管脚号管脚名称lever管脚功能描述1vss0电源地2vdd+5.0v电源电压3v0-液晶显示器驱动电压4d/i(rs)h/ld/i=“h”,表示db7db0为显示数据d/i=“l”,表示db7db0为显示指令数据5r/wh/lr/w=“h”,e=“h”数据被读到db7db0r/w=“l”,e=“hl”数据被写到ir或dr6eh/lr/w=“l”,e信号下降沿锁存db7db0r/w=“h”,e=“h”ddram数据读到db7db07db0h/l数据线8db1h/l数据线9db2h/l数据线10db3h/l数据线11db4h/l数据线12db5h/l数据线13db6h/l数据线14db7h/l数据线15cs1h/lh:选择芯片(右半屏)信号16cs2h/lh:选择芯片(左半屏)信号17reth/l复位信号,低电平复位18vout-10vlcd驱动负电压19led+-led背光板电源20led-led背光板电源2)、 内部功能器件及相关功能1. 指令寄存器(ir) ir是用于寄存指令码,与数据寄存器数据相对应。当d/i=0时,在e信号下降沿的作用下,指令码写入ir。2数据寄存器(dr) dr是用于寄存数据的,与指令寄存器寄存指令相对应。当d/i=1时,在下降沿作用下,图形显示数据写入dr,或在e信号高电平作用下由dr读到db7db0数据总线。dr和ddram之间的数据传输是模块内部自动执行的。3忙标志:bf bf标志提供内部工作情况。bf=1表示模块在内部操作,此时模块不接受外部指令和数据。bf=0时,模块为准备状态,随时可接受外部指令和数据。 利用status read指令,可以将bf读到db7总线,从检验模块之工作状态。4显示控制触发器dff 此触发器是用于模块屏幕显示开和关的控制。dff=1为开显示(display off),ddram的内容就显示在屏幕上,dff=0为关显示(display off)。 ddf的状态是指令display on/off和rst信号控制的。5xy地址计数器 xy地址计数器是一个9位计数器。高3位是x地址计数器,低6位为y地址计数器,xy地址计数器实际上是作为ddram的地址指针,x地址计数器为ddram的页指针,y地址计数器为ddram的y地址指针。 x地址计数器是没有记数功能的,只能用指令设置。 y地址计数器具有循环记数功能,各显示数据写入后,y地址自动加1,y地址指针从0到63。6显示数据ram(ddram) ddram是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。ddram与地址和显示位置的关系见ddram地址表。7z地址计数器 z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,rst复位后z地址计数器为0。 z地址计数器可以用指令display start line预置。因此,显示屏幕的起始行就由此指令控制,即ddram的数据从哪一行开始显示在屏幕的第一行。此模块的ddram共64行,屏幕可以循环滚动显示64行。三、软件设计(一)、设计题目及要求:1、基本要求设计指标:a. 测温范围:0100;b. 温度分辨力:0.0625;c. 测量速率:2次/秒自动连续测量;d. 结果显示方式:用图形液晶lcd12864显示当前温度及与上一次温度测量值差值。2、扩展要求用图形液晶显示温度曲线。3、误差测试调试无误后,可用水银温度计与其进行比对,记录测量结果,进行误差分析。(二)、整体思路根据要求,我们将整个程序分为三大部分。主要包括主程序,温度传感程序,lcd12864液晶显示程序。(二)、程序流图1、 ds18b20温度计程序ds18b20温度计程序包括读出温度子程序,温度转换命令子程序,计算温度子程序。主程序的主要功能是负责温度的实时显示、读出并处理ds18b20的测量温度值,温度测量每0.5s进行一次。读出温度子程序的主要功能是读出ram中的字节。温度转换命令子程序主要是发温度转换开始命令,采用12位分辩率为0.065,在本程序设计中采用0.5s显示程序延时法等待转换的完成。 ds18b20温度计程序流程图如下:开始ds18b20的初始化启动温度转换读取温度寄存器ds18b20的初始化复位(二)、lcd12864液晶显示程序流程图如下:(三)、主程序流图开始初始化显示开机画面(b3组数字温度计)循环温度上电转化一次(读取温度)温度上电转化一次(读取温度)温度处理温度处理调用液晶显示程序显示温度(当前温度)储存此刻温度b储存此刻温度a调用液晶显示程序显示温度(之前温度)if(ab)yn 温度差d=b-a温度差d=a-b处理温度差显示温度差四、调试过程及问题分析我所设计的模块为lcd12864液晶显示模块,由于之前所接触的显示器件都是数码管显示,对液晶显示还是很陌生,所以在此次设计中,我翻阅和产寻了很多资料,对其内部结构进行了解,对其功能不断渗透,而老师在设计前也给了我们许多关于lcd12864的显示源程序及调试程序,这对我们的设计起了很大帮助。但是在写源程序的时候还是出了很多的问题。根据老师所给的综合程序,我们进行了综合分析,而我们的设计在液晶显示上重点是要输出汉字和相应的温度数值,综合程序中有汉字输出,我开始根据程序从取模程序中输出所需汉字的字模,但是从液晶屏上却总显示的是乱码,试了很多次,最后请教老师才知道,所给字码的像素是不一样的,所给综合程序的discode是8*16像素的,而我从取模程序中取的字模是16*16像素的,后来,老师和我们分析了液晶屏显示字码的基本原理,每一格通过为代码显示字模信息,后来,我又仔细分析和对比了综合程序的字模和我的字模,找到了两个解决方案,改代码或者改像素。结果都如我愿,操作显示正确。后来我在弄完时闲来无事又发现了一种方法可以用16*16的像素用8*16的discode显示,我发现,只要我所需要的字码在相应的小格里显示输出字码即可,于是我把一个字分左、右两部分分别显示,输出字码结合,结果也正确,而在此次设计中,我们采取汉字的输出方法也均用此方法。液晶显示模块的代码在我们的整体设计中可以说是一块比较简单的部分,而重点就是db18b20的温度模块,这个模块是我们组花比较多的时间完成的,db18b20对温度的测量是在延时过程中进行的,在温度的转化中设定0.5s的测温速度,以12位的分辨率进行,这12位转化后得到的12位数据,存储在18b20的两个8比特的ram中,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。温度主函数输出温度。而整体的主函数调用温度显示温度是我们整个设计的一个大问题,试了许多次,总是达不到所期待的结果,最后,老师告诉我们,在软件中仿真,一点点的找根源,进入程序内部,分析,一点点的排除。最终,我们发现了问题所在,原来是温度转换出了问题,在温度输出的16位字节的高八位 和低八位的输出转换有误,修改后输出正确。五、结论在这一学期的单片机课程中,文老师给我们讲了许多单片机的内部结构,编译语言,一直在朦朦胧胧的学习,模模糊糊的接受,即使到了考试的时候,我甚至感觉自己对单片机还是那么陌生。两周的课程实习,不长不短,但是又不可或缺,它似乎是对一学期的课程的润色,把抽象变为形象,让我们突然跳出理论,开始实践,当然是理论结合实践,真正在做得时候,才发现之前学的那么少,进行课程实习的时候,我看了很多关于单片机,温度传感器,液晶显示器的资料和相应的程序代码,越看越不懂,但是越看就越想看,就感觉看到一个不懂的,去找答案,于是就刹不住车了,一个套着一个,但是虽然模糊,但是却越想看,又一次,我看的最晚的一次是从下午一直到晚上3点多,一直没有看表也没有注意时间,那次我才发现知识那么可贵,不能说自己看懂,但是那种被知识灌输的感觉让我很舒服。对于此次的课程实习,我也总结了很多我认为适合我们,起码适合我自己的一些方法。一、 要对硬件功能了解,要熟悉相应程序代码和功能实现,二、 设计程序要有思路,根据思路才能有效进行三、 编写程序要有所根据,出现错误很正常,要一步步的排查错误,一定要细心耐心四、 要懂得听取正确意见,多和人交流,集思广益,合作的力量是无穷大的。五、 向别人讲解程序时,流程图是最好的展示。而我们小组正是在不断的合作中在两次的课题中都顺利完成。当然在此感谢各位指导老师这几周里对我们的帮助和指导。参考文献1杨恢先,黄辉先.单片机原理及应用(第一版) m.北京:人民邮电出版社,2006:214-221.2马忠梅.单片机c语言程序设计 m.北京:北航出版社,2007:36-48.3 田立,田清,代方震. 51单片机c语言程序设计快速入门(第一版) m.北京:人民邮电出版社,2007:35-40.附件1:源程序代码/=/ lcd12864 液晶显示/=#include #include #define uchar unsigned char#define uint unsigned int#define ulong unsigned long/=引脚定义=sbit lck = p35;/锁存信号sbit dq =p14;/18b20数据线引脚/=常用命令及参数定义=#define dispon 0x3f#define dispoff 0x3e#define dispfirst 0xc0#define setx 0x40#define sety 0xb8#define lcdbuzy 0x80#define l 0x00#define r 0x40#define limit 0x80#define line 16 / 设置最多一行可以显示多少字符(116)/=全局变量=code uchar pixel8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;uchar tempdisdata=0x00,0x00,0x00;uchar cbyte;uint i,j,temp;uchar data statu;uchar dispbuf8; /显示缓冲区 uchar temper2;/存放温度的数组 bit xy; / the position variableuchar charnum=1; /this named charnum variable recorded the char position,the whole screen can write 56 characters/one line can be written 14 characters /=汉字序列定义#define hz_zhi +1#define hz_dang +3#define hz_qian +5#define hz_wen +7#define hz_du +9#define hz_b +11#define hz_c +12#define hz_cha +14#define hz_bb +16#define hz_3 +17#define hz_zu +18#define hz_shu +20#define hz_zi+22#define hz_ji +24#define hz_kongge +26/=函数声明=void wrl(uchar x);void wrr(uchar x);void lcmcls(void);void delay1s(void);void lcminit (void);void putpicture(uchar flag);void delay(unsigned int time);void vtoh8x16change(uchar *hzbuf);void puthalf(uchar *strch,uchar row,uchar col);void wrdata(uchar x,uchar row,uchar col);void locatexy(uchar row,uchar col);void vwrite8x16character(uchar *ch,uchar row,uchar col,bit flag);void vwrite8x16string(uchar *str,uchar col, uchar row, bit flag);extern uchar code char_table9516;/=/ usage: print the character in format/=void printc(uint chr) uchar lie,hang; hang=(charnum-1)/line; hang=hang*2; lie=(charnum-1)%line; lie=8*lie; vwrite8x16character(char_tablechr- ,hang,lie,0); charnum+; /=/ name : prints(uchar *str)/ usage: print a stream in format /=void prints(uchar *str) while(*(str)!=0 ) / 一些格式的处理 if(*(str)=n ) /回车处理 charnum=(charnum+15)/16; charnum=charnum*16+1; str+; if(*(str)=0 ) return; if(*(str)=r ) /跳到所在行的行头 charnum=(charnum+15)/16; charnum=(charnum)*16-15; str+; if(*(str)=0 ) return; printc(*(str); str+; /=/ name : format(uchar *str)/ usage: this function is printing some format/ 格式化显示字符串 /=void format(uchar *str ) if(*(str)=n ) /回车处理 charnum=(charnum+15)/16; charnum=charnum*16+1; return; if(*(str)=r ) /回到本行头 charnum=(charnum+15)/16; charnum=charnum*16-15; return; if(*(str)=p ) /回到上一行头 charnum=(charnum+15)/16; charnum=charnum*16-31; return; if(*(str)=b ) /退格,并删除 charnum-; prints( ); charnum-; return; /*延时函数*/void delay (unsigned int us) while(us-);void reset(void) /复位 uchar x=0; dq = 1; delay(8); /稍做延时 dq = 0; delay(80); /精确延时 大于 480us dq = 1; /拉高总线 delay(14); x=dq; delay(20);void wr_temp(uchar dat)/写1个字节bit testb;for(j=8;j0;j-)testb=dat&0x01;dat=dat1;if(testb)/写1dq=0;/拉低总线,产生写时间隙i+;/延时大于1usdq=1;/拉高总线i=8;while(i0)i-;/延时至少60us,供ds18b20采样else /写0dq=0;/拉低总线,产生写时间隙i=8;while(i0)i-;/保持至少60us,供ds18b20采样dq=1;/拉高总线i+;i+;uchar rd_temp()/读1个字节bit b;/定义存放接收到的1个字节uchar i_b;uchar rdbyte;for(j=8;j0;j-)dq=0;/拉低总线,产生读时隙i+;/延时大于1usdq=1;/释放总线i+;i+;/给一定时间让总线释放b=dq;/读取数据i=8;while(i0)i-;/延时至少60usi_b=b;rdbyte=(i_b1);/将读取到得一位值左移7位,存放读取的数据变量rdbyte右移1位return rdbyte;/*cpu读取温度值*/void readtemp(void) /读取温度 float backbit; uchar a=0,b=0; reset();wr_temp(0xcc);/跳过romwr_temp(0x44);/开始温度转换reset();wr_temp(0xcc);/跳过romwr_temp(0xbe);/读暂存器 a= rd_temp(); /低位 b= rd_temp(); /高位 temp=b;tempb) d=c-b;else d=b-c;tempdisdata0=d/100;tempdisdata1=d%100/10;/显示数据:个位tempdisdata2=d%10; /显示数据:十分位 printc(tempdisdata0+0 ); printc(tempdisdata1+0 ); printc(hz_b ); /输出一个汉字需要两个字节 printc(tempdisdata2+0 ); printc(hz_c ); /输出一个汉字需要两个字节 printc(hz_c+1 ); delay1s(); delay1s(); delay1s();/*约1s延时*/void delay1s(void) delay(50000); delay(50000);/*初始化lcd*/void lcminit (void) cbyte=dispoff; wrl(cbyte); wrr(cbyte); cbyte=dispon; wrl(cbyte); wrr(cbyte); cbyte=dispfirst; wrl(cbyte); wrr(cbyte); lcmcls(); locatexy(0,0);/*lcd清屏*/void lcmcls(void) uchar i,j; for(i=0;i8;i+) delay(6); for(j=0;jlimit;j+) delay(6); wrdata(0x0,i,j); /*写左区*/void wrl(uchar x) p0=0xff;/p0口送ff,准备读 lck = 0; p1 = 0x2a;/elcd=1/w=1(读),csb=1,csa=0 lck = 1; while(p0 & lcdbuzy);/最高位为1,表示忙,则循环 lck = 0; p1 = 0x00;/elcd=0,r/w=0(读),csb=0,csa=0 lck = 1; p0 = x; /数据送到p0口 lck = 0; p1 = 0x22;/elcd=1,rw = 0(写),csb=1,csa=0 lck = 1; lck = 0; p1 = 0x00;/elcd=0,rw = 0(写),csb=0,csa=0 lck = 1;/*写右区*/void wrr(uchar data x) p0=0xff;/p0口送ff,准备读 lck = 0; p1 = 0x29;/elcd=1,r/w=1(读),csb=0,csa=1 lck = 1; while(p0 & lcdbuzy);/最高位为1,表示忙,则循环 lck = 0; p1 = 0x00;/elcd=0,r/w=0(读),csb=0,csa=1 lck = 1; p0=x; /数据送到p0口 lck = 0; p1 = 0x21;/elcd=1,rw = 0(写),csb=0,csa=1 lck = 1; lck = 0; p1 = 0x00;/elcd=0,rw = 0(写),csb=0,csa=0 lck = 1; /*定位*/void locatexy(uchar row,uchar col) uchar x, y, right; switch(col&0xc0) case 0: p0=0xff;/p0口送ff,准备读 lck = 0; p1 = 0x29;/elcd=1,r/w=1(读),csb=0,csa=1 lck = 1; while(p0 & lcdbuzy);/最高位为1,表示忙,则循环 lck = 0; p1 = 0x00; lck = 1; right = 1;break;/置右半屏标志 case 0x40: p0=0xff;/p0口送ff,准备读 lck = 0; p1 = 0x2a;/elcd=1,r/w=1(读),csb=1,csa=0 lck = 1; while(p0 & lcdbuzy);/最高位为1,表示忙,则循环 lck = 0; p1 = 0x00;/elcd=0,r/w=0(读)csb=0,csa=0 lck = 1; right =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论