微机原理与单片机与接口技术课程设计.docx
《微机原理与单片机与接口技术课程设计.docx》由会员分享,可在线阅读,更多相关《微机原理与单片机与接口技术课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
微机原理与单片机与接口技术课程设计
河南理工大学
《微机原理与单片机接口技术》课程设计
实时测温报警系统
姓名:
李磊
学号:
311308001116
专业班级:
电信13-4
指导老师:
王新
所在学院:
电气工程与自动化学院
2016年月日
摘要
本设计是一款基于单片机的实时温度测量装置,其中单片是数据处理的核心,用来接受和处理温度传感器测的数据。
用温度传感器来获得采样的温度,单片机将得到的温度数据处理后,通过液晶显示屏来显示,关于时间显示方面是通过单片机的定时中断来实现的,并通过按键来调节显示时间。
本文简要介绍基于单片机的测温系统的设计原理,并根据系统的原理制作出实物,能够简单的实现温度的测量。
本测温系统主要有以下几个模块构成:
测温模块、显示模块、按键控制模块、时间显示模块以及报警模块等几个模块组成。
测温模块主体是一个测温传感器DS18B20来进行温度的测量,温度报警模块是一个鸣蜂器,显示模块是通过液晶显示屏1602来进行温度和时间的显示,按键控制是由触电开关跟单片机构成,时间显示模块是单片机的定时中断跟1602液晶显示屏构成。
本设计的核心是型号为STC12C5A60S2的单片机。
本系统的工作先由DS18B20测量温度,经过DS18B20内部的转换电路得到一组12位精度为0.0625的温度数值通过一根单数据线将数据交给单片机,单片机处理数据后将最终温度显示在液晶显示屏上,当温度超过设定值的时候鸣蜂器鸣笛报警,单片机内部的定时中断程序将时间也同一时间显示在液晶显示屏上,通过按键可以暂停时间和温度测量的刷新,来调节时间。
本设计最终做得的实物能够进行0~125°C的测量,24小时以内的时间显示以及时间调节。
关键字:
单片机技术、温度采集、液晶1602显示。
目录
1、概述…………………………………………………………………………………4
1.1设计背景及意义………………………………………………………………4
1.2设计目的………………………………………………………………………4
1.3温度测试报警系统完成的功能………………………………………………4
2、系统总体方案及硬件计……………………………………………………………5
2.1总体方案设计…………………………………………………………………5
2.2硬件设计………………………………………………………………………5
3、软件设计……………………………………………………………………………11
3.1DS18B20程序编架……………………………………………………………11
3.21602液晶显示程序编写框架…………………………………………………11
3.3时间及按键程序编写框架……………………………………………………11
3.4总程序编写框架………………………………………………………………11
4、软件仿真……………………………………………………………………………12
5、课程设计体会………………………………………………………………………13
参考文献
附1:
源程序代码
附2:
系统原理图
1概述
1.1设计背景及意义
温度是生产过程和科学实验中普遍而且重要的物理参数,随着社会的发展,科技的进步,以及测温仪器在各个领域的应用,智能化已是现代温度控制系统发展的主流方向。
特别是近年来,温度控制系统已应用到人们生活的各个方面,但温度控制一直是一个未开发的领域,却又是与人们息息相关的一个实际问题。
针对这种实际情况,设计一个温度控制系统,具有广泛的应用前景与实际意义。
温度是一个重要的物理量,它反映了物体冷热的程度,与自然界中的各种物理和化学过程相联系。
在工、农业生产和日常生活中,各个环节都与温度紧密相联,温度的准确监测及控制占据着极其重要地位。
比如,发电厂锅炉的温度必须控制在一定的范围之内;许多化学反应的工艺过程必须在适当的温度下才能正常进行等。
没有合适的温度环境,许多电子设备就不能正常工作,粮仓的储粮就会变质霉烂,酒类的品质就没有保障。
可见,温度的测量和控制是非常重要的。
随着电子技术和微型计算机的迅速发展,单片机在电子产品中的应用已经越来越广泛。
利用单片机对温度进行控制的技术也随之而生,并日益发展和完善,且越来越显示出它的优越性。
1.2设计目的
本设计的内容是温度测试报警系统,控制对象是温度。
温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制。
而以往温度控制是由人工完成的而且不够重视,其实在很多场所温度都需要监控以防止发生意外。
针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度测试报警系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。
1.3温度测试报警系统完成的功能
本设计是对温度进行实时监测与报警,设计的温度报警系统实现了基本的温度测试和报警功能:
当温度超过设定的温度阀值的时候鸣蜂器发声来进行报警,同时通过1602液晶显示屏显示当时的时间跟温度便于对温度的管理。
2系统总体方案及硬件设计
2.1总体方案设计
考虑使用温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。
在本系统的电路设计方框图如图1.1所示,它由三部分组成:
①控制部分主芯片采用单片机STC12C5160S2;②显示部分采用液晶屏1602进行显示;③温度采集部分采用DS18B20温度传感器。
图2-1温度计电路总体设计方案
2.2硬件设计
1.控制部分
单片机STC12C5160S2具有低电压供电和体积小等特点,很适合便携手持式产品的设计使用,系统应用三节电池供电。
2.显示部分
显示电路采用1602液晶显示屏。
3.温度采集部分
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温。
这一部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。
数字温度传感器DS18B20把采集到的温度通过数据引脚传到单片机的P1.3口,单片机接受温度并存储。
此部分只用到DS18B20和单片机,硬件很简单
1)DS18B20的性能特点如下[9]:
1)独特的单线接口仅需要一个端口引脚进行通信;
2)多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
3)无须外部器件;
4)可通过数据线供电,电压范围为3.0~5.5V;
5)零待机功耗;
6)温度以3位数字显示;
7)用户可定义报警设置;
8)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
9)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
(2)DS18B20的内部结构
DS18B20采用3脚PR-35封装,如图1.2所示;DS18B20的内部结构,如图3所示。
图2-2DS18B20封装
(3)DS18B20内部结构主要由四部分组成[5]:
1)64位光刻ROM。
开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前56位的CRC校验码,这也是多个DS18B20可以采用一线进行通信的原因[10]。
64位闪速ROM的结构如下.
表2-1ROM结构
8b检验CRC
48b序列号
8b工厂代码(10H)
MSBLSBMSBLSBMSBLSB
图2-3DS18B20内部结构
2)非挥发的温度报警触发器TH和TL,可通过软件写入用户报警上下限值。
3)高速暂存存储,可以设置DS18B20温度转换的精度。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的E2PRAM。
高速暂存RAM的结构为8字节的存储器,结构如图1.3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
它的内部存储器结构和字节定义如图1.3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式。
表2-2DS18B20内部存储器结构
Byte0
温度测量值LSB(50H)
Byte1
温度测量值MSB(50H)
E2PROM
Byte2
TH高温寄存器
----
TH高温寄存器
Byte3
TL低温寄存器
----
TL低温寄存器
Byte4
配位寄存器
----
配位寄存器
Byte5
预留(FFH)
Byte6
预留(0CH)
Byte7
预留(IOH)
Byte8
循环冗余码校验(CRC)
2)非挥发的温度报警触发器TH和TL,可通过软件写入用户报警上下限值。
3)高速暂存存储,可以设置DS18B20温度转换的精度。
DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率,如图1.4。
图2-3DS18B20字节定义
TM
R1
R0
1
1
1
1
1
由表1.1可见,分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表1.2是一部分温度值对应的二进制温度数据[6]。
表2-4DS18B20温度转换时间表
R1
R0
分辨率/位
温度最大转向时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
表2-5 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
续表2-5
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
4)CRC的产生
在64bROM的最高有效字节中存储有循环冗余校验码(CRC)。
主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数。
4.液晶显示部分
1.管脚:
1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:
RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管
脚展开进行初始化,写命令,写数据。
以下具体阐述这三个管脚:
RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。
R/W为读写选择,高电平进行读操作,低电平进行写操作。
E端为使能端,后面和时序联系在一起。
除此外,D0~D7分别为8位双向数据线。
2.指令集:
LCD_1602初始化指令小结:
0x38设置16*2显示,5*7点阵,8位数据接口
0x01清屏
0x0F开显示,显示光标,光标闪烁
0x08只开显示
0x0e开显示,显示光标,光标不闪烁
0x0c开显示,不显示光标
0x06地址加1,当写入数据的时候光标右移
0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变
0x18光标和显示一起向左移动
3.显示地址:
LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。
3软件设计
3.1DS18B20程序编写框架
查询DS18B20的技术手册,通过技术手册上的时序图编写初始化指令、写指令、读指令程序,最后编写一个获得温度的函数,通过函数返回值将测的数据传递给单片机。
3.21602液晶显示程序编写框架
与DS18B20编写的过程大体相同,最终也将液晶显示程序封装成一个无返回值函数。
3.3时间及按键程序编写框架
时间是通过单片机的定时中断来获得的,按键是采用独立按键通过P3^2,P3^3,P3^4来进行控制的。
3.4总程序编写框架
将键盘函数跟报警程序放入主函数中,而1602显示程序和DS18B20程序放在定时中断程序中,来实现程序的隔离,放置按键函数影响显示和测温程序的时序,来造成程序运行混乱。
4软件仿真
5课程设计体会
通过本次课程设计使我对单片机的认识跟进一步,让我了解学习了单片机的扩展功能,不再局限于以前单片机只能做一个流水灯或者数码显示的思想。
本次设计遇到了很多困难,一个最大的困难就是关于DS18B20的时序编写,由于不知到C语言程序在单片机中的运行时间,所以在编写时序的时候出了很多问题,最后经过查资料和通过keil软件的指令运行时间查询功能,最终才编写出正确的时序程序。
另一个困难是各个程序模块的协调运行问题,单个的模块能够正常运行,但是多个放在一起就会出现程序运行错误,经过努力最终找到是因为多个模块的放在一起会影响各自的时序才造成程序错误,最终我通过中断函数将各个模块进行隔离完成了最终的设计。
这次的设计,虽然困难重重,但是最终当系统能够正常工作的时候,我感到无比的喜悦。
参考文献
《微机原理与单片机接口技术》
《C语言程序设计》
附1:
源程序代码
/******************************************
用1602实现数字表显示、调节时间功能
能作为50年限的万年历
******************************************/
#include
#include
#include
#include
#defineT25.6
sbitRS=P1^0;
sbitRW=P1^1;
sbitE=P1^2;
sbitkey1=P3^2;
sbitkey2=P3^3;
sbitkey3=P3^4;
sbitbeer=P3^1;
ucharcodetable1[]="T:
00.0";
ucharcodetable2[]="time:
00:
00:
00";
ucharcodetable3[]="ERROR";
ucharcodenumber[]={0x30,0x31,0x32,0x33,0x34,
0x35,0x36,0x37,0x38,0x39,0xdf,0x43};
uchartt0,miao,shi,fen,k1,k2,k3;
uinttemperature;
voiddelay1(uintz)//延时程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidlcdwrite_com(ucharcom)//lcd写命令
{
RW=0;
RS=0;
E=0;
delay1
(1);
E=1;
delay1(5);
P0=com;
delay1(5);
E=0;
}
voidlcdwrite_dat(uchardat)//lcd写数据
{
RW=0;
RS=1;
E=0;
delay1
(1);
E=1;
delay1(5);
P0=dat;
delay1(5);
E=0;
}
voidggn1(ucharm)//有关k2键的函数1,时间控制函数
{
lcdwrite_com(0x38);
delay1(5);
lcdwrite_com(0x0f);
delay1(5);
lcdwrite_com(0x80+m);
delay1(5);
}
voidmfs(uchars,ucharm)//时分秒显示子程序
{
uchars1,s2;
lcdwrite_com(0x80+m);
delay1(5);
s1=s/10;
s2=s%10;
lcdwrite_dat(number[s1]);
delay1(5);
lcdwrite_dat(number[s2]);
delay1(5);
}
voidmfs1(uints,ucharm)//温度显示程序
{
uchars1,s2,s3;
lcdwrite_com(0x80+0x40+m);
delay1(5);
s1=s/100;
s2=s%100/10;
s3=s%10;
lcdwrite_dat(number[s1]);
delay1(5);
lcdwrite_dat(number[s2]);
delay1(5);
lcdwrite_dat(0x2e);
delay1(5);
lcdwrite_dat(number[s3]);
delay1(5);
}
voidscankey()//独立键盘
{
if(key1==0)//k1键是暂停并进入功能设置
{
delay1(10);
if(key1==0)
{
k2=0;
if(k1==0)
{
k1=1;
TR0=0;
}
else
{
k1=0;
TR0=1;
lcdwrite_com(0x0c);
delay1(10);
}
}
while(!
key1);
}
if(k1==1)//k2键是位选功能键
{
if(key2==0)
{
delay1(10);
if(key2==0)
{
k2++;
if(k2==1)
ggn1(12);
if(k2==2)
ggn1(9);
if(k2==3)
ggn1(6);
if(k2==4)
k2=0;
}
while(!
key2);
}
if(k2)//k3键是加一
{
if(key3==0)
{
delay1(10);
if(key3==0)
{
if(k2==1)
{
miao++;
if(miao==60)
{
miao=0;
}
mfs(miao,0x0c);
lcdwrite_com(0x80+0x0b);
}
if(k2==2)
{
fen++;
if(fen==60)
{
fen=0;
}
mfs(fen,0x09);
lcdwrite_com(0x80+0x08);
}
if(k2==3)
{
shi++;
if(shi==24)
{
shi=0;
}
mfs(shi,0x06);
lcdwrite_com(0x80+0x05);
}
}
while(!
key3);
}
}
}
}
voidinit()//程序初始化
{
uchari,t1,t2;
lcdwrite_com(0x38);//显示模式设置//
delay1(5);
lcdwrite_com(0x08);//显示关闭
delay1(5);
lcdwrite_com(0x01);//显示清屏
delay1(5);
lcdwrite_com(0x0c);//显示开及光标设置
delay1(5);
lcdwrite_com(0x06);//显示光标移动设置//
delay1(5);
t1=strlen(table2);
for(i=0;i{
lcdwrite_dat(table2[i]);
delay1(20);
}
lcdwrite_com(0x80+0x40);
delay1(5);
t2=strlen(table1);
for(i=0;i{
lcdwrite_dat(table1[i]);
delay1(20);
}
lcdwrite_dat(0xdf);//显示温度的单位
delay1(5);
lcdwrite_dat(0x43);
delay1(5);
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0x4c;
TL0=0X00;
}
voidmain()
{
init();
while
(1)
{
scankey();
if(temperature/10>T)
{
beer=0;
}
else
{
beer=1;
}
}
}
voidtime0()interrupt1//秒表计数
{
T