1、 数字温度计毕业设计0电子毕业设计数字温度计题目: 数显温度计学院: 电子信息学院班级: 学号: 姓名: 指导老师: 日期:数字温度计毕业设计1数字温度计设计任务书一、 课程设计目的1、 加强学生理论联系实际的能力,提高学生的动手能力;2、 学会基本电子元器件的识别和检测;3、 学会应用 EDA 软件 Proteus 进行电路的设计和仿真;4、 基本掌握单片机的基本原理,并能将其应用于系统的设计。5、 通过实训,提高学生的学习兴趣,激发自主学习能力,培养创新意识。二、 设计任务先焊制一个单片机最小系统,并以制作的单片机最小系统为核心,设计并制作一个数字式温度计应用系统。三、 设计要求具有以下功
2、能:(1) 采用 DS18B20作为温度传感器进行温度检测;(2) 对采集温度进行显示(显示温度分辨率0.1 ) ;(3) 采集温度数值应采用数字滤波措施,保证显示数据稳定;(4) 显示数据,无数据位必须消隐。数字温度计毕业设计2目录数字温度计设计任务书 21、 设计思路(1 ) 设计原理 4(2 ) 系统方案及总体设计框图 42、 数字温度计应用系统的硬件设计(1) 单片机小系统基本组成及硬件图 (2) 外围电路工作原理及系统硬件图 (3) 主要芯片及其功能 3、 系统软件程序的设计软件流程框图 4、 系统调试(1) 仿真器介绍 (2) 调试结果及其分析(3) 系统设计电路的特点和方案的优缺
3、点 5、 课程设计心得体会参考文献附录 程序清单及注释数字温度计毕业设计3一、 设计思路:设计方案及其总体设计框图温度计设计系统流程图开始进入缓冲区初始化复位 DS18B20 发跳过 ROM 命令温度转换命令延时复位 DS18B20,跳过 ROM 命令读存储器命令将温度转换为 BCD 码更新数据缓冲区读温度命令系统设计原理:本次课程设计是基于单片机的数字温度计设计,在开始课程设计的时候我们要理解并掌握对单片机的开发,学会使用 KEIL 及 Proteus等仿真软件。根据设计任务要求选择好器件,编写好程序运行成功之后进行软件联调,验证系统是否正确。通过筛选,我们组选用单片机AT89S52 作为主
4、控制系统;用 1602液晶显示模块芯片作为温度数据显示装置;智能温度传感器采用DS18B20 器件作为测温电路主要组成部分。晶振控制单片机芯片AT89S521602 显示器温度检测电路DS18B20数字温度计毕业设计4二、数字温度计应用系统的硬件设计1、单片机小系统的基本组成及其选择(1 )单片机单片机选型参考 AT89S51、AT89S52 :具备 ISP 下载功能 ,可以使用 USBASP 程序下载线或者并口下载 STC89C51、STC89C52 :使用串口线+MAX232 烧写程序。 AT89C51、AT89C52 :可以在最小系统板上使用,但需要另外用编程器烧写程序 本次课程设计选用
5、 AT89S52 型号单片机进行操作。AT89S52 引脚图此外,AT89S52 设计和配置了振荡频率可为 0Hz 并可通过软件设置省电模式。空闲模式下,CPU 暂停工作,而 RAM 定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存 RAM 的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有 PDIP、TQFP 和 PLCC 等三 种封装形式,以适应不同产品的需求。(4 ) 电源 电源适配器供电:DC 座(三个管脚) usb 供电:AT89S52 是一个低功耗,高性能 CMOS 8 位单片机,片内含 8k Bytes ISP(In-system progra
6、mmable)的可反复擦写 1000 次的 Flash 只读程序存储器,器件采用 ATMEL 公司的高密度、非易失性存储技术制造,兼容标准 MCS -51 指令系统及 80C51 引脚结构,芯片内集成了通用 8位中央处理器和 ISP Flash 存储单元,功能强大的微型计算机的 AT89S52 可为许多嵌入式控制应用系统提供高性价比的解决方案。AT89S52 具有如下特点: 40 个引脚,8k Bytes Flash 片内程序存储器,256 bytes 的随机存取数据存储器(RAM) ,32 个外部双向输入 /输出(I/O)口,5 个中断优先级 2 层中断嵌套中断,2 个 16 位可编程定时计
7、数器,2 个 全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。AT89S52 引脚图此外,AT89S52 设计和配置了振荡频率可为0Hz 并可通过软件设置省电模式。空闲模式下,CPU 暂停工作,而 RAM 定时计数器,串行口,外中断 系统可继续工作,掉电模式冻结振荡器而保存 RAM 的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP 和 PLCC 等三 种封装形式,以适应不同产品的需求。数字温度计毕业设计53、时钟4、 I/O 口 /数据/命令选择端(H/L)sbit LCDEN = P27; /使能端void delayUs() /短延时_nop_(
8、);void delayMs(uint a) /长延时uint i, j;for(i = a; i 0; i-)for(j = 100; j 0; j-);/第一行开始地址为 0x80, 第二行开始地址为 0xc0;/写命令:RS=0, RW=0;void writeComm(uchar comm)RS = 0; P1 = comm;LCDEN = 1;delayUs();LCDEN = 0;delayMs(1);数字温度计毕业设计14/写数据:RS=1, RW=00void writeData(uchar dat)RS = 1;P1 = dat;LCDEN = 1;delayUs();LCD
9、EN = 0;delayMs(1);/初始化函数/显示模式, 固定指令为 00111000=0x38, 16*2 显示, 5*7 点阵,8 位数据接口/显示开/关及光标设置 00001100=0x0c/指令 1: 00001DCB : D:开显示/ 关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L)/指令 2: 000001NS :/N=1, 当读/写一个字符后地址指针加 1, 且光标也加 1; N=0 则相反/S=1, 当写一个字符 , 整屏显示左移(N=1) 或右移(N=0), 但光标不移动; S=0, 整屏不移动void init()writeComm(
10、0x38); /显示模式writeComm(0x0c); /开显示, 关光标writeComm(0x06); /写字符后地址加 1, 光标加 1writeComm(0x01); /清屏void writeString(uchar * str, uchar length)uchar i;for(i = 0; i 0) i-;ds = 1; /产生一个上升沿 , 进入等待应答状态i = 4;while(i0) i-;void dsWait()unsigned int i;while(ds); while(ds); /检测到应答脉冲i = 4;while(i 0) i-;/向 DS18B20 读取一
11、位数据/读一位, 让 DS18B20 一小周期低电平, 然后两小周期高电平, /之后 DS18B20 则会输出持续一段时间的一位数据bit readBit()unsigned int i;bit b;ds = 0;i+; /延时约 8us, 符合协议要求至少保持 1usds = 1; i+; i+; /延时约 16us, 符合协议要求的至少延时 15us 以上b = ds;i = 8; while(i0) i-; /延时约 64us, 符合读时隙不低于 60us 要求return b;数字温度计毕业设计16/读取一字节数据, 通过调用 readBit()来实现unsigned char rea
12、dByte()unsigned int i;unsigned char j, dat;dat = 0;for(i=0; i 1);return dat;/向 DS18B20 写入一字节数据void writeByte(unsigned char dat)unsigned int i;unsigned char j;bit b;for(j = 0; j = 1;/写“1“, 将 DQ 拉低 15us 后, 在 15us60us 内将 DQ 拉高, 即完成写 1if(b) ds = 0;i+; i+; /拉低约 16us, 符号要求 1560us 内ds = 1; i = 8; while(i0)
13、 i-; /延时约 64us, 符合写时隙不低于 60us 要求else /写“0“, 将 DQ 拉低 60us120usds = 0;i = 8; while(i0) i-; /拉低约 64us, 符号要求数字温度计毕业设计17ds = 1;i+; i+; /整个写 0 时隙过程已经超过 60us, 这里就不用像写 1 那样, 再延时 64us 了/向 DS18B20 发送温度转换命令void sendChangeCmd()dsInit(); /初始化 DS18B20, 无论什么命令, 首先都要发起初始化dsWait(); /等待 DS18B20 应答delayMs(1); /延时 1ms,
14、 因为 DS18B20 会拉低 DQ 60240us 作为应答信号writeByte(0xcc); /写入跳过序列号命令字 Skip RomwriteByte(0x44); /写入温度转换命令字 Convert T/向 DS18B20 发送读取数据命令void sendReadCmd()dsInit();dsWait();delayMs(1);writeByte(0xcc); /写入跳过序列号命令字 Skip RomwriteByte(0xbe); /写入读取数据令字 Read Scratchpad/获取当前温度值int getTmpValue()unsigned int tmpvalue;i
15、nt value; /存放温度数值float t;unsigned char low, high;sendReadCmd();/连续读取两个字节数据low = readByte(); high = readByte();数字温度计毕业设计18/将高低两个字节合成一个整形变量/计算机中对于负数是利用补码来表示的/若是负值, 读取出来的数值是用补码表示的, 可直接赋值给 int 型的 valuetmpvalue = high;tmpvalue 0 ? 0.5 : -0.5); /大于 0 加 0.5, 小于 0 减 0.5return value;void display(int v) unsig
16、ned char count;unsigned char datas = 0, 0, 0, 0;unsigned int tmp = abs(v);datas0 = tmp / 1000;datas1 = tmp % 1000 / 100;datas2 = tmp % 100 / 10;datas3 = tmp % 10;writeComm(0xc0+3);if(v 0)writeString(“- “, 2);elsewriteString(“+ “, 2);if(datas0 != 0)数字温度计毕业设计19writeData(0+datas0);for(count = 1; count != 4; count+)writeData(0+datascount);if(count = 2)writeData(.);/*DS18B20*/void main()uchar table = “Now Temperature “;delayMs(1);sendChangeCmd();init();writeComm(0x80);writeString(table, 16);while(1)delayMs(1000); /温度转换时间需要 750ms 以上writeComm(0xc0);display(getTmpValue();sendChangeCmd();