多种模式下-IO输入读取和输出控制

发布时间:2023年12月20日

目录

一、使用外部中断LED灯亮灭控制

1、原理图如下

2、实物图接线

3、功能和代码

(1)功能

(2)代码:使用一个按钮控制Led亮灭

(3)代码:使用两个按钮控制Led亮灭

二、使用外部中断LED流水灯控制

1、线路图

2、功能和代码

(1)功能

(2)测试效果

(3)代码

三、LED呼吸灯控制

1、线路图

2、功能和代码

(1)功能

(2)测试效果

(3)代码

?四、使用串口通信对IO输出进行控制

1、线路图

2、功能和代码

(1)功能

(2)代码

(3)测试效果

五、Udp网络对IO输出控制

1、硬件

2、代码


一、使用外部中断LED灯亮灭控制

使用按钮输入信号,控制Led灯输出

1、原理图如下

输入信号为低电平、按钮上升沿信号有效。

输出控制Led为低电平输出,led灯点亮。

2、实物图接线

3、功能和代码

(1)功能

①代码1:

按钮1按下一次,三个Led灯全部点亮。按钮1再次按下,三个Led全部熄灭。

②代码2:

按钮1按下,三个Led灯全部点亮。

按钮2按下,三个Led灯全部熄灭。

(2)代码:使用一个按钮控制Led亮灭

bool state = true;

//定义Led灯引脚
const int redLed=10;
const int greenLed=11;
const int yellowLed=12;

void setup() 
{
  Serial.begin(9600);  
  //attachInterrupt(0,StateChange,FALLING);     //外部中断0,对应输入的引脚2。下降沿触发。StateChange:中断函数 
  attachInterrupt(0,StateChange,RISING);        //外部中断0,对应输入的引脚2。上升沿触发。StateChange:中断函数 
  //设置中断引脚2为上拉输入模式,                      普通的输入:INPUT            
  pinMode(2,INPUT_PULLUP);
  
  //设置IO口为输出模式
  pinMode(redLed,OUTPUT); 
  pinMode(greenLed,OUTPUT); 
  pinMode(yellowLed,OUTPUT);
  //IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。
  digitalWrite(redLed,LOW);
  digitalWrite(greenLed,LOW);
  digitalWrite(yellowLed,LOW);
}

void loop() 
{
    if(state)
    {
      digitalWrite(redLed,LOW);
      digitalWrite(greenLed,LOW);
      digitalWrite(yellowLed,LOW);           
    }
    else
    {
      digitalWrite(redLed,HIGH);
      digitalWrite(greenLed,HIGH);
      digitalWrite(yellowLed,HIGH);
    }    
}

//中断函数
void StateChange()
{
  state= !state;
}

(3)代码:使用两个按钮控制Led亮灭

bool state = true;

//定义Led灯引脚
const int redLed=10;
const int greenLed=11;
const int yellowLed=12;

void setup() 
{
  Serial.begin(9600);  
  attachInterrupt(0,RStateChange,RISING);    //外部中断0,对应输入的引脚2。上升沿触发。对应中断函数:StateChange()
  attachInterrupt(1,BStateChange,RISING);    //外部中断1,对应输入的引脚3。上升沿触发。对应中断函数:BStateChange()

  //设置中断引脚2、3为上拉输入模式,                普通的输入:INPUT     
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);

  //设置IO口为输出模式
  pinMode(redLed,OUTPUT); 
  pinMode(greenLed,OUTPUT); 
  pinMode(yellowLed,OUTPUT);
  //IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。
  digitalWrite(redLed,LOW);
  digitalWrite(greenLed,LOW);
  digitalWrite(yellowLed,LOW);
}

void loop() 
{
    if(state)
    {
      digitalWrite(redLed,LOW);
      digitalWrite(greenLed,LOW);
      digitalWrite(yellowLed,LOW);           
    }
    else
    {
      digitalWrite(redLed,HIGH);
      digitalWrite(greenLed,HIGH);
      digitalWrite(yellowLed,HIGH);
    }    
}

//外部中断0函数
void RStateChange()
{  
  state = false;
}
//外部中断1函数
void BStateChange()
{
  state = true;   
}

二、使用外部中断LED流水灯控制

1、线路图

硬件和线路连接和上面相同。

2、功能和代码

(1)功能

按钮1按下,三个Led灯间隔500毫秒依次亮灭。

按钮2按下,三个Led灯全部熄灭。

(2)测试效果

(3)代码

bool state = true;

//定义Led灯引脚
const int redLed=10;
const int greenLed=11;
const int yellowLed=12;

void setup() 
{
  Serial.begin(9600);  
  attachInterrupt(0,RStateChange,RISING);    //外部中断0,对应输入的引脚2。上升沿触发。对应中断函数:StateChange()
  attachInterrupt(1,BStateChange,RISING);    //外部中断1,对应输入的引脚3。上升沿触发。对应中断函数:BStateChange()

  //设置中断引脚2、3为上拉输入模式,                普通的输入:INPUT     
  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);

  //设置IO口为输出模式
  pinMode(redLed,OUTPUT); 
  pinMode(greenLed,OUTPUT); 
  pinMode(yellowLed,OUTPUT);
  //IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。
  digitalWrite(redLed,LOW);
  digitalWrite(greenLed,LOW);
  digitalWrite(yellowLed,LOW);
}

void loop() 
{
    if(state)
    {
      digitalWrite(redLed,LOW);
      digitalWrite(greenLed,LOW);
      digitalWrite(yellowLed,LOW);           
    }
    else
    {
      for(int i=10;i<13;i++)
      {
        digitalWrite(i,HIGH);
        delay(500);
        digitalWrite(i,LOW);
      }
      /*
      digitalWrite(redLed,HIGH);
      digitalWrite(greenLed,HIGH);
      digitalWrite(yellowLed,HIGH);
      */
    }    
}

//外部中断0函数
void RStateChange()
{  
  state = false;
}
//外部中断1函数
void BStateChange()
{
  state = true;   
}

三、LED呼吸灯控制

1、线路图

硬件和线路连接和上面相同。

2、功能和代码

(1)功能

单片机上电后,三个Led灯由熄灭状态慢慢变亮、然后再慢慢变暗至熄灭状态。

(2)测试效果

(3)代码


//定义Led灯引脚
const int redLed=10;
const int greenLed=11;
const int yellowLed=12;

void setup() 
{
  Serial.begin(9600);  

  //设置IO口为输出模式
  pinMode(redLed,OUTPUT); 
  pinMode(greenLed,OUTPUT); 
  pinMode(yellowLed,OUTPUT);
}

void loop() 
{
  for(int i = 0;i <= 255;i++)
  {
    analogWrite(redLed,i);
    analogWrite(greenLed,i);
    analogWrite(yellowLed,i);
    delay(10);
    if(i>=255)
    {
      //delay(1000);
    }
  }
  for(int i = 255;i >= 0; i--)
  {
    analogWrite(redLed,i);
    analogWrite(greenLed,i);
    analogWrite(yellowLed,i);
    delay(10);
    if(i<=0)
    {
      delay(1000);
    }
  }

}




?四、使用串口通信对IO输出进行控制

1、线路图

硬件和线路连接和上面相同。

2、功能和代码

(1)功能

①发送字符‘a’,Led点亮。

②发送字符‘b’,Led熄灭。

(2)代码


//定义Led灯引脚
const int redLed=10;
const int greenLed=11;
const int yellowLed=12;

void setup() 
{
  Serial.begin(9600);
  //设置IO口为输出模式
  pinMode(redLed,OUTPUT); 
  pinMode(greenLed,OUTPUT); 
  pinMode(yellowLed,OUTPUT);
  //IO口初始输出低电平。Led灯正极接IO口,即输出高电平点亮。
  digitalWrite(redLed,LOW);
  digitalWrite(greenLed,LOW);
  digitalWrite(yellowLed,LOW);

}

void loop() 
{
  if(Serial.available()>0)
  {
    char ch=Serial.read();
    Serial.print("Serial Recive: ");
    Serial.print(ch);
    Serial.println(" ;");
    if(ch=='a')
    {
      for(int i=10;i<13;i++)
      {
        digitalWrite(i,HIGH);
      }
      Serial.println("Turn On Success");
    }
    if(ch=='b')
    {
      for(int i=10;i<13;i++)
      {
        digitalWrite(i,LOW);
      }
      Serial.println("Turn Off Success");
    }
  }

}

(3)测试效果

开灯效果(注意看面包板上的三个LED灯)

关灯效果(注意看面包板上的三个LED灯)

五、Udp网络对IO输出控制

1、硬件

单片机:Arduino MEGA

网络模块:W5500网口模块

具体介绍:Arduino中以太网Udp通信-CSDN博客

2、代码

#include <string.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

const int LED=3;
char ledOpen[]="led_open";
char ledClose[]="led_close";

EthernetUDP Udp;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];  // 用于保存读取的Udp数据包的缓冲区
char ReplyBuffer[] = "Received,Over";        // 本机Udp给发送信息的Udp发送字符串

//定义单片机本地Mac、IP地址和端口号
byte localMac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress localIp(192, 168, 1, 177);
unsigned int localPort = 9999;

// 初始化程序,执行一次
void setup() 
{ 
    //
    pinMode(LED,OUTPUT);
    //   
    Ethernet.begin(localMac, localIp);
    // 打开串口
    Serial.begin(9600);
    while (!Serial) 
    {
        ; //等待串口连接。仅本机USB口使用。
    }
    // 检查以太网硬件情况
    if (Ethernet.hardwareStatus() == EthernetNoHardware)  //检查W5500模块是否存在
    {
        Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
        while (true) 
        {
          delay(1); // do nothing, no point running without Ethernet hardware
        }
    }    
    
    if (Ethernet.linkStatus() == LinkOFF)                 //检查网口是否连接
    {
      Serial.println("Ethernet cable is not connected.");
    }  

    // 启动UDP
    Udp.begin(localPort);

    //
    digitalWrite(LED, HIGH);
}

//循环运行程序
void loop() 
{
    int packetSize = Udp.parsePacket();   //Udp接收到的数据长度
    if(packetSize>0)
    {
        Serial.print("Received packet of size ");       
        Serial.println(packetSize);                     //串口打印,Udp接收到的数据长度
        
        Serial.print("From ");
        IPAddress remote = Udp.remoteIP();              //串口打印,发送消息Udp的ip地址、端口号
        for (int i=0; i < 4; i++)                       //ip地址
        {
            Serial.print(remote[i], DEC);
            if (i < 3) 
            {
                Serial.print(".");
            }
        }
        Serial.print(", port ");      
        Serial.println(Udp.remotePort());               //端口号

        // 将Udp接收到的消息,通过串口打印出来
        Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); //Udp接收到的字符串消息
        Serial.println("Contents:");
        Serial.println(packetBuffer);

        //本机给发送消息的Udp机器发送消息
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.write(ReplyBuffer);
        Udp.endPacket();  

        if(strcmp(ledOpen, packetBuffer)==0)
        {
          digitalWrite(LED, LOW);
        }
        else
        {
          digitalWrite(LED, HIGH);
        }
        
    }
    delay(10);  
}

文章来源:https://blog.csdn.net/panjinliang066333/article/details/135090338
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。