}
}
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)); }