PC串行口发送数字信号给板子并在LED上通过二进制显示

本文介绍了一种使用STM32通过串行口接收数字,并在LED上以二进制形式显示的方法。程序中配置了GPIO、USART等相关外设,包括LED输出、按键检测和串口发送功能。
摘要由CSDN通过智能技术生成

以下是程序

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"


#define LED0    GPIO_Pin_8
#define LED1    GPIO_Pin_9
#define LED2    GPIO_Pin_10
#define LED3    GPIO_Pin_11
#define LED4    GPIO_Pin_12
#define LED5    GPIO_Pin_13
#define LED6    GPIO_Pin_14
#define LED7    GPIO_Pin_15
#define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)
#define LED_PORT GPIOC
#define N_LE GPIO_Pin_2
#define N_LE_PORT GPIOD
#define SWN 4 /* 按键数量 */
#define N_K1 GPIO_Pin_0
#define N_K2 GPIO_Pin_8
#define N_K3 GPIO_Pin_1
#define N_K4 GPIO_Pin_2
#define N_K1C GPIOA
#define N_K2C GPIOA
#define N_K3C GPIOB
#define N_K4C GPIOB


#define LED_OUT(x) GPIO_SetBits(LED_PORT,LED_ALL), \
GPIO_ResetBits(LED_PORT, x<<8), \
GPIO_SetBits(N_LE_PORT,N_LE), \
GPIO_ResetBits(N_LE_PORT,N_LE)


typedef enum

FALSE = 0,
  TRUE
}y_bool;
y_bool led_t = TRUE; /* 设置二极管状态标记 */
y_bool key_t = FALSE; /* 设置按键检测标记 */
static y_bool usart_t = FALSE; /* 设置串行口发送标记 */
uint8_t rx_b = 0x00; /* 接收缓冲区 */


/* 配置函数(初始化) */
void init()
{

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较具体的问题,我会尽量给予详细的回答。首先,你需要使用51单片机的串行口,通过串口通信与PC机进行数据的传输。你需要在单片机端写一个串口接收中断程序,用来接收来自PC机的数据。接收到数据后,你需要将其显示在2位数码管上,同时将其转换为二进制并在8个LED灯上显示。这个过程可以通过移位运算实现。最后,你需要将接收到的数据加1,并通过串口发送PC机。 下面是一个简单的代码示例: ```c #include <reg51.h> // 定义数码管和LED灯的连接引脚 sbit DIG1 = P2^0; sbit DIG2 = P2^1; sbit LED0 = P1^0; sbit LED1 = P1^1; sbit LED2 = P1^2; sbit LED3 = P1^3; sbit LED4 = P1^4; sbit LED5 = P1^5; sbit LED6 = P1^6; sbit LED7 = P1^7; // 定义接收数据的变量 unsigned char data_received = 0; // 串口接收中断服务程序 void serial_ISR() interrupt 4 { if (RI) // 判断是否有数据接收 { data_received = SBUF; // 保存接收到的数据 RI = 0; // 清除接收中断标志 } } // 数码管显示函数 void display(unsigned char num) { unsigned char digit[2]; digit[0] = num / 10; // 十位数 digit[1] = num % 10; // 个位数 // 数码管显示 DIG1 = 1; P0 = digit[0]; DIG1 = 0; DIG2 = 1; P0 = digit[1]; DIG2 = 0; } // LED显示函数 void LED_display(unsigned char num) { LED0 = num & 0x01; LED1 = (num >> 1) & 0x01; LED2 = (num >> 2) & 0x01; LED3 = (num >> 3) & 0x01; LED4 = (num >> 4) & 0x01; LED5 = (num >> 5) & 0x01; LED6 = (num >> 6) & 0x01; LED7 = (num >> 7) & 0x01; } void main() { // 初始化串口 TMOD = 0x20; // 定时器1工作在方式2,用于串口通信 TH1 = 0xfd; // 波特率9600 TL1 = 0xfd; SCON = 0x50; // 8位数据,无校验,1位停止位,允许接收 // 初始化中断 EA = 1; // 允许中断 ES = 1; // 允许串口中断 while (1) { display(data_received); // 显示接收到的数据 LED_display(data_received); // 显示接收到的数据的二进制 data_received++; // 数据加1 SBUF = data_received; // 发送数据给PC机 while (!TI); // 等待发送完成 TI = 0; // 清除发送中断标志 } } ``` 需要注意的是,这只是一个简单的示例代码,你需要根据你的具体硬件情况进行修改和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值