CH4输入口的应用.docx
《CH4输入口的应用.docx》由会员分享,可在线阅读,更多相关《CH4输入口的应用.docx(16页珍藏版)》请在冰豆网上搜索。
CH4输入口的应用
课题名称
第四章输入端口的应用
计划学时
2课时
内容分析
知识点:
输入电路的设计
教学目标及要求
认识c51的输入口
理解并掌握常见的输入设备(按钮开关、拨码开关、数字型拨码开关)与输入电路的设计方法。
重点及措施
教学重点:
按钮开关、拨码开关的电路设计,去抖动的硬件和软件方法
难点及措施
教学难点:
按钮开关、拨码开关的电路设计
教学方式
教学采用教师课堂讲授为主,使用多媒体教学方式,学生讨论、交流与提问。
教
学
过
程
一、引入
在第三章中介绍了c51系列单片机的4个I/O口,分别是P0、P1、P2和P3口,四个口均可作为输入口使用,经过本章的学习,我们可以掌握到常用的按钮开关和拨码开关的电路如何设计,并通过7个实例具体讲解输入电路的应用。
二、新授
4.1认识输入口
PORT0的输入功能
4.2输入设备与输入电路设计
4.2.1输入设备
✧按钮开关(TackSwitch)
✧2、8P拨码开关(DIPSwitch)
✧数字型拨码开关的外观(四位数)与内部结构(每一位数)
✧电路板用数字型拨码开关的尺寸与外观(一位数)
1、按钮开关的输入电路
2、闸刀开关的输入电路
3、BCD拨码开关的使用
4.2.3抖动与去抖动
1、抖动现象:
2、硬件去抖动:
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。
因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。
结论:
RS触发器的R和S端,一个保持不变,一个改变,触发器的Q端不变,只有两个都改变,Q端才改变;
单片机电路中的防抖现在一般都用程序防抖而不用触发器这些硬件防抖了。
Qn
S
R
Qn+1
0
0
0
0
0
0
1
0
0
1
0
1
0
1
1
不确定
1
0
0
1
1
0
1
0
1
1
0
1
1
1
1
不确定
条件:
Qn+1=S+RQn
SR=0
2、硬件去抖动:
RC去抖动电路
PB1未被按下时,P2.3上是高电平,C1右侧是VCC,左侧是0。
PB1被按下时,C1两侧会放电延时,C1右侧的正电荷越来越少,直到P2.3上是低电平,PB1抖动,貌似弹起,C1右侧的正电荷会增加一点,但时间很短暂,可以忽略不计,此时P2.3上还是低电平,真到PB1按下稳定,C1放电结束
如a图:
按下按钮开关时,开关第一次接触时电容短路,电容快速放电,电容两端电压快速为0;开关弹开时,电路构成RC充电电路。
电容两端的电压:
VC=VCC*(1-e-t/RC)<0.3VCC
→t/RC<0.357→10ms/10k*c<0.357→c>2.8uf
电容选择在2.8uf~5.6uf之间,
一般R=10k,C=3.3uf,或R=100K,C=0.33uf
3、软件去抖动
按钮开关动作与去抖动函数的波形分析
1)按下按钮,8051检测到第一个低电平信号时,随即调用debouncer函数以延迟20ms,这段时间程序不动作。
2)debouncer函数结束后,继续检测开关是否为高电平?
若检测到第一个高电平,再调用debouncer函数以延迟20ms,这段时间程序不动作。
3)debouncer函数结束后,程序才响应该按钮所要进行的动作。
voiddebouncer(void)
{
inti;
for(i=0;i<2400;i++)
}
实例演练4-3-2按钮ON-OFF控制实验
#include//定义8051暂存器
sbitPB1=P2^0;//声明按钮1接至P2.0
sbitPB2=P2^1;//声明按钮2接至P2.1
sbitLED=P1^0;//声明LED为P1.0
main()//主程序开始
{LED=1;//关闭LED
PB1=PB2=1;//规划输入端口
while
(1)//无穷循环,程式一直跑
{if(PB2==0)LED=1;//若按下PB2,则关闭LED
elseif(PB1==0)LED=0;//若按下PB1,则点亮LED
}//while循环结束
}//结束程序
思考:
1)在本实验里,有没有“抖动”的困扰?
2)若将按钮开关当成启动电机的ON-OFF开关,而LED换成继电器(RELAY),是否可作为电机控制?
3)若同时按下PB1与PB2按钮会怎样?
实例演练4-3-3
按钮切换式控制实验
#include//定义8051暂存器
sbitPB1=P2^0;//声明PB1接至P2.0
sbitLED=P1^0;//声明LED接至P1.0
voiddebouncer(void);//声明防弹跳函数
main()//主程式开始
{LED=1;//关闭LED
PB1=1;//规划P2.0为输入埠
while
(1)//无穷循环,程序一直跑
{if(PB1==0)//若按下PB1
{debouncer();//呼叫防弹跳函数(按下时)
LED=!
LED;//切换LED为反相
while(PB1!
=1);//若仍按住PB1,继续等
debouncer();//呼叫防弹跳函数(放开时)
}//if叙述结束
}//while循环结束
}//主程序结束
voiddebouncer(void)//防弹跳函数开始
{inti;//声明整数变数i
for(i=0;i<2400;i++);//计数2400次,延迟约20ms
}//防弹跳函数结束
思考:
在本实验里,改变debouncer函数的时间长短,看看有什么影响?
若按住PB1不放会怎样?
如何改善?
实例演练4-3-4:
按钮开关应用实验
/*ch04-3-4.c-按钮应用(两按钮控制七段显示器上下数)*/
#include//定义8051暂存器
#defineSEGP0//定义七节显示器接至Port0
/*声明七节显示器驱动信号阵列(共阳)*/
charcodeTAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,//数字0-4
0x92,0x83,0xf8,0x80,0x98};//数字5-9
sbitPB1=P2^0;//声明按钮1接至P2.0
sbitPB2=P2^1;//声明按钮2接至P2.1
voiddebouncer(void);//声明防弹跳函数
//==主程式=================================
main()//主程序开始
{unsignedchari=0;//声明变量i初值=0
PB1=PB2=1;//规划输入端口
SEG=TAB[i];//输出数字至七段显示器
while
(1)//无穷循环,程式一直跑
{if(PB1==0)//判断PB1是否按下
{debouncer();//呼叫防弹跳函数
i=(i<9)?
i+1:
0;//若i<9则i=i+1,若i>=9清除为0
SEG=TAB[i];//输出数字至七段显示器
while(PB1==0);//PB1是否按住?
debouncer();//呼叫防弹跳函数
}//if叙述结束
if(PB2==0)//判断PB2是否按下
{debouncer();//呼叫防弹跳函数
i=(i>0)?
i-1:
9;//若i>0则i=i-1,i<=0重设为9
SEG=TAB[i];//输出数字至七段显示器
while(PB2==0);//PB1是否按住?
debouncer();//呼叫防弹跳函数
}//if叙述结束
}//while循环结束
}//主程序结束
/*防弹跳函数函数,延迟约20ms*/
voiddebouncer(void)//防弹跳函数开始
{inti;//声明整数变量i
for(i=0;i<2400;i++);//计数2400次,延迟约20ms
}//防弹跳函数结束
思考:
1)在本实验里,若按钮按住不放,会怎样?
如何改善?
2)在本实验里,若PB1与PB2两个按钮同时按,会怎样?
实例演练4-3-6多重按钮开关实验
/*myio.h-自己写的程序库*/
#defineLEDP1//定义LED接至Port1
voiddebouncer(void);//声明防弹跳函数
voiddelay10ms(int);//声明10毫秒延迟函数
voidalter(int);//声明交互闪烁函数
voidleft(int);//声明单灯左移函数
voidright(int);//声明单灯右移函数
voidpili(int);//声明霹雳灯函数
voidflash(int);//声明闪烁函数
/*防弹跳函数函数,延迟约20ms*/
voiddebouncer(void)//防弹跳函数开始
{delay10ms
(2);//延迟约20ms
}//防弹跳函数结束
/*延迟函数开始,延迟约x10ms*/
voiddelay10ms(intx)//延迟函数开始
{inti,j;//声明整数变量i,j
for(i=0;ifor(j=0;j<1200;j++);//计数1200次,延迟约10ms
}//延迟函数结束
/*高低位元交互闪烁函数,执行x次*/
voidalter(intx)//高低位元交互闪烁函数开始
{inti;//声明变量i
LED=0x0f;//初始状态(高位元亮,低位元灭)
for(i=0;i<2*x-1;i++)//i变量for循环执行2x-1次
{delay10ms(50);//延迟50*10m=0.5s
LED=~LED;//LED反相输出
}//i变量for循环结束
delay10ms(50);//延迟5010m=0.5s
}//高低位元交互闪烁函数结束
/*全灯闪烁函数,执行x次*/
voidflash(intx)//全灯闪烁函数开始
{inti;//声明变量i
LED=0x00;//初始状态(全亮)
for(i=0;i<2*x-1;i++)//i变量for循环执行2x-1次
{delay10ms(50);//延迟5010m=0.5s
LED=~LED;//P0反相输出
}//i变量for循环结束
delay10ms(50);//延迟5010m=0.5s
}//全灯闪烁函数结束
/*单灯左移函数,执行x圈*/
voidleft(intx)//单灯左移函数开始
{inti,j;//声明变量i,j
for(i=0;i{LED=0xfe;//初始状态=11111110
for(j=0;j<7;j++)//j循环,左移7次
{delay10ms(25);//延迟2510m=0.25s
LED=(LED<<1)|0x01;//左移1位後,LSB设为1
}//j循环结束
delay10ms(25);//延迟2510m=0.25s
}//i循环结束*/
}//单灯左移函数结束
/*单灯右移函数,执行x圈*/
voidright(intx)//单灯右移函数开始
{inti,j;//声明变量i,j
for(i=0;i{LED=0X7f;//初始状态=01111111
for(j=0;j<7;j++)//j循环,右移7次
{delay10ms(25);//延迟2510m=0.25s
LED=(LED>>1)|0x80;//左移1位後,MSB设为1
}//j循环结束
delay10ms(25);//延迟2510m=0.25s
}//i循环结束
}//单灯左移函数结束
/*霹雳灯函数,执行x圈*/
voidpili(intx)//霹雳灯函数开始
{inti;//声明变量i
for(i=0;i{left
(1);//单灯左移一圈
right
(1);//单灯左移一圈
}//i循环结束
}//霹雳灯函数结束
/*ch04-3-6a.c-多重按钮开关实验之1-P4-26*/
#include//定义8051暂存器的标头档,P2-17~19
#include"myio.h"//自己写的I/O程序库
sbitPB1=P2^0;//声明PB1=P2.0
sbitPB2=P2^1;//声明PB2=P2.1
sbitPB3=P2^2;//声明PB3=P2.2
sbitPB4=P2^3;//声明PB4=P2.3
main()//主程序开始
{LED=0xff;//初始状态(LED全灭)
P2=0xff;//规划P2输入端口
while
(1)//无穷循环,程序一直跑
{if(PB1==0)//如果按下PB1
{debouncer();//防弹跳
alter(3);//高低位元交互闪烁三次
flash(3);}//全灯闪烁三次
elseif(PB2==0)//如果按下PB2
{debouncer();//防弹跳
left(3);//单灯左移三圈
flash(3);}//全灯闪烁三次
elseif(PB3==0)//如果按下PB3
{debouncer();//防弹跳
right(3);//单灯右移三圈
flash(3);}//全灯闪烁三次
elseif(PB4==0)//如果按下PB4
{debouncer();//防弹跳
pili(3);//霹雳灯三圈
flash(3);}//全灯闪烁三次
}//while循环结束
}//主程序结束
方法二:
/*ch04-3-6b.c-多重按钮开关实验之2-P4-30*/
#include//定义8051暂存器
#include"myio.h"//自己写的I/O程序库P4-26
#definePBP2//定义按钮开关接至Port2
main()//主程序开始
{LED=0xff;//初始状态(LED全灭)
while
(1)//无穷循环,程序一直跑
{PB=0xff;//规划输入埠
switch(~PB)//switch叙述开始
{case0x01:
//如果按下PB1
{debouncer();//防弹跳
alter(3);//交互闪烁三次
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x02:
//如果按下PB2
{debouncer();//防弹跳
left(3);//单灯左移三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x04:
//如果按下PB3
{debouncer();//防弹跳
right(3);//单灯右移三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x08:
//如果按下PB4
{debouncer();//防弹跳
pili(3);//霹雳灯三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
}//结束switch叙述
}//while结束
}//主程序结束
实例演练4-3-7放开按钮后动作实验
/*ch04-3-7.c-按钮放开后才动作实验-P4-34*/
#include//定义8051暂存器的标头档,P2-17~19
#include"myio.h"//自己写的I/O程序库
#definePBP2//定义按钮开关接至Port2
main()//主程序开始
{LED=0xff;//初始状态(LED全灭)
while
(1)//无穷循环,程序一直跑
{PB=0xff;//规划P2为输入端口
switch(~PB)//switch叙述开始
{case0x01:
//如果按下PB1
{debouncer();//防弹跳
while(~PB==1);//等待PB1放开
debouncer();//防弹跳
alter(3);//交互闪烁三次
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x02:
//如果按下PB2
{debouncer();//防弹跳
while(~PB==2);//等待PB2放开
debouncer();//防弹跳
left(3);//单灯左移三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x04:
//如果按下PB3
{debouncer();//防弹跳
while(~PB==4);//等待PB3放开
debouncer();//防弹跳
right(3);//单灯右移三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
case0x08:
//如果按下PB4
{debouncer();//防弹跳
while(~PB==8);//等待PB4放开
debouncer();//防弹跳
pili(3);//霹雳灯三圈
flash(3);//全灯闪烁三次
break;}//退出switch叙述
}//结束switch叙述
}//while结束
}//主程序结束
三、小结
本节讲述了按钮开关、拨码开关以及它们的电路设计,并讲解了抖动产生的原因,以及怎样通过硬件和软件的方法去抖动,最后通过实例的方式进一步讲述了拨码开关、多个按钮开关以及它们的电路设计,并讲解了自定义链接库的编写方法。
思考题和习题
思考与习题:
①完成课堂思考题
②仿真实现例4-3-2、4-3-3、4-3-4、4-3-6
教
学
后
记