微机型实时检测报警系统的模拟设计文档格式.docx
《微机型实时检测报警系统的模拟设计文档格式.docx》由会员分享,可在线阅读,更多相关《微机型实时检测报警系统的模拟设计文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
在描述了外围硬件电路的同时,还做了大量的软件工作。
关键词:
单片机、a/d转换、显示、报警
二、设计原理
1、原理图
2、功能模块说明
(1)、模拟量
根据设计的要求,我们通过8只电位器和一定的硬件电路连接,从而实现8通道的模拟量输入。
我们可以将电位器理解为滑动变阻器,通过和5V电源的连接,就能够实现分压,其中有效部分的电压就能作为模拟量输入。
(2)、AD转换
由于51单片机大部分不带AD转换器,所以模拟量的采集就必须靠A/D来实现。
下面,将对ad0809作一下介绍。
(a)AD0809的逻辑结构
ADC0809是8位逐次逼近型A/D转换器。
它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成(见图1)。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(b)AD0809的工作原理
IN0-IN7:
8条模拟量输入通道
ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;
输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
通道选择表如下表所示。
C
B
A
选择的通道
IN0
1
IN1
IN2
IN3
IN4
IN5
IN6
IN7
数字量输出及控制线:
11条
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;
下跳沿时,开始进行A/D转换;
在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;
否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;
OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,
VREF(+),VREF(-)为参考电压输入。
(c)ADC0809应用说明
(1).ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。
(2).初始化时,使ST和OE信号全为低电平。
(3).送要转换的哪一通道的地址到A,B,C端口上。
(4).在ST端给出一个至少有100ns宽的正脉冲信号。
(5).是否转换完毕,我们根据EOC信号来判断。
(6).当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单
片机了。
(d)AD0809的应用
主要由AD转换器AD0809,频率发生器SUN7474,单片机AT89S51及显示用数码管组成。
AD0809的启动方式为脉冲启动方式,启动信号START启动后开始转换,EOC信号在START的下降沿10us后才变为无效的低电平。
这要求查询程序待EOC无效后再开始查询,转换完成后,EOC输出高电平,再由OE变为高电平来输出转换数据。
我们在设计程序时可以利用EOC信号来通知单片机(查询法或中断法)读入已转换的数据,也可以在启动AD0809后经适当的延时再读入已转换的数据。
AT89S51的输出频为晶振频的1/6(2MHZ),AT89S1与SUN7474连接经与7474的ST脚提供AD0809的工作时钟。
AD0809的工作频范围为10KHZ-1280KHZ,当频率范围为500KHZ时,其转换速度为128us。
AD0809的数据输出公式为:
Dout=Vin*255/5=Vin*51,其中Vin为输入模拟电压,Vout为输出数据。
由于温度的范围是0~200℃,为了实现精度±
1℃,可令显示部分的输出公式ad_date=Dout*200/255,当输入为5V时,输出的显示值正好为200.
(3)、按键
按键主要是用来对通道号、温度范围的设定。
通过多次的讨论,确定选用4个按钮。
功能如下表:
按钮编号
按钮1
按钮2
按钮3
按钮4
功能
按1下,设置通道
设置温度的位号
按第1下,设置百位值;
按第2下,设置十位值;
按第3下,设置个位值
按一下加1
按一下减1
按2下,设置温度的上限值
按3下,设置温度的下限值
按4下,退出所有设置
通过4个按钮,就能实现对通道号和各通道所对应的温度范围的设置,从而实现人机交互。
剩下的一个按钮,作为复位开关使用,复位电路如图:
(4)、MCU
根据实验的要求,选用AT89S51作为CPU.
引脚说明:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
(5)、温度显示
根据设计的要求,选用4个8段数码管作为显示。
由于单片机不能直接驱动数码管,所以需要加一个驱动电路,驱动端正好作为共阳数码管的公共端,并且用单片机的输出信号作为驱动的触发端,所以就能实现设计的要求。
工作原理:
LED84S显示器的C1-C8接口接收由P0.0-P0.7口输入显示信号;
S1-S4接入单片机的P2.0-P2.3接口,对显示电路进行控制(5.1)。
(6)、越限报警
图一
这部分只需要一根线来实现对蜂鸣器的控制即可,具体见接线图。
图6.1
图5.1
三、硬件接线图
图中P2.4作为蜂鸣器的控制端,与图6.1的P3.7连接即可。
其余的4个按钮其中一端直接与+5V的电源,令一端分别与P3.3、P.4、P3.6、P3.7相接即可。
四、程序框图
五、程序
#include<
at89s51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitst=P3^2;
sbitoe=P3^1;
sbiteoc=P3^0;
ucharcodetab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
//数码管显示段码
ucharcodetd[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
//通道先择数组
uintad_0809,ad_data1,ad_data2,ad_data3,ad_data0;
ucharm,number;
ucharfirst_press_flag=0;
ucharx[8];
//八通道数据待存数组
voiddelaynms(uintx);
//延时程序
voiddisplay();
//显示程序
voidad0809();
//芯片启动程序
voidtongdao();
//通道号
voidset();
//用于设置通道号和相应温度范围
voiddeal();
//延时程序
voiddelaynms(uintx)
{
uchari;
while(x-->
0)
for(i=0;
i<
125;
i++)
{;
}
voiddisplay()
uchara;
ad_data1=(ad_0809*200/255)/100;
//读得的数据乘以2再乘以98%除以100得百位
ad_data2=((ad_0809*200/255)%100)/10;
//读得的数据乘以2再乘以98%再分出十位
ad_data3=(((ad_0809*200/255)%100)%10);
//读得的数据乘以2再乘以98%再分出个位
for(a=0;
a<
10;
a++)
P0=tab[ad_data3];
//个位显示
P2=0x07;
//选通第一个数码管
delaynms(3);
P0=tab[ad_data2];
//十位显示
P2=0x0b;
//选通第二个数码管
P0=tab[ad_data1];
//百位显示
P0_7=0;
//点亮第三个数码管
P2=0x0d;
/选通第三个数码管
P0=tab[number];
//送通道号显示
P2=0x0e;
}}
voidad0809()
uchari,m=1;
8;
P0=td[i];
//选通通道
oe=0;
//以下三条指令为起动AD0809
st=0;
st=1;
delaynms
(1);
while(!
eoc);
//等待转换结束
oe=1;
//取出读得的数据
x[m]=P2;
//送相关通道数组
m++;
voidtongdao()
delaynms(100);
number++;
//通道号显示加一
if(number>
=8)number=0;
//八通道
}}}
voidset()
/************选择显示通道***************/
voidmode1(void)
{
ucharcount=1;
if(P3^4==0)
{
delaynms(20);
//延时去抖
count--;
if(count==0)
count=0;
}
if(P3^6==0)
count++;
if(count==9)
count=1;
number=count;
//改变通道
desplay();
//显示通道
/************设置最大值***************/
voidmode2(void)
cahrbit3=max/100;
cahrbit2=max%100/10;
cahrbit1=max%10;
//初始最大温度
charcount2=1;
if(P3^7==0)//位数设置
if(count==4)
switch(count)
case3:
if(P3^4==0)//设置最高位
count2--;
if(count2==-1)
count2=9;
count2++;
if(count2==10)
count2=0;
count2=bit3
case2:
if(P3^4==0)//设置2高位
if(coun2==-1)
coun2t=0;
count2=bit2
case1:
if(P3^4==0)//设置最低位
count2=bit2;
max=100*bit3+100*bit2+bit1;
}
/************设置最小值***************/
voidmode3(void)
charbit3=min/100;
charbit2=min%100/10;
charbit1=min%10;
//初始最小温度
min=100*bit3+100*bit2+bit1;
/**************中断选择模式*************/
voidmode(void)interrupt2
ucharL1=0,H1=0,L2=0,H2=0,mode=0;
ucharfirst_press_flag=0;
while((P3^4&
&
P3^6));
//等待第一次按键
{
L1=0;
first_press_flag=2;
elseif(P3^6==0)
H1=1;
//等待第二次按键
L2=0;
H2=1;
mode=first_press_flag*(L1+H1)+(L2+H2);
//计算模式
switch(mode)
case0:
mode1();
//模式一处理函数
break;
mode2();
//模式二处理函数
mode3();
//模式三处理函数
nop();
//退出
voiddeal()
if(min<
ad_0809&
max>
ad_0809)
P2.5=0;
else
P2.5=!
P2.4;
main()
number=0;
P1=0x00;
while
(1)
ad0809();
//调AD0809启动子程序
ad_0809=x[number];
//把相关通道数据给ad_0809
display();
deal();
六、附录
元件清单表:
名称
数量
At89S51
1块
2
ADC0809
1片
3
SUN7474
4
LED84S
1个
5
12M晶振
6
常用电阻
若干
7
常用电容
8
导线
9
按钮
5个
10
三极管
4个
11
蜂鸣器
参考文献:
电子技术基础数字部分(第五版)康华光
单片机原理与工程应用杨居义
现代控制技术于海生
七、