PT100数字温度计.docx
《PT100数字温度计.docx》由会员分享,可在线阅读,更多相关《PT100数字温度计.docx(13页珍藏版)》请在冰豆网上搜索。
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();
}
}六.设计结果与总结
七.课程设计心得与总结
经过这次单片机课程设计,终于完成了我的数字