基于系列单片机温度报警器课程设计Word文档下载推荐.doc

上传人:wj 文档编号:1345888 上传时间:2023-04-30 格式:DOC 页数:19 大小:153KB
下载 相关 举报
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第1页
第1页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第2页
第2页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第3页
第3页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第4页
第4页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第5页
第5页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第6页
第6页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第7页
第7页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第8页
第8页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第9页
第9页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第10页
第10页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第11页
第11页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第12页
第12页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第13页
第13页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第14页
第14页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第15页
第15页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第16页
第16页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第17页
第17页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第18页
第18页 / 共19页
基于系列单片机温度报警器课程设计Word文档下载推荐.doc_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于系列单片机温度报警器课程设计Word文档下载推荐.doc

《基于系列单片机温度报警器课程设计Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《基于系列单片机温度报警器课程设计Word文档下载推荐.doc(19页珍藏版)》请在冰点文库上搜索。

基于系列单片机温度报警器课程设计Word文档下载推荐.doc

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所示:

存储和控制逻辑

高速暂存器

温度传感器

高温触发器TH

低温触发器TL

配置寄存器

8位CRC生成器

64位ROM和一线端口

供电方式

图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所示:

N

Y

读温度命令

将温度高、低位读出

处理数据到百、十、个、小数位,并在数码管上显示

超出限制?

报警器报警和数码管闪烁

初始化DS18B20

开始

应答脉冲?

发出温度转换的命令

等待温度转换完成

图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所示:

Y

符号为正?

求补码

高、低8位整合成为一个整数存入A中

-50~110之间?

报警

分别存入百、十、个、小数位

取温度值

图10数据处理流程图

6显示子程序

将百、十、个、小数位的数据查表,送到对应的数码管显示,程序流程图如11所示:

温度为负?

显示百位,延时

显示负号,延时

显示十位,延时

显示个位,延时

显示1000遍?

取温度

返回

显示小数位,延时

延时

超过范围?

图11显示程序流程图

五试验仿真

1总线路图

六课程设计体会

这两个礼拜的单片机课程设计已接近尾声,回顾这个过程,收获颇多!

单片机课程是我们上个学期学的内容,经过两个月的寒假,遗忘了很多东西!

再加上初次认识和使用系统仿真软件protues和编译软件keil,自己动手设计电路,所以在刚开始的课程设计遇到了很大困难!

说到这确实深感惭愧,但这也给自己创造了一个学习的机会!

重新回顾上个学期学过的内容,并且在图书馆和网上查阅了很多资料,通过和同学之间的交流,还有老师的辅导,自己开始熟悉并掌握有关单片机的设计!

经过两个礼拜的努力,看到了自己的成果!

同时对单片机有了一个新的认识,产生了很大的兴趣!

我认识到:

我们要认真对待每一门课程,并且要从中有所收获!

我们要不断温习以前学过的知识,而不能学过去了就把它扔在一边!

这样自己才能有进步!

课程设计检验的是综合能力,自己不仅要掌握课本上的东西,还有自己的动手能力,组织能力等等,要认真对待课程设计,学以致用,理论联系实际,尽自己的最大努力把它做好!

这个经历会磨练袭击的意志,我相信对自己以后的学习和工作有很大的帮助。

七参考文献

1、何立民主编,单片机中级教程,北京航空航天大学出版社

2、丁元杰主编,单片机原理与应用,机械工业出版社

3、彭伟编,单片机C语言程序设计实训,电子工业出版社

附录

程序清单:

#include<

reg51.h>

#include<

intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

#definedelayNOP(){_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_RW=0;

LCD_EN=0;

P0=cmd;

delayNOP();

LCD_EN=1;

LCD_EN=0;

voidWrite_LCD_Date(uchardat)

{

LCD_RS=1;

P0=dat;

LCD_EN=0;

voidLCD_Initialise()

Write_LCD_Command(0x01);

DelayX(5);

Write_LCD_Command(0x38);

Write_LCD_Command(0x0C);

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);

status=DQ;

Delay(100);

returnstatus;

ucharReadOneByte()

uchari,dat=0;

for(i=0;

8;

i++)

DQ=0;

dat>

>

=1;

DQ=1;

if(DQ)dat|=0x80;

Delay(30);

returndat;

voidWriteOneByte(uchardat)

for(i=0;

{DQ=0;

DQ=dat&

0x01;

Delay(5);

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()

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]+'

Current_Temp_Display_Buffer[8]=Display_Digit[2]+'

Current_Temp_Display_Buffer[7]=Display_Digit[3]+'

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]=='

-'

if(Current_Temp_Display_Buffer[7]=='

Current_Temp_Display_Buffer[7]='

Current_Temp_Display_Buffer[6]='

Set_LCD_POS(0x00);

16;

Write_LCD_Date(Temp_Disp_Title[i]);

Set_LCD_POS(0x40);

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);

while

(1)

if(DS18B20_IS_OK)Display_Temperature();

19-19

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2