毕业设计单片机原理及应用课程设计数字式温度计的设计Word文件下载.docx
《毕业设计单片机原理及应用课程设计数字式温度计的设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《毕业设计单片机原理及应用课程设计数字式温度计的设计Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
2.软件设计8
3.调试结果20
4.操作说明21
5心得体会21
参考文献22
1.硬件电路及原理
1.1方案的总体设计框图
温度计电路设计总体设计方框图如图1所示,控制器采用单片机AT89c51,温度传感器采用DS18B20,用12864以串口传送数据实现温度显示。
图1 总体设计方框图
1.1.1主控制器
单片机AT89c51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
1.1.2显示电路
显示电路采用12864液晶显示,从P0口输出段码。
1.1.3温度传感器
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。
图2DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
CRC
图3 DS18B20字节定义
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;
当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
表1DS18B20温度转换时间表
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
表2 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
1.2DS18B20温度传感器与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图4所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
2.软件设计
#include<
reg51.h>
intrins.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineportP0//DB0~DB7数据口
#definebeepP2^6
sbite=P2^0;
//使能
sbitrw=P2^1;
//读写
sbitrs=P2^2;
//数据/命令
sbitcs2=P2^3;
//片选
sbitcs1=P2^4;
sbitbusy=P0^7;
//检测忙
sbitDQ=P3^0;
//定义DS18B20数据端口
ucharfuhao;
//负号寄存器
sbitP2_6=P2^6;
//蜂鸣器数据口
sbitP1_0=P1^0;
//下限加键
sbitP1_1=P1^1;
//下限减键
sbitP1_2=P1^2;
//上限加键
sbitP1_3=P1^3;
//上限减键
uintj=0;
intth=10;
//上限默认值
inttl=-12;
//下限默认值
uints=0,m=0,h=0;
//时分秒初始值
ucharcodehz[][32]={
{0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00},
//"
电"
2
{0x40,0x20,0x58,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x14,0x06,0x04,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x80,0x70,0x00},
气"
3
{0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00},
二"
4
{0x84,0x84,0xFC,0x84,0x06,0xF4,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x86,0x04,0x00,
0x20,0x60,0x3F,0x10,0x92,0x41,0x38,0x07,0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00},
班"
5
{0x00,0xFE,0x22,0x5A,0x86,0x08,0x88,0x48,0x38,0x0F,0xE8,0x08,0x88,0x0C,0x08,0x00,
0x00,0xFF,0x04,0x08,0x07,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x19,0x30,0x00},
/*"
陈"
4*/
{0x50,0x4C,0x44,0x44,0x44,0x44,0x45,0xC6,0x44,0x44,0x44,0x44,0x44,0x54,0x4C,0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
宁"
5*/
};
ucharcodetime[][32]={
{0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00},
时"
0
{0x00,0x80,0x40,0x20,0x98,0x86,0x80,0x80,0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00,
0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00},
分"
1
{0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80,0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00,
0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,0x40,0x20,0x17,0x08,0x04,0x03,0x00,0x00}
秒"
ucharcodenum[][16]={
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00},
0"
{0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},
1"
{0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},
2"
{0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},
3"
{0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00},
4"
{0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},
5"
{0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},
6"
6
{0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},
7"
7
{0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00},
8"
8
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}
9"
9
ucharcodesign[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},
-"
{0x00,0xC0,0xE0,0x30,0x10,0x10,0x10,0x20,0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x08},
C"
{0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
°
"
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00},
."
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
"
{0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00},
:
5
{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},
|"
{0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},
+"
//延时
voiddelay(uintn)
{
uinti;
for(;
n>
0;
n--)
for(i=200;
i>
i--);
}
//判断是否忙
voidcheck()
rs=0;
rw=1;
//读e=1;
port=0x00;
e=1;
while(busy);
e=0;
//写指令
voidsendcommand(ucharcommand)
check();
//指令
rw=0;
//写e=0;
port=command;
//写入指令
//写数据
voidwritedata(uchardat)
rs=1;
//数据
port=dat;
//选屏幕0--全屏,1--左屏,2--右屏;
voidselect(uintn)
switch(n)
{
case0:
cs1=0;
cs2=0;
break;
//低电平选中
case1:
cs2=1;
//cs1左屏
case2:
cs1=1;
//cs2右屏
}
//页
voidsetpage(ucharpage)
page=page&
0x07;
page=page|0xb8;
sendcommand(page);
//列
voidsetcolumn(ucharcolumn)
column=column&
0x3f;
column=column|0x40;
sendcommand(column);
//起始行
voidsetline(ucharline)
line=line&
line=line|0xc0;
sendcommand(line);
//屏幕开关显示0--关,1--开;
voidseton(uintn)
n=n|0x3e;
sendcommand(n);
//清屏0--全屏,1--左屏,2--右屏;
voidclear(uintn)
uchari,j;
select(n);
for(i=0;
i<
8;
i++)
setpage(i);
setcolumn(0);
for(j=0;
j<
64;
j++)
writedata(0);
//置0清空
}
//初始化
voidinit()
seton
(1);
clear(0);
setline(0);
//显示汉字16*16显示
voidshow16(ucharpage,ucharcolumn,ucharscreen,ucharmethod,uchar*str)
select(screen);
j=0;
setpage(page);
setcolumn(column);
16;
{if(method==1)writedata(~str[j++]);
//method为显示方式。
当等于1时,反白。
elsewritedata(str[j++]);
setpage(page+1);
}
//显示数字8*8显示
voidshow8(ucharpage,ucharcolumn,ucharscreen,ucharmethod,uchar*str)
j=0;
setpage(page+1);
setcolumn(column);
//显示时间
voidshowtime()
show16(2,24,2,0,time[0]);
show16(4,24,2,0,time[1]);
show16(6,24,2,0,time[2]);
show8(2,40,2,0,sign[5]);
show8(4,40,2,0,sign[5]);
show8(6,40,2,0,sign[5]);
show8(2,48,2,0,num[h/10]);
show8(4,48,2,0,num[m/10]);
show8(6,48,2,0,num[s/10]);
show8(2,56,2,0,num[h%10]);
show8(4,56,2,0,num[m%10]);
show8(6,56,2,0,num[s%10]);
//中断服务程序
timer0()interrupt1using1
j++;
TH0=15536/256;
TL0=15536%256;
if(j==20){
j=0;
if(++s==60){
s=0;
if(++m==60){
m=0;
if(++h==24)h=0;
}
}
}
//显示个人信息
voidwelcome()
show16(0,0,1,0,hz[0]);
show16(0,16,1,0,hz[1]);
show16(0,32,1,0,hz[2]);
show16(0,48,1,0,hz[3]);
show16(0,8,2,0,hz[4]);
show1