计算机控制 下载本文

}

}

if(P1_2==0) {

delay(100); if(P1_2==0) {

P1_5=0; \\\\输出低电平 } }

}

void delay(uchar c) \\\\延时子程序 {

while(c--) }

void mian(void) {

EA=1; EX0=1; IT0=1; while(1); }

4.4 电路如图4.2所示,要求通过2×5的键盘,实现在数码管上显示与按下键盘对应的数字。

+5V+5VP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.71357924680驱动器89C51图4.2 题4.2图

答:

#include

#define uchar unsigned char #define uint unsigned int

uchar code DSY_CODE[]= {0x3f, 0x06, 0x5b, 0x4F, 0x66, 0x6d, 0x7d, 0x07,

0x7f, 0x6f}; //段码,0-9

uchar Pre_KeyNo=10, KeyNo=10; //上次和当前按键的序号

void delayMS(uint x) //延时 {

uchar i; while(x--)

for(i=0;i<120;i++); }

void Keys_Scan() //键盘扫描子程序 {

uchar Tmp;

P1=0x1f; //列输出0,读行 delayMS(1);

Tmp=(P1^0x1f)&0x7f; //异或,屏蔽P1.7

switch(Tmp) //判断按键发生于0~4行的哪一行 {

case 1: KeyNo=1;break; //第一行 case 2: KeyNo=3;break; //第二行 case 4: KeyNo=5;break; //第三行 case 8: KeyNo=7;break; //第四行 case 16: KeyNo=9;break; //第五行 default:KeyNo=10; //无键按下 }

P1=0xe0; //低5位置0,高三位置1,行输出0,读列 delayMS(1);

Tmp=(P1^0xe0)&0x7f>>5; \\\\ switch(Tmp) {

case 1: KeyNo+=0;break; \\\\得到最终按键号 case 2: KeyNo+=1; if (keyNo==0x0a) {keyNo=0;} } }

void main() {

P0=0x00; while(1) {

P1=0xe0;

if(P1!=0xe0) //判断有键按下 {

Keys_Scan();

} //获取键序号 if(Pre_KeyNo!=KeyNo) {

P0=DSY_CODE[KeyNo]; Pre_KeyNo=KeyNo; }

delayMS(100); } }

第五章作业

5.1 顺序查表、计算查表及对分查表各有什么特点?分别使用在什么场合? 答: 特点 适用场合 顺序查表 按照顺序从第一项开始逐项寻针对无序表格,表格小 找, 直至找到所要查找的关键字为止,表格要求不严 计算查表 表格要求各元素在表中排列的针对有序表格,表格小,适格式及所占用的空间必须一用于某些数值计算程序 致, 而且各元素是严格按顺序排列的。表格要求严 对分法查表 速度快,针对长表格尤为明显 针对长表格 5.2常用的数字滤波器有哪些?它们各有什么优缺点? 答: 优点 缺点 限幅滤波 能有效克服偶然性的脉限幅造成平滑度差,对冲干扰 周期性干扰效果很差 限速滤波 既照顾了采样的实时不够灵活,不能反映采性,又顾及了采样值变样点数大于3时各采样化的连续性 数值受干扰情况 中值滤波 能有效克服偶然性脉冲但是对流量速度等快速波动 变化的参数不适用 算术平均值滤波 加权平均值滤波 滑动平均值滤波 平滑度较高 对脉冲信号的干扰效果较差,实时性不太理想 可以根据需要选择信号 实时性不太理想 对周期干扰有良好的抑灵敏度低,对偶然脉冲制作用,平滑度高,适干扰抑制性差。 用于高频振荡系统

5.3为什么计算机控制系统采用软件滤波?

答:无需增加任何硬件设备,系统可靠性高, 不存在阻抗匹配问题,可多通道共享, 从而降低了成本;可以对频率很低(如001Hz) 的信号进行滤波;使用灵活、 方便, 可根据需要选择不同的滤波方法或改变滤波器的参数。

5.4 编写防脉冲干扰平均值滤波C程序。 答:程序如下 char filter() {

char count, temp, i, j, k; char value_buf[N]; int sum=0;

for (count=0;count

value_buf[count] = get_ad(); delay(); }

for (j=0;j

for (i=0;i

if ( value_buf[i]>value_buf[i+1] ) {

temp = value_buf[i];

value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp; } } }

for(count=1;count

sum += value_buf[count];

return (char) (sum/(N-2)); }