独立按键识别 单片机原理 实验报告.docx
《独立按键识别 单片机原理 实验报告.docx》由会员分享,可在线阅读,更多相关《独立按键识别 单片机原理 实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
独立按键识别单片机原理实验报告
宁德师范学院计算机系
实验报告
(2014—2015学年第2学期)
课程名称单片机原理
实验名称独立按键识别
专业计算机科学与技术(软工)
年级2012级
学号B2012103145姓名冯武
指导教师杨烈君
实验日期2015.5.27
实验目的与要求:
目的:
1.掌握查询式按键的原理和编程方法
2.理解按键防抖技术
要求:
1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2.在电路中增加按键、Led灯、八位7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连,P3引脚输出位选控制信号。
3.实现单按键控制Led灯闪烁
4.实现单按键多功能识别——控制4路Led灯闪烁
5.实现0-99的计数器效果,按一下数值加一
6.实现0-99码表(按一次开始计时,第二次停止,第三次清零)
7.扩展要求:
通过3个按键实现时钟的调整(KEY1模式,KEY2+,KEY3-)
实验设备(环境):
1.计算机
2.ProteusISIS7Professional应用程序
3.Keil应用程序
实验内容:
按键识别要求实现:
1.实现单按键控制Led灯闪烁
2.实现单按键多功能识别——控制4路Led灯闪烁
3.实现0-99的计数器效果,按一下数值加一
4.实现0-99码表(按一次开始计时,第二次停止,第三次清零)
5.扩展要求:
通过3个按键实现时钟的调整(KEY1模式,KEY2+,KEY3-)
参考原理图
实验步骤、实验结果及分析:
1实验步骤:
1、使用ProteusISIS7Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:
AT89C51、CAP、CAP-ELEC、CRYSTAL、RESPACK-8。
3、构建仿真电路
图1按键识别1、2
图2按键识别3
图3按键识别4
图3按一下暂停
图4归零
图5时钟调整
电路图
4、创建一个Keil应用程序:
新建一个工程项目文件;为工程选择目标器件(AT89C52);为工程项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。
5、把用户程序经过编译后生成的HEX文件添加到仿真电路中的处理器中(编辑元件→文件路径)
2实验程序<流程图>
(1)按键识别(按下LED灯亮,再按灭)
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitled=P2^6;
sbitkey=P2^7;
voiddelay(uintx)
{
while(x--);
}
voidmain()
{
while
(1)
{
if(key==0)
{
delay(1000);
if(key==0)
{
led=~led;
while(key==0);
}
}
}
}
(2)按键识别(按下灭,再按闪)
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitled=P2^6;
sbitkey=P2^7;
voiddelay(uintx)
{
while(x--);
}
voidmain()
{
uinti,j;
while
(1)
{led=1;
if(key==0)
{
delay(1000);
if(key==0)
{
i++;
j=i%2;
while(key==0);
}
}
switch(j)
{
case0:
led=0;break;
case1:
led=~led;delay(100);break;
default:
break;
}
}
}
(3)按键识别(按下数码管数值加1)
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeLedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
ucharDispBuf[8];
sbitled=P2^6;
sbitkey=P2^7;
voiddelay(uintx)
{
while(x--);
}
voiddisnum(uintn)
{
uinti;
for(i=0;i<=7;i++)
{
DispBuf[7-i]=n%10;
if(n==0&&i)
DispBuf[7-i]=10;
n=n/10;
}
}
voidmain()
{
uinti,j;
while
(1)
{led=1;
if(key==0)
{
delay(1000);
if(key==0)
{
i++;
while(key==0);
}
}
disnum(i);
for(j=0;j<8;j++)
{
P1=1<P3=~LedCode[DispBuf[j]];
delay(100);
}
}
}
(4)一键多功能识别(按下L1闪,再按L2闪,L3,L4依次闪烁)
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitled1=P2^0;
sbitled2=P2^1;
sbitled3=P2^2;
sbitled4=P2^3;
sbitkey=P2^7;
voiddelay(uintx)
{
while(x--);
}
voidmain()
{
uinti;
led1=0;
led2=0;
led3=0;
led4=0;
while
(1)
{
if(key==0)
{
delay(1000);
if(key==0)
{
i++;
while(key==0);
i=i%4;
}
}
switch(i)
{
case0:
led1=~led1;delay(100);led4=0;break;
case1:
led2=~led2;delay(100);led1=0;break;
case2:
led3=~led3;delay(100);led2=0;break;
case3:
led4=~led4;delay(100);led3=0;break;
default:
break;
}
}
}
(5)一键多功能识别(秒表,按第1下开始,按第2下停,按第3下清零)
#include"reg51.h"
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeLedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
ucharDispBuf[8];
uinthour=0,min=0,sec=0;
sbitkey=P2^7;
voiddelay(uintx)//延迟函数
{
while(x--);
}
voidPntNum(void)//时间的拆分
{
DispBuf[7]=sec%10;//获取秒钟的个位数
DispBuf[6]=sec/10;//获取秒钟的十位数
DispBuf[5]=10;
DispBuf[4]=min%10;
DispBuf[3]=min/10;
DispBuf[2]=10;
DispBuf[1]=hour%10;
DispBuf[0]=hour/10;
}
voidplay(void)
{
uchari;
for(i=0;i<8;i++)
{
P1=1<
P3=~LedCode[DispBuf[i]];
delay(100);
}
}
voidtime()
{
uintn;
n++;
if(n>=0)
{
sec++;n=0;
}
if(sec>=60)
{
min++;sec=0;
}
if(min>=60)
{
hour++;min=0;
}
if(hour>=24)
{
hour=0;
}
}
voidmain()
{
uinti=2;
while
(1)
{
if(key==0)
{
delay(1000);
if(key==0)
{
i++;
while(key==0);
i=i%3;
}
}
switch(i)
{
case0:
PntNum();play();time();break;
case1:
PntNum();play();break;
case2:
hour=0,min=0,sec=0;PntNum();play();break;
default:
break;
}
}
}
(6)通过3个按键实现时钟的调整(KEY1模式,KEY2+,KEY3-)
#include
#defineuintunsignedint
#defineucharunsignedchar
#definedisnull10
ucharhour=15,min=24,sec=20;
ucharcodeLedCode[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchardispbuff[8];
voidpnttime()
{
dispbuff[7]=sec%10;
dispbuff[6]=sec/10;
dispbuff[5]=disnull;
dispbuff[4]=min%10;
dispbuff[3]=min/10;
dispbuff[2]=disnull;
dispbuff[1]=hour%10;
dispbuff[0]=hour/10;
}
voiddelay(uintx)
{
while(x--);
}
voidmain()
{
uchari,ms;
while
(1)
{
pnttime();
for(i=0;i<8;i++)
{
P3=0;
P3=1<
P2=~LedCode[dispbuff[i]];
delay(500);
}
ms++;
if(ms>=10)
{
sec++;ms=0;
}
if(sec>=60)
{
min++;sec=0;
}
if(min>=60)
{
hour++;min=0;
}
if(hour>=24)
{
hour=0;
}
}
}
3实验总结(包括过程总结、心得体会及实验改进意见等):
过程总结:
通过本次实验对单片机的知识进一步了解,通过单片机可以实现很多电子功能的实现,比如时钟的实现。
掌握查询式按键的原理和编程方法,理解按键防抖技术。
本次实验大多数是为了熟悉按键设计,对按键设计进行更加的了解与熟练。
心得体会:
本次实验过程之中,有很多难度,比以前的数码管多了一个按键,这个按键就是本次实验的关键,经过不停的修改和同学的讨论,做了出来,虽然不怎么样,但是还是做出来了。
以后的遇到相同的按键操作就不会这样什么都不懂了。
指导教师评语:
1、完成所有规定的实验内容,实验步骤正确,结果正确;
2、完成绝大部分规定的实验内容,实验步骤正确,结果正确;
3、完成大部分规定的实验内容,实验步骤正确,结果正确;
4、基本完成规定的实验内容,实验步骤基本正确,所完成的结果基本正确;
5、未能很好地完成规定的实验内容或实验步骤不正确或结果不正确。
6、其它:
评定等级:
A(优秀)B(良好)C(中等)D(及格)E(不及格)
成绩评定
教师签字
年月日
备注:
注:
1、报告内的项目或设置,可根据实际情况加以补充和调整
2、教师批改学生实验报告应在学生提交实验报告10日内