毕业设计-无人监守点滴自动监控系统的设计 下载本文

//下列语句从串行口向74LS164移位输出8个0 T1=0; SBUF=mask;

while (TI==0); //等待发送完毕

//下列语句通过检测P3. 4和P3. 5是否为0来判断是否有键按下,若有则延时l0ms消除按键抖动。然后再次检测P3. 4和P3. 5是否为0,若不为0则表明有干扰信号并继续等待按键,否则表示有键被按下并退出循环

while (1){

while((P3.4&P3.5)!=0); delay();

if((P3.4&P3.5)!=0) continue; else break;

} //下面语句分析被按下键所在的列号 mask=0xfe; while(1){ TI=0; SBUF=mask; while (TI==0); if ((P3.4&P3.5)!=0) {

mask= _crol_(mask, 1); //将mask的值循环左移一位 column++;

if (column>=8) column=0; continue; { else break:

//下面语句分析被按下键所在行号并计算键序号 if(P34==0) key _ code=column; else key _ code=8+column;

return(key _ code);

}

void delay (void) {

unsigned int i=10; //延时10ms while(i--); }

16

4.2.3 点滴速度监测模块

N 开 始 参数初始化 调用key_scan扫描函数 是否为功能键? Y 进入中断 N 调用key_scan扫描函数 调用防抖子程序 结束? Y 退出中断 图15键盘扫描流程图

点滴速度的测量是通过记录单位时间内点滴的下滴个数,再计算单个点滴的速度。计算原理是:每出现一个点滴下滴就进行一次中断,在单位时间内出现的中断数即为点滴下滴个数,如图16所示。

中断计数

中断计数

图16速度计算原理

系统用的定时器T0定时时间为200us。当系统检测到第一个脉冲信号时,程序立即进行中断处理,读出此时计数器存储的内容,然后清零,记脉冲信号的初始值为COUNT=0。当定时器定时到达200us时,程序中断检测输入信号是否有脉冲信号到来,把计数器加1为COUNT=1。由计数器COUNT=1检测到的脉冲信号个数而设定计数器COUNT=1的存储单元是10,通过循环存储脉冲个数。在定时器COUNT =1中取5个相临的脉冲信号点,设起始脉冲点对应的计数器

17

COUNT值是n1,最后一个脉冲点对应的值是n2。从而计算出5个脉冲点所需时间为:t = (n2-n1) ×200us,那么两相临脉冲信号时间间隔的平均值为T=t/5。由此可得到点滴速度:V=60s/T,即V=1500/(n2-n1) [5]。根据上面的理论分析和计算,得到点滴速度测量流程图,如图17所示。

定时200us 设臵计算器COUNT=0 设臵计算器COUNT1=0 N 定时结束? Y COUNT加1 退出中断 开始 检测到脉冲信号? Y COUNT加1 N 图17点滴速度测量流程图

点滴速度检测程序如下: #include #include #define ulong unsigned long

unsigned int T0_ ISR_ count=0; //定义T0中断次数 void T0_ISR (void) interrupt 1 {

TO_ISR_count++; //每次T0中断时,中断次数加1 TF0=0; }

void main (void) {

SCON=0x50; //串行口初始化

TMOD |=0x20; //利用定时器Tl作为波特率发生器 THl=0xFA; //晶振为11. 0592MHz时波特率为9600

18

TRl = 1; TI = 1; PCON |=0x80;

printf (“\\nPulse Width Example Program\\n\\n”); //输出标题信息 ET0=1;

EA=l; //开中断

TMOD=(TMOD&0xF0) | 0x09; //设臵T0为16位定时器方式 while (1) {

T0_ ISR_ count=0; TH0=0; TL0=0; TR0=1;

printf (\ //输出提示信息

while (! INTO); //等待脉冲上升沿,开始测量 while (INTO); //等待脉冲下降沿,停止测量 //以每个T0计数值为200 u s计算脉冲宽度并输出 printf (\

(ulong)((TH0<<8) | TL0 | ((ulong)T0_ISR_count <<16))); } }

4.2.4 电机控制模块

本系统采用了工业上较为流行的PID控制算法,实现了步进电机的精确控制,其算法公式为:

ΔP=Pout(k)-Pout(k-1)=Kp×[e(k)-e(k-1)]+Ki×e(k)+Kd×[e(k)-2e(k-1)+e(k-1)] ,Kp=5,Ki =5,Kd=2

步进电机的正、反转靠正向、反向驱动两个函数来实现,当函数中变量direction=1时,步进电机正转;direction=0时,步进电机反转。步进电机正、反驱动程序如下:

void moto_one_step(byte direction, word pulse) {

if(direction) {

if(moto_state==moto_state _a) moto_ state=moto_state_da; else moto_state--; } else

19