监测控制系统的设计与实现.docx
《监测控制系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《监测控制系统的设计与实现.docx(14页珍藏版)》请在冰豆网上搜索。
监测控制系统的设计与实现
实验课程名称:
监测控制系统应用实验七
实验项目名称:
监测控制系统的设计与实现实验成绩:
实验者:
专业班级:
电信130班
同组者:
实验日期:
周四3~4节
一.实验目的
1.通过本次实验形成系统设计的概念
2.掌握单片机应用系统的设计方法和流程
3.学会合理分配资源
4.提高综合运用知识的能力
二.实验要求
1.综合前面的实验,实现一监测控制系统,监测一模拟量(0-5V的交流电)输入并显示。
2.当该模拟量在正常的1-3V范围内时,系统执行正常的顺序控制,这时8个LED灯依次亮2s并循环(代表正常的工序)。
3.当模拟量超出1-3V范围时,则8个LED灯间隔一个灯依次亮2s并循环(代表特殊的工序)。
4.用一个按键模拟故障,当该按键按一下时,发出报警声,LED全灭(代表工作暂停),当该按键再按一下时,表示故障解除,停报警声,恢复正常工作。
3.探究内容
1.当系统有较多外设时,如何为外设分配I/O口,是否要扩展I/O口?
2.当系统有较多任务时,分析任务的实时性和所占资源,考虑那些任务放主程序执行,哪些放中断执行?
(中断资源、定时器资源的合理分配)
3.本任务中的定时2s任务是由定时器定时实现还是通过软件延时实现好?
(定时器资源、实时性综合考虑,只要满足要求即可,没有固定的安排模式)
四.流程图
系统流程图定时中断流程图
外部中断流程图
五.实验连线图
PCF芯片的CLK接P1.0;CS接P1.1;D1接P1.2;D0接P1.3;
蜂鸣器接在P3.6接一个开关在P3.2(外部中断),P1.5接整数位显示数码管的位选,P1.6接第一位显示数码管的位选,P1.7接第二位数码管的位选。
查看LED灯状态时,LED灯接P2口;
查看数码管状态时,数码管段选接在P0口。
六.实验结果及分析
1.实验结果
2.结果分析:
有实验知,输入电压在1~3V之间时,LED依次滚动显示,相邻显示间隔2s,电压小于1V或者大于3V时,LED灯隔一个显示,每次显示2s。
有外部中断触发时,蜂鸣器响,LED灯全灭,外部中断再次触发时,根据外部输入电压值正常显示。
七.附录
实验程序
/*******************************初始化*******************************/
#ifndef__XPT2046_H_
#define__XPT2046_H_
//---包含头文件---//
#include
#include
//---重定义关键词---//
#ifndefuchar
#defineucharunsignedchar
#endif
#ifndefuint
#defineuintunsignedint
#endif
#ifndefulong
#defineulongunsignedlong
#endif
//---定义使用的IO口---//
sbitCLK=P1^0;//时钟
sbitCS=P1^1;//片选
sbitDIN=P1^2;//输入
sbitDOUT=P1^3;//输出
uintRead_AD_Data(ucharcmd);
uintSPI_Read(void);
voidSPI_Write(uchardat);
#endif
/*******************总线初始化及AD/DA转换函数初始化********************/
#include"XPT2046.h"
/****************************************************************************
*函数名:
TSPI_Start
*输入:
无
*输出:
无
*功能:
初始化触摸SPI
****************************************************************************/
voidSPI_Start(void)
{
CLK=0;
CS=1;
DIN=1;
CLK=1;
CS=0;
}
/****************************************************************************
*函数名:
SPI_Write
*输入:
dat:
写入数据
*输出:
无
*功能:
使用SPI写入数据
****************************************************************************/
voidSPI_Write(uchardat)
{
uchari;
CLK=0;
for(i=0;i<8;i++)
{
DIN=dat>>7;//放置最高位
dat<<=1;
CLK=0;//上升沿放置数据
CLK=1;
}
}
/****************************************************************************
*函数名:
SPI_Read
*输入:
无
*输出:
dat:
读取到的数据
*功能:
使用SPI读取数据
***************************************************************************/
uintSPI_Read(void)
{
uinti,dat=0;
CLK=0;
for(i=0;i<12;i++)//接收12位数据
{
dat<<=1;
CLK=1;
CLK=0;
dat|=DOUT;
}
returndat;
}
/****************************************************************************
*函数名:
Read_AD_Data
*输入:
cmd:
读取的X或者Y
*输出:
endValue:
最终信号处理后返回的值
*功能:
读取触摸数据
***************************************************************************/
uintRead_AD_Data(ucharcmd)
{
uchari;
uintAD_Value;
CLK=0;
CS=0;
SPI_Write(cmd);
for(i=6;i>0;i--);//延时等待转换结果
CLK=1;//发送一个时钟周期,清除BUSY
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS=1;
returnAD_Value;
}
/************************AD转换函数初始化结束*********************/
#include"reg51.h"
#include"XPT2046.h"
//--定义使用的IO--//
voiddelay(unsignedinti)
{
charj;
for(i;i>0;i--)
for(j=100;j>0;j--);
}
sbitbeep=P3^6;
sbitint0=P3^2;
sbitbb=P3^0;
sbitS1=P1^4;
sbitS2=P1^5;
sbitS3=P1^6;
sbitS4=P1^7;
intlzc;
uinttemp,count;
unsignedcharcontrol=0;
unsignedchart=0;
unsignedcharflag=0;
unsignedcharDisplayData[8];//用来存放要显示的8位数的值
bitflag_error=0;
unsignedchartable[16]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//此表为LED的字模,共阴数码管0-9-
unsignedcharcodetable2[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
voidDigDisplay(void);
voidm_error()interrupt0{
EX0=0;
delay(5);
if(int0==0){
flag_error=~flag_error;
bb=flag_error;
while(int0==0);
EX0=1;
}
EX0=1;
}
voidtime_2s()interrupt1using3{
ET0=0;
TH0=0x3c,TL0=0xb0;
t++;
if(t==40){
t=0;
control++;
if(control==8)
control=0;
}
ET0=1;
}
voidshunxu(){
flag=1;
if(control==0)
P2=0x01;
if(control==1)
P2=0x02;
if(control==2)
P2=0x04;
if(control==3)
P2=0x08;
if(control==4)
P2=0x10;
if(control==5)
P2=0x20;
if(control==6)
P2=0x40;
if(control==7)
P2=0x80;
}
voidteshu(){
flag=2;
if(control==0||control==4)
P2=0x01;
if(control==1||control==5)
P2=0x04;
if(control==2||control==6)
P2=0x10;
if(control==3||control==7)
P2=0x40;
}
voiddelay1(unsignedcharm)//指定控制频率
{
unsignedi=3*m;
while(--i);
}
voiddisplay(){
inti,j;
for(i=0;i<4;i++)
{
DisplayData[0]=table2[temp%10000/1000];
DisplayData[1]=table2[temp%1000/100];
DisplayData[2]=table2[temp%100/10];
DisplayData[3]=0;
switch(i)
{
case0:
S1=0;S2=1;S3=1;S4=1;
case1:
S1=1;S2=0;S3=1;S4=1;
case2:
S1=1;S2=1;S3=0;S4=1;
case3:
S1=1;S2=1;S3=1;S4=0;
}
P0=DisplayData[i];
j=100;
while(j--);//扫描间隔时间
}
P0=0;
}
voidalarm_beep(){
inti;
for(i=0;i<=5;i++){
beep=~beep;
delay1(0x10);
}
}
voidmain(void)
{
P2=0xff;
TMOD=0x01;
TH0=0x3c,TL0=0xb0;
EA=1,ET0=1;
EX0=1;
TR0=1;
while
(1)
{
if(count==50)
{
count=0;
temp=Read_AD_Data(0x94)*1.22;//AIN0电位器
}
count++;
DisplayData[0]=table2[temp%10000/1000];
DisplayData[1]=table2[temp%1000/100];
DisplayData[2]=table2[temp%100/10];
DisplayData[3]=table2[temp%10/1];
if(flag_error==0){
if(lzc>=1&&lzc<3){
if(flag!
=1)control=0;
shunxu();
}
else{
if(flag!
=2)control=0;
teshu();
}
}
else{
P2=0x00;
alarm_beep();
}
display();
}
}