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;
            }
        }
    }
}
相关推荐
良许Linux36 分钟前
32岁入行STM32迟吗?
stm32·单片机·嵌入式硬件
m0_466607701 小时前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang5 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭5 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记9 天前
MCU编程
单片机·嵌入式硬件
Python小老六9 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit9 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习
HX科技10 天前
STM32给FPGA的外挂FLASH进行升级
stm32·嵌入式硬件·fpga开发·flash·fpga升级
Li Zi10 天前
STM32 ADC(DMA)双缓冲采集+串口USART(DMA)直接传输12位原始数据到上位机显示并保存WAV格式音频文件 收藏住绝对实用!!!
经验分享·stm32·单片机·嵌入式硬件
damo王10 天前
Zephyr 系统深入解析:SoC 支持包结构与中断调度器调优实践
单片机·嵌入式硬件·zephyr