单片机原理独立按键识别单片机原理实验报告.docx
- 文档编号:3979879
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:15
- 大小:682.14KB
单片机原理独立按键识别单片机原理实验报告.docx
《单片机原理独立按键识别单片机原理实验报告.docx》由会员分享,可在线阅读,更多相关《单片机原理独立按键识别单片机原理实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
单片机原理独立按键识别单片机原理实验报告
单片机原理■独立按键识别■单片机原理■实验报告
宁德师范学院计算机系
实验报告
(2014—2015W第2学期)
课程名称单片机原理
实验名称独立按键识别
专业计算机科学与技术(非师)
年级12>
学号B2012102147姓名王秋
指导教师杨烈君
实验日期2015.5.27
实验目的:
1.掌握查询式按键的原理和编程方法
实验要2.理解按键防抖技术
1.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路
2.在电路中增加按键、Led灯、八位7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连,P3引脚输出位选控制信号。
实
3现单按键控制Led灯闪烁
实现单按键多功能识别一一控制4路Led灯闪烁
5实现0・99的计数器效果,按一下数值加一
-实现0・99码表(按一次开始计时,第二第
次停止,三次清零)
7倉扩展要求:
通过3个按键实现时钟的调整模(KEY1式,KEY2+,KEY3・)
实验设备(环境):
计算机、ProteusISIS7Professional应用程序、Ke订应用程序
实验内容:
_
[麴WS轟P控制4路Led
]'实现99的计数器效果,按一下数值加一实现99码表(按一次开始计时,第二第次停g,三次清零)
J扩展要求:
通过3个按键实现时钟的调整(KEY1模式‘KEY2+,KEY3・)
实验步骤、实验结果及分析:
1、使用ProteusISIS7Professional应用程
序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”
(快捷键P),分别选择以下元件:
AT89C51CAP
CAP-ELECCRYSTALRESPACK。
3、构建仿真电路
4、创建一个Keil应用程序:
新建工程项目文
件;为工程选择目标器件(AT89C52;为工程项目创建源程序文件并输入程序代码;保存创建的源程序项目文件;把源程序文件添加到项目中。
5、把程序经过编译后生成的HEX文件添加到仿真电路中的处理器中(编辑元件一文件路径)程序代码:
1•实现单按键控制Led灯闪烁
#include"reg51.h"
#defineucharunsignedchar
sbitLed1=P1A0;
sbitKey=P3A2;
ucharMode=0;
voiddelay(intx)II定义时间间隔
while(x);
应的代码
if(Key=O)
{delay(IOOO);if(Key=0){
Mode=(Mode+1)%2;while(Key==O);
if(Mode==0)
Led1=0;if(Mode==1)
Led仁〜Led1;delay(IOOO);
}
voidmain()
whiled)button_Cotrol();
图1单按钮,控制led灯闪烁
2•实现单按键多功能识别一一控制4路Led灯
闪烁
#include"reg51.h"
#defineucharunsignedcharsbitLed
仁P1A0;sbitLed2=P1A1;sbit
Led3=P1A2;sbitLed4=P1A3;sbit
Key=P3A2;
ucharMode=0;
voiddelay(intx)//定义时间间隔
while(x-);
voidbutton_Cotrol()//根据按键模式执行相
应的代码
{if(Key==O)
{delay(IOOO);
if(Key==O)
{
Mode=(Mode+1)%4;while(Key==O);
}
}
if(Mode==0)
{
Led4=0;
Led仁〜Led1;
delay(3000);
if(Mode==1)
{
Led1=0;
Led2=〜Led2;delay(3000);
}
if(Mode==2)
{
Led2=0;
Led3=〜Led3;delay(3000);
}
if(Mode==3)
{
Led3=0;
Led4=〜Led4;delay(3000);
voidmain()
Led1=0;
Led2=0;
Led3=0;
Led4=0;
while(l)button_Cotrol();
}
曾3
BIvtffrFr
17
图2单按键多功能识别,控制4路Led灯闪烁
3.实现0-99的计数器效果,按一下数值加1
#\nclude"reg51.hH
#defineucharunsignedchar
#definedisp_null10sbitKey=P3八2;
ucharcodetab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxff};
〃共阳数码管显示0~9的段码表
ucharsec=0;
voiddelay(intx)II定义时间间隔{
while(x-);
}
voidPutTime()
{
DispBuf[7]=sec%10;
DispBuf[6]=sec/10;
DispBuf[5]=disp_null;
DispBuf[4]=disp_null;
DispBuf[3]=disp_null;
DispBuf[2]=disp_null;
DispBuf[1]=disp_null;
DispBuf[O]=disp_null;
voiddisplayo
{
uchari;
for(i=0;i<8;i++)
{
P2=0;
P2=1«i;
PO=tab[DispBuf[i]];delay(100);
}
}
voidButton_Control()
{
if(Key==O)
{
delay(3000);if(Key==O)
sec++;while(Key==O);
voidmain()
while
(1)
{
displayo;PutTime();Button_Control();
图30-99的计数器效果,按一下数值加1
4•实现0・99码表(按一次开始计时,第二次停止,第三次清零)
#include"reg51.h"
#defineucharunsignedchar
#definedisp_null10sbitKey=P3八2;ucharcode
tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxff};
〃共阳数码管显示0〜9的段码表
ucharDispBuf[8];
ucharsec=0;
uchartemp=30;
ucharMode=2;
voiddelay(intx)II定义时间间隔{
while(x);
}
voidPutTime()
DispBuf[7]=sec%10;
DispBuf[6]=sec/10;
DispBuf[5]=disp_null;
DispBuf[4]=disp_null;
DispBuf[3]=disp_null;
DispBuf[2]=disp_null;
DispBuf[1]=disp_null;DisDBuf[O]=dispnull;
voiddisplay()
uchari;
for(i=0;iv8;i++)
P2=0;
P2=1«i;
PO=tab[DispBuf[i]];delay(IOO);
}
}
voidtime_Eclipse()
{
if(Mode==1)
{temp-;
if(temp==0)
{temp=30;
sec++;
voidButton_Control()
if(Key==O)
{delay(3000);if(Key==0){
Mode=(Mode+1)%3;while(Key==O);
}
}
if(Mode==0)sec=0;
if(Mode==1)time_Eclipse();
if(Mode==2);
}
voidmain()
while
(1){display。
;
Button_Control();
PutTime();
图40-99码表,按一次开始计时、第二次停止
图50-99码,按表第三次清零
5•扩展要求:
通过3个按键实现时钟的调整
#include"reg51.h"
#defineucharunsignedchar
#definedisp_null10ucharcode
tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,Oxbf};
〃共阳数码管显示0-9的段码表
uchardispBuf[8];
ucharhour=13,min=23,sec=25;//分别给时、
分、秒赋初值
sbitkey1=P3八2;
sbitkey2=P3A3;
sbitkey3=P3A4;
voiddelay(intx)II定义时间间隔{
r
while(x-);
voidPutTime()
{dispBuf[7]=sec%10;dispBuf[6]=sec/10;dispBuf[5]=disp_nuII;dispBuf[4]=min%10;
dispBuf[3]=min/10;dispBuf[2]=disp_null;dispBuf[1]=hour%10;dispBuf[0]=hour/10;
〃识别是否按
ucharScanKey()
1被按'则返回1
if(key2==0)return”if(key3==0)retUm,J;
return0;
}
ucharReadKey()
退出
回来的和原来的值不一样'放弃
return0;
while(SeanKey());//如果一旦读回
来的值为0,也就是松开按键,o
那么就可以返回〃按键返回
returntmp;
}
voiddisplay。
{
uchari;
for(i=0;i<8;i++)
{
P2=0;
P2=1«i;
PO=tab[dispBuf[i]];delay(100);
}
}
voidmain()
unsignedcharmode=0;
unsignedcharms;while(l)
{
PutTime();
displayo;
switch(ReadKey())
{case'1':
mode=(mode+1)%4;break;
case'+':
if(mode==0)break;
elseif(mode==1)
hour=(hour+1)%24;
elseif(mode==2)min=(min+1)%60;elseif(mode==3)sec=(sec+1)%60;break;
case'-':
if(mode==0)break;
elseif(mode==1&&hour)hour=(hour-
1)%24;
elseif(mode==2&&min)
min=(min-1)%60;
elseif(mode==3&&sec)sec=(sec-
1)%60;break;
}
ms++;//控制加1的时延
if(ms>=50)
sec++;ms=O;
}
if(sec>=60)//表示进位,当秒满六十
则向分钟进1,同时秒数清零
min++;sec=O;
if(min>=60)
hour++;min=O;
if(hour>=24)II当小时数满24小时时,则小
时数清零,完成计时
hour=0;
按键实现时钟的调整,KEY1选择模式,KEY
+,KEY3・
按键实现时钟的调整'KEY1选择模式,KEY
Ki
KEY3-
E
9
WH
MY*r**
■J”初
»*•••
nw-
83按键实现时钟的调整,KEY1
选择模式,KEY
+,KEY3-
实验总结(包括过程总结、心得体会及实验改进意见等):
过程总结:
1•在电路中增加按键、Led灯、八位7段数码管(共阳/共阴自选),将P2口作数据输出口与7段数码管数据引脚相连,P3引脚输出位选控制信号。
掌握查询式按键的原理和编程方法
2.在Proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路,理解按键防抖技术,当第一次检测到有建按下时,先延时(10~20mS,而后再确认键电平是否依旧维持闭合状态的电平。
若保持闭合状态电平,则确认此间已按下,从而消除抖动影响°
心得体会:
本次的实验是通过对按键的不同控制实现各个功能,在理想的环境下按键的反馈是即时且无
误差的,但是在实际的环境中要考虑到按键抖动的现象,所以要写一个判断按键抖动的函数,还有单按键控制多个灯的亮灭,可以设置一个变量来记录按键的情况来实现对不同部件的控制,而多按键的时候只需要判断是哪一个按键被按下,然后执行对应的程序。
指导教师评语:
成绩评定
教师签字
年月日
备注:
注:
1、报告内的项目或设置,可根据实际情况加以补充和调整
2、教师批改学生实验报告应在学生提交实验报告
10日内
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 独立 按键 识别 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)