微机型实时检测报警系统的模拟设计.docx
《微机型实时检测报警系统的模拟设计.docx》由会员分享,可在线阅读,更多相关《微机型实时检测报警系统的模拟设计.docx(22页珍藏版)》请在冰豆网上搜索。
![微机型实时检测报警系统的模拟设计.docx](https://file1.bdocx.com/fileroot1/2023-1/28/05010850-d530-48d5-8b34-55e48c7f02be/05010850-d530-48d5-8b34-55e48c7f02be1.gif)
微机型实时检测报警系统的模拟设计
微机型实时检测报警系统的模拟设计
1.设计目的
a.了解实时控制系统的构成。
b.初步掌握较复杂实时控制系统的设计。
2.可选元器件和实验设备
a.CPU选用51系列单片机。
b.51系列单片机综合实验开发平台。
c.用于模拟8路温度模拟输入量的电位器8只。
d.按键若干,八段数码管LED显示器若干。
e.报警用蜂鸣器1只。
f.常用集成电路芯片。
3.模拟系统控制要求
a.要求以一定周期巡回检测8路输入模拟量。
b.对各路参数的测量值实时轮回显示。
c.对温度进行越限检测,温度检测范围为0~200℃,精度±1℃,各路正常温度区间值由操作员设定。
d.一旦温度越限,立即驱动蜂鸣器报警,并持续显示当前温度检测值(若有多路越限,则轮回显示)。
4.设计要求
a.初步掌握计算机控制系统的分析和设计的基本方法。
b.选择单片机机型和外围电路及器件,完成系统电气原理图的绘制。
c.完成主要程序框图的绘制,编写温度检测及报警驱动控制程序。
d.完成一份不少于5000字的设计说明书。
微机型实时检测报警系统的模拟设计
一、摘要
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益的更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合的,以作完善。
本系统是以单片机的基本语言“C语言”来进行软件设计编程的,其指令的执行速度快,节省存储空间。
为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。
使硬件在软件的控制下协调运作。
本文主要介绍了单片机AT89S51、ADC0809、按键、LED显示电路、报警电路;在描述了外围硬件电路的同时,还做了大量的软件工作。
关键词:
单片机、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
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
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
#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;//选通第二个数码管
delaynms(3);
P0=tab[ad_data1];//百位显示
P0_7=0;//点亮第三个数码管
P2=0x0d;/选通第三个数码管
delaynms(3);
P0=tab[number];//送通道号显示
P2=0x0e;
delaynms(3);
}}
voidad0809()
{
uchari,m=1;
for(i=0;i<8;i++)
{
P0=td[i];//选通通道
oe=0;//以下三条指令为起动AD0809
st=0;
st=1;
st=0;
delaynms
(1);
while(!
eoc);//等待转换结束
oe=1;//取出读得的数据
x[m]=P2;//送相关通道数组
oe=0;
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)
{
delaynms(20);//延时去抖
count++;
if(count==9)
count=1;
}
number=count;//改变通道
desplay();//显示通道
}
/************设置最大值***************/
voidmode2(void)
{
cahrbit3=max/100;
cahrbit2=max%100/10;
cahrbit1=max%10;//初始最大温度
ucharcount=1;
charcount2=1;
if(P3^7==0)//位数设置
{
delaynms(20);//延时去抖
count++;
if(count==4)
count=1;
}
switch(count)
{
case3:
if(P3^4==0)//设置最高位
{
delaynms(20);//延时去抖
count2--;
if(count2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
count2=0;
}
count2=bit3
count2=0;
case2:
if(P3^4==0)//设置2高位
{
delaynms(20);//延时去抖
count2--;
if(coun2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
coun2t=0;
}
count2=bit2
count2=0;
case1:
if(P3^4==0)//设置最低位
{
delaynms(20);//延时去抖
count2--;
if(count2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
count2=0;
}
count2=bit2;
count2=0;
max=100*bit3+100*bit2+bit1;
}
}
/************设置最小值***************/
voidmode3(void)
{
charbit3=min/100;
charbit2=min%100/10;
charbit1=min%10;//初始最小温度
ucharcount=1;
charcount2=1;
if(P3^7==0)//位数设置
{
delaynms(20);//延时去抖
count++;
if(count==4)
count=1;
}
switch(count)
{
case3:
if(P3^4==0)//设置最高位
{
delaynms(20);//延时去抖
count2--;
if(count2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
count2=0;
}
count2=bit3
count2=0;
case2:
if(P3^4==0)//设置2高位
{
delaynms(20);//延时去抖
count2--;
if(coun2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
coun2t=0;
}
count2=bit2
count2=0;
case1:
if(P3^4==0)//设置最低位
{
delaynms(20);//延时去抖
count2--;
if(count2==-1)
count2=9;
}
if(P3^6==0)
{
delaynms(20);//延时去抖
count2++;
if(count2==10)
count2=0;
}
count2=bit2;
count2=0;
}
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));//等待第一次按键
if(P3^4==0)
{
delaynms(20);//延时去抖
if(P3^4==0)
{
L1=0;
first_press_flag=2;
}
}
elseif(P3^6==0)
{
delaynms(20);//延时去抖
if(P3^6==0)
{
H1=1;
first_press_flag=2;
}
}
while((P3^4&&P3^6));//等待第二次按键
if(P3^4==0)
{
delaynms(20);//延时去抖
if(P3^4==0)
{
L2=0;
}
}
elseif(P3^6==0)
{
delaynms(20);//延时去抖
if(P3^6==0)
{
H2=1;
}
}
mode=first_press_flag*(L1+H1)+(L2+H2);//计算模式
switch(mode)
{
case0:
mode1();//模式一处理函数
break;
case1:
mode2();//模式二处理函数
break;
case2:
mode3();//模式三处理函数
break;
case3:
nop();//退出
break;
}
}
}
voiddeal()
{
if(minad_0809)
P2.5=0;
else
P2.5=!
P2.4;
}
main()
{
number=0;
P1=0x00;
while
(1)
{
voidset();
ad0809();//调AD0809启动子程序
voidtongdao();//通道号
ad_0809=x[number];//把相关通道数据给ad_0809
display();
deal();
}}
六、附录
元件清单表:
名称
数量
1
At89S51
1块
2
ADC0809
1片
3
SUN7474
1片
4
LED84S
1个
5
12M晶振
1个
6
常用电阻
若干
7
常用电容
若干
8
导线
若干
9
按钮
5个
10
三极管
4个
11
蜂鸣器
1个
参考文献:
电子技术基础数字部分(第五版)康华光
单片机原理与工程应用杨居义
现代控制技术于海生
七、心得体会
通过本次设计,我们在课程上所学的计算机控制技术理论知识很好的运用到实际工程当中,在具体的设计中,真正做到了学以致用,并使自己的实际工程能力得到了很大的提高。
在设计中,我基本掌握计算机控制系统的分析和设计的基本方法,同时在制图方面,我们熟悉了CAD制图专用软件,加强了WORD等常用软件的掌握。