评语: 考勤10分 守纪10分 过程30分 设计报告30分 答辩20分 总成绩(100分)
专 业:电气工程及其自动化 班 级: 电气1101 姓 名: 学 号: 指导教师:
兰州交通大学自动化与电气工程学院
2014 年 1 月 17 日
单片机原理及系统课程设计报告
1 设计题目
基于单片机的数字温度计设计。
2 设计方案
2.1设计目的
单片机是单片微型计算机的简称,其具有体积小、可靠性高、功能强、灵活方便等优点,故可以广泛应用于各种领域。其中数字温度计就是一个典型的例子。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确等特点,其输出温度采用数字显示,主要用于对测温要求较高的场所,该设计主要使用的元件有单片机ATC52,测温传感器使用DS18B20和LCD1602液晶显示器。
2.2 性能指标
(1) 基本范围-50℃-110℃; (2) 精度为0.5℃; (3) 液晶LCD显示;
(4) 可以设定温度的上下限以及报警功能。
3 数字温度计系统的硬件设计
3.1 数字温度计硬件框图
数字温度计系统硬件框图如图1所示。
- 1 -
单片机复位LCD显示ATC52时钟震荡蜂鸣器、指示灯温度报警调整DS18B20温度传感器 图1 系统的硬件框图
3.2 ATC52单片机
ATC52单片机引脚配置图,如图2所示。
U119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52 图2 ATC52引脚配置图
3.3 外围电路
ATC52的时序就是CPU在执行指令时所需控制信号的时间顺序。选择了内部时钟方式,即利用芯片内部的振荡器,然后在引脚XTAL1和XTAL两端跨接晶体或陶瓷谐振器,就构成了稳定的自激振荡器,其发出的脉冲直接送入内部时钟电路。外接晶振时,C1和C2值通常选择为30PF左右。C1和C2对频率有微调作用。晶体的频率范围可在1.2~12MHZ之间选择。
- 2 -
单片机原理及系统课程设计报告
ATC52的复位电路是按键电平复位电路,相当于按复位键后复位端通过电阻与Vcc电源接通。复位是单片机的初始化操作。单片机在启动运行时,都需要先复位,其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
显示电路采用LCD1602液晶显示器显示。
故障状态指示电路采用发光二级管以及蜂鸣器对运行方式进行指示,可清楚看到系统的故障状态。
测温传感器DS18B20可以直接读出被测温度值,采用三线制和单片机相连,少了外部的硬件电路,具有低成本和易使用的特点。
3.4 总设计图
数字温度计系统的硬件总设计图如图3所示。
- 3 -
LCD1LM016LVSSVDDVEERSRWEp30456123C1191nFU1X1CRYSTAL18XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617p20p21p22p23p24p25p26p27p30p37321C2C31nF1uFXTAL29RSTR110k293031PSENALEEAQ1MPS3702LS112345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52p207p218p229p2310p2411p2512p2613p2714D0D1D2D3D4D5D6D7U2VCCDQGNDDS18B2012.0p37SOUNDERD1LED-GREEN 图3 总设计图
4 数字温度计系统的软件设计及系统整体流程
整个系统的功能是由硬件电路配合软件来实现的,从软件的功能不同,可以分为两类:主程序和子程序。
主程序是整个软件的核心,专门用来协调各个执行模块和操作者的联系。 子程序是用来完成各种实质性的工作的,如读温度子程序、转换温度子程序、计算温度子程序等。
各执行模块规划好以后,就可以规划监控软件了。首先要根据系统的总体功能选择一种最合适的主程序结构,然后根据实时性的条件,合理安排监控软件和执行软件之间的调度关系。
4.1 总体流程图
数字温度计系统总体流程图如图4所示。
- 4 -
单片机原理及系统课程设计报告
图4 主流序流程图
4.2 子程序流程图
数字温度计系统子程序主要包含:读温度子程序、转换温度子程序、计算温度子程序。
(1)读温度子程序流程图
读温度子程序流程图如图5所示。
- 5 -
开始发DS 18B 20复位命令发送ROM命令发读取温度命令读取操作否9字节完?是否CRC校验正?是移入温度暂存器结束
图5 读温度子程序流程图
(2)转换温度子程序流程图
转换温度子程序流程图如图6所示。
- 6 -
单片机原理及系统课程设计报告
开始发DS18B20复位命令发跳过ROM命令发温度转换开始命令结束 图6 转换温度子程序流程图
(3)计算温度子程序流程图
计算温度子程序流程图如图7所示。
开始温度零下?否是温度值取补码置“-”标志温度置“+”标志计算小数位温度BCD值计算整数位温度BCD值结束 图7 计算温度子程序流程图
- 7 -
5 仿真结果
(1) 正常温度显示
温度计正常温度显示如图8所示。
LCD1LM016LD1LED-GREENVSSVDDVEERSRWEp30456123p207p218p229p2310p2411p2512p2613p2714D0D1D2D3D4D5D6D7 图8 正常温度显示 (2) 报警温度显示 温度计报警温度显示如图9所示。 LCD1LM016LD1LED-GREENVSSVDDVEERSRWEp30456123p207p218p229p2310p2411p2512p2613p2714D0D1D2D3D4D5D6D7 图9 报警温度显示 6 总结 通过这次单片机课程设计,不仅让我加深了解了单片机课本上所学的知识,更通过自己的动手设计,将课本知识与动手操作能力相结合,让我对单片机及其系统设计的认识更进一步。 在此次的课程设计中我学会了很多的东西。经过自己努力,基本上完成了设计要求的内容,在系统可行性分析、原理图设计等方面都作了许多实际工作,取得了一些结果,同时也发现了许多不足。对于本次的课程设计还有很大提升空间,目前仅完成的是基本功能实现,还有很多的扩展功能可以提升。 - 8 - 单片机原理及系统课程设计报告
参考文献
1. 王思明. 单片机原理及应用系统设计[M]. 北京:科学出版社, 2012. 2. 李广弟. 单片机基础[M]. 北京:北京航空航天大学出版社, 1994.
3. 艾德才. pentium/80486实用汇编语言程序设计[M]. 北京:清华大学出版社, 1997.
- 9 -
附录 源程序
//使用1602LCD显示DS18B20转换的温度值 #include #define uchar unsigned char #define uint unsigned int sbit RS = P3^0; //数据/命令选择端(H/L) sbit LCDEN = P3^2; //使能端 sbit deng=P1^6; //超过温度指示灯 sbit beep=P1^7; //超过温度报警器 uchar high=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(1); - 10 - 单片机原理及系统课程设计报告 } //写数据:RS=1, RW=00 void writeData(uchar dat) { RS = 1; P2 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); } //初始化函数 //显示模式, 固定指令为=0x38, 16*2显示, 5*7点阵,8位数据接口 //显示开/关及光标设置=0x0c //指令1: 00001DCB : D:开显示/关显示(H/L); C:显示光标/不显示(H/L), B:光标闪烁/不闪烁(H/L) //指令2: NS : //N=1, 当读/写一个字符后地址指针加1, 且光标也加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(str[i]); } - 11 - } /*****************************DS18B20*******************************/ sbit ds = P3^7; //初始化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); while(~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--; //延时约us, 符合读时隙不低于60us要求 return b; } //读取一字节数据, 通过调用readBit()来实现 unsigned char readByte() { - 12 - 单片机原理及系统课程设计报告 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; j < 8; j++) { b = dat & 0x01; dat >>= 1;//写\"1\将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1 if(b) { ds = 0; i++; i++; //拉低约16us, 符号要求15~60us内 ds = 1; i = 8; while(i>0) i--; //延时约us, 符合写时隙不低于60us要求 } else //写\"0\将DQ拉低60us~120us { ds = 0; i = 8; while(i>0) i--; //拉低约us, 符号要求 ds = 1; i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时us了 - 13 - } } } //向DS18B20发送温度转换命令 void sendChangeCmd() { dsInit(); //初始化DS18B20, 无论什么命令, 首先都要发起初始化 dsWait(); //等待DS18B20应答 delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号 writeByte(0xcc); //写入跳过序列号命令字 Skip Rom writeByte(0x44); //写入温度转换命令字 Convert T } //向DS18B20发送读取数据命令 void sendReadCmd() { 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(); //将高低两个字节合成一个整形变量 //计算机中对于负数是利用补码来表示的 //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value tmpvalue = high; tmpvalue <<= 8; tmpvalue |= low; value = tmpvalue; //使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度 t = value * 0.0625; - 14 - 单片机原理及系统课程设计报告 //将它放大10倍, 使显示时可显示小数点后一位, 并对小数点后第二位进行4舍5入 //如t=11.0625, 进行计数后, 得到value = 111, 即11.1 度 //如t=-11.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); datas[0] = tmp / 1000; datas[1] = tmp % 1000 / 100; datas[2] = tmp % 100 / 10; datas[3] = tmp % 10; r= tmp/10; writeComm(0xc0+3); if(v < 0) { writeString(\"- \ } else { writeString(\"+ \ } if(datas[0] != 0) { writeData('0'+datas[0]); } for(count = 1; count != 4; count++) { writeData('0'+datas[count]); if(count == 2) { - 15 - writeData('.'); } } } /******************************报警*******************************/ void BEEP()//报警 {if((r>=high&&r<129)||r 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(); } /******************************DS18B20*******************************/ BEEP(); } - 16 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务