程序目前已经可以运行,可以实时根据输入脉冲频率的不同改变动作 但是试过不同频率信号,根据调改if语句中num的范围值发现动作误差总在50左右(程序中有具体说明) 程序如下 void main(void) { int num; //计数器TC0脉冲数 int count; //定时器TC1溢出次数 P2=0x08; TMOD=0x15; //设置TC0,TC1工作方式 TR0=1; TR1=1; for(;;) { num=0; count=0; for(;;) { TH1=(65536-18432)/256; TL1=(65536-18432)%256; //定时器TC1溢出时间,20ms(晶振频率为11.0592M) while(!TF1) { TH0=0xff; TL0=0xff; do{} while(!TF0); num++; //每次T0脚有脉冲到,num自加 TF0=0; } count++; //定时器TC1溢出次数自加 TF1=0; if(count>=50) break; //若TC1溢出次数达50(表示定时器完成1s的计时),跳出 } if(num>=100&&num<=300) P2=0x01; if(num>300&&num<=500) P2=0x08; if(num>500&&num<=1000) P2=0x81; if(num>1000) P2=0x89; //判断脉冲数量,作出不同动作(这里用led灯代替动作发生) } }
我们以 if(num>500&&num<=1000)P2=0x81;if(num>1000)P2=0x89;这两个语句来判断误差次数,发现改变信号频率到1kHz会有误动作,执行的效果为P2=0x89;。如若将两句改为if(num>500&&num<=1050)P2=0x81;if(num>1050)P2=0x89;,则输入信号频率为1k时,动作才能按照预想的发生
|