(完整word版)PT100数字温度计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计
PT100数字温度计
学院:物理电气信息学院
班级:电气工程与自动化(1班)
学号:12012241992
姓名:于高乐
PT100数字温度计
一. 设计目的与任务
采用PT100温度传感器,设计一款可以实时显示温度的数字温度计
二. 设计中所需软件及设备
PC 机电脑、Keil C 软件、Protues 软件。
本次设计所需软件为Keil C51以及Proteus ISIS 仿真软件,应用Proteus ISIS 对实验电路进行仿真,得到实验结果。
三.设计原理说明
1.实验方案设计图
由于是16路的24V 电源输入,所以不能直接将24V 电源输入到单片机,故需要有隔离或转换电路,将16路24V 电源转换为转换为16路的信号输入到单片机I/O 口,由单片机采集16路电平信号.
方案设计结构图如下图
2.硬件设计与结构图
(1)单片机模块及最小系统
(2)液晶显示模块(3)温度模拟模块
四。
总体电路原理图及其仿真图
五.设计程序
主函数
首先实现单片机的初始化。
然后将I/O口数据传送至虚拟终端。
最后执行虚拟终端显示打
印函数,在加一段演示程序,便于观察。
源程序
#include <reg52。
H>
#include 〈intrins.H〉
#include 〈math。
H〉
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^6; //数据/命令选择端(H/L) sbit LCDEN = P2^7;//使能端
void delayUs() //短延时
{
_nop_();
}
void delayMs(uint a)//长延时
{
uint i, j;
for(i = a;i 〉0;i-—)
for(j = 100;j > 0;j-—);
}
//第一行开始地址为0x80, 第二行开始地址为0xc0;
(完整word版)PT100数字温度计//写命令: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)
{
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,整屏不移动
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]);
}
}
/*****************************PT100*******************************/
sbit ds = P3^4;
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-—;
}
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——;//延时约64us,符合读时隙不低于60us要求return b;
}
//读取一字节数据, 通过调用readBit()来实现
unsigned char readByte()
{
unsigned int i;
unsigned char j, dat;
dat = 0;
for(i=0; i〈8; i++)
{
j = readBit();
//最先读出的是最低位数据
dat = (j 〈〈7)| (dat >〉1);
}
return dat;
}
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-—;//延时约64us,符合写时隙不低于60us要求
}
else //写”0”, 将DQ拉低60us~120us
{
ds = 0;
i = 8;while(i>0) i——; //拉低约64us,符号要求
ds = 1;
i++; i++; //整个写0时隙过程已经超过60us, 这里就不用像写1那样,再延时64us了
}
}
}
void sendChangeCmd()
{
dsInit(); //初始化DS18B20, 无论什么命令,首先都要发起初始化
dsWait();//等待DS18B20应答
delayMs(1); //延时1ms,因为DS18B20会拉低DQ 60~240us作为应答信号writeByte(0xcc); //写入跳过序列号命令字Skip Rom
writeByte(0x44);//写入温度转换命令字Convert T
}
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;
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 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;
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*******************************/
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();
}
}六。
设计结果与总结
七.课程设计心得与总结
经过这次单片机课程设计,终于完成了我的数字温度计的设计,虽然不能做到很完美,但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来,高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,也许是第一次进行这种系统的设计所以感觉完成这样一次小系统设计我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获.通过这次对数字温度计的设计与制作,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个电路总要先用仿真
仿真成功之后才实际接线的.但是最后的成品却不一定与仿真时完全一样,因为,再实际接线中有着各种各样的条件制约着。
而且,在仿真中无法成功的电路接法,在实际中因为芯片本身的特性而能够成功.所以,在设计时应考虑两者的差异,从中找出最适合的设计方法。
通过这次学习,让我对各种电路都有了大概的了解,所以说,坐而言不如立而行,对于这些电路还是应该自己动手实际操作才会有深刻理解。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获.。