单片机编辑库一之延时与led灯
单片机编辑库二之按键
单片机编辑库三之蜂鸣器
单片机编辑库二之按键
在上一篇文章当中为大家提供了单片机编辑库的创作思路以及一个基础的电灯例程,这一章,为大家带来的是按键的操作例程,话不多说,上代码!!!
按键
总所周知,按键在51单片机之中的识别非常简单,只需要将按键的两端分别接在单片机的一个引脚和GND上,再检测单片机引脚是否为低电平即可。单片机中常见的按键如下图所示:
内部原理图:
在实物操作时为了保证我们的连接一定准确可用,我们通常只需要接对角的两个引脚即可,即图中的1,4或者2、3对角接线即可。
仿真图中的连接方式:
由于仿真图中的按键只有两个引脚,所以我们只需要一段接单片机的引脚,一端接GND即可。
例程二:按键
为了更好的方便大家进行学习,我使用了两个按键,一个用于启动流水灯,一个用于停止运行。
按键程序如下:
key.h
#ifndef _KEY_H
#define _KEY_H
#include "reg52.h"
sbit key1=P2^3;//定义按键1
sbit key2=P2^4;//定义按键2
extern unsigned int KeyValue;//定义全局变量,在这里不能进行赋值,需要在其他C文件中重新定义赋值
void key_scan();//按键扫描函数
#endif
key.c
#include "key.h"
#include "delay.h"//延时函数头文件
unsigned int KeyValue=0;//重新定义全局变量并赋值
void key_scan()
{
KeyValue=0;//每次进入重新赋值为0,防止按键值停留在上一次按下的情况
if(key1==0)//按键1按下
{
delay_ms(10);//延时消抖
if(key1==0)
{
KeyValue=1;//相应按键按下,给KeyValue赋相应的值
}
}
if(key2==0)//按键2按下
{
delay_ms(10);//延时消抖
if(key2==0)
{
KeyValue=2;//相应按键按下,给KeyValue赋相应的值
}
}
}
由于需要用到了流水灯,所以led灯的程序也要进行一些修改,这里的流水灯方式我提供了两种方式,符号运算和数学运算,各位可自取所需:
led.h
#ifndef _LED_H
#define _LED_H
#include "reg52.h"
#include "delay.h"
#define LED_METHOD 1//控制led循环的方法,1:符号运算 2:数学运算
sbit led1=P0^0;
extern bit led_DIR;//流水灯的方向,0为左移,1为右移
extern bit lamp_flag;//定义一个标志位,作用是判断保持流水灯的状态
void led_on();//点亮led灯
void led_off();//熄灭led灯
void water_Lamp();//流水灯实现函数
void led_init();//初始化LED系统
#endif
led.c
#include "led.h"
#include "math.h"//包含数学运算函数
bit led_DIR=0;//位定义,这个值只能为0或1
bit lamp_flag=0;//位定义,如果这个值为0,流水灯不运行,如果是1,流水灯运行
void led_on()//点亮led灯
{
P0=0x01;//点亮第一颗led
}
void led_off()//熄灭led灯
{
P0=0x00;//led灯挂接在P0端口上,正极接单片机引脚,所以可以这样全部熄灭
led_DIR=0;//方向值复位
}
void led_init()//初始化LED系统
{
led_on();//先将所有led灯点亮一次
delay_ms(1000);//延时1s
led_off();//关闭所有led灯
}
void water_Lamp()//流水灯
{
if(lamp_flag!=0)
{
switch(LED_METHOD)
{
case 1: //运算符号实现左右移
if(led_DIR==0)
{
if(P0<0x80) P0<<=1;//如果 P0的值还没有达到 1000 0000,左移一位
else led_DIR=1;//如果 P0的值为 1000 0000,流水灯开始右移
}
else if(led_DIR==1)
{
if(P0>0x01) P0>>=1;//如果 P0的值还没有达到 0000 0001,右移一位
else led_DIR=0;//如果 P0的值为 0000 0001,流水灯开始左移
}
delay_ms(100);//延时0.1s
break;
case 2://数学算法实现左右移
if(led_DIR==0)
{
if(P0<0x80) P0*=2;//如果 P0的值还没有达到 1000 0000,左移一位
else led_DIR=1;//如果 P0的值为 1000 0000,流水灯开始右移
}
else if(led_DIR==1)
{
if(P0>0x01) P0/=2;//如果 P0的值还没有达到 0000 0001,右移一位
else led_DIR=0;//如果 P0的值为 0000 0001,流水灯开始左移
}
delay_ms(100);//延时0.1s
break;
default:break;
}
}
}
为了使主程序看起来足够简介,我又添加了一个专门用来处理函数的头文件,handle,具体程序如下:
hangdle.h
#ifndef _HANDLE_H
#define _HANDLE_H
//为了方便起见,可以把主函数里面包含的头文件全部包含在这里,除了"handle.h"
#include "reg52.h"
#include "led.h"
#include "delay.h"
#include "key.h"
void handle_Init();//初始化处理函数
void handele_led();//led处理函数
void handele_key();//按键处理函数
#endif
handle.c:
/*
该函数用于处理所有需要实现的功能函数,目的是减少在主函数中程序显得杂乱
*/
#include "handle.h"
void handle_Init()//初始化处理函数
{
led_init();//初始化LED系统
}
void handele_led()//led处理函数
{
water_Lamp();
}
void handele_key()//按键处理函数
{
key_scan();//按键扫描函数在此处调用
if(KeyValue!=0)//如果有按键按下
{
switch(KeyValue)
{
case 1: //如果按下的是按键1,点亮led
lamp_flag=1;
led_on();
delay_ms(100);
break;
case 2: //如果按下的是按键2,熄灭led
led_off();
break;
default:break;
}
}
}
主程序 main.c:
#include "reg52.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "handle.h"
void main()
{
handle_Init();//调用初始化处理函数
while(1)
{
handele_led();//调用led处理函数
handele_key();//调用按键处理函数
}
}
按键程序框架
proteus仿真演示
小福利
由于上传实例的时候发现只能上传gif格式的图片,所以我只能将录好的QQ录屏转化为GIF格式,这里为大家提供下我用到的python代码:
首先我们需要安装一个库:
pip install moviepy
具体程序如下:
# -*- coding: UTF-8 -*-
import moviepy.editor as mpy
# 视频文件的本地路径"C:\\Users\\chaoshen\\Desktop\\QQ录屏.mp4"
content = mpy.VideoFileClip("C:\\Users\\chaoshen\\Desktop\\QQ录屏.mp4")
# 剪辑0分0秒到0分13秒的片段。resize为修改清晰度
change = content.subclip((0, 3), (0, 13)).resize((240, 160))
# 保存为gif图到python的默认路径
change.write_gif("QQ录屏.gif")