基于51系列单片机温度报警器课程设计.docx
- 文档编号:3858790
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:20
- 大小:172.53KB
基于51系列单片机温度报警器课程设计.docx
《基于51系列单片机温度报警器课程设计.docx》由会员分享,可在线阅读,更多相关《基于51系列单片机温度报警器课程设计.docx(20页珍藏版)》请在冰点文库上搜索。
基于51系列单片机温度报警器课程设计
一概述
1.1课程设计的目的和意义
通过这次课程设计,我进一步熟悉了单片机的内部结构和工作原理,掌握了单片机应用系统设计的基本方法和步骤;通过利用MCS-51单片机,理解单片机在自动化装置中的作用以及掌握单片机的编程调试方法;通过设计一个简单的实际应用输入控制及显示系统,掌握protues和keil以及各种仿真软件的使用。
目前温度计的发展很快,从原始的玻璃管温度计发展到了现在的热电阻温度计、热电偶温度计、数字温度计、电子温度计等等,温度计中传感器是它的重要组成部分,它的精度、灵敏度基本决定了温度计的精度、测量范围、控制范围和用途等。
传感器应用极其广泛,目前已经研制出多种新型传感器。
但是,作为应用系统设计人员需要根据系统要求选用适宜的传感器,并与自己设计的系统连接起来,从而构成性能优良的监控系统。
1.2任务及要求
设计内容:
所设计数字电压表应具有以下功能:
(1)可以测量-50到110摄氏度内的温度。
(2)在4位LED数码管上显示温度,分别为百位、十位、个位和小数点后一位。
(3)测量精度误差在0.5摄氏度以内。
设计要求:
1、根据题目要求进行系统总体设计。
2.完成系统硬件电路的设计。
(1)硬件电路图。
(2)硬件电路说明。
3.系统程序的设计。
(1)程序流程图。
(2)完整源程序。
4.完成的控制系统能达到题目的要求。
5.书写设计说明书。
二总体设计方案
1功能简介
LCD液晶显示器直接显示DS18B20所测量的温度,超出-50~110℃范围时喇叭报警并且数码管开始闪烁,在温度范围内时喇叭停止报警并且数码管停止闪烁,运行期间可以随时进行复位操作。
2设计思路
AT89C51作为温度测试系统设计的核心器件,具有低电压供电和体积小等特点。
该器件是INTEL公司生产的MCS-5l系列单片机中的基础产品,采用了可靠的CMOS工艺制造技术,具有高性能的8位单片机,属于标准的MCS-51的CMOS产品。
芯片中集成了CPU、RAM、ROM、定时/计数器和多功能I/O接口等计算机所需的基本功能部件。
程序存储在单片机的程序存储器中,运行过程由程序控制。
时钟信号用来控制单片机内各种微操作的时间基准,通常有两种形式得到,即内部震荡方式和外部震荡方式。
内部震荡方式所得的信号比较稳定,故设计数字温度计的时钟信号选用内部震荡方式,晶振选用12MHZ。
复位电路使片内单片机的片内寄存器初始化,使单片机从一种确定的状态开始运行。
复位电路有两种基本形式,即上电复位和开关复位。
为了保证温度计的正常工作,采用上电且开关复位,也就是CR复位。
温度传感器选用达拉斯公司的单线数字温度传感芯片DS18B20。
它将地址线、数据线和控制线合为一根双向串行传输数据的信号线,允许在这根信号线上挂接多个DS18B20。
每个芯片内有一个64位的ROM,其中存有各个器件自身的序列号,作为器件独有的ID号码。
其测温范围是-55~128℃,测温分辨率在12位时精度为0.0625℃。
DS18B20简化了温度器件与计算机的接口电路,使得电路简单,使用更加方便。
显示部分使用LM016L来作为温度的直接输出,当温度超出-50~110℃时,喇叭报警和数码管闪烁来提示。
采用单片机汇编程序语言设计温度计的程序,对DS18B20进行初始化、读、写,读取温度,数据的转换,温度显示和报警处理等等。
3芯片器材
主机:
单片机AT89C51一片;温度传感器:
DS18B20一片,显示电路:
LM016L液晶显示器;时钟电路:
电容两个,晶振片一个;复位电路:
电容一个,开关按钮一个;导线若干,+5V电源等等。
三硬件设计
189C51
如图1
图1AT89C51引脚图
本次设计需要注意的几个端口:
P0口(39—32):
是一组8位漏极开路行双向I/O口,也既地址/数据总线复用口。
可作为输出口使用时,每位可吸收电流的方式驱动8个TTL逻辑电路,对端口写“1”可作为高阻抗输入输入端用。
在访问外部数据存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,PO口接收指令字节,而在程序校验时,输出指令字节,校验时,要求接上拉电阻。
P3口(10—17):
是一组带有内部上拉电阻的8位双向I/O口,,P1的输入缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输出端口。
作输出端口时,被外部拉低的P3口将用上拉电阻输出电流。
P3口除可作为一般的I/O口线外,更重要的用途是它的第二功能,如图2所示:
图2端口引脚P3
/Vpp(31):
内部和外部程序存储器选择线。
=0时访问外部ROM0000H—FFFFH;
=1时,地址0000H—0FFFH空间访问内部ROM,地址1000H—FFFFH空间访问外部ROM。
本次设计
接高电平。
XTAL1(19)和XTAL2(18):
使用内部振荡电路时,用来接石英晶体和电容;使用外部时钟时,用来输入时钟脉冲。
RST/VPD(9):
复位信号输入端。
AT89S51接能电源后,在时钟电路作用下,该脚上出现两个机器周期以上的高电平,使内部复位。
第二功能是VPD,即备用电源输入端。
当主电源Vcc发生故障,降低到低电平规定值时,VPD将为RAM提供备用电源,发保证存储在RAM中的信号不丢失。
2温度获取
使用美国Dallas半导体公司的数字化温度传感器DS1820,支持“一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。
全部传感元件及转换电路集成在形如一只三极管的集成电路内。
“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。
现在,新一代的DS18B20体积更小、更经济、更灵活。
使你可以充分发挥“一线总线”的优点。
同DS1820一样,DS18B20也支持“一线总线”接口,测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。
现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。
适合于恶劣环境的现场温度测量,如:
环境控制、设备或过程控制、测温类消费电子产品等。
与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。
而且新一代产品更便宜,体积更小
DS18B20产品的特点:
(1)、只要求一个端口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。
C到+125。
C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
DS18B20内部结构[2]如图3所示:
图3DS18B20内部结构
DS18B20功能命令[2]如表1所示:
表1DS18B20功能命令表
命令
功能描述
代码
CONVERT
启动温度转换
44H
READSCRATCHPAD
读取温度寄存器
BEH
READROM
读DS18B20的序列号
33H
WRITESCRATPAD
将数据写入暂存器的第2、3字节中
4EH
MATCHROM
匹配ROM
55H
SEARCHROM
搜索ROM
F0H
ALARMSEARCH
报警搜索
ECH
SKIPROM
跳过读序列号的操作
CCH
READPOWERSUPPLY
读电源供给方式,0寄生,1外部电源
B4H
其连线使用如图4所示(2接P3.6):
图4DS18B20连线图
由于DS18B20单线通信功能是分时完成的,所以有严格的时隙概念,读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
3复位电路
复位操作是为了完成单片机内部电路的初始化,使单片机从一种确定的状态开始运行。
当AT89C51单片机的复位引脚RST出现2个机器周期以上,单片机就完成了复位操作。
如果RST持续为高电平,单片机就处于循环复位状态[1]。
复位通常有2种基本形式:
上电复位和开关复位。
上电复位要求要求接通电源后,自动实现复位操作。
开关复位要求在电源接通的条件下,在单片机运行期间,用按钮开关操作使单片机复位。
本次采用的是常用的上电且开关复位电路,如图5所示:
图5复位电路
上电后,由于电容充电,使RST持续一段高电平时间。
当单片机已在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电且开关复位的操作。
通常选择C=10~30μF,R=10~1000Ω。
复位操作使单片机进入初始化过程,其中包括使程序计数器PC=0000H,P0~P3=FFH,SP=07H,其它寄存器处于零。
4时钟电路
单片机的时钟信号使用内部震荡方式产生,其电路图如图6所示:
图6内部震荡电路
电容器C、C1起稳定震荡频率、快速起振的作用,电容值一般为5-30pF,晶振通常选用6MHZ、12MHZ、24MHZ。
内部震荡方式所得的时钟信号比较稳定。
五温度显示电路
四位共阴极数码管,能够显示带一位小数的正负温度。
零下时:
1显示负号,2显示十位,3显示个位,4显示小数位。
零上时:
1显示百位,2显示十位,3显示个位,4显示小数位。
当温度超过109.5或低于49.5时,四个数码闪烁。
其如图8
图8总体电路
四软件设计
1程序流程图
程序流程图如图9所示:
图9程序流程图
2初始化子程序
使用DS18B20时,单片机先向DS18B20送出复位信号,单片机将数据拉低并保持480~960μs;再释放数据线,由上拉电阻拉高15~60μs;然后再由DS18B20发出低电平60~240μs,就完成了复位操作[3]。
3读子程序
读数据之前,单片机先将数据线拉低,再释放。
DS18B20在数据线从高电平跳低后15μs内将数据送到数据线上。
单片机在15μs后读数据线。
4写子程序
在单片机对DS18B20写数据时,应先将数据线拉低1μs以上,再写入数据(写1为高,写0为低)。
待单片机写入的数据变化15~60μs后,DS18B20将对数据线采样。
单片机写入数据到DS18B20的保持时间为60~120μs。
5数据处理子程序
先判断温度高8位的CY,如果CY为1,则将高、低8八位求补;对高、低8位的数据按权整合称一个整数,判断是否在-50~110℃之间,超出范围则置报警灯为亮;将该数按百、十、个位分别存入相应的存储单元。
流程图如图10所示:
图10数据处理流程图
6显示子程序
将百、十、个、小数位的数据查表,送到对应的数码管显示,程序流程图如11所示:
图11显示程序流程图
五试验仿真
1总线路图
六课程设计体会
这两个礼拜的单片机课程设计已接近尾声,回顾这个过程,收获颇多!
单片机课程是我们上个学期学的内容,经过两个月的寒假,遗忘了很多东西!
再加上初次认识和使用系统仿真软件protues和编译软件keil,自己动手设计电路,所以在刚开始的课程设计遇到了很大困难!
说到这确实深感惭愧,但这也给自己创造了一个学习的机会!
重新回顾上个学期学过的内容,并且在图书馆和网上查阅了很多资料,通过和同学之间的交流,还有老师的辅导,自己开始熟悉并掌握有关单片机的设计!
经过两个礼拜的努力,看到了自己的成果!
同时对单片机有了一个新的认识,产生了很大的兴趣!
我认识到:
我们要认真对待每一门课程,并且要从中有所收获!
我们要不断温习以前学过的知识,而不能学过去了就把它扔在一边!
这样自己才能有进步!
课程设计检验的是综合能力,自己不仅要掌握课本上的东西,还有自己的动手能力,组织能力等等,要认真对待课程设计,学以致用,理论联系实际,尽自己的最大努力把它做好!
这个经历会磨练袭击的意志,我相信对自己以后的学习和工作有很大的帮助。
七参考文献
1、何立民主编,单片机中级教程,北京航空航天大学出版社
2、丁元杰主编,单片机原理与应用,机械工业出版社
3、彭伟编,单片机C语言程序设计实训,电子工业出版社
附录
程序清单:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definedelayNOP(){_nop_();_nop_();_nop_();_nop_();}
sbitDQ=P3^3;
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
ucharcodeTemp_Disp_Title[]={"currenttemp:
"};
ucharCurrent_Temp_Display_Buffer[]={"C"};
ucharcodeTemperature_Char[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};
ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
ucharCurrentT=0;
ucharTemp_Value[]={0x00,0x00};
ucharDisplay_Digit[]={0,0,0,0};
bitDS18B20_IS_OK=1;
voidDelayX(intx)
{
uchari;
while(x--)for(i=0;i<120;i++);
}
bitLCD_Busy_Check()
{
bitresult;
LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();
result=(bit)(P0&0x80);
LCD_EN=0;
returnresult;
}
voidWrite_LCD_Command(ucharcmd)
{
while(LCD_Busy_Check());
LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();
P0=cmd;delayNOP();
LCD_EN=1;delayNOP();LCD_EN=0;
}
voidWrite_LCD_Date(uchardat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;
P0=dat;delayNOP();
LCD_EN=1;delayNOP();LCD_EN=0;
}
voidLCD_Initialise()
{
Write_LCD_Command(0x01);DelayX(5);
Write_LCD_Command(0x38);DelayX(5);
Write_LCD_Command(0x0C);DelayX(5);
Write_LCD_Command(0x06);DelayX(5);
}
voidSet_LCD_POS(ucharpos)
{Write_LCD_Command(pos|0x80);
}
voidDelay(uintx)
{while(--x);
}
ucharInit_DS18B20()
{
ucharstatus;
DQ=1;Delay(8);DQ=0;Delay(90);DQ=1;Delay(8);
status=DQ;Delay(100);
DQ=1;
returnstatus;
}
ucharReadOneByte()
{
uchari,dat=0;
DQ=1;_nop_();
for(i=0;i<8;i++)
{
DQ=0;dat>>=1;DQ=1;_nop_();_nop_();
if(DQ)dat|=0x80;
Delay(30);
DQ=1;
}
returndat;
}
voidWriteOneByte(uchardat)
{
uchari;
for(i=0;i<8;i++)
{DQ=0;DQ=dat&0x01;Delay(5);DQ=1;dat>>=1;
}
}
voidRead_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK=0;
else
{WriteOneByte(0xCC);
WriteOneByte(0x44);
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
Temp_Value[0]=ReadOneByte();
Temp_Value[1]=ReadOneByte();
DS18B20_IS_OK=1;
}
}
voidDisplay_Temperature()
{
uchari;
uchart=150,ng=0;
if((Temp_Value[1]&0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00)Temp_Value[1]++;
ng=1;
}
Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];
CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);
Display_Digit[3]=CurrentT/100;
Display_Digit[2]=CurrentT%100/10;
Display_Digit[1]=CurrentT%10;
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0';
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0';
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0';
if(Display_Digit[3]==0)Current_Temp_Display_Buffer[7]='';
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]='';
if(ng)
{
if(Current_Temp_Display_Buffer[8]=='')
Current_Temp_Display_Buffer[8]='-';
else
if(Current_Temp_Display_Buffer[7]=='')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
Set_LCD_POS(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Date(Temp_Disp_Title[i]);
}
Set_LCD_POS(0x40);
for(i=0;i<16;i++)
{
Write_LCD_Date(Current_Temp_Display_Buffer[i]);
}
Set_LCD_POS(0x4D);Write_LCD_Date(0x00);
Set_LCD_POS(0x4E);Write_LCD_Date('C');
}
voidmain()
{
LCD_Initialise();
Read_Temperature();
Delay(50000);
Delay(50000);
while
(1)
{
Read_Temperature();
if(DS18B20_IS_OK)Display_Temperature();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 系列 单片机 温度 报警器 课程设计