目录
LED
前言:中文名为发光二极管,用途为:照明、广告灯、指引灯、屏幕等。
注意:以上分别为LED灯的元器件符号,元器件实物和区分元器件正负极的方法。
LED灯亮的原理图
注意:
- 上面的接法为共阳极接法,左边的接口分别连到单片机的引脚上,若单片机给该引脚低电平,那么就可以形成回路,进而导致LED灯亮。
- 单片机控制引脚的方式为寄存器,寄存器通常每8位为一组;既可以8位一起处理,也可以按位方式使用(CPU通过控制寄存器来控制我们的硬件电路,硬件电路来执行我们想要完成的功能)
- 寄存器对应的脚位顺序:P1=01011101——对应脚位顺序:P1.7,P1.6,P1.5,P1.4,P1.3,P1.2,P1.1,P1.0
LED灯光闪烁
电路设计
keil文件
#include "reg51.h"
#共阳极接法
#P2的0号脚位
sbit LED0=P2^0;
#大概nms的延时
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}
void main()
{
#我们要让51单片机一直运行
while(1){
#共阳极接法,那么单片机接口处给低电平,灯方可亮
LED0=0;
delay(5);
LED0=1;
delay(5);
}
}
LED流水灯的实现
电路设计:和上面LED灯泡闪烁的电路一样
keil文件
#include "reg51.h"
#共阳极接法
sbit LED0=P2^0;
#大概nms的延时
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}
#流水灯的实现
void led(){
int i=0;
for(i=0;i<8;i++){
P2=~(0x01<<i);//0000 0001
delay(100);
}
}
void main()
{
while(1){
led();
}
}
单片机之按键
键盘的结构
按键消抖
前言:对于机械开关,当机械触点断开,闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随着一连串抖动
软件消抖
注意:这个抖动会有个抖动时间,这个时间大概在10ms到20ms之间;我们可以依据这个原理错开这个时间来实现软件消抖。
硬件消抖
理解:本质上还是利用了延时进行消抖。
键盘的分类
独立式键盘
特点:
- 每个独力健占用一根并口线,键位多时占用的并口线多
- 用于键位较少的情况
- 处理简单,直接判并口线
行列式键盘
特点:
- 键位分布在行列交叉点上
- 占用并口较少,键位越多越明显
键盘的识别
两步:第一步首先检测键盘上是否有键按下;第二部识别是哪一个键按下
- 检测键盘上是否有键按下的处理方法——全扫描
- 识别键盘中的哪一个键按下的方法——逐行逐列扫描
独立按键案例
需求:通过独立式按键控制数码管上的显示(每按下一次按键,数码管中显示的值加一)
电路图
keil文件
#include "reg51.h"
sbit key0=P1^0;
unsigned int num=0,flag=0;
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void key(){
#第一次按下
if(key0==0&flag==0){
flag=1;
}
#已经按下了,但是按键抬起
if(flag==1&key0==1){
num++;
flag=0;
if(num==10){
num=0;
}
}
}
void seg(){
P2=s[num];
}
void main()
{
while(1){
key();
seg();
}
}
行列式键盘案例
需求:按第一个键盘,按键亮1;按第二个键盘,按键亮2;
电路图
对应按键判断
原理:按键按下时,高电平会被低电平拉至低电平。
编码 | H3 | H2 | H1 | H0 | L3 | L2 | L1 | L0 |
初值 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
判断被按下按键的行数:检测第一个按键被按下,L0将H0拉至低电平:1110 0000
编码 | H3 | H2 | H1 | H0 | L3 | L2 | L1 | L0 |
初值 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
判断被按下案件的列数:检测第一个按键被按下,L0被H0拉至低电平:0000 1110
总结:
- 由此观之:行数:0xe0;列数:0x0e。由此观之第一个按键的行列标识为——行数+列数=0xe0+0x0e=0xee。
- 单片机IO口是一种弱上拉,强下拉的工作模式(输出的1驱动能力是有限的,而输出0驱动能力是比较强的)
keil文件
#include "reg51.h"
unsigned char s[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char num=99;
void delay(unsigned int n){
unsigned int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<120;j++);
}
}
void key_scan()
{
unsigned char temp=0,temp0=0,temp1=0;
P1=0xf0; //为P1置初值,判断被按下按键的行数
//检测按键是否被按下
if(P1!=0xf0){
delay(20); //软件消抖
temp0=P1; //取出P1的值
P1=0x0f; //为P1置初值,判断被按下按键的列数
if(P1!=0x0f){
temp1=P1;
}
}
//取得被按下按键的标识
temp=temp0+temp1;
//被按下对应的按键执行对应的操作
if(temp==0xee){
num=0;
}
if(temp==0xed){
num=1;
}
}
void display(){
P2=s[num];
}
void main()
{
while(1){
key_scan();
display();
}
}