标题: 51单片机串口接收PC发送的数字显示到数码管程序求助 [打印本页]

作者: 安和聚聚子    时间: 2022-11-14 23:03
标题: 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. }
复制代码







作者: lkc8210    时间: 2022-11-14 23:24
main()呢?while(1)呢?
作者: yzwzfyz    时间: 2022-11-15 09:11
做8个变量:LED1,LED2......LED8。
先学会如何将这8个变量中的数,依序送到LED上显示。
而后再考虑串口接收数据。
这时,只要将收到的数字放到LED1,LED2......LED8中就可以了。

作者: Longan.Wang    时间: 2022-11-15 09:17
通过贴出的代码看不出具体问题!!!!
作者: 安和聚聚子    时间: 2022-11-15 15:17
代码被吃掉了
作者: 安和聚聚子    时间: 2022-11-15 18:34
lkc8210 发表于 2022-11-14 23:24
main()呢?while(1)呢?

重新发了大佬
作者: 非凡科技    时间: 2022-11-15 19:03
EA不可以关闭这是总中断
作者: 非凡科技    时间: 2022-11-15 19:05
我说错了请斑竹删了
作者: 非凡科技    时间: 2022-11-15 19:07
你关闭了总中断,所以接收不到
作者: 非凡科技    时间: 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;
            }
        }
    }
}
作者: Hephaestus    时间: 2022-11-15 20:05
串口中断里面的那个i必须是static的!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1