STC89C52的室内火气安全检测装置设计Word文档下载推荐.docx
《STC89C52的室内火气安全检测装置设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《STC89C52的室内火气安全检测装置设计Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
非易失性温度报警器触发器TH和TL,可通过软件写入户报警上下限。
图464位ROM结构图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图5所示。
头2个字节包含测得的温度信息,第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。
该字节各位的定义热图6所示。
低5位一直为1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。
在DS18B20出厂时该位被设置为0,用户不要改动,R1和R0决定温度转换得精度位数,即用来设置分辨率,定义方法见表1。
图5高速暂存RAM结构图
图6配置寄存器
表1DS18B20分辨率的定义规定
由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要,系统对DS18B20的各种操作必须按协议进行.操作协议为:
初始化DS18B20→发ROM功能命令→发存储器操作命令→处理数据.
图8DS18B20测温原理图
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源.另一种是寄生电源供电方式,如图9所示.单片机端口接单线总线,为为保证有效DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉.
图9DS18B20采用寄生电源的电路图
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us.采用寄生电源供电方式时Vdd和GND端均接地.由于单线制只有一根线,因此发送接口必须是三态的
2.3STC89C2单片机及其引脚说明
89C51是一种高性能低功耗的采用CMOS工艺制造的8位微控制器,它提供下列标准特征:
4K字节的程序存储器,128字节的RAM,32条I/O线,2个16位定时器/计数器,一个5中断源两个优先级的中断结构,一个双工的串行口,片上震荡器和时钟电路。
STC89C52管脚功能图
引脚说明:
·
VCC:
电源电压
GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,作为输出口用时,每个引脚能驱动8个TTL逻辑门电路。
当对0端口写入1时,可以作为高阻抗输入端使用。
当P0口访问外部程序存储器或数据存储器时,它还可设定成地址数据总线复用的形式。
在这种模式下,P0口具有内部上拉电阻。
在EPROM编程时,P0口接收指令字节,同时输出指令字节在程序校验时。
程序校验时需要外接上拉电阻。
P1口:
P1口是一带有内部上拉电阻的8位双向I/O口。
P1口的输出缓冲能接受或输出4个TTL逻辑门电路。
当对P1口写1时,它们被内部的上拉电阻拉升为高电平,此时可以作为输入端使用。
当作为输入端使用时,P1口因为内部存在上拉电阻,所以当外部被拉低时会输出一个低电流(IIL)。
P2口:
P2是一带有内部上拉电阻的8位双向的I/O端口。
P2口的输出缓冲能驱动4个TTL逻辑门电路。
当向P2口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
作为输入口,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出电流(IIL)。
P2口在访问外部程序存储器或16位地址的外部数据存储器(例如MOVX@DPTR)时,P2口送出高8位地址数据。
在这种情况下,P2口使用强大的内部上拉电阻功能当输出1时。
当利用8位地址线访问外部数据存储器时(例MOVX@R1),P2口输出特殊功能寄存器的内容。
当EPROM编程或校验时,P2口同时接收高8位地址和一些控制信号。
P3口:
P3是一带有内部上拉电阻的8位双向的I/O端口。
P3口的输出缓冲能驱动4个TTL逻辑门电路。
当向P3口写1时,通过内部上拉电阻把端口拉到高电平,此时可以用作输入口。
P3口同时具有AT89C51的多种特殊功能,具体如下表1所示:
端口引脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时器0)
P3.5
T1(定时器1)
P3.6
(外部数据存储器写选通)
P3.7
(外部数据存储器都选通)
表1P3口的第二功能
RST:
复位输入。
当振荡器工作时,RST引脚出现两个机器周期的高电平将使单片机复位。
ALE/
:
当访问外部存储器时,地址锁存允许是一输出脉冲,用以锁存地址的低8位字节。
当在Flash编程时还可以作为编程脉冲输出(
)。
一般情况下,ALE是以晶振频率的1/6输出,可以用作外部时钟或定时目的。
但也要注意,每当访问外部数据存储器时将跳过一个ALE脉冲。
:
程序存储允许时外部程序存储器的读选通信号。
当AT89C52执行外部程序存储器的指令时,每个机器周期
两次有效,除了当访问外部数据存储器时,
将跳过两个信号。
/VPP:
外部访问允许。
为了使单片机能够有效的传送外部数据存储器从0000H到FFFH单元的指令,
必须同GND相连接。
需要主要的是,如果加密位1被编程,复位时EA端会自动内部锁存。
当执行内部编程指令时,
应该接到VCC端。
XTAL1:
振荡器反相放大器以及内部时钟电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
在本次设计中,采用89C51作为CPU处理器,充分利用其硬件资源,结合D触发器CD4013,分频器CD4060,模拟转换开关CD4051,计数器74LS90等数字处理芯片,主要控制两大硬件模块,量程切换以及显示模块。
下面还将详细说明。
2.4信号调理及放大整形模块,LM358芯片LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。
它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
特性:
内部频率补偿
直流电压增益高(约100dB)
单位增益频带宽(约1MHz)
电源电压范围宽:
单电源(3—30V);
双电源(±
1.5一±
15V)
低功耗电流,适合于电池供电,低输入偏流
低输入失调电压和失调电流
共模输入电压范围宽,包括接地
差模输入电压范围宽,等于电源电压范围
输出电压摆幅大(0至Vcc-1.5V)
第3节软件设计
统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等等.
1.主程序
主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值,温度测量1s进行一次,其程序流程图见图10.
2.读出温度子程序
读出温度子程序的主要功能是读出RAM中的9个字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写.其程序流程图如图11所示.
图10DS18B20温度计主程序流程图
图11读出温度子程序流程图
3.温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12分辨率时转换时间为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成.温度转换命令子程序流程图如图12所示.
图12温度转换命令子程序流程图
4.计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判断,其程序流程图如图13所示.
图13计算温度子程序流程图
5.显示数据刷新子程序
显示数据刷新子程序主要是对显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位.程序流程图如图14所示.
图14显示数据刷新子程序流程图
结束语
通过这两周的课程设计,我运用相关知识,自己从头至尾完完全全的制作了一块板子,并进行调试。
对“纸上学来终觉浅,绝知此事要躬行”这句话的含义也了解的更加透彻了。
虽然,讲解枯燥乏味;
虽然,焊接烫伤了手;
虽然……但还是很开心(也有放假两周的喜悦)。
最后做完了,验收时效果不是很好,心里还是有点淡淡的小伤感。
呵呵,算了不想了,下次努力吧(如果有下次的话)。
事实上,只有通过自己亲力亲为的去解决,才能体会到成功是的那份收获时的喜悦,从这次课程设计中,我深切的体会自己动手创造出来的劳动成果才是可贵的,不仅如此,在参与动手的过程中会有很多意想不到的收获。
参考文献
[1]李光飞,楼苗然主编.51系列单片机.北京:
北京航空航天大学出版社,2003
[2]
孙江宏、李良玉等.《Protel99电路设计与应用》.机械工业出版社.2003.2
[3]康华光.邹寿彬.电子技术基础(数字部分)[M].高等教育出版社.1998.7
[4]张毅刚.单片机原理及应用[M].高等教育出版社.2003
[5]陈步月.基于单片机的测试技术原理与应用[M].机械工业出版社.2007.3
[6]李忠国.陈刚.单片机应用技能实训[M].辽宁科技出版社.2006.11
[7]冯育长.马金强.单片机系统设计于实例分析[M].2007.5
附录一:
#include<
reg52.h>
intrins.h>
//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
#defineledP0
#definekeyP2
uinty1,y2,y3,y4;
unsignedcharTL;
//储存暂存器的温度低位
unsignedcharTH;
//储存暂存器的温度高位
uinttemph,templ;
uintTN;
//储存温度的整数部分
uintTD;
//储存温度的小数部分
floatTD1;
//以小数形式储存温度的小数部分
uinttemp;
sbitw1=P1^7;
sbitw2=P1^6;
sbitw3=P1^5;
sbitw4=P1^4;
sbitMQ=P1^3;
sbitfmq=P3^5;
sbitdeng=P3^6;
uchars=0;
//模式切换标志位
ucharcodetable2[]={0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0xff};
//没点的反
ucharcodetable4[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x20};
//0~9的ASCii码
unsignedcharcodetable1[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//没点的正
unsignedcharcodetable3[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff};
//有点的正
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddelay_2us()//延时2us
{
ucharp;
for(p=0;
p<
1;
p++)
_nop_();
}
/*****************************************************
函数功能:
延时若干纳秒
入口参数:
n
***************************************************/
voiddelay_nus(ucharn)//延时2nus
n;
delay_2us();
voiddelay1ms()
uchari,j;
for(i=0;
i<
2;
i++)
for(j=0;
j<
30;
j++);
延时若干微秒
voiddelayms(ucharn)
uchari;
delay1ms();
位置寻找函数
findout(uintr,uinty)
uinti;
11;
if(table4[i]==r)
break;
y=i;
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbitDQ=P1^0;
uchartime;
//设置全局变量,专门用于严格延时
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
bitInit_DS18B20(void)
bitflag;
//储存DS18B20是否存在的标志,flag=0,表示存在;
flag=1,表示不存在
DQ=1;
//先将数据线拉高
for(time=0;
time<
time++)//略微延时约6微秒
;
DQ=0;
//再将数据线从高拉低,要求保持480~960us
200;
time++)//略微延时约600微秒
//以向DS18B20发出一持续480~960us的低电平复位脉冲
//释放数据线(将数据线拉高)
10;
time++)
//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;
//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
time++)//延时足够长时间,等待存在脉冲输出完毕
return(flag);
//返回检测成功标志
从DS18B20读取一个字节数据
dat
***************************************************/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat;
//储存读出的一个字节数据
for(i=0;
8;
DQ=1;
//先将数据线拉高
//等待一个机器周期
DQ=0;
//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>
>
=1;
DQ=1;
//将数据线"
人为"
拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;
//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;
//如果读到的数据是1,则将1存入dat
else
dat|=0x00;
//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);
//返回读出的十进制数据
向DS18B20写入一个字节数据
WriteOneChar(unsignedchardat)
unsignedchari=0;
for(i=0;
i<
i++)
DQ=0;
//将数据线从高拉低时即启动写时序
DQ=dat&
0x01;
//利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
time++)
//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;
//释放数据线
//延时3us,两个写时序间至少需要1us的恢复期
//将dat中的各二进制位数据右移1位
4;
time++);
//稍作延时,给硬件一点反应时间
显示温度的整数部分
x
voiddisplay_temp1(ucharx)
uchark,l;
//j,k,l分别储存温度的百位、十位和个位
k=x/10%10;
//取十位
l=x%10;
//取个位
w1=0;
led=table1[k];
delay(4);
w1=1;
led=table3[l];
w2=0;
w2=1;
//小数部分
voiddisplay_temP3(ucharx)
w3=0;
led=table1[x];
w3=1;
w4=0;
led=0xC6;
w4=1;
做好读温度的准备
voidReadyReadTemp(void)
Init_DS18B20();
//将DS18B20初始化
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
100;
time++);
//温度转换需要一点时间
//跳过读序号列号的操作
WriteOneCh