单片机原理独立按键识别单片机原理实验报告Word文档格式.docx
《单片机原理独立按键识别单片机原理实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机原理独立按键识别单片机原理实验报告Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
![单片机原理独立按键识别单片机原理实验报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/11/128efcb2-7ce4-4ebc-af32-6c99ab7e9a2e/128efcb2-7ce4-4ebc-af32-6c99ab7e9a2e1.gif)
F0.6/AD6
F0.7/AD7
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
D4-ED-GREEN
12
参考原理图
实验目的:
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-)
实验设备(环境):
计算机、ProteusISIS7Professional应用程序、Keil应用程序
实验内容:
1.实现单按键控制Led灯闪烁
2.实现单按键多功能识别一一控制4路Led灯闪烁
3.实现0-99的计数器效果,按一下数值加一
4.实现0-99码表(按一次开始计时,第二次停止,第三次清零)
5.扩展要求:
F3.0/RXD
F3.1/TXD
F3.2HNT0
R3.3』用L
F3.4/T0
F3.5/T1
P3.6/WR
P37/R旷
实验步骤、实验结果及分析:
1、使用ProteusISIS7Professional应用程序,建立一个.DSN文件
2、在“库”下拉菜单中,选中“拾取元件”(快捷键P),分别选择以下元件:
AT89C51、CAP
CAP-ELECCRYSTALRESPACK-8
3、构建仿真电路
4、创建一个Keil应用程序:
新建工程项目文件;
为工程选择目标器件(AT89C52);
为工程项目创建源程序文件并输入程序代码;
保存创建的源程序项目文件;
把源程序文件添加到项目中。
5、把程序经过编译后生成的HEX文件添加到仿真电路中的处理器中(编辑元件t文件路径)程序代码:
1.实现单按键控制Led灯闪烁
#include"
reg51.h"
#defineucharunsignedchar
sbitLed仁PUO;
sbitKey=P3A2;
ucharMode=0;
voiddelay(intx)//疋义时间间隔
{
while(x--);
}
voidbutton_Cotrol()//根据按键模式执行相应的代码
if(Key==0)
delay(1000);
Mode=(Mode+1)%2;
while(Key==0);
if(Mode==0)
Led1=0;
if(Mode==1)
Led1=~Led1;
delay(1000);
voidmain()
while
(1)
button_Cotrol();
E席rmiai:
:
l;
l^」」忆益电一
图1单按钮,控制led灯闪烁
sbitLed仁P1A0;
sbitLed2=P1A1;
sbitLed3=P1A2;
sbitLed4=P1A3;
voiddelay(intx)//定义时间间隔
delay(IOOO);
Mode=(Mode+1)%4;
Led4=0;
delay(3000);
Led2=~Led2;
if(Mode==2)
Led2=0;
Led3=~Led3;
delay(3000);
}if(Mode==3)
Led3=0;
Led4=~Led4;
Led1=0;
while
(1)button_Cotrol();
图2单按键多功能识别,控制4路Led灯闪烁
3.实现0-99的计数器效果,按一下数值加1
#definedisp_null10
ucharcodetab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
//共阳数码管显示0~9的段码表
ucharDispBuf[8];
ucharsec=0;
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_nuII;
DispBuf[0]=disp_null;
voiddisplay()
uchari;
for(i=0;
i<
8;
i++)
P2=0;
P2=1<
<
i;
PO=tab[DispBuf[i]];
delay(100);
voidButton_Control()
sec++;
while
(1)
display。
;
PutTime();
Button_Control();
}
图30-99的计数器效果,按一下数值加1
#include"
#defineucharunsignedchar#definedisp_null10sbitKey=P3A2;
II共阳数码管显示0~9的段码表
uchartemp=30;
ucharMode=2;
voiddelay(intx)II定义时间间隔{
delay(1OO);
voidtime_Eclipse()
{temp--;
if(temp==0)
temp=30;
}if(sec>
99)sec=0;
if(Key==O)
{Mode=(Mode+1)%3;
while(Key==O);
}if(Mode==0)sec=O;
if(Mode==1)time_Eclipse();
if(Mode==2);
display();
图40-99码表,按一次开始计时,第二次停止
图50-99码,按表第三次清零
通过3个按键实现时钟的调整
ucharcodetab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//共阳数码管显示0~9的段码表
uchardispBuf[8];
ucharhour=13,min=23,sec=25;
//分别给时、分、秒赋初值
sbitkey仁P3A2;
sbitkey2=P3A3;
sbitkey3=P3A4;
dispBuf[7]=sec%10;
dispBuf[6]=sec/10;
dispBuf[5]=disp_null;
dispBuf[4]=min%10;
dispBuf[3]=min/10;
dispBuf[2]=disp_null;
dispBuf[1]=hour%10;
dispBuf[0]=hour/10;
ucharScanKey()
if(key1==0)return'
1'
;
if(key2==0)return'
+'
if(key3==0)return'
-'
return0;
ucharReadKey()
uchartmp;
tmp=ScanKey();
if(tmp==0)return0;
delay(1