普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 749|回复: 0

51串口无法收发字符串

[复制链接]

1

主题

1

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-11-9 11:10:48 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ruirui 于 2023-11-9 11:13 编辑
  1. #include <reg51.h>

  2. // 定义串口相关参数
  3. #define BAUD_RATE 9600   // 波特率
  4. #define T1_PRESCALER 3   // T1定时器的分频系数

  5. // 定义指令和对应数据
  6. #define CMD_1 0x01
  7. #define CMD_2 0x02

  8. unsigned char receivedData = 0;   // 接收到的数据

  9. void initUART() {
  10.   // 设置 T1 定时器工作模式为 8位自动重装模式
  11.   TMOD &= 0xF0;
  12.   TMOD |= 0x20;
  13.   
  14.   // 设置 T1 定时器的初值和分频系数
  15.   TH1 = -(256 - (11059200UL / BAUD_RATE / 12 / (1 << T1_PRESCALER)));
  16.   
  17.   // 启用 T1 定时器
  18.   TCON |= 0x40;
  19.   
  20.   // 设置串口工作模式为 8 位可变波特率模式,并启用接收
  21.   SCON = 0x50;
  22.   
  23.   // 允许串口中断
  24.   ES = 1;
  25.   
  26.   // 开启总中断
  27.   EA = 1;
  28. }

  29. void sendByte(unsigned char byte) {
  30.   // 等待发送缓冲区为空
  31.   while (!TI);
  32.   
  33.   // 发送一个字节
  34.   SBUF = byte;
  35.   
  36.   // 清除发送完成标志
  37.   TI = 0;
  38. }

  39. // 串口接收中断处理函数
  40. void UART_ISR() interrupt 4 {
  41.   // 接收完成
  42.   if (RI) {
  43.     receivedData = SBUF;
  44.     RI = 0;
  45.    
  46.     // 根据接收到的指令返回不同数据
  47.     switch (receivedData) {
  48.       case CMD_1:
  49.         sendByte(0xAA);   // 返回数据1
  50.         break;
  51.         
  52.       case CMD_2:
  53.         sendByte(0xBB);   // 返回数据2
  54.         break;
  55.         
  56.       default:
  57.         sendByte(0xFF);   // 无效指令,返回数据3
  58.         break;
  59.     }
  60.   }
  61. }

  62. void main() {
  63.   initUART();   // 初始化串口
  64.   
  65.   while (1) {
  66.     // 程序主体
  67.   }
  68. }
复制代码

为什么在Proteus 里面,用串口给单片机发送指令后,无法在串口助手接收到返回的指定数据。






#include <reg51.h>// 定义串口相关参数#define BAUD_RATE 9600   // 波特率#define T1_PRESCALER 3   // T1定时器的分频系数// 定义指令和对应数据#define CMD_1 0x01#define CMD_2 0x02unsigned char receivedData = 0;   // 接收到的数据void initUART() {  // 设置 T1 定时器工作模式为 8位自动重装模式  TMOD &= 0xF0;  TMOD |= 0x20;    // 设置 T1 定时器的初值和分频系数  TH1 = -(256 - (11059200UL / BAUD_RATE / 12 / (1 << T1_PRESCALER)));    // 启用 T1 定时器  TCON |= 0x40;    // 设置串口工作模式为 8 位可变波特率模式,并启用接收  SCON = 0x50;    // 允许串口中断  ES = 1;    // 开启总中断  EA = 1;}void sendByte(unsigned char byte) {  // 等待发送缓冲区为空  while (!TI);    // 发送一个字节  SBUF = byte;    // 清除发送完成标志  TI = 0;}// 串口接收中断处理函数void UART_ISR() interrupt 4 {  // 接收完成  if (RI) {    receivedData = SBUF;    RI = 0;        // 根据接收到的指令返回不同数据    switch (receivedData) {      case CMD_1:        sendByte(0xAA);   // 返回数据1        break;              case CMD_2:        sendByte(0xBB);   // 返回数据2        break;              default:        sendByte(0xFF);   // 无效指令,返回数据3        break;    }  }}void main() {  initUART();   // 初始化串口    while (1) {    // 程序主体  }}

我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有0人回答

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-5-7 13:21 , Processed in 0.102405 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表