单片机课堂思考题-如何用手机控制单片机IO口-如点亮一个LED

本文介绍了一种使用单片机通过WiFi实现远程控制的方法。主要内容包括:建立单片机与手机的WiFi连接,设计控制程序架构,以及具体程序实例。通过此教程,读者将学会如何让单片机接收来自手机的指令,并据此控制LED灯的开关。

主要考察学生思路,常见现象是直接网上查找然后开始刷刷看并写到本子上。

很难了,思考-检索-推荐,在互联网算法的投喂下,大部分已经丧失了独立思考的能力了。

第一步,需要使手机和单片机建立连接,通常手机不用串口连接外设,一般而言适用无线wifi和蓝牙。

第二步,才是构思程序架构,比如控制哪些IO口,如何配置wifi和蓝牙等。

第三步,在设计好程序流程图之后,依据具体芯片特色进行程序设计。

简言之,连通性和控制程序。

参考程序如下:

IO口可以更换为2、4等,依据具体情况适当调整。

#include <WiFi.h>

const char* ssid     = "yourssid";
const char* password = "yourpasswd";

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    pinMode(5, OUTPUT);      // set the LED pin mode

    delay(10);

    // We start by connecting to a WiFi network

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();

}

int value = 0;

void loop(){
 WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> to turn the LED on pin 5 on.<br>");
            client.print("Click <a href=\"/L\">here</a> to turn the LED on pin 5 off.<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(5, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(5, LOW);                // GET /L turns the LED off
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}

连接上WiFi之后,一定要注意查看串口获取单片机wifi的ip地址然后,适用手机或者电脑的浏览器登陆,就可以控制灯亮灭了。

也就是控制IO口输出高低电平。

# 题目重述 基于51单片机的交通灯控制系统,要求实现两个外部中断功能: - 当 `INT0` 按钮按下时,系统进入夜间模式,所有方向的黄灯闪烁; - 当 `INT1` 按钮按下时,系统进入全部红灯模式,所有红灯点亮。 # 详解 以下是使用C语言编写的51单片机程序,实现了上述功能。程序利用外部中断0(INT0)和外部中断1(INT1)来触发不同的工作模式,并通过GPIO控制LED模拟交通灯状态。 ```c #include <reg52.h> // 定义LED连接的IO(假设P1控制灯) sbit NS_Red = P1^0; // 南北红灯 sbit NS_Yellow = P1^1; // 南北黄灯 sbit NS_Green = P1^2; // 南北绿灯 sbit EW_Red = P1^3; // 东西红灯 sbit EW_Yellow = P1^4; // 东西黄灯 sbit EW_Green = P1^5; // 东西绿灯 // 模式标志 bit night_mode = 0; // 夜间模式(黄灯闪烁) bit all_red_mode = 0; // 全部红灯模式 // 函数声明 void Init_Interrupts(); void Delay_ms(unsigned int ms); void main() { // 初始化中断系统 Init_Interrupts(); // 默认初始状态:南北红灯,东西绿灯 NS_Red = 1; NS_Yellow = 0; NS_Green = 0; EW_Red = 0; EW_Yellow = 0; EW_Green = 1; while (1) { // 正常运行逻辑可以在此添加 // 当前仅为等待中断 if (!night_mode && !all_red_mode) { // 可加入正常的红绿灯循环逻辑 } } } // 初始化外部中断 void Init_Interrupts() { IT0 = 1; // 设置INT0为下降沿触发 EX0 = 1; // 使能INT0中断 IT1 = 1; // 设置INT1为下降沿触发 EX1 = 1; // 使能INT1中断 EA = 1; // 开启总中断 } // 延时函数(毫秒级) void Delay_ms(unsigned int ms) { unsigned int i, j; for (i = ms; i > 0; i--) for (j = 110; j > 0; j--); } // 外部中断0服务函数:进入夜间模式(黄灯闪烁) void INT0_ISR() interrupt 0 { unsigned char i; night_mode = 1; all_red_mode = 0; for (i = 0; i < 6; i++) // 闪烁约3秒(每500ms一次) { NS_Yellow = ~NS_Yellow; EW_Yellow = ~EW_Yellow; Delay_ms(500); } // 恢复后仍保持夜间模式开启,直到其他中断打断 // 实际应用中可根据需求调整 } // 外部中断1服务函数:进入全部红灯模式 void INT1_ISR() interrupt 2 { all_red_mode = 1; night_mode = 0; // 关闭所有非红灯 NS_Yellow = 0; NS_Green = 0; EW_Yellow = 0; EW_Green = 0; // 打开所有红灯 NS_Red = 1; EW_Red = 1; } ``` ### 说明: - **中断配置**:`IT0=1`, `IT1=1` 设置为下降沿触发;`EX0/EX1` 启用外部中断;`EA=1` 开启全局中断。 - **中断向量号**: - `INT0` 对应 `interrupt 0` - `INT1` 对应 `interrupt 2` - **黄灯闪烁**:在 `INT0_ISR` 中通过循环翻转黄灯电平实现闪烁效果。 - **全红模式**:`INT1` 触发后强制所有方向亮红灯。 # 知识点(列出该代码中遇到的知识点) - **外部中断配置与响应**:通过设置IT、EX、EA等寄存器启用边沿触发中断,实现异步事件响应。 - **中断服务函数(ISR)**:使用`interrupt`关键字定义ISR,自动保存现场并处理特定事件。 - **IO控制**:利用`sbit`定义特殊功能位,直接操作P1驱动LED模拟交通灯状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangrelay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值