目录
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. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。
图1:实验电路图
2. 编写控制源程序,将其保存为keyscan_self.asm 或keyscan_self.c。
3. 将源程序添加到U1 中,并构造(build)该程序,将asm文件编译成hex文件,将可执行文件hex写入芯片
4. 执行仿真过程观察秒表程序功能是否正确。
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]);
}
}
}
初学单片机,可能存在错误之处,还请各位不吝赐教。
受于文本原因,本文相关实验工程无法展示出来,现已将资源上传,可自行下载。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/38888.html