首页 > 其他分享 >51单片机有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。

51单片机有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。

时间:2024-06-15 20:30:39浏览次数:22  
标签:定时器 LED 中断 开发板 串口 接收

1、功能描述

有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。

2、实验原理

1.串口通信(UART)

串口通信是一种异步通信方式,它允许单片机通过两条线(发送线TX和接收线RX)进行数据传输。在51单片机中,串口通信是通过两个主要寄存器(SCON、SMO/SM1)和中断(RI、TI)来控制的。

. scON(串行控制寄存器)︰用于设置串口的工作模式。.SMO/SM1(多机通信控制位):用于选择串口的工作模式。

·RI(接收中断标志位)︰当接收到数据时自动置位。

· T(发送中断标志位)︰当数据发送完成后自动置位。

2.定时器作为波特率发生器

波特率,即每秒传输的比特数,是串口通信的重要参数。在51单片机中,可以使用定时器的溢出率来产生波特率。

 TMOD(定时器模式寄存器)︰设置定时器的工作模式。

TH1/TL1(定时器高八位/低八位)︰设置定时器的计数初值,影响定时器溢出的时间间隔。

3.中断系统

51单片机的中断系统允许程序在特定事件发生时自动跳转到特定的服务程序。

· EA(总中断使能位):全局中断使能。. ES(串行中断使能位)︰串口中断使能。

· Rl(接收中断标志位)∶接收到数据时自动置位。

. T(发送中断标志位)︰发送完数据时自动置位。4.按键检测与消抖

在开发板A上,通过检测按键的电平变化来触发数据发送。由于机械按键在按下时可能会产生多次电平跳变(抖动),通常需要消抖处理。

·软件消抖:通过检测按键状态多次并延时,确认按键确实被按下。

5.数据发送与接收

开发板A在检测到按键按下后,将数据(如0x01)通过串口发送出去。开发板B通过串口接收到数据后,根据数据内容控制LED的亮灭。

.SBUF(串行数据缓冲寄存器)︰用于存储待发送或已接收的数据。6.LED控制

在开发板B上,根据接收到的数据来控制LED的状态。这是通过位操作来实现的,即通过改变LED对应的端口位的电平来控制LED的亮灭。

3、编程思路

开发板A(发送端)∶

1.初始化:设置定时器模式和计数初值,启动定时器,配置串口工作模式,启用接收和总中断。

2.按键检测:通过检测按键(P31)的状态,来判断是否被按下。

3.数据发送:如果检测到按键被按下,并且是首次检测到(通过key_state变量控制),则发送数据0x01到开发板B。

4.发送完成:等待发送标志位TI(传输中断标志位)置位,然后清除TI。

开发板B(接收端)∶

1.初始化:与开发板A相同,设置定时器和串口参数。

⒉.接收数据∶在串口接收中断服务程序中,读取接收到的数据并存入recv_data变量。3.LED控制:在主循环中,如果接收到的数据是ox01,则控制LED灯亮灭。

1、定时器初始化:设置定时器1为8位自动重装方式(方式2),并设置计数初值,以产生所需的波特率。

2.串口配置:设置串口为模式1(可变波特率),并启动接收功能。

3.中断配置:开启总中断和串口中断,以响应按键和串口接收事件。

4.按键处理:在开发板A上,通过检测按键状态,并在按下时发送数据。

5.数据发送:使用SBUF寄存器发送数据,并等待发送完成。

6.接收中断:在开发板B上,通过串口接收中断服务程序读取数据。

7.LED控制:根据接收到的数据控制LED灯的亮灭状态。

4、代码

开发板A:

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key = P3^1; 
void main() {
    uchar key_state = 0;
    uchar send_data = 0;
    TMOD = 0x20; 
    TH1 = 0xFD; 
    TL1 = TH1;
    TR1 = 1; 
    SM0 = 0; 
    SM1 = 1;
    REN = 1; 
    EA = 1; 
    ES = 1; 
    while (1) {
        if (key == 0) { 
            if (key_state == 0) { 
                key_state = 1;
                send_data = 0x01; 
                SBUF = send_data; 
                while (!TI); 
                TI = 0;
            }
        } else {
            key_state = 0;
        }
    }
}

void serial() interrupt 4 {
    if (RI) {
        RI = 0;
    }
}

开发板B:

#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit led = P2^1; 
void main() {
    uchar recv_data = 0;
TMOD = 0x20;    
TH1 = 0xFD;  
    TL1 = TH1;
    TR1 = 1;
    SM0 = 0; 
    SM1 = 1;
    REN = 1; 
    EA = 1; 
    ES = 1; 
    while (1) {
        if (recv_data == 0x01) { 
            led = ~led;
        }
    }
}

void serial() interrupt 4 {
    if (RI) {
        RI = 0;
        recv_data = SBUF; 
    }
}

标签:定时器,LED,中断,开发板,串口,接收
From: https://blog.csdn.net/ylazzy/article/details/139566092

相关文章

  • 基于单片机的太阳能无线 LED 灯设计
    摘要:文章设计一款太阳能LED灯,经过太阳能给锂电池充电,利用51单片机通过检测电路对整个系统施行管理和监控,可以使用手机和WIFI作为通信工具,利用光敏电阻检测光照,进而控制灯的亮度,天越黑,灯越亮,程序编写构造清晰,应用前景广阔。关键词:单片机......
  • QT210开发板学习(2): 通过DNW点亮LED灯
    查找开发板原理图,可知可用的LED有4个,引脚为EINT0/1/2/3,对应的IO口则是GPH0_0/1/2/3,寄存器有GPH0CON,GPH0DAT,GPH0PUD,GPH0DRVGPH0CON用来设置IO模式(地址为0xE0200C00),GPH0DAT是电平状态(地址为0xE0200C04)我们需要设置为Output模式,并且将状态设置为高电平新......
  • QT210开发板学习(1):SEC S5PC110 Test B/D驱动安装
    把开发板的开关拨到USBBOOT,通过USB线连接到开发板的OTG口,打开板上总电源,会提示驱动安装失败我们需要下载驱动(win7-64-DNW-USB)https://github.com/joyjohn131/QT210/tree/main/1打开dseo13b.exe,依次点击Next,Yes选择"EnableTestMode","Next",提示完成开启选择"SignaS......
  • 嵌入式Linux中的LED驱动控制(基于misc)
    在开发驱动程序的时候,有时希望快速地实现其业务功能,以把精力放在文件接口功能的测试上来。这样,对于常见的一些繁琐而又不能省略的步骤(如设备号的申请、字符设备的注册、设备节点文件的创建等),就希望能尽量地简化。这时,就可以使用Linux内核提供的misc(杂项)来实现。这里仍然使用“嵌......
  • NG32031单片机串口初始化
    目录1.串口基础2.串口配置步骤3.N32G031串口初始化示例3.1开启时钟3.2 配置GPIO3.3 配置USART3.4 使能中断(如果需要)    3.5. 示例代码4.调试和验证5.注意事项6.额外功能NG32G031单片机的串口(UART)通常用于与外部设备或计算机进行串行通信。以下......
  • 编写一个.sh的脚本,然后通过 shell 脚本执行 Makefile 文件并把生成的可执行文件下载到
    要编写一个shell脚本来执行Makefile并下载生成的可执行文件到开发板,你需要确保开发板可以通过某种方式(如SSH、FTP、SCP等)访问。以下是一个简单的shell脚本示例,它使用scp命令将可执行文件从本地机器复制到开发板。假设你的开发板可以通过SSH访问,并且你已经配置了SSH密钥认证,这样你......
  • 设置springboot scheduled多线程,解决多个定时任务并发问题(转载)
    项目上有几个定时任务都是同时间点要执行的,最近发现多个定时任务为单线程排队执行,后来经过查资料发现@schedule注解默认是单线程的,如果定时任务比较多或者有的定时任务比较耗时,会影响到其他定时任务的执行,通过以下方法解决多个定时任务同时并发执行问题。第1种:增加配置类@Configu......
  • 学习日志-C51-串口通信
    学习日志-C51-串口通信串口控制LED灯亮灭1.常见通信串口比较分类1:单工:只能由甲向乙传输信号,一根传输线。半双工:数据可以在双方传输,但同一时刻只能单方传输,发送数据的同时不能接收数据,一根传输线。全双工:数据可以在双方传输,发送数据的同时也能接收数据,需两根传输线。......
  • ubuntu22.04编译openwrt的lede-17.01一些错误的处理方式
    m4c-stack.c:55:26:error:missingbinaryoperatorbeforetoken“(“55|#elifHAVE_LIBSIGSEGV&&解决方法:wgethttps://raw.githubusercontent.com/keyfour/openwrt/2722d51c5cf6a296b8ecf7ae09e46690403a6c3d/tools/m4/patches/011-fix-sigstksz.patch-O......
  • 串口收发UART(Verilog HDL)
    UART(UniversalAsynchronousReceiverTransmitter,通用异步收发器)是一种异步串行通信协议,主要用于计算机和嵌入式系统之间的数据交换。实现UART通信的接口规范和总线标准包括RS-232、RS449、RS423和RS485等,接口标准规定了通信标准的电气特性、传输速率、连接特性和机械特性。文......