51单片机IO口控制

51单片机IO口控制

1.点亮LED灯

原理:根据电路图,指向IO口的引脚;拉低电平,灯亮、

如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zfco4IjK-1690308697530)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014128.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldzpl4XB-1690308697531)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014157.png)]

c 复制代码
#include "reg52.h"

sbit ledOne=P3^7;//根据电路图指定引脚
sbit ledTwo=P3^6;

void main()
{
    ledOne=0; 
    ledTwo=0;//拉低电平,灯亮
}

2.LED灯闪烁

原理:根据延时实现LED灯闪烁的效果;也要根据原理图指定引脚

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpMUOFiQ-1690308697532)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014128.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ntz7JKWI-1690308697533)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014157.png)]

#include "reg52.h"
#include "intrins.h"

sbit ledOne=P3^7; //根据电路图指定引脚
sbit ledTwo=P3^6;

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
    while(1)
    {    
       ledOne=0;//置低电平,点亮灯
       ledTwo=0;//置低电平,点亮灯
       Delay500ms();  
       ledOne=1;//置高电平,灭灯
       ledTwo=1;//置高电平,灭灯
       Delay500ms();
    }         
}

3.按下按键点亮灯

3.1查询法控制点灯

  • 怎么知道sw1按键被按下
  • KEY1位置和GND接通,表现为低电平,值为0
  • 怎么知道sw1按键没有被按下
  • KEY1位置通过上拉电阻到5V,表现为高电平,值为1

通过下图得知

同理LED的分析,

KEY1接到STC89C52RC的P2.1口,我们只要不断检测P2.1口的值(0-按下,1-松开)就知道按键是否被按下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYDfhi4N-1690308697533)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 015556.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t82sTeun-1690308697534)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 015619.png)]

/*
实现功能,按下按键一点亮灯
*/

#include "reg52.h"
#include "intrins.h"

sbit ledOne=P3^7; //根据电路图指定引脚
sbit key1=P2^1;

void main()
{
    while(1)
    {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           ledOne=0; 灯亮,给一个P3.7低电平
       }    
        
    }         
}

/*实现功能:按下按键一,LED亮;按下按键二,lED灭*/

#include "reg52.h"
#include "intrins.h"

sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1   =P2^1;
sbit key2   =P2^0;

void main()
{
    while(1)
    {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           ledOne=0; //灯亮,给一个P3.7低电平
       }    
       if(key2==0)
       {
           ledOne=1; //灯灭,给一个P3.7低电平
       }           
    }         
}

/*
 按下按键一,两盏灯亮;按下按键二,两盏灯灭;
*/

#include "reg52.h"
#include "intrins.h"

sbit ledOne =P3^7; //根据电路图指定引脚
sbit ledTwo =P3^6;
sbit key1   =P2^1;
sbit key2   =P2^0;

void main()
{
    while(1)
    {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           ledOne=0; //灯亮,给一个P3.7低电平
           ledTwo=0;
       }    
       if(key2==0)
       {
           ledOne=1; //灯灭,给一个P3.7低电平
           ledTwo=1;
       }           
    }         
}

3.2软件消抖

软件消抖:为了防止开发板遭遇抖动导致灯亮灭(不是人为导致的);这里用延时,更科学的方法应该是用定时器。

#include "reg52.h"
#include "intrins.h"

sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1   =P2^1;
sbit key2   =P2^0;

void Delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}


void main()
{
    while(1)
   {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key1==0)
           {    
              ledOne=0; //灯亮,给一个P3.7低电平
           }   
       }    
       if(key2==0)
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key2==0)
           {    
             ledOne=1; //灯灭,给一个P3.7低电平
           }   
           
       }           
    }         
}

3.3IO口翻转(有一些代码会这么写)

#include "reg52.h"
#include "intrins.h"

sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1   =P2^1;
sbit key2   =P2^0;

void Delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}


void main()
{
    ledOne=1;
    
    while(1)
   {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key1==0)
           {    
              ledOne=!ledOne; //灯亮,给一个P3.7低电平(取反,也可以叫IO口状态翻转)
           }   
       }    
       if(key2==0)
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key2==0)
           {    
             ledOne=1; //灯灭,给一个P3.7低电平
           }   
           
       }           
    }         
}

3.4.记录状态位点灯

状态位的作用是:当按键被按下时,不着急点灯,在这里记下状态,在别的地方点灯;当业务比较复杂时,可以在当下记下状态,在别的地方实现;

#define的作用主要是让没有意义的数据变得有意义,让代码的可读性更好。

#include "reg52.h"
#include "intrins.h"

#define off_status 0 
#define on_status  1 

sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1   =P2^1;
sbit key2   =P2^0;

void Delay500us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 227;
	while (--i);
}


void main()
{
    int ledMark=off_status;
    
    ledOne=1;
    
    while(1)
   {    
       if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key1==0)
           {    
              ledMark=on_status;//当按键被按下,记录状态位在别的地方点灯,适用与业务场景复杂;
           }   
       }    
       if(key2==0)
       {
           Delay500us();//这里延时一下,防止意外抖动,软件消抖
           if(key2==0)
           {    
            ledMark=off_status;
           }   
           
       }

       if(ledMark==on_status)
       {
           ledOne=0;
       }
       else
       {
           ledOne=1;
       }           
    }         
}

4.震动传感器点灯

原理:当输出低电平的时候,震动,点亮灯

#include "reg52.h"
#include<intrins.h>

sbit led1=P3^7;
sbit virbrate=P3^3;

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
   while(1)
   {
      if(virbrate==0) //模块说明,D0输出低电平震动
      {
          led1=0;
          Delay2000ms();
          led1=1;
      }          
      else
      {
          led1=1;
      }    
   }       

}

5.震动控制继电器

继电器:电子开关

#include "reg52.h"
#include<intrins.h>

sbit switcher=P1^1;
sbit vibrate = P3^3;

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


void main()
{
   while(1)
   {
      if(vibrate==0) //模块说明,D0输出低电平震动
      {
          switcher=0;//当发生震动适合,导通继电器,给继电器IN一个低电平
          Delay2000ms();
          switcher=1;//高电平,继电器N0和COM不通
      }          
      else
      {
          switcher=1;
      }    
   }       

}

6.按键控制继电器开关

#include "reg52.h"
#include<intrins.h>

sbit key1     =P2^1;
sbit key2     =P2^0;
sbit switcher =P1^1;

void main()
{
   while(1)
   {
      if(key1==0) //模块说明,D0输出低电平震动
      {
          switcher=0;//当发生震动适合,导通继电器,给继电器IN一个低电平
      }          
      if(key2==0)
      {
          switcher=1;
      }    
   }       

}

7.433M控制继电器开关

按下A按键,继电器亮;按下B按键,继电器灭;

#include "reg52.h"
#include<intrins.h>

sbit D0_ON    =P1^2;
sbit D1_OFF   =P1^3;
sbit switcher =P1^1;

void main()
{
   //查询方式哪个按键被按下 
   while(1)
   {
      if(D0_ON==1) //收到遥控信号A,D0表现为高电平
      {
          switcher=0;//A被按下,我们导通继电器,给继电器IN一个低电平
      }          
      if(D1_OFF==1)//收到遥控信号C,D1表现为高电平
      {
          switcher=1;//B被按下,我们不导通继电器,给继电器IN一个高电平
      }    
   }       

}

8.电动车简易报警器

硬件模块:51单片机,震动传感器,喇叭,继电器,433M模块

#include "reg52.h"
#include<intrins.h>

#define J_ON 1
#define J_OFF 0
sbit switcher = P1^0;
sbit D0_ON = P1^1;
sbit D1_OFF = P1^2;
sbit vibrate = P1^3;

void Delay2000ms() //@11.0592MHz
{
        unsigned char i, j, k;
        _nop_();
        i = 15;
        j = 2;
        k = 235;
        do
        {
        do
        {
        while (--k);
        } while (--j);
        } while (--i);
}
void Delay500ms() //@11.0592MHz
{
    unsigned char i, j, k;
    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
    do
    {
    while (--k);
    } while (--j);
    } while (--i);
}
void main()
{
    int mark = J_OFF;
    while(1)
    {
        //1. 如果a按键被按下,设定为开启警报模式
        if(D0_ON == 1){
        //长响,表示进入警报模式
        switcher = 0;
        Delay2000ms();
        switcher = 1;
        //设定警报模式标记
        mark = J_ON ;
    }
    //2. 如果b按键被按按下,设定为关闭警报模式
    if(D1_OFF == 1){
        //短响,表示进入解除警报模式
        switcher = 0;
        Delay500ms();
        switcher = 1;
        //设定警报解除模式标记
        mark = J_OFF ;
    }
    //3. 如果标记是在警报模式下
    if(mark == J_ON){
            //3.1 如果发生了震动
            if(vibrate == 0){
            //喇叭响,给继电器低电平,导通
            switcher = 0;
            }//3.2 如果不发生震动
            else{
            //喇叭不响,给继电器高电平,不导通
            switcher = 1;
            }
        }
    }
}
相关推荐
1101 110119 分钟前
STM32-笔记12-实现SysTick模拟多线程流水灯
笔记·stm32·嵌入式硬件
思为无线NiceRF2 小时前
新品:SA628F39大功率全双工音频传输模块
单片机·嵌入式硬件·音视频
沐欣工作室_lvyiyi7 小时前
基于单片机的蓄电池内阻检测系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·智能家居
电子绿洲7 小时前
三极管恒流源电路
stm32·单片机·嵌入式硬件·硬件工程·信息与通信·智能硬件
新手嵌入式学习7 小时前
单片机理论基础
单片机·嵌入式硬件
柘木木7 小时前
STM32使用UART发送字符串与printf输出重定向
stm32·单片机·嵌入式硬件
皮皮黄-机电工程师7 小时前
第一节:电路连接【51单片机-L298N-步进电机教程】
51单片机·步进电机·l298n
不能只会打代码9 小时前
32单片机从入门到精通之硬件架构——内核与外设(一)
单片机·嵌入式硬件·硬件架构
陌夏微秋11 小时前
STM32单片机芯片与内部47 STM32 CAN内部架构 介绍
数据库·stm32·单片机·嵌入式硬件·架构·信息与通信
上海易硅智能科技局有限公司1 天前
AG32 MCU 的电机控制方案
单片机·嵌入式硬件