PT100数字温度计.docx

上传人:b****1 文档编号:1628928 上传时间:2022-10-23 格式:DOCX 页数:13 大小:71.47KB
下载 相关 举报
PT100数字温度计.docx_第1页
第1页 / 共13页
PT100数字温度计.docx_第2页
第2页 / 共13页
PT100数字温度计.docx_第3页
第3页 / 共13页
PT100数字温度计.docx_第4页
第4页 / 共13页
PT100数字温度计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

PT100数字温度计.docx

《PT100数字温度计.docx》由会员分享,可在线阅读,更多相关《PT100数字温度计.docx(13页珍藏版)》请在冰豆网上搜索。

PT100数字温度计.docx

PT100数字温度计

单片机课程设计

 

PT100数字温度计

 

学院:

物理电气信息学院

班级:

电气工程与自动化(1班)

学号:

12012241992

姓名:

于高乐

PT100数字温度计

一.设计目的与任务

采用PT100温度传感器,设计一款可以实时显示温度的数字温度计

二.设计中所需软件及设备

PC机电脑、KeilC软件、Protues软件。

本次设计所需软件为KeilC51以及ProteusISIS仿真软件,应用ProteusISIS对实验电路进行仿真,得到实验结果。

三.设计原理说明

1.实验方案设计图

由于是16路的24V电源输入,所以不能直接将24V电源输入到单片机,故需要有隔离或转换电路,将16路24V电源转换为转换为16路的信号输入到单片机I/O口,由单片机采集16路电平信号。

方案设计结构图如下图

晶振控制

单片机芯片

AT89S52

1602显示器

温度检测电路

 

2.硬件设计与结构图

(1)单片机模块及最小系统

 

(2)液晶显示模块

(3)温度模拟模块

四.总体电路原理图及其仿真图

 

五.设计程序

主函数

首先实现单片机的初始化。

然后将I/O口数据传送至虚拟终端。

最后执行虚拟终端显示打印函数,在加一段演示程序,便于观察。

源程序

#include

#include

#include

#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

{

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();

}

}六.设计结果与总结

 

七.课程设计心得与总结

经过这次单片机课程设计,终于完成了我的数字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1