如何用51单片机玩爆小灯珠!!!#51单片机IO口基本操作

本文详细介绍了如何使用STC89C52RC单片机的IO口控制LED灯,包括点亮、闪烁、按键触发控制、软件消抖以及状态记录。通过实例代码演示了如何运用C语言实现这些功能,为电动车报警器项目打下基础。
摘要由CSDN通过智能技术生成

前言

  本篇博文主要写的是对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;
		}
	}
 
} 

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值