单片机课程设计之温控系统附源代码.docx

上传人:b****8 文档编号:30405049 上传时间:2023-08-14 格式:DOCX 页数:20 大小:256.48KB
下载 相关 举报
单片机课程设计之温控系统附源代码.docx_第1页
第1页 / 共20页
单片机课程设计之温控系统附源代码.docx_第2页
第2页 / 共20页
单片机课程设计之温控系统附源代码.docx_第3页
第3页 / 共20页
单片机课程设计之温控系统附源代码.docx_第4页
第4页 / 共20页
单片机课程设计之温控系统附源代码.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

单片机课程设计之温控系统附源代码.docx

《单片机课程设计之温控系统附源代码.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之温控系统附源代码.docx(20页珍藏版)》请在冰豆网上搜索。

单片机课程设计之温控系统附源代码.docx

单片机课程设计之温控系统附源代码

一、实验任务与要求

二、总体设计

三、硬件模块介绍

1.单片机模块介绍

2.温度传感器

3.数码管

4.报警电路

四程序设计

1.温度传感器初始化程序

2.温度测量

3.数码管显示

4.温度报警

五、程序流程图

六、实验调试

七、实验总结

 

一、实验任务与要求

1.利用用单片机完成温度的测量并显示

2.了解温度传感器的工作原理

3.了解锁存器的工作原理

4.理解数码管的显示原理

二、总体设计

利用单片机接收温度传感器传过来的温度值并经过数值处理以动态方式显示于数码管上,利用while函数循环检测温度值,当温度值高于设定值时启动报警电路,报警电路主要由蜂鸣器实现。

三、硬件模块介绍

1.单片机模块介绍

实验中采用的是89C52。

该单片机是INTEL公司MCS-51系列单片机中基本的产品,它采用ATMEL公司可靠的CMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。

它结合了CMOS的高速和高密度技术及CMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于89C51增强型单片机版本。

具有以下特点:

·标准MCS-51内核和指令系统

·片内8kROM(可扩充64kB外部存储器)

·32个双向I/O口

·256x8bit内部RAM(可扩充64kB外部存储器)

·3个16位可编程定时/计数器

·时钟频率3.5-12/24/33MHz

·向上或向下定时计数器

·改进型快速编程脉冲算法

·6个中断源

·5.0V工作电压

·全双工串行通信口

·布尔处理器

—帧错误侦测

·4层优先级中断结构

—自动地址识别

·兼容TTL和CMOS逻辑电平

·空闲和掉电节省模式

·PDIP(40)和PLCC(44)封装形式

原理图如下:

2.温度传感器

1.概述

温度传感器采用的是由美国Dallas半导体公司生产的数字化温度传感器DS1820。

它是是世界上第一片支持"一线总线"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。

全部传感元件及转换电路集成在形如一只三极管的集成电路内。

2.特点

(1)适应电压范围更宽,电压范围:

3.0~5.5V,在寄生电源方式下可由数据线供电;

(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;

(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温;

(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;

(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;

(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;

(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快;(

(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力;

(9)负压特性:

电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

3.结构组成

DS18B20内部结构主要由四部分组成:

64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。

DS18B20的管脚排列如右图所示:

DS18B20引脚定义:

(1)GND为电源地;

(2)DQ为数字信号输入/输出端;

(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

原理图如下:

4.工作原理

DS18B20测温原理如图20所示。

图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。

高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。

计数器1和温度寄存器被预置在-55℃所对应的一个基数值。

计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。

3.数码管

数码管的作用是显示温度数值。

数码管接法有共阴极接法和共阳极接法。

二者接法的区别在于共电源与共地,相同字符编码显示正好相反,在本次设计中采用的是八段共阴极数码管。

使用数码管时,要注意区分这两种不同的接法。

为了显示数字或字符,必须对数字或字符进行编码。

七段数码管加上一个小数点,共计8段,因此为LED显示器提供的编码正好是一个字节。

根据电路连接图显示16进制数的编码显示于下图。

数码管的显示方式有两种,分别为动态显示和静态显示。

动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。

选亮数码管采用动态扫描显示。

所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。

当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

这种方法的优点是占用CPU时间少,显示便于监测和控制。

缺点是硬件电路比较复杂,成本较高。

根据实验要求,需要实时显示当前温度值,所以采用的是动态显示方式,这里需要用到锁存器,锁存器的作用是将单片机端口分时复用。

这里采用的是74HC573。

左边接单片机数据输出端,右边接数码管数据输入端。

LE为芯片使能端,高电平时选中该芯片工作。

当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。

实验中采用两个74HC573,作用分别是负责数码管的段选和位选,段选是选择亮哪段,显示什么字符。

位选则是选择哪一片数码管亮。

由于此温度采集系统需要至少三个数码管显示温度,必须要有位选。

原理图如下:

5.

报警电路

报警电路则采用蜂鸣器电路负责报警。

如右图所示,当外界温度高于设定值时,FM置于高电平,三极管导通,蜂鸣器工作产生报警声音。

四.程序设计

1.温度传感器初始化程序

voidInit_Ds18b20(void)//DS18B20初始化

{

DQ=1;//DQ复位,不要也可行。

delay

(1);//稍做延时

DQ=0;//单片机拉低总线

delay(250);//精确延时,维持至少480us

DQ=1;//释放总线,即拉高了总线

delay(100);//此处延时有足够,确保能让DS18B20发出存在脉冲。

}

2.温度测量

uintGet_Tmp()//获取温度getthetemperature

{

floattt;

uchara,b;

Init_Ds18b20();//初始化

Write_One_Byte(0xcc);//忽略ROM指令

Write_One_Byte(0x44);//温度转换指令

Init_Ds18b20();//初始化

Write_One_Byte(0xcc);//忽略ROM指令

Write_One_Byte(0xbe);//读暂存器指令

a=Read_One_Byte();//读取到的第一个字节为温度LSB

b=Read_One_Byte();//读取到的第一个字节为温度MSB

temp=b;//先把高八位有效数据赋于temp

temp<<=8;//把以上8位数据从temp低八位移到高八位

temp=temp|a;//两字节合成一个整型变量

tt=temp*0.0625;//得到真实十进制温度值

//因为DS18B20可以精确到0.0625度

//所以读回数据的最低位代表的是0.0625度

temp=tt*10+0.5;//放大十倍

//这样使小数点后第一位也转换为可显示数字

//同时进行一个四舍五入操作。

returntemp;

}

3.数码管显示

voidDisplay(uinttemp)//显示程序

{

ucharA1,A2,A3;

A1=temp/100;//百位

A2=temp%100/10;//十位

A3=temp%10;//个位

dula=0;

P0=table[A1];//显示百位

dula=1;//打开段选,对应74573的锁存位,高电平不锁存

dula=0;

wela=0;

P0=0xfe;

wela=1;//打开位选

wela=0;

delay(0);

dula=0;

P0=table1[A2];//显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)

dula=1;

dula=0;

wela=0;

P0=0xfd;

wela=1;

wela=0;

delay(0);

P0=table[A3];//显示个位

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(0);

}

4.温度报警

if(temp>=almtemp)

beepon();//若温度大于almtemp设定值,启动报警,否则关闭

else

beepoff();

五.程序流程图

 

六.实验调试

本次实验已经基本实现了温度的实时显示,精确于小数点后一位,并可以产生报警。

实验效果如下:

 

七.实验总结

通过本次实验,让我对80C52单片机有了更好的了解。

对数码管显示,锁存器温度传感器工作原理等有了更深的理解,能够利用单片机完成温度显示报警系统的设计。

 

附程序代码:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#definealmtemp200

sbitDQ=P2^2;//数据口defineinterface

sbitdula=P2^6;//数码管段选

sbitwela=P2^7;//数码管位选

sbitbeep=P2^3;//报警

uinttemp;//温度值variableoftemperature

//不带小数点

unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

//带小数点,共阴

unsignedcharcodetable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

/*************精确延时函数*****************/

voiddelay(unsignedchari)

{

while(--i);

}

/******************************************

此延时函数针对的是12Mhz的晶振

delay(0):

延时518us误差:

518-2*256=6

delay

(1):

延时7us(原帖写"5us"是错的)

delay(10):

延时25us误差:

25-20=5

delay(20):

延时45us误差:

45-40=5

delay(100):

延时205us误差:

205-200=5

delay(200):

延时405us误差:

405-400=5

*******************************************/

/*****************DS18B20******************/

voidInit_Ds18b20(void)//DS18B20初始化sendresetandinitializationcommand

{

DQ=1;//DQ复位,不要也可行。

delay

(1);//稍做延时

DQ=0;//单片机拉低总线

delay(250);//精确延时,维持至少480us

DQ=1;//释放总线,即拉高了总线

delay(100);//此处延时有足够,确保能让DS18B20发出存在脉冲。

}

ucharRead_One_Byte()//读取一个字节的数据readabytedate

//读数据时,数据以字节的最低有效位先从总线移出

{

uchari=0;

uchardat=0;

for(i=8;i>0;i--)

{

DQ=0;//将总线拉低,要在1us之后释放总线

//单片机要在此下降沿后的15us内读数据才会有效。

_nop_();//至少维持了1us,表示读时序开始

dat>>=1;//让从总线上读到的位数据,依次从高位移动到低位。

DQ=1;//释放总线,此后DS18B20会控制总线,把数据传输到总线上

delay

(1);//延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分

if(DQ)//控制器进行采样

{

dat|=0x80;//若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0

}

delay(10);//此延时不能少,确保读时序的长度60us。

}

return(dat);

}

voidWrite_One_Byte(uchardat)

{

uchari=0;

for(i=8;i>0;i--)

{

DQ=0;//拉低总线

_nop_();//至少维持了1us,表示写时序(包括写0时序或写1时序)开始

DQ=dat&0x01;//从字节的最低位开始传输

//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,

//因为15us后DS18B20会对总线采样。

delay(10);//必须让写时序持续至少60us

DQ=1;//写完后,必须释放总线,

dat>>=1;

delay

(1);

}

}

uintGet_Tmp()//获取温度getthetemperature

{

floattt;

uchara,b;

Init_Ds18b20();//初始化

Write_One_Byte(0xcc);//忽略ROM指令

Write_One_Byte(0x44);//温度转换指令

Init_Ds18b20();//初始化

Write_One_Byte(0xcc);//忽略ROM指令

Write_One_Byte(0xbe);//读暂存器指令

a=Read_One_Byte();//读取到的第一个字节为温度LSB

b=Read_One_Byte();//读取到的第一个字节为温度MSB

temp=b;//先把高八位有效数据赋于temp

temp<<=8;//把以上8位数据从temp低八位移到高八位

temp=temp|a;//两字节合成一个整型变量

tt=temp*0.0625;//得到真实十进制温度值

//因为DS18B20可以精确到0.0625度

//所以读回数据的最低位代表的是0.0625度

temp=tt*10+0.5;//放大十倍

//这样做的目的将小数点后第一位也转换为可显示数字

//同时进行一个四舍五入操作。

returntemp;

}

/****************数码码动态显示函数**************/

voidDisplay(uinttemp)//显示程序

{

ucharA1,A2,A3;

A1=temp/100;//百位

A2=temp%100/10;//十位

A3=temp%10;//个位

dula=0;

P0=table[A1];//显示百位

dula=1;//打开段选,对应74573的锁存位,高电平不锁存

dula=0;

wela=0;

P0=0xfe;

wela=1;//打开位选

wela=0;

delay(0);

dula=0;

P0=table1[A2];//显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)

dula=1;

dula=0;

wela=0;

P0=0xfd;

wela=1;

wela=0;

delay(0);

P0=table[A3];//显示个位

dula=1;

dula=0;

P0=0xfb;

wela=1;

wela=0;

delay(0);

}

voidbeepon(void)

{

beep=0;

}

voidbeepoff(void)

{

beep=1;

}

voidmain()

{

beepoff();

while

(1)

{

Display(Get_Tmp());

delay(4);

if(temp>=almtemp)

beepon();

else

beepoff();

}

}

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1