如何用51单片机玩爆小灯珠!!!#51单片机IO口基本操作
前言
本篇博文主要写的是对STC89C52RC单片机IO口的基本控制,以控制LED灯为例,包含点亮第一颗LED灯,编程实现LED灯闪烁,按下按键控制灯,两个按键控制灯,按键软件消抖,IO口状态翻转,记录状态来控制LED灯。以便为后面的电动车报警器项目制作打基础,减轻项目学习压力。
1.预备知识
完成本篇博文所实现功能,需要会以下知识。
一、串并联电路知识
二、高低电平的识别
三、电源正负极识别
四、C变量
五、基本输入输出
六、流程控制
七、函数
如果以上知识不清楚,请自行学习后再来浏览。
2.点亮第一颗LED灯
1.为什么灯会亮?
1.得看电路图,简单的串联电路,D4,D5,D6板子上有标记,D5一端通过电阻接5v,另外一端接着"LED1标志的线",我们发现在89C52RC的电路图中也有LED1的标志,是在P3的IO口组中,在P3.7引脚,所以编程让P3.7出低电平(0)就让D5灯完成一个串联电路,所以亮。
2.也就是说,给LED1对应标号的P3^7一个低电平,就能点亮灯
3.记住:原理图中标号一样代表是同一根“电线”
4.原理图
2.程序代码
#include "reg52.h"
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
void main()
{
LED1 = 0; //对LED灯的负极赋低电平,使LED灯形成回路点亮。
}
3.编程实现LED灯闪烁
1.怎么做才会闪烁
1.使用STC-ISP自带延时函数
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
此函数功能实现延时500毫秒
2.实现思路:要实现LED灯闪烁必须使它一会儿灭一会儿亮
2.程序代码
#include "reg52.h"
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
//要实现LED灯闪烁必须使它一会儿灭一会儿亮
//首先让LED灯亮
LED1 = 0;
//让它亮一会儿
Delay500ms();
//让LED灯灭
LED1 = 1;
//让它灭一会儿
Delay500ms();
//最后让他能够一直循环执行用while(1)死循环
}
}
4.按下按键控制灯
1.原理
按键和灯不是我们传统理解的思维,传统按键和灯是在同一个电路中的。而我们单片机编程按键和灯是分开的两个电路,通过单片机作为媒介来处理数据,通过逻辑来实现按键控制灯。
2.通过什么方法来检测按键呢?——通过查询法
1.怎么知道sw1按键被按下?
答:KEY1位置和GND接通,表现为低电平,值为0
2.怎么知道sw1按键没有被按下
答:KEY1位置通过上拉电阻到5V,表现为高电平,值为1
3.根据原理图可知单片P2.1口与KEY1相连,当KEY1被按下会使单片机IO口电位被拉低,因此可以将这个拉低电平作为触发灯亮的条件。
4.程序代码
#include "reg52.h"
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
sbit KEY1 = P2^1; //由原理图可知,独立按键与单片机的P2.1口连接
void main()
{
//查询法检测按键按下
while(1)
{
//由原理图可知,当按下键盘时单片机P2.1口电位被拉低,所以KEY1 == 0;
if(KEY1 == 0)
{
LED1 = 0; //对LED灯的负极赋低电平,使LED灯形成回路点亮。
}
}
}
5.两个按键控制灯
1.根据原理图可知单片P2.0口与KEY2相连,当KEY2被按下会使单片机IO口电位被拉低,因此可以将这个拉低电平作为触发灯亮灭的条件。
2.程序代码
#include "reg52.h"
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
sbit KEY1 = P2^1; //由原理图可知,独立按键与单片机的P2.1口连接
sbit KEY2 = P2^0; //由原理图可知,独立按键与单片机的P2.1口连接
void main()
{
//查询法检测按键按下
while(1)
{
//由原理图可知,当按下键盘时单片机P2.1口电位被拉低,所以KEY1 == 0;
if(KEY1 == 0)
{
LED1 = 0; //对LED灯的负极赋低电平,使LED灯形成回路点亮。
}
//由原理图可知,当按下键盘时单片机P2.0口电位被拉低,所以KEY2 == 0;
if(KEY2 == 0)
{
LED1 = 1; //对LED灯的负极赋高电平,使LED灯不形成回路熄灭。
}
}
6.按键软件消抖
1.为什么消抖
因为开关制程工艺的不一样,导致有些开关在电路板抖动时会闭合,引起灯亮
2.软件消抖的原理
消抖的原理是延时50ms再进行按键按下判断,这样就避免的灯误亮的情况
3.程序代码
#include "reg52.h"
/*
时间: 2023年9月2日17:11:17
程序功能:按键软件消抖
*/
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
sbit KEY1 = P2^1; //由原理图可知,独立按键与单片机的P2.1口连接
sbit KEY2 = P2^0; //由原理图可知,独立按键与单片机的P2.1口连接
void Delay50ms() //@11.0592MHz
{
unsigned char i, j;
i = 90;
j = 163;
do
{
while (--j);
} while (--i);
}
void main()
{
//查询法检测按键按下
while(1)
{
//由原理图可知,当按下键盘时单片机P2.1口电位被拉低,所以KEY1 == 0;
if(KEY1 == 0)
{
//为了防止电路板抖动导致开关短暂闭合使灯亮,所以我们采用软件消抖
//消抖的原理是延时50ms再进行按键按下判断
Delay50ms();
if(KEY1 == 0)
{
LED1 = 0; //对LED灯的负极赋低电平,使LED灯形成回路点亮。
}
}
//由原理图可知,当按下键盘时单片机P2.0口电位被拉低,所以KEY2 == 0;
if(KEY2 == 0)
{
LED1 = 1; //对LED灯的负极赋高电平,使LED灯不形成回路熄灭。
}
}
}
7.IO口状态翻转
1.IO口状态翻转原理
IO口状态翻转通过符号 ‘!’ 来改变。当程序执行带有感叹号的语句时会改变当前变量的状态。也就是1变0 ,0变1。
2.程序代码
#include "reg52.h"
/*
时间: 2023年9月2日21:39:30
程序功能:IO口状态表翻转(有问题)
*/
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
sbit KEY1 = P2^1; //由原理图可知,独立按键与单片机的P2.1口连接
sbit KEY2 = P2^0; //由原理图可知,独立按键与单片机的P2.1口连接
void Delay50ms() //@11.0592MHz
{
unsigned char i, j;
i = 90;
j = 163;
do
{
while (--j);
} while (--i);
}
void main()
{
LED1 = 1; //LED1一个初识值,使它熄灭
//查询法检测按键按下
while(1)
{
//由原理图可知,当按下键盘时单片机P2.1口电位被拉低,所以KEY1 == 0;
if(KEY1 == 0)
{
//为了防止电路板抖动导致开关短暂闭合使灯亮,所以我们采用软件消抖
//消抖的原理是延时50ms再进行按键按下判断
Delay50ms();
if(KEY1 == 0)
{
LED1 = !LED1; //对LED灯的负极赋低电平,使LED灯形成回路点亮。 !号为翻转运算符,当程序遇到
//!号时会翻转原来的状态,也就是1变0 0变1
}
}
//由原理图可知,当按下键盘时单片机P2.0口电位被拉低,所以KEY2 == 0;
/*if(KEY2 == 0)
{
LED1 = 1; //对LED灯的负极赋高电平,使LED灯不形成回路熄灭。
}*/
}
}
8.记录状态来控制LED灯
1.记录状态的原因
当业务代码相对复杂,需要处理的实时性强时,不想在逻辑算法代码中控制时,就需要利用标志位来做过度处理。
2.定义标志位
此程序中的标志位为int ledMark;在逻辑算法中对标志位的改变,在逻辑算法外对标志位的值进行判断,在执行相应硬件操作。
3.程序代码
#include "reg52.h"
#define ON_STATUS 1
#define OFF_STATUS 0
/*
时间: 2023年9月2日21:39:30
程序功能:IO口状态表翻转(有问题)
*/
sbit LED1 = P3^7; //位定义,单片机上的P3口的第7口连接着LED灯的负极。
sbit KEY1 = P2^1; //由原理图可知,独立按键与单片机的P2.1口连接
sbit KEY2 = P2^0; //由原理图可知,独立按键与单片机的P2.1口连接
void Delay50ms() //@11.0592MHz
{
unsigned char i, j;
i = 90;
j = 163;
do
{
while (--j);
} while (--i);
}
void main()
{
int ledMark = OFF_STATUS; //变量定义应该放在第一行,不然会报错
LED1 = 1; //LED1一个初识值,使它熄灭
//查询法检测按键按下
while(1)
{
//由原理图可知,当按下键盘时单片机P2.1口电位被拉低,所以KEY1 == 0;
if(KEY1 == 0)
{
//为了防止电路板抖动导致开关短暂闭合使灯亮,所以我们采用软件消抖
//消抖的原理是延时50ms再进行按键按下判断
Delay50ms();
if(KEY1 == 0)
{
ledMark = ON_STATUS;
// LED1 = !LED1; //对LED灯的负极赋低电平,使LED灯形成回路点亮。 !号为翻转运算符,当程序遇到
//!号时会翻转原来的状态,也就是1变0 0变1
}
}
//由原理图可知,当按下键盘时单片机P2.0口电位被拉低,所以KEY2 == 0;
if(KEY2 == 0)
{
ledMark = OFF_STATUS;
// LED1 = 1; //对LED灯的负极赋高电平,使LED灯不形成回路熄灭。
}
if(ledMark == ON_STATUS)
{
LED1 = 0;
}
else
{
LED1 = 1;
}
}
}
结束语
很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!