完整word版PT100数字温度计.docx
- 文档编号:12943564
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:16
- 大小:85.44KB
完整word版PT100数字温度计.docx
《完整word版PT100数字温度计.docx》由会员分享,可在线阅读,更多相关《完整word版PT100数字温度计.docx(16页珍藏版)》请在冰点文库上搜索。
完整word版PT100数字温度计
单片机课程设计
PT100数字温度计
学院:
物理电气信息学院
班级:
电气工程与自动化(1班)
学号:
12012241992
姓名:
于高乐
PT100数字温度计
一.设计目的与任务
采用PT100温度传感器,设计一款可以实时显示温度的数字温度计
二.设计中所需软件及设备
PC机电脑、KeilC软件、Protues软件。
本次设计所需软件为KeilC51以及ProteusISIS仿真软件,应用ProteusISIS对实验电路进行仿真,得到实验结果。
三.设计原理说明
1.实验方案设计图
由于是16路的24V电源输入,所以不能直接将24V电源输入到单片机,故需要有隔离或转换电路,将16路24V电源转换为转换为16路的信号输入到单片机I/O口,由单片机采集16路电平信号.
方案设计结构图如下图
2.硬件设计与结构图
(1)单片机模块及最小系统
(2)液晶显示模块
(3)温度模拟模块
四。
总体电路原理图及其仿真图
五.设计程序
主函数
首先实现单片机的初始化。
然后将I/O口数据传送至虚拟终端。
最后执行虚拟终端显示打印函数,在加一段演示程序,便于观察。
源程序
#include H> #include〈intrins.H〉 #include〈math。 H〉 #defineucharunsignedchar #defineuintunsignedint sbitRS=P2^6;//数据/命令选择端(H/L) sbitLCDEN=P2^7;//使能端 voiddelayUs()//短延时 { _nop_(); } voiddelayMs(uinta)//长延时 { uinti,j; for(i=a;i〉0;i-—) for(j=100;j>0;j-—); } //第一行开始地址为0x80,第二行开始地址为0xc0; //写命令: RS=0,RW=0; voidwriteComm(ucharcomm) { RS=0; P1=comm; LCDEN=1; delayUs(); LCDEN=0; delayMs (1); } //写数据: RS=1,RW=00 voidwriteData(uchardat) { RS=1; P1=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,且光标也加1;N=0则相反 //S=1,当写一个字符,整屏显示左移(N=1)或右移(N=0),但光标不移动;S=0,整屏不移动 voidinit() { writeComm(0x38);//显示模式 writeComm(0x0c);//开显示,关光标 writeComm(0x06);//写字符后地址加1,光标加1 writeComm(0x01);//清屏 } voidwriteString(uchar*str,ucharlength) { uchari; for(i=0;i〈length;i++) { writeData(str[i]); } } /*****************************PT100*******************************/ sbitds=P3^4; voiddsInit() { //对于11.0592MHz时钟,unsignedint型的i,作一个i++操作的时间大于为8us unsignedinti; ds=0; i=100;//拉低约800us,符合协议要求的480us以上 while(i〉0)i-—; ds=1;//产生一个上升沿,进入等待应答状态 i=4; while(i>0)i——; } voiddsWait() { unsignedinti; while(ds); while(~ds);//检测到应答脉冲 i=4; while(i〉0)i-—; } bitreadBit() { unsignedinti; bitb; ds=0; i++;//延时约8us,符合协议要求至少保持1us ds=1; i++;i++;//延时约16us,符合协议要求的至少延时15us以上 b=ds; i=8; while(i〉0)i——;//延时约64us,符合读时隙不低于60us要求 returnb; } //读取一字节数据,通过调用readBit()来实现 unsignedcharreadByte() { unsignedinti; unsignedcharj,dat; dat=0; for(i=0;i〈8;i++) { j=readBit(); //最先读出的是最低位数据 dat=(j〈〈7)|(dat>〉1); } returndat; } voidwriteByte(unsignedchardat) { unsignedinti; unsignedcharj; bitb; 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-—;//延时约64us,符合写时隙不低于60us要求 } else//写”0”,将DQ拉低60us~120us { ds=0; i=8;while(i>0)i——;//拉低约64us,符号要求 ds=1; i++;i++;//整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了 } } } voidsendChangeCmd() { dsInit();//初始化DS18B20,无论什么命令,首先都要发起初始化 dsWait();//等待DS18B20应答 delayMs (1);//延时1ms,因为DS18B20会拉低DQ60~240us作为应答信号 writeByte(0xcc);//写入跳过序列号命令字SkipRom writeByte(0x44);//写入温度转换命令字ConvertT } voidsendReadCmd() { dsInit(); dsWait(); delayMs (1); writeByte(0xcc);//写入跳过序列号命令字SkipRom writeByte(0xbe);//写入读取数据令字ReadScratchpad } //获取当前温度值 intgetTmpValue() { unsignedinttmpvalue; intvalue;//存放温度数值 floatt; unsignedcharlow,high; sendReadCmd(); //连续读取两个字节数据 low=readByte(); high=readByte(); //将高低两个字节合成一个整形变量 //计算机中对于负数是利用补码来表示的 //若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value tmpvalue=high; tmpvalue〈<=8; tmpvalue|=low; value=tmpvalue; t=value*0.0625; //将它放大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 returnvalue; } voiddisplay(intv) { unsignedcharcount; unsignedchardatas[]={0,0,0,0}; unsignedinttmp=abs(v); datas[0]=tmp/1000; datas[1]=tmp%1000/100; datas[2]=tmp%100/10; datas[3]=tmp%10; writeComm(0xc0+3); if(v<0) { writeString(”—",2); } else { writeString(”+”,2); } if(datas[0]! =0) { writeData(’0’+datas[0]); } for(count=1;count! =4;count++) { writeData('0'+datas[count]); if(count==2) { writeData(’。 ’); } } } /******************************PT100*******************************/ voidmain() { uchartable[]=”NowTemperature”; delayMs (1); sendChangeCmd(); init(); writeComm(0x80); writeString(table,16); while (1) { delayMs(1000);//温度转换时间需要750ms以上 writeComm(0xc0); display(getTmpValue()); sendChangeCmd(); } }六。 设计结果与总结 七.课程设计心得与总结 经过这次单片机课程设计,终于完成了我的数字温度计的设计,虽然不能做到很完美,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀! 在本次设计的过程中,我发现很多的问题,也许是第一次进行这种系统的设计所以感觉完成这样一次小系统设计我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获.通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真仿真成功之后才实际接线的.但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。 而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功.所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。 通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。 从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word PT100 数字 温度计