找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 976|回复: 9
收起左侧

两个51单片机串口通信程序遇到的疑惑

[复制链接]
ID:1008259 发表于 2023-6-5 17:29 | 显示全部楼层 |阅读模式
大家好最近学习单片机串口通信,教材给出的例子是一个数字密码(935467)从甲传递给乙,再显示到数码管上。但通过Proteus仿真,一直显示“8.8.8.8.8.8”,看不出问题在哪里。
发送端代码如下:
  1. //程序:ex6_1.c
  2. //功能:甲机发送数据程序,采用查询方式实现
  3. #include <reg51.h>  //包含头文件reg51.h,定义51单片机的专用寄存器
  4. void main()                        //主函数
  5. {
  6.   unsigned char i;
  7. unsigned char send[]={9,3,5,4,6,7};  //定义要发送的动态密码数据
  8.         TMOD=0x20;        //定时器T1工作于方式2
  9.         TL1=0xf4;         //波特率为2400bps
  10.         TH1=0xf4;
  11.         TR1=1;        
  12.         SCON=0x40;        //定义串行口工作于方式1
  13.     for (i=0;i<6;i++)
  14.     {
  15.             SBUF=send[i];     // 发送第i个数据
  16.             while(TI==0);     // 查询等待发送是否完成
  17.             TI=0;                  // 发送完成,TI由软件清0
  18.         }
  19.     while(1);
  20. }
复制代码


接收端代码如下:
  1. //程序:ex6_2.c
  2. //功能:乙机接收及显示程序,采用查询方式实现,采用中断方式实现的程序参见
  3.       //6.3节中的ex6_5.c程序
  4. #include <reg51.h>     //包含头文件reg51.h,定义51单片机的专用寄存器
  5. code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6.                                                 //定义0~9共阳极显示字型码
  7. unsigned char buffer[]={0x00,0x00,0x00,0x00,0x00,0x00};//定义接收数据缓冲区
  8. void disp(void);    //显示函数声明
  9. void main()                        //主函数
  10. {
  11.     unsigned char i;
  12.         TMOD=0x20;      //定时器T1工作于方式2
  13.         TL1=0xf4;       //波特率定义
  14.         TH1=0xf4;
  15.         TR1=1;
  16.     SCON=0x40;      //定义串行口工作于方式1
  17.     REN=1;                 //接收允许
  18.     for(i=0;i<6;i++)
  19.     {
  20.              while(RI==0);                           //查询等待,RI为1时,表示接收到数据
  21.              buffer[i]=SBUF;                         //接收数据
  22.              RI=0;                                            //RI由软件清0
  23.     }
  24.     for(;;) disp();                                //显示接收数据
  25. }
  26. //函数名:disp
  27. //函数功能:在6个LED上显示buffer中的6个数
  28. //入口参数:无
  29. //出口参数:无
  30. void disp()
  31. {
  32.    unsigned char w,i,j;
  33.    w=0x01;              //位码赋初值
  34.    for(i=0;i<6;i++)
  35.    {
  36.      P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
  37.      P2=~w;             // 送反相后的位码
  38.      for(j=0;j<100;j++);// 显示延时
  39.      w<<=1;                     // w左移一位
  40.    }
  41. }
复制代码


因为乙的P2引脚电平一直没有变化,怀疑是延时和串口通信冲突,又重新加载了接收端为中断机制的程序:
  1. //程序:ex6_5.c
复制代码

奇怪的是,仿真结果成了这样,各位均为短横"-":
1.png

P2电平状态能正常切换,但字形依然不能正常显示,似乎并没有数据从甲成功传递。

各位大佬有知道的请指点一下,不胜感谢!

仿真程序.7z (22.31 KB, 下载次数: 5)
回复

使用道具 举报

ID:235200 发表于 2023-6-6 01:05 | 显示全部楼层
P2口输出经过了反相器74LS04,所以在程序中的P1和P2输出刚好反好,应该为
P1=~tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
     P2=w;             // 送反相后的位码
另外仿真时,数码管显示未消影,所以最终要把程序改成如下就对了:
P1=0;
P1=~tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
P2=w;             // 送反相后的位码
回复

使用道具 举报

ID:213173 发表于 2023-6-6 10:21 | 显示全部楼层
void disp()
{
        unsigned char w,i,j;
        w=0x01;                //位码赋初值
        for(i=0;i<6;i++)
        {
                P2=0xff;           // 消隐
                P1=tab[buffer[i]]; // 送共阳极显示字型段码,buffer[i]作为数组分量的下标
                P2=~w;             // 送反相后的位码
                for(j=0;j<100;j++);// 显示延时
                w<<=1;             // w左移一位
        }
}
回复

使用道具 举报

ID:1008259 发表于 2023-6-7 00:41 | 显示全部楼层
多谢楼上的回复,但似乎不是消隐的问题。
回复

使用道具 举报

ID:213173 发表于 2023-6-7 07:03 | 显示全部楼层
Intel2006 发表于 2023-6-7 00:41
多谢楼上的回复,但似乎不是消隐的问题。

消隐是问题之一,从你的图片看明显是数码管用错了,要用共阳。
回复

使用道具 举报

ID:213173 发表于 2023-6-7 07:04 | 显示全部楼层
Intel2006 发表于 2023-6-7 00:41
多谢楼上的回复,但似乎不是消隐的问题。

无标题.jpg
回复

使用道具 举报

ID:1008259 发表于 2023-6-7 08:01 | 显示全部楼层

是的,我昨晚也发现它用的是共阴极了。教材还是国家特等奖,但例程不止这一个有问题。
回复

使用道具 举报

ID:1008259 发表于 2023-6-7 13:15 | 显示全部楼层

多谢,但是我设置了消隐并修改了硬件为7SEG-MPX6-CA之后,显示是6个“0”,还是没解决啊?感觉甲机的数据传送到乙(串口助手可以检测到数据发送),但并没有成功给buffer[]赋值,使得这个数组还是初始化的样子。请问您知道里面的原因吗?
回复

使用道具 举报

ID:213173 发表于 2023-6-7 15:49 | 显示全部楼层
Intel2006 发表于 2023-6-7 13:15
多谢,但是我设置了消隐并修改了硬件为7SEG-MPX6-CA之后,显示是6个“0”,还是没解决啊?感觉甲机的数据 ...

你仔细看一下甲机代码,只在初始化时发送一次,如果乙机还没有准备好,当然收不到,后续也没有信号了。
回复

使用道具 举报

ID:1008259 发表于 2023-6-8 11:03 | 显示全部楼层
wulin 发表于 2023-6-7 15:49
你仔细看一下甲机代码,只在初始化时发送一次,如果乙机还没有准备好,当然收不到,后续也没有信号了。

多谢,我再好好琢磨~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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