目录
一、使用外部中断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为低电平输出,led灯点亮。
①代码1:
按钮1按下一次,三个Led灯全部点亮。按钮1再次按下,三个Led全部熄灭。
②代码2:
按钮1按下,三个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;
}
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;
}
硬件和线路连接和上面相同。
按钮1按下,三个Led灯间隔500毫秒依次亮灭。
按钮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,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灯由熄灭状态慢慢变亮、然后再慢慢变暗至熄灭状态。
//定义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);
}
}
}
硬件和线路连接和上面相同。
①发送字符‘a’,Led点亮。
②发送字符‘b’,Led熄灭。
//定义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");
}
}
}
开灯效果(注意看面包板上的三个LED灯)
关灯效果(注意看面包板上的三个LED灯)
单片机:Arduino MEGA
网络模块:W5500网口模块
具体介绍:Arduino中以太网Udp通信-CSDN博客
#include
#include
#include
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);
}