目录
独立按键
看到这一章的时候,我们不经思考,什么是独立按键呢?
相关概念
轻触按键: 相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开
它的样子是这样的
独立按键的连接方式
内部是这样连接的
在STC89C51的单片机中,和主要芯片的连接是这样的
(其中GND为负极,所有的IO口都默认为高电平)
对应到芯片位置就是左侧的P3.0到P3.3处
所以单片机上独立按键的连接方式就如下图所示
其中TXD为寄存器,它会检测io口的电平
按键如果按下,寄存器的值为0,反之寄存器的值为1
预备知识
sfr和sbit
将头文件打开,会看到
sfr是定义八位寄存器的,在这里面操作的P2是八位一体的(同时控制八位的电平)
sbit是位寄存器(如P2_0就只是控制P2的一号口)
重要:在操作位的时候,就是非0即1、
C51数据运算
数据运算的时候需要用到下列的运算符(用法和之前学到的c语言相同):
举例:
按位右移(>>): 0011 1100>>1(表示“按位右移”1位) ->0001 1110
按位左移(<<):0011 1100<<1(表示“按位左移”1位) ->0111 1000
按位与(&):0001 1000 & 0010 1010 (同一位上只有都为1时,输出的才是1,其余都是0(有且的意思))-> 0000 1000
按位或(|):0001 1000 | 0010 1010(同一位上只要有1,输出的就是1,其余都是0(有或者的意思)) -> 0011 1010
按位异或(^):0001 1000 ^ 0010 1010(异或:同一位上两个相同为0,不同为1) -> 0011 0010
按位取反(~):~0001 1000(这个符号只用在一串数字上)(每一位上都取相反的) -> 1110 0111
C51基本语句
3-1 独立按键控制LED亮灭
代码
#include <REGX52.H> void main(){ while(1){ if(P3_1==0){//因为K1按键连接的是P31的口,所以需要写P3_1的位,按键按下为0松开为1 //k1对应P3_1,k2对应P3_0,k3对应P3_2,k4对应P3_3 P2_0=0;//点亮第一个LED灯,位计算器的时候 } else{ P2_0=1; } } }
思路:
1、k1口是由P31控制的,k1按下为0
2、利用if语句对其进行判断
3、在if语句下控制灯的亮灭即可
4、然后输入到单片机上实现即可
3-2 独立按键控制LED状态
按键的抖动:
对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动
解决的办法有两种:
1、是利用物理的方法,在上面接上一根线(这个比较复杂,先讲一下2怎么写的)
2、利用软件的方法,当发生抖动的时候,就延时10毫秒
实现方法2的话:
首先要建立工程,如果不会的话可以参考下面这篇文章
然后在STC-ISP(软件延时计算器)里生成一个相关的代码(注意:系统频率要和单片机的规定频率相同,8051指令集也同理)
在延时代码中加入一个参数unsigned int类型的函数(范围为0~65535)方便控制任意时刻的时间。
然后需要测试一下这个调用函数,以防出错
之后就可以书写代码了
代码
#include <REGX52.H> void Delay(unsigned int xms) //利用STC-ISP生成的1毫秒的延时代码,添加一个函数,就可以实现,随意定义时间 { while(xms){ //利用while函数和xms--;语句实现对时间的控制 unsigned char data i, j; i = 2; j = 239; do { while (--j); } while (--i); xms--; } } void main(){ while(1){ //利用while函数实现循环 if(P3_1==0){ //利用if语句,判断按键k1是否被按下 Delay(20); //延时20毫秒 while(P3_1==0);//如果按键一直被按着,就用while语句一直循环 Delay(20); //延时20毫秒 P2_0=~P2_0; //利用取反,使得执行相反的操作(对于P2整体不能操作,试过了,需要对位进行操作) } } }
然后输入到单片机上实现即可;
3-3 独立按键控制LED显示二进制
代码
#include <REGX52.H> void Delay(unsigned int xms)//用于控制秒数,括号中输入多少秒就是U多少秒 { while(xms--){ unsigned char data i, j; i = 2; j = 239; do { while (--j); } while (--i); } } void main(){ int n=0; //定义一个新函数,并将其赋值为0 //这里的赋值,是n充当一个瓶子,防止P2在加的时候使得自身发生变化,而陷入死循环 while(1){ if(P3_1==0){ //利用if语句判断k1按键是否被按下 Delay(20); //延时20毫秒 while(P3_1==0); //为了防止K1按下20毫秒还在按着,就保持循环 Delay(20); n++; //利用++操作实现二进制 P2=~n; //因为0为亮,1为灭,所以需要对其取反 } } }
然后输入到单片机上实现即可;
3-4 独立按键控制LED移位
代码
#include <REGX52.H> void Delay(unsigned int xms);//函数的声明 void main(){ int n; //定义一个新函数,并将其赋值为0 //这里的赋值,是n充当一个瓶子,防止P2在加的时候使得自身发生变化,而陷入死循环 P2=0xfe; while(1){ if(P3_1==0){ //利用if语句判断k1按键是否被按下 Delay(20); //延时20毫秒 while(P3_1==0); //为了防止K1按下20毫秒还在按着,就保持循环 Delay(20); n++; //利用++操作实现对位平移个数的控制 if(n>=8){ //如果平移个数大于8,就要回到灯 n=0; } P2=~(0x01<<n);//因为0为亮,所以需要取反 } if(P3_0==0){ //下面的操作与上面相同 Delay(20); while(P3_0==0); Delay(20); if(n==0){ n=7; } else{ n--; } P2=~(0x01<<n); } } } void Delay(unsigned int xms)//用于控制秒数,括号中输入多少秒就是U多少秒 { while(xms--){ unsigned char data i, j; i = 2; j = 239; do { while (--j); } while (--i); } }
然后输入到单片机上实现即可;