51单片机IO口控制

这篇具有很好参考价值的文章主要介绍了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)]

#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模块文章来源地址https://www.toymoban.com/news/detail-605630.html

#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;
            }
        }
    }
}

到了这里,关于51单片机IO口控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年04月11日
    浏览(14)
  • STM32单片机学习3--STM32控制键盘

    STM32单片机学习3--STM32控制键盘

    单片机型号:STM32F103C8T6 开发环境:Keil5 4种输入模式 上拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为1,高电平(与Vdd相连的为上拉电阻); 下拉输入模式:在默认状态下(GPIO引脚无输入),读取得的GPIO引脚数据为0,低电平(与Vss相连的为下拉电

    2024年02月10日
    浏览(12)
  • 基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

    基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

     功能介绍  以51/STM32单片机作为主控系统;   LCD1602液晶显示当前时间、温湿度、药品重量   3次吃药时间、药品类目和药品数量  HX711压力采集当前药品重量  红外感应当前药盒是否打开  DS1302时钟芯片显示当前年月日、时分秒、星期  DHT11采集当前环境温度和湿度       

    2024年02月19日
    浏览(9)
  • STM32单片机学习4--STM32控制八段码

    STM32单片机学习4--STM32控制八段码

    数码管:实际上是多个LED按照一定顺序排列,并加上遮罩所构成的元件。 八段码一般会引出9个引脚,其中7个引脚显示数字(或某些字母),1个显示小数点,1个作为片选端。 根据连接方式的不同,数码管分为 共阳 和 共阴 。 共阳在这端输出低电平时点亮,高电平时会熄灭

    2024年01月23日
    浏览(13)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(47)
  • 物联网毕设 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    物联网毕设 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月03日
    浏览(15)
  • STM32单片机实现简易声控灯控制

    STM32单片机实现简易声控灯控制

    首先,先分析一下声控灯实现的原理,即当外界发出声音的时候,灯就会被点亮。那是一旦发出声音灯就会被点亮吗?从现时生活中我们可以知道,楼道声控灯并不是只要有声音就会把灯点亮的,当白天光线充足的时候,无论外界有多大的声音,灯都不会被点亮。但是我们知

    2024年02月04日
    浏览(9)
  • 自用纯C语言实现任务调度(可用于STM32、C51等单片机)

    自用纯C语言实现任务调度(可用于STM32、C51等单片机)

      这个任务调度模块的实现是形成于毕设项目中的,用在 STM32 中,断断续续跨度2个月实现了一些基本功能,可能后面再做其他项目时会一点点完善起来,也会多学习相关知识来强化模块的实用性和高效性,毕竟用自己自主实现出来的功能还是蛮舒心的。   整体上的结构

    2023年04月09日
    浏览(12)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(46)
  • 【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

    【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

    本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、HC05蓝牙、DHT11温湿度、PCF8591 ADC模块、光线传感器、28BYJ48步进电机等。 主要功能: 系统运行后,LCD1602显示温湿度和光线强度值和系统模式状态。 系统模式以自动模式运行,当按下K4键切换为手动模式

    2023年04月24日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包