2022年PT数字温度计 .pdf
单片机课程设计PT100数字温度计学院: 物理电气信息学院班级:电气工程与自动化 (1 班)学号:12012241992 姓名: 于高乐名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - PT100数字温度计一. 设计目的与任务采用 PT100温度传感器,设计一款可以实时显示温度的数字温度计二. 设计中所需软件及设备PC机电脑、 Keil C 软件、 Protues 软件。本次设计所需软件为 Keil C51以及 Proteus ISIS 仿真软件,应用 Proteus ISIS对实验电路进行仿真,得到实验结果。三.设计原理说明1. 实验方案设计图由于是 16 路的 24V电源输入,所以不能直接将24V 电源输入到单片机,故需要有隔离或转换电路,将16 路 24V 电源转换为转换为16 路的信号输入到单片机 I/O 口,由单片机采集16 路电平信号。方案设计结构图如下图2. 硬件设计与结构图(1)单片机模块及最小系统晶振控制单片机芯片AT89S52 1602 显示器温度检测电路名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - (2)液晶显示模块(3)温度模拟模块名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - 四.总体电路原理图及其仿真图五设计程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - 主函数首先实现单片机的初始化。然后将I/O 口数据传送至虚拟终端。最后执行虚拟终端显示打印函数,在加一段演示程序,便于观察。源程序#include #include #include #define uchar unsigned char #define uint unsigned int sbit RS = P26; /数据/命令选择端 (H/L) sbit LCDEN = P27; /使能端void delayUs() /短延时 _nop_(); void delayMs(uint a) /长延时 uint i, j; for(i = a; i 0; i-) for(j = 100; j 0; j-); /第一行开始地址为 0 x80, 第二行开始地址为0 xc0; /写命令 :RS=0, RW=0; void writeComm(uchar comm) RS = 0; P1 = comm; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); /写数据 :RS=1, RW=00 void writeData(uchar dat) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - RS = 1; P1 = dat; LCDEN = 1; delayUs(); LCDEN = 0; delayMs(1); /初始化函数/显示模式 , 固定指令为 00111000=0 x38, 16*2显示, 5*7 点阵,8 位数据接口/显示开 /关及光标设置 00001100=0 x0c /指令 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(0 x38); /显示模式writeComm(0 x0c); /开显示 , 关光标writeComm(0 x06); /写字符后地址加 1, 光标加 1 writeComm(0 x01); /清屏 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-; bit readBit() unsigned int i; bit b; ds = 0; i+; /延时约 8us, 符合协议要求至少保持1us ds = 1; i+; i+; /延时约 16us, 符合协议要求的至少延时15us以上b = ds; i = 8; while(i0) i-; /延时约 64us, 符合读时隙不低于60us要求return b; /读取一字节数据 , 通过调用 readBit()来实现unsigned char readByte() unsigned int i; unsigned char j, dat; dat = 0; for(i=0; i8; i+) j = readBit(); /最先读出的是最低位数据dat = (j 1); return dat; void writeByte(unsigned char dat) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - unsigned int i; unsigned char j; bit b; for(j = 0; j = 1;/写1, 将 DQ 拉低 15us后, 在 15us60us内将 DQ 拉高, 即完成写 1 if(b) ds = 0; i+; i+; /拉低约 16us, 符号要求 1560us内ds = 1; i = 8; while(i0) i-; /延时约 64us, 符合写时隙不低于60us要求 else /写0, 将 DQ 拉低 60us120us ds = 0; i = 8; while(i0) i-; /拉低约 64us, 符号要求ds = 1; i+; i+; /整个写 0 时隙过程已经超过60us, 这里就不用像写 1那样, 再延时 64us了 void sendChangeCmd() dsInit(); /初始化 DS18B20, 无论什么命令 , 首先都要发起初始化dsWait(); /等待 DS18B20 应答delayMs(1); /延时 1ms, 因为 DS18B20会拉低 DQ 60240us作为应答信号writeByte(0 xcc); /写入跳过序列号命令字Skip Rom writeByte(0 x44); /写入温度转换命令字Convert T void sendReadCmd() dsInit(); dsWait(); delayMs(1); writeByte(0 xcc); /写入跳过序列号命令字Skip Rom writeByte(0 xbe); /写入读取数据令字Read Scratchpad 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - /获取当前温度值int getTmpValue() unsigned int tmpvalue; int value; /存放温度数值float t; unsigned char low, high; sendReadCmd(); /连续读取两个字节数据low = readByte(); high = readByte(); /将高低两个字节合成一个整形变量/计算机中对于负数是利用补码来表示的/若是负值 , 读取出来的数值是用补码表示的, 可直接赋值给 int 型的 value tmpvalue = high; tmpvalue 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; writeComm(0 xc0+3); if(v 0) writeString(- , 2); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - - - - - - - else writeString(+ , 2); if(datas0 != 0) writeData(0+datas0); for(count = 1; count != 4; count+) writeData(0+datascount); if(count = 2) writeData(.); /*PT100*/ void main() uchar table = Now Temperature ; delayMs(1); sendChangeCmd(); init(); writeComm(0 x80); writeString(table, 16); while(1) delayMs(1000); /温度转换时间需要750ms以上writeComm(0 xc0); display(getTmpValue(); sendChangeCmd(); 六.设计结果与总结名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - 七课程设计心得与总结名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - 经过这次单片机课程设计, 终于完成了我的数字温度计的设计,虽然不能做到很完美,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀!在本次设计的过程中, 我发现很多的问题, 也许是第一次进行这种系统的设计所以感觉完成这样一次小系统设计我长进了很多,单片机课程设计重点就在于软件算法的设计, 需要有很巧妙的程序算法, 虽然以前写过几次程序, 但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是 BCD 码,这一次,我全部用的都是 16 进制的数直接加减, 显示处理时在用除法去删分 ,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中, 我真真正正的意识到, 在以后的学习中, 要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此, 程序只有在经常的写与读的过程中才能提高, 这就是我在这次课程设计中的最大收获。通过这次对数字温度计的设计与制作, 让我了解了设计电路的程序, 也让我了解了关于数字温度计的原理与设计理念, 要设计一个电路总要先用仿真仿真成功之后才实际接线的。但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。 而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功。 所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。通过这次学习, 让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。从这次的课程设计中, 我真真正正的意识到, 在以后的学习中, 要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此, 程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -