多路监控报警系统单片机课程设计1 精品推荐.docx
《多路监控报警系统单片机课程设计1 精品推荐.docx》由会员分享,可在线阅读,更多相关《多路监控报警系统单片机课程设计1 精品推荐.docx(39页珍藏版)》请在冰豆网上搜索。
多路监控报警系统单片机课程设计1精品推荐
单片机课程设计
——多路监控报警系统
多路监控报警系统
一、实验目的
1.了解A/D芯片TLC0809转换性能及编程方法。
2.掌握A/D转换器与单片机的接口方法
3.学会使用A/D转换器进行电压信号采集。
二、设计任务及要求
利用串行模/数转换芯片TLC0809、SST89E58及液晶显示器,设计完成一个数字电压多路监控报警系统。
要求:
数字电压多路监控报警系统可测量0~5V输入电压,电压值通过液晶轮流显示,并根据设置的限定值对输入超出额度的路端警报提示。
三、工作原理及设计思路
多路监控报警系统的设计由A/D转换、数据处理及显示控制等组成。
A/D转换由集成电路TLC0809完成,利用TLC0809将模拟电压转换为数字量,经单片机将数字量转换成对应的电压值,并通过液晶显示输出。
四、系统特点
本系统可以每一路独立设置最高最低的电压值,并对每一路电压进行监控报警,对超出范围内的电路显示对应路值,并用LED灯和蜂鸣器表示不同的路值。
五、硬件电路设计及原理
1、ADC0809
(1)、ADC0809管脚图及时序图:
该ADC0809数据采集部分是单片CMOS器件,它具有8位模拟数字转换器,8通道多路复用器和微处理器兼容控制逻辑。
8位A/D转换器采用逐次逼近作为转换技术。
根据时序电路的分析,可以完成单片机编程。
该系统在工作时,单片机将产生串行时钟,并按时序发送和接受数据位。
由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
IN0-IN7:
8条模拟量输入通道ADC0809对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
数字量输出及控制线:
11条ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(+),VREF(-)为参考电压输入。
(2)、ADC0809应用说明ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连,初始化时,使ST和OE信号全为低电平,送要转换的哪一通道的地址到A,B,C端口上,在ST端给出一个至少有100ns宽的正脉冲信号,是否转换完毕,我们根据EOC信号来判断,当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
2、SST89E58RD
(1)、SST89E58RD管脚图:
3、1602液晶
引脚功能说明
第1脚:
VSS为电源地,接GND。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
BLA背光电源正极(+5V)输入引脚。
第16脚:
BLK背光电源负极,接GND。
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
指令1:
清显示,指令码01H,光标复位到地址00H位置指令2:
光标复位,光标返回到地址00H指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:
字符发生器RAM地址设置指令8:
DDRAM地址设置指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据指令11:
读数据。
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
五、软件设计
主程序设计:
1)A/D转换程序
每次5组电压值构成一个数组,数组中的值为AD进入值50次的平均值。
2)数据处理程序:
可以说是整个程序设计的最难点,数据处理显示的电压值计算公式:
V=(A*500)/255,(其中A为经0809转换后所得的数字量)这样使得计算出来的数值为整型,避免了浮点数计算复杂的缺点,在之后的显示中加入小数点即可。
子程序设计:
由于C语言的子程序功能比较强大,所以本程序调用相关子程序,减少了很多编程的繁琐,相关子程序功能如下所示:
函数功能:
400ms延时延时函数功能:
5ms延时函数功能:
1602A按指定位置显示一个字符
函数功能:
1602A初始化函数功能:
1602A读状态函数功能:
1602A写指令
函数功能:
1602A读数据函数功能:
1602A写数据作用:
AD0809通道选择采样值
流程图:
否
是
六、系统C程序
根据上述软/硬件的设计,编写好的源程序如下:
/******************************************************************
**ADC0809的多路电压监视器
**ADC0809+1602LCD+单片机
**作者:
于萱格
******************************************************************/
#include
#include
#include
#include
#include
#defineSYSTEM_OSC12000000//定义晶振频率12000000HZ
#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔
#defineucharunsignedchar
#defineuintunsignedint
#defineLCM_DataP2//数据接口
sbitST=P0^0;//file:
//片选端
sbitEOC=P0^1;//file:
//时钟端
sbitOE=P0^2;//file:
//数据输入输出复用
sbitA=P0^3;
sbitb=P0^5;
sbitC=P0^6;
sbitLCM_E=P3^5;//定义接口
sbitLCM_RW=P3^6;
sbitLCM_RS=P3^7;
sbitLED_GREEN=P3^1;//定义绿灯的口
sbitLED_RED=P3^0;//定义红灯的口
sbitBeepIO=P3^4;//定义输出管脚
sbitEX_0=P3^2;//外部中断INTO
sbitEX_1=P3^3;//外部中断INT1
sbitB_UP=P0^7;//定义外部按键1
sbitB_DOWN=P0^4;//定义外部按键2
voidLCM_WriteData(ucharWDLCM);
voidLCM_WriteCommand(ucharWCLCM,BuysC);
ucharLCM_ReadData(void);
ucharLCM_ReadStatus(void);
voidLCM_Init(void);
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);
voidDelay5Ms(void);
voidDelay400Ms(void);
voidinit(void);//AD0809初始化
voidAD(uintM);//选择通道来显示
voidDelay(uintm);//AD0809专用延时
charB_UP_CHECK(void);//向上按键去抖
charB_DOWN_CHECK(void);//向下按键去抖
voidInitialSound(void);
voidDelay1ms(unsignedintcount);
voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed);
ucharcodeuctech[10]={'0','1','2','3','4','5','6','7','8','9'};
unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表
unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7在频率表中的位置
unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};
unsignedcharSound_Temp_TH0,Sound_Temp_TL0;//音符定时器初值暂存
unsignedcharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存
//intfunc=0,func_ok=0,max_value=130,min_value=50;
intAD_DATA;
ucharcodenet[]={"Running"};//7
ucharcodenet1[]={"Set_Max_Value"};//13
ucharcodenet2[]={"Set_Min_Value"};//13
ucharcodenet3[]={"HelloWorld!
"};//7
ucharcodenet4[]={"Now_Value:
"};//9
ucharcodenet5[]={"WARNNING!
"};//9
ucharcodenet6[]={"CH"};//9
intfunc=0,func_ok=0;
uintmax_value[5]={200,200,200,200,200};
uintmin_value[5]={0,0,0,0,0};
//*****************************Music******************************************************
//挥着翅膀的女孩
unsignedcharcodeMusic_Girl[]={0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x03,
0x16,0x03,0x17,0x03,0x17,0x03,0x17,0x03,0x18,0x03,
0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x02,0x18,0x03,
0x17,0x03,0x15,0x02,0x18,0x03,0x17,0x03,0x18,0x02,
0x10,0x03,0x15,0x03,0x16,0x02,0x15,0x03,0x16,0x03,
0x17,0x02,0x17,0x03,0x18,0x03,0x19,0x02,0x1A,0x03,
0x1B,0x03,0x1F,0x03,0x1F,0x03,0x17,0x03,0x18,0x03,
0x19,0x02,0x16,0x03,0x17,0x03,0x18,0x03,0x17,0x03,
0x18,0x03,0x1F,0x03,0x1F,0x02,0x16,0x03,0x17,0x03,
0x18,0x03,0x17,0x03,0x18,0x03,0x20,0x03,0x20,0x02,
0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,
0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,
0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,
0x1A,0x03,0x19,0x03,0x15,0x03,0x15,0x03,0x17,0x03,
0x16,0x66,0x17,0x04,0x18,0x04,0x18,0x03,0x19,0x03,
0x1F,0x03,0x1B,0x03,0x1F,0x66,0x20,0x03,0x21,0x03,
0x20,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x66,0x1F,0x03,
0x1B,0x03,0x19,0x03,0x19,0x03,0x15,0x03,0x1A,0x66,
0x1A,0x03,0x19,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x00,0x1A,0x03,0x1A,0x03,0x1A,0x03,0x1B,0x03,
0x1B,0x03,0x1A,0x03,0x19,0x03,0x19,0x02,0x17,0x03,
0x15,0x17,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,
0x17,0x04,0x18,0x0E,0x18,0x03,0x17,0x04,0x18,0x0E,
0x18,0x66,0x17,0x03,0x18,0x03,0x17,0x03,0x18,0x03,
0x20,0x03,0x20,0x02,0x1F,0x03,0x1B,0x03,0x1F,0x66,
0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x66,0x1F,0x04,0x1B,0x0E,0x1B,0x03,0x19,0x03,
0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,
0x15,0x03,0x15,0x03,0x17,0x03,0x16,0x66,0x17,0x04,
0x18,0x04,0x18,0x03,0x19,0x03,0x1F,0x03,0x1B,0x03,
0x1F,0x66,0x20,0x03,0x21,0x03,0x20,0x03,0x1F,0x03,
0x1B,0x03,0x1F,0x66,0x1F,0x03,0x1B,0x03,0x19,0x03,
0x19,0x03,0x15,0x03,0x1A,0x66,0x1A,0x03,0x19,0x03,
0x19,0x03,0x1F,0x03,0x1B,0x03,0x1F,0x00,0x18,0x02,
0x18,0x03,0x1A,0x03,0x19,0x0D,0x15,0x03,0x15,0x02,
0x18,0x66,0x16,0x02,0x17,0x02,0x15,0x00,0x00,0x00};
//同一首歌
unsignedcharcodeMusic_Same[]={0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x66,0x18,0x03,
0x17,0x02,0x15,0x02,0x16,0x01,0x15,0x02,0x10,0x02,
0x15,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x02,
0x17,0x03,0x18,0x03,0x19,0x02,0x15,0x02,0x18,0x66,
0x17,0x03,0x19,0x02,0x16,0x03,0x17,0x03,0x16,0x00,
0x17,0x01,0x19,0x02,0x1B,0x02,0x1B,0x70,0x1A,0x03,
0x1A,0x01,0x19,0x02,0x19,0x03,0x1A,0x03,0x1B,0x02,
0x1A,0x0D,0x19,0x03,0x17,0x00,0x18,0x66,0x18,0x03,
0x19,0x02,0x1A,0x02,0x19,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x01,0x11,0x02,0x11,0x03,0x10,0x03,0x0F,0x0C,
0x10,0x02,0x15,0x00,0x1F,0x01,0x1A,0x01,0x18,0x66,
0x19,0x03,0x1A,0x01,0x1B,0x02,0x1B,0x03,0x1B,0x03,
0x1B,0x0C,0x1A,0x0D,0x19,0x03,0x17,0x00,0x1F,0x01,
0x1A,0x01,0x18,0x66,0x19,0x03,0x1A,0x01,0x10,0x02,
0x10,0x03,0x10,0x03,0x1A,0x0C,0x18,0x0D,0x17,0x03,
0x16,0x00,0x0F,0x01,0x15,0x02,0x16,0x02,0x17,0x70,
0x18,0x03,0x17,0x02,0x15,0x03,0x15,0x03,0x16,0x66,
0x16,0x03,0x16,0x02,0x16,0x03,0x15,0x03,0x10,0x02,
0x10,0x01,0x11,0x01,0x11,0x66,0x10,0x03,0x0F,0x0C,
0x1A,0x02,0x19,0x02,0x16,0x03,0x16,0x03,0x18,0x66,
0x18,0x03,0x18,0x02,0x17,0x03,0x16,0x03,0x19,0x00,
0x00,0x00};
//两只蝴蝶
unsignedcharcodeMusic_Two[]={0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,
0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,
0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,
0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x16,0x03,
0x17,0x01,0x16,0x03,0x17,0x03,0x16,0x03,0x15,0x01,
0x10,0x03,0x15,0x03,0x16,0x02,0x16,0x0D,0x17,0x03,
0x16,0x03,0x15,0x03,0x10,0x03,0x15,0x03,0x16,0x01,
0x17,0x03,0x16,0x03,0x17,0x01,0x16,0x03,0x17,0x03,
0x16,0x03,0x15,0x01,0x10,0x03,0x15,0x03,0x16,0x02,
0x16,0x0D,0x17,0x03,0x16,0x03,0x15,0x03,0x10,0x03,
0x10,0x0E,0x15,0x04,0x0F,0x01,0x17,0x03,0x19,0x03,
0x19,0x01,0x19,0x03,0x1A,0x03,