单片机C语言实验及实践教程2文档格式.doc

上传人:b****1 文档编号:13165478 上传时间:2022-10-07 格式:DOC 页数:33 大小:314.50KB
下载 相关 举报
单片机C语言实验及实践教程2文档格式.doc_第1页
第1页 / 共33页
单片机C语言实验及实践教程2文档格式.doc_第2页
第2页 / 共33页
单片机C语言实验及实践教程2文档格式.doc_第3页
第3页 / 共33页
单片机C语言实验及实践教程2文档格式.doc_第4页
第4页 / 共33页
单片机C语言实验及实践教程2文档格式.doc_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

单片机C语言实验及实践教程2文档格式.doc

《单片机C语言实验及实践教程2文档格式.doc》由会员分享,可在线阅读,更多相关《单片机C语言实验及实践教程2文档格式.doc(33页珍藏版)》请在冰豆网上搜索。

单片机C语言实验及实践教程2文档格式.doc

要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。

具体的一个按键从按下到释放的全过程的信号图如上图所示:

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。

从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

对于按键识别的指令,我们依然选择如下指令JB BIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。

或者是 JNB BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL处执行程序,否则就继续向下执行程序。

但对程序设计过程中按键识别过程的框图如右图所示:

                 图4.8.3

5.程序框图

图4.8.4

6.汇编源程序

 

ORG0

START:

MOVR1,#00H ;

初始化R7为0,表示从0开始计数

MOVA,R1 ;

CPLA ;

取反指令

MOVP1,A ;

送出P1端口由发光二极管显示

REL:

JNBP3.7,REL ;

判断SP1是否按下

LCALLDELAY10MS ;

若按下,则延时10ms左右

JNBP3.7,REL ;

再判断SP1是否真得按下

INCR7 ;

若真得按下,则进行按键处理,使

MOVA,R7 ;

计数内容加1,并送出P1端口由

发光二极管显示

JNBP3.7,$ ;

等待SP1释放

SJMPREL ;

继续对K1按键扫描

DELAY10MS:

MOVR6,#20 ;

延时10ms子程序

L1:

MOVR7,#248

DJNZR7,$

DJNZR6,L1

RET

END

7.C语言源程序

#include<

AT89X51.H>

unsignedcharcount;

voiddelay10ms(void)

{

unsignedchari,j;

for(i=20;

i>

0;

i--)

for(j=248;

j>

j--);

}

voidmain(void)

while

(1)

{

if(P3_7==0)

{

delay10ms();

if(P3_7==0)

{

count++;

if(count==16)

{

count=0;

}

P1=~count;

while(P3_7==0);

}

}

}

9. 

一键多功能按键识别技术

1.实验任务

如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。

2.电路原理图

图4.9.1

3.系统板上硬件连线

4.程序设计方法

设计思想由来

在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;

那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。

设计方法

从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;

当L2在闪烁时,ID=1;

当L3在闪烁时,ID=2;

当L4在闪烁时,ID=3;

很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。

下面给出有关程序设计的框图。

5.程序框图

图4.9.2

6.汇编源程序

ID EQU30H

SP1 BITP3.7

L1 BITP1.0

L2 BITP1.1

L3 BITP1.2

L4 BITP1.3

MOVID,#00H

JBK1,REL

LCALLDELAY10MS

JBK1,REL

INCID

MOVA,ID

CJNEA,#04,REL

JNBK1,$

CJNEA,#00H,IS0

CPLL1

LCALLDELAY

SJMPSTART

IS0:

CJNEA,#01H,IS1

CPLL2

IS1:

CJNEA,#02H,IS2

CPLL3

IS2:

CJNEA,#03H,IS3

CPLL4

IS3:

LJMPSTART

MOVR6,#20

LOOP1:

MOVR7,#248

DJNZR6,LOOP1

DELAY:

MOVR5,#20

LOOP2:

LCALLDELAY10MS

DJNZR5,LOOP2

7.C语言源程序

unsignedcharID;

voiddelay02s(void)

unsignedchari;

{delay10ms();

{while

(1)

{if(P3_7==0)

{delay10ms();

ID++;

if(ID==4)

ID=0;

switch(ID)

{case0:

P1_0=~P1_0;

delay02s();

break;

case1:

P1_1=~P1_1;

case2:

P1_2=~P1_2;

case3:

P1_3=~P1_3;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1