找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2122|回复: 10
打印 上一主题 下一主题
收起左侧

51单片机串口接收PC发送的数字显示到数码管程序求助

[复制链接]
跳转到指定楼层
楼主
用的是普中开发板,需求是用串口调试助 发送12345678 显示到数码管上
现在就是只有一位数码管显示,其他的都是空值
在此求大佬教一下

单片机源程序如下:
  1. #include<reg51.h>

  2. typedef unsigned int u16;          //对数据类型进行声明定义
  3. typedef unsigned char u8;


  4. unsigned char buffer[8];
  5. u8 DisplayData[8];

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;


  9. void delay(u16 i)
  10. {
  11.         while(i--);       
  12. }

  13. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  14.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值


  15. void DigDisplay()
  16. {
  17.         u8 i;
  18.         for(i=0;i<8;i++)
  19.         {
  20.                 switch(i)         //位选,选择点亮的数码管,
  21.                 {
  22.                         case(0):
  23.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位
  24.                         case(1):
  25.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  26.                         case(2):
  27.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  28.                         case(3):
  29.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  30.                         case(4):
  31.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  32.                         case(5):
  33.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  34.                         case(6):
  35.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  36.                         case(7):
  37.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位       
  38.                 }
  39.                 P0=smgduan[i];//发送段码
  40.                 delay(100); //间隔一段时间扫描       
  41.                 P0=0x00;//消隐
  42.         }
  43. }


  44. void rs_init()         //串口初始化,波特率设置2400
  45. {

  46.         SCON=0x40;
  47.         PCON=0x00;
  48.         TMOD=0x20;
  49.         TL1=0xf4;//bs
  50.         TH1=0xf4;

  51.         TR1=1;


  52. }





  53. void main()
  54. {
  55.          rs_init();

  56.          REN=1;
  57.          EA=1;
  58.          ES=1;

  59.          while(1){
  60.          
  61.          DigDisplay();
  62.          
  63.          }

  64. }


  65. void serial() interrupt 4
  66. {
  67.         unsigned char i=0;
  68.         EA=0;
  69.         RI=0;
  70.         buffer[i]=smgduan[SBUF];
  71.         i++;
  72.         if(i==8);
  73.         i=0;
  74.         EA=1;

  75. }
复制代码






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2022-11-14 23:24 | 只看该作者
main()呢?while(1)呢?
回复

使用道具 举报

板凳
ID:123289 发表于 2022-11-15 09:11 | 只看该作者
做8个变量:LED1,LED2......LED8。
先学会如何将这8个变量中的数,依序送到LED上显示。
而后再考虑串口接收数据。
这时,只要将收到的数字放到LED1,LED2......LED8中就可以了。
回复

使用道具 举报

地板
ID:77589 发表于 2022-11-15 09:17 | 只看该作者
通过贴出的代码看不出具体问题!!!!
回复

使用道具 举报

5#
ID:1051996 发表于 2022-11-15 15:17 | 只看该作者
代码被吃掉了
回复

使用道具 举报

6#
ID:1051996 发表于 2022-11-15 18:34 | 只看该作者
lkc8210 发表于 2022-11-14 23:24
main()呢?while(1)呢?

重新发了大佬
回复

使用道具 举报

7#
ID:101869 发表于 2022-11-15 19:03 | 只看该作者
EA不可以关闭这是总中断
回复

使用道具 举报

8#
ID:101869 发表于 2022-11-15 19:05 | 只看该作者
我说错了请斑竹删了
回复

使用道具 举报

9#
ID:101869 发表于 2022-11-15 19:07 | 只看该作者
你关闭了总中断,所以接收不到
回复

使用道具 举报

10#
ID:101869 发表于 2022-11-15 19:11 | 只看该作者
这是我经常用的  你改改就行
{
    static u8 rx_step = 0;         //接收中断函数里的步骤变量
    static u8 array_cnt = 0; //接收缓存数组的下标

    if (RI)
    {
        RI=0;
        if (0 == rx_ok_flag) // 1代表已经完成接收了一串新数据,并且禁止接收其它新的数据
        {

            switch (rx_step)
            {
            case 0:                                                  //接头暗号的步骤。判断数据头的步骤。
                rx_buffer[0] =SBUF;          //直接读取刚接收完的一个字节的数据。
                if (0x5a == rx_buffer[0]) //等于数据头0x5a,接头暗号吻合。
                {
                    array_cnt = 1; //接收缓存的下标
                    rx_step = 1;   //切换到下一个步骤,接收其它有效的数据
                }
                break;

            case 1:                                                          //数据类型和长度
                rx_buffer[array_cnt] = SBUF; //直接读取刚接收完的一个字节的数据。
                array_cnt++;                                  //每接收一个字节,数组下标都自加1,为接收下一个数据做准备
                if (array_cnt >= 4)
                {

                    rx_ok_flag = 1; //接收完成标志“置1”,通知主函数处理。
                    rx_step = 0;        //及时切换回接头暗号的步骤
                }
                break;
            }
        }
    }
}
回复

使用道具 举报

11#
ID:883242 发表于 2022-11-15 20:05 | 只看该作者
串口中断里面的那个i必须是static的!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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