標題: 51單片機串口接收PC發(fā)送的數(shù)字顯示到數(shù)碼管程序求助 [打印本頁]

作者: 安和聚聚子    時間: 2022-11-14 23:03
標題: 51單片機串口接收PC發(fā)送的數(shù)字顯示到數(shù)碼管程序求助
用的是普中開發(fā)板,需求是用串口調(diào)試助 發(fā)送12345678 顯示到數(shù)碼管上
現(xiàn)在就是只有一位數(shù)碼管顯示,其他的都是空值
在此求大佬教一下

單片機源程序如下:
  1. #include<reg51.h>

  2. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  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)         //位選,選擇點亮的數(shù)碼管,
  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];//發(fā)送段碼
  40.                 delay(100); //間隔一段時間掃描       
  41.                 P0=0x00;//消隱
  42.         }
  43. }


  44. void rs_init()         //串口初始化,波特率設(shè)置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. }
復(fù)制代碼







作者: lkc8210    時間: 2022-11-14 23:24
main()呢?while(1)呢?
作者: yzwzfyz    時間: 2022-11-15 09:11
做8個變量:LED1,LED2......LED8。
先學(xué)會如何將這8個變量中的數(shù),依序送到LED上顯示。
而后再考慮串口接收數(shù)據(jù)。
這時,只要將收到的數(shù)字放到LED1,LED2......LED8中就可以了。

作者: Longan.Wang    時間: 2022-11-15 09:17
通過貼出的代碼看不出具體問題!。!
作者: 安和聚聚子    時間: 2022-11-15 15:17
代碼被吃掉了
作者: 安和聚聚子    時間: 2022-11-15 18:34
lkc8210 發(fā)表于 2022-11-14 23:24
main()呢?while(1)呢?

重新發(fā)了大佬
作者: 非凡科技    時間: 2022-11-15 19:03
EA不可以關(guān)閉這是總中斷
作者: 非凡科技    時間: 2022-11-15 19:05
我說錯了請斑竹刪了
作者: 非凡科技    時間: 2022-11-15 19:07
你關(guān)閉了總中斷,所以接收不到
作者: 非凡科技    時間: 2022-11-15 19:11
這是我經(jīng)常用的  你改改就行
{
    static u8 rx_step = 0;         //接收中斷函數(shù)里的步驟變量
    static u8 array_cnt = 0; //接收緩存數(shù)組的下標

    if (RI)
    {
        RI=0;
        if (0 == rx_ok_flag) // 1代表已經(jīng)完成接收了一串新數(shù)據(jù),并且禁止接收其它新的數(shù)據(jù)
        {

            switch (rx_step)
            {
            case 0:                                                  //接頭暗號的步驟。判斷數(shù)據(jù)頭的步驟。
                rx_buffer[0] =SBUF;          //直接讀取剛接收完的一個字節(jié)的數(shù)據(jù)。
                if (0x5a == rx_buffer[0]) //等于數(shù)據(jù)頭0x5a,接頭暗號吻合。
                {
                    array_cnt = 1; //接收緩存的下標
                    rx_step = 1;   //切換到下一個步驟,接收其它有效的數(shù)據(jù)
                }
                break;

            case 1:                                                          //數(shù)據(jù)類型和長度
                rx_buffer[array_cnt] = SBUF; //直接讀取剛接收完的一個字節(jié)的數(shù)據(jù)。
                array_cnt++;                                  //每接收一個字節(jié),數(shù)組下標都自加1,為接收下一個數(shù)據(jù)做準備
                if (array_cnt >= 4)
                {

                    rx_ok_flag = 1; //接收完成標志“置1”,通知主函數(shù)處理。
                    rx_step = 0;        //及時切換回接頭暗號的步驟
                }
                break;
            }
        }
    }
}
作者: Hephaestus    時間: 2022-11-15 20:05
串口中斷里面的那個i必須是static的!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1