单片机课程设计 数字温度计课程设计_第1页
单片机课程设计 数字温度计课程设计_第2页
单片机课程设计 数字温度计课程设计_第3页
单片机课程设计 数字温度计课程设计_第4页
单片机课程设计 数字温度计课程设计_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机原理及系统课程设计评语:考勤10分守纪10分过程30分设计报告30分答辩20分总成绩(100分)专 业:电气工程及其自动化班 级: 电气1101 姓 名: 学 号: 指导教师: 兰州交通大学自动化与电气工程学院2014 年 1 月 17 日1 设计题目基于单片机的数字温度计设计。2 设计方案2.1设计目的单片机是单片微型计算机的简称,其具有体积小、可靠性高、功能强、灵活方便等优点,故可以广泛应用于各种领域。其中数字温度计就是一个典型的例子。本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等特点,其输出温度采用数字显示,主要用于对测温要求较高的场所,该设计主要

2、使用的元件有单片机AT89C52,测温传感器使用DS18B20和LCD1602液晶显示器。2.2 性能指标(1) 基本范围-50-110;(2) 精度为0.5;(3) 液晶LCD显示;(4) 可以设定温度的上下限以及报警功能。3 数字温度计系统的硬件设计3.1 数字温度计硬件框图数字温度计系统硬件框图如图1所示。图1 系统的硬件框图3.2 AT89C52单片机AT89C52单片机引脚配置图,如图2所示。图2 AT89C52引脚配置图3.3 外围电路AT89C52的时序就是CPU在执行指令时所需控制信号的时间顺序。选择了内部时钟方式,即利用芯片内部的振荡器,然后在引脚XTAL1和XTAL两端跨接

3、晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路。外接晶振时,C1和C2值通常选择为30PF左右。C1和C2对频率有微调作用。晶体的频率范围可在1.212MHZ之间选择。AT89C52的复位电路是按键电平复位电路,相当于按复位键后复位端通过电阻与Vcc电源接通。复位是单片机的初始化操作。单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。显示电路采用LCD1602液晶显示器显示。故障状态指示电路采用发光二级管以及蜂鸣器对运行方式进行指示,可清楚看到系统的故障状态。测温传感器DS18B20可以直接读出被测温

4、度值,采用三线制和单片机相连,少了外部的硬件电路,具有低成本和易使用的特点。3.4 总设计图数字温度计系统的硬件总设计图如图3所示。图3 总设计图4 数字温度计系统的软件设计及系统整体流程整个系统的功能是由硬件电路配合软件来实现的,从软件的功能不同,可以分为两类:主程序和子程序。主程序是整个软件的核心,专门用来协调各个执行模块和操作者的联系。子程序是用来完成各种实质性的工作的,如读温度子程序、转换温度子程序、计算温度子程序等。各执行模块规划好以后,就可以规划监控软件了。首先要根据系统的总体功能选择一种最合适的主程序结构,然后根据实时性的条件,合理安排监控软件和执行软件之间的调度关系。4.1 总

5、体流程图 数字温度计系统总体流程图如图4所示。图4 主流序流程图4.2 子程序流程图数字温度计系统子程序主要包含:读温度子程序、转换温度子程序、计算温度子程序。(1)读温度子程序流程图读温度子程序流程图如图5所示。图5 读温度子程序流程图(2)转换温度子程序流程图转换温度子程序流程图如图6所示。图6 转换温度子程序流程图(3)计算温度子程序流程图计算温度子程序流程图如图7所示。图7 计算温度子程序流程图5 仿真结果(1) 正常温度显示温度计正常温度显示如图8所示。图8 正常温度显示(2) 报警温度显示温度计报警温度显示如图9所示。图9 报警温度显示6 总结通过这次单片机课程设计,不仅让我加深了

6、解了单片机课本上所学的知识,更通过自己的动手设计,将课本知识与动手操作能力相结合,让我对单片机及其系统设计的认识更进一步。在此次的课程设计中我学会了很多的东西。经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些结果,同时也发现了许多不足。对于本次的课程设计还有很大提升空间,目前仅完成的是基本功能实现,还有很多的扩展功能可以提升。参考文献1. 王思明. 单片机原理及应用系统设计M. 北京:科学出版社, 2012.2. 李广弟. 单片机基础M. 北京:北京航空航天大学出版社, 1994.3. 艾德才. pentium/80486实用汇编语言程

7、序设计M. 北京:清华大学出版社, 1997.附录 源程序/使用1602LCD显示DS18B20转换的温度值 #include <reg52.H> #include <intrins.H> #include <math.H> #define uchar unsigned char #define uint unsigned int sbit RS = P30; /数据/命令选择端(H/L) sbit LCDEN = P32; /使能端 sbit deng=P16; /超过温度限制指示灯 sbit beep=P17; /超过温度限制报警器 uchar high

8、=30; /最高温度 uchar low=10; /最低温度 unsigned char r; void delayUs() /短延时 _nop_(); 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; P2 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(

9、1); /写数据:RS=1, RW=00 void writeData(uchar dat) RS = 1; P2 = dat; LCDEN = 1; delayUs(); LCDEN = 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, 且光标也

10、加1; N=0则相反 /S=1, 当写一个字符, 整屏显示左移(N=1)或右移(N=0), 但光标不移动; S=0, 整屏不移动 void init() writeComm(0x38); /显示模式 writeComm(0x0c); /开显示, 关光标 writeComm(0x06); /写字符后地址加1, 光标加1 writeComm(0x01); /清屏 void writeString(uchar * str, uchar length) uchar i; for(i = 0; i < length; i+) writeData(stri); /*DS18B20*/ sbit ds

11、 = P37; /初始化DS18B20 /让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动 void dsInit() /对于11.0592MHz时钟, unsigned int型的i, 作一个i+操作的时间大于为8us unsigned int i; ds = 0; i = 100; /拉低约800us, 符合协议要求的480us以上 while(i>0) i-; ds = 1; /产生一个上升沿, 进入等待应答状态 i = 4; while(i>0) i-; void dsWait() unsigned int i; while(ds); whi

12、le(ds); /检测到应答脉冲 i = 4; while(i > 0) i-; /向DS18B20读取一位数据/读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, /之后DS18B20则会输出持续一段时间的一位数据bit readBit() unsigned int i; bit b; ds = 0; i+; /延时约8us, 符合协议要求至少保持1us ds = 1; i+; i+; /延时约16us, 符合协议要求的至少延时15us以上 b = ds; i = 8; while(i>0) i-; /延时约64us, 符合读时隙不低于60us要求 return b

13、;/读取一字节数据, 通过调用readBit()来实现unsigned char readByte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i<8; i+) j = readBit(); /最先读出的是最低位数据 dat = (j << 7) | (dat >> 1); return dat;/向DS18B20写入一字节数据void writeByte(unsigned char dat) unsigned int i; unsigned char j; bit b; for(j = 0;

14、 j < 8; j+) b = dat & 0x01; dat >>= 1;/写"1", 将DQ拉低15us后, 在15us60us内将DQ拉高, 即完成写1 if(b) ds = 0; i+; i+; /拉低约16us, 符号要求1560us内 ds = 1; i = 8; while(i>0) i-; /延时约64us, 符合写时隙不低于60us要求 else /写"0", 将DQ拉低60us120us ds = 0; i = 8; while(i>0) i-; /拉低约64us, 符号要求 ds = 1; i+

15、; i+; /整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了 /向DS18B20发送温度转换命令void sendChangeCmd() dsInit(); /初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); /等待DS18B20应答 delayMs(1); /延时1ms, 因为DS18B20会拉低DQ 60240us作为应答信号 writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0x44); /写入温度转换命令字 Convert T/向DS18B20发送读取数据命令void sendRe

16、adCmd() dsInit(); dsWait(); delayMs(1); writeByte(0xcc); /写入跳过序列号命令字 Skip Rom writeByte(0xbe); /写入读取数据令字 Read Scratchpad/获取当前温度值int getTmpValue() unsigned int tmpvalue; int value; /存放温度数值 float t; unsigned char low, high; sendReadCmd(); /连续读取两个字节数据 low = readByte(); high = readByte(); /将高低两个字节合成一个整形

17、变量 /计算机中对于负数是利用补码来表示的 /若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; /使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度 t = value * 0.0625; /将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二位进行4舍5入 /如t=11.0625, 进行计数后, 得到value = 111, 即11.1 度 /如t=-11

18、.0625, 进行计数后, 得到value = -111, 即-11.1 度 value = t * 10 + (value > 0 ? 0.5 : -0.5); /大于0加0.5, 小于0减0.5 return value;/显示温度void display(int v) unsigned 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;r= tmp/10; writeC

温馨提示

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

评论

0/150

提交评论