目录
1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。
2. 编写控制源程序,将其保存为keyscan_self.asm 或keyscan_self.c。
3. 将源程序添加到U1 中,并构造(build)该程序,将asm文件编译成hex文件,将可执行文件hex写入芯片
3.4矩阵键盘扫描实验
1、画出实验的流程图
2、编写源程序并进行注释
3、记录实验过程
4、记录程序运行结果截图

图1:实验电路图
1)可见实验开始时,顺时针旋转,且速度为最慢,如图2所示:

图2:顺时针旋转
2)当按下逆时针按钮,灯泡逆时针亮起,如图3:

图3:逆时针旋转
3)按下加速按钮,观察到灯泡亮灭的速度加快,如图4:

图4:转速加快
4)按下减速按钮,灯泡明灭的速度变慢,如图5:

图5:转速减慢
实验流程图6如下所示:

图6:旋转彩灯线反转法C 语言程序控制流程图
- #include <reg51.h> //预处理伪指令
- #include <stdio.h>
- #include <intrins.h>
-
- typedef unsigned int uint; //使用typedef函数定义数据类型
- typedef unsigned char uchar; //简化无符号整形和无符号字符型的标号
-
- uint Speed_light[]={0xef,0xf7,0xfb,0xfd,0xfe}; //定义速度的档位
- uint Delay_time[]={1000,800,600,400,200}; // 定义延时数组
-
- uint out=0xfe; // 定义out输出,初始为 P1输出,D1亮
- uchar dir=0; // dir指示旋转的顺时针与逆时针,定义起始状态为顺时针
- uchar speed=1; // 定义旋转速度,开始为一档
- uchar key=8; // 定义key,用于键盘键值
-
- void delay(uint t) //程序,传递参数t,延时tms
- {
- uint x,y;
- for(x = t;x > 0;x--) //外层循环
- for(y = 110;y > 0;y--); // 内层循环
- }
-
- void key_scan() // 定义键盘扫描子程序
- { uint temp; // 定义变量temp
- P3 = 0Xf0; //行扫描
- if(P3!=0xf0) //判断若P3值改变,说明有按键按下
- {
- delay(10); //调用延时子程序去抖动
- if(P3!=0xf0) //若不为0XF0,说明的确有按键按下
- {
- temp=P3;
- if(temp==0xe0)// 判断若P3的值为0xe0,说明按下的是KEY0或KEY2
- {key=0;} //令key为0
- else if(temp==0xd0) //否则若P3的值为0XD0,说明按下的是KEY1或KEY3
- {key=1;}; //令key为1
- }
- }
- P3=0x0f; //列扫描
- if(P3!=0x0f) //判断P3值改变
- {
- delay(10); // 调用延时子程序去抖动
- if(P3!=0x0f) // 判断若不为0X0F
- {
- temp=P3; //令tmp等于P3
- if(temp==0x0e) // 若为0x0e
- {key=key;}
- else if(temp==0x0d) // 若为0x0d
- {key=key+2;}; //则成为key2或key3
- }
- }
- }
-
- void main() // main函数
- {
- while(1) //始终循环
- {
- key_scan(); //调用子程序键盘扫描
- if(key==0) //若按下的是key0
- {dir=0; //则为顺时针
- key=8;} // 给key赋值
- else if(key==1) // 但若按下的是key1
- {dir=1; // 则为逆时针
- key=8;} // 给key赋值
- else if(key==2&&speed<5) // 若按下的是key2且未达到最高速5
- {speed++; //则使其加速
- key=8;} //key赋值
- else if(key==2&&speed==5) //若按下的是key2且已经是最高速5
- {speed=5; //保持原速
- key=8;}
- else if (key==3&&speed>1) // 若按下的是key3且不是最低速1
- {speed--; // 则使其减速
- key=8;}
- else if(key==3&&speed==1) // 若按下的是key3但是最低速1
- {speed=1; //保持原速
- key=8;};
-
- if(dir==0) // 若为顺时针
- {
- out=_crol_(out,1); //P1左移一位,循环点亮
- P1=out; // 输出
- P0=Speed_light[speed-1]; //控制点亮速度挡位指示灯
- delay(Delay_time[speed-1]); // 调用延时程序
- }
- else if(dir==1) // 若是逆时针
- {
- out=_cror_(out,1); //右移一位,循环点亮
- P1=out;
- P0=Speed_light[speed-1]; // 控制速度挡位的指示灯
- delay(Delay_time[speed-1]);
- }
- }
- }
初学单片机,可能存在错误之处,还请各位不吝赐教。
受于文本原因,本文相关实验工程无法展示出来,现已将资源上传,可自行下载。