找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1144|回复: 6
收起左侧

单片机串口程序,不清楚为什么出错

[复制链接]
ID:1096616 发表于 2023-10-28 17:00 | 显示全部楼层 |阅读模式
这也是一次单片机练习,我是根据课上讲的仿照写的,但是出错了,不清楚出错点,请各位大佬给指点指点。

要求:计算机发送数据0x00~0x0F,一次发送一个数据,单片机接收后在1位共阳数码管上显示,并返回计算机一个信息,例如接收到0x00,返回一个0x80,接收0x01,返回0x81

单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char//宏定义非整型字符
#define uint unsigned int//宏定义整型字符
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管0~16段码
uchar code sendbuf[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
0x8A,0x8B,0x8C,0x8D,0X8E,0X8F};//单片机返回数字
uchar dat;
void delay(uint a);
void uart();
void send(uchar byte);
/****主函数*****/
void main()
{   uart();
   while(1);
}
/*****串口方式初始化*******/
void uart()
{  SCON=0x50;//串口方式一,允许接收
    PCON=0x80; //波特率加倍
    TMOD=0x20; //T1定时方式2
    TH1=0xf3;
    TL1=0xf3;//4800b/s
    TR1=1;
    ES=1;
    EA=1;
}
/******中断服务函数*****/
void rf()interrupt 4
{      RI=0;
       dat=SBUF;
       switch(dat)
       {case 0x00: SBUF=sendbuf[0]; P2=seg[0];break;
       case 0x01: SBUF=sendbuf[1]; P2=seg[1];break;
       default:break;
       }
        
}
回复

使用道具 举报

ID:883242 发表于 2023-10-28 18:44 | 显示全部楼层
哪里出错了?是编译失败,还是执行错误,你不讲清楚是不行的。
回复

使用道具 举报

ID:1096616 发表于 2023-10-28 18:56 | 显示全部楼层
Hephaestus 发表于 2023-10-28 18:44
哪里出错了?是编译失败,还是执行错误,你不讲清楚是不行的。

抱歉,是我没有形容准确,是没有反馈,这个目的是希望输出00,然后就返回80,接着数码管灯亮,但现在在串口调试助手发送00,没有返回值80,数码管也不亮。
屏幕截图 2023-10-28 185553.png
回复

使用道具 举报

ID:213173 发表于 2023-10-28 21:19 | 显示全部楼层
  1. #include<reg52.h>
  2. #define uchar unsigned char//宏定义非整型字符
  3. #define uint unsigned int//宏定义整型字符
  4. uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管0~16段码
  5. uchar code sendbuf[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
  6. 0x8A,0x8B,0x8C,0x8D,0X8E,0X8F};//单片机返回数字
  7. uchar dat;
  8. bit busy;
  9. bit flag;
  10. //void delay(uint a);
  11. void uart();
  12. void send(uchar byte);

  13. /****主函数*****/
  14. void main()
  15. {
  16.         uart();
  17.         while(1)
  18.         {
  19.                 if(flag)
  20.                 {
  21.                         flag=0;
  22.                         switch(dat)
  23.                         {
  24.                                 case 0x00: P2=seg[0]; break;
  25.                                 case 0x01: P2=seg[1]; break;
  26.                                 default:break;
  27.                         }
  28.                         while(busy);
  29.                         busy = 1;
  30.                         SBUF = sendbuf[dat];
  31.                 }
  32.         }
  33. }
  34. /*****串口方式初始化*******/
  35. void uart()
  36. {
  37.         SCON=0x50;//串口方式一,允许接收
  38.         PCON=0x80; //波特率加倍
  39.         TMOD=0x20; //T1定时方式2
  40.         TH1=0xf3;
  41.         TL1=0xf3;//4800b/s
  42.         TR1=1;
  43.         ES=1;
  44.         EA=1;
  45. }
  46. /******中断服务函数*****/
  47. void rf()interrupt 4
  48. {
  49.         if (TI)
  50.         {
  51.                 TI = 0;
  52.                 busy = 0;
  53.         }
  54.         if (RI)
  55.         {
  56.                 RI = 0;
  57.                 dat = SBUF;
  58.                 flag=1;
  59.         }
  60. }
复制代码
回复

使用道具 举报

ID:1096616 发表于 2023-10-29 08:36 | 显示全部楼层

我刚刚尝试了你的方法,虽然是有返回值,但是返回值不对,而且数码管也没有亮起来。
屏幕截图 2023-10-29 083402.png
屏幕截图 2023-10-29 083425.png
回复

使用道具 举报

ID:213173 发表于 2023-10-29 10:52 | 显示全部楼层
深层次 发表于 2023-10-29 08:36
我刚刚尝试了你的方法,虽然是有返回值,但是返回值不对,而且数码管也没有亮起来。

无标题.jpg
回复

使用道具 举报

ID:1096616 发表于 2023-10-29 16:34 | 显示全部楼层

我明白我的错误在哪里了,在串口调试助手处我应该选择16进制发送的,这样子就可以得到正确的返回值,谢谢大佬
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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