欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機新人求助,串口接受數據在數碼管上顯示 [打印本頁]

作者: paradox666    時間: 2020-3-25 23:00
標題: 單片機新人求助,串口接受數據在數碼管上顯示
晶振為12MHz,串口通訊,工作方式為1,SMOD=1,波特率為4800,當接收到一位數字的時候,在一個數碼管上顯示這個數字,如果不是一位數字,則在數碼管上顯示一個“點”符號。
實際結果是在串口中無論輸入任何值數碼管上顯示的都是點。求大神幫助!

單片機源程序如下:
  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit signal_in_A = P2^2; //define the input pins for 74HC138
  6. sbit signal_in_B = P2^3;
  7. sbit signal_in_C = P2^4;

  8. u8 display_digit[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  9.         0x7f, 0x6f};  
  10. int received_data;

  11. void delay(u16 i)
  12. {
  13.         while(i--);
  14. }

  15. void dynamic_scan()
  16. {
  17.         u8 counter;
  18.         int is_digits;
  19.         is_digits = received_data / 10;

  20.         for(counter=0; counter<8; counter++)
  21.         {
  22.                 if(is_digits==0)
  23.                 {
  24.                         P0 = 0x5b;
  25.                         delay(100); // about 1s
  26.                         P0 = 0x00; // erase shadows
  27.                 }

  28.                 if(is_digits!=0)
  29.                 {
  30.                         P0 = 0x80;
  31.                         delay(100); // about 1s
  32.                         P0 = 0x00; // erase shadows
  33.                 }
  34.                 switch(counter)
  35.                 {
  36.                         case 0:
  37.                                 signal_in_A = 0; signal_in_B = 0; signal_in_C = 0;
  38.                                 break;
  39.                         case 1:
  40.                                 signal_in_A = 1; signal_in_B = 0; signal_in_C = 0;
  41.                                 break;
  42.                         case 2:
  43.                                 signal_in_A = 0; signal_in_B = 1; signal_in_C = 0;
  44.                                 break;
  45.                         case 3:
  46.                                 signal_in_A = 1; signal_in_B = 1; signal_in_C = 0;
  47.                                 break;
  48.                         case 4:
  49.                                 signal_in_A = 0; signal_in_B = 0; signal_in_C = 1;
  50.                                 break;
  51.                         case 5:
  52.                                 signal_in_A = 1; signal_in_B = 0; signal_in_C = 1;
  53.                                 break;
  54.                         case 6:
  55.                                 signal_in_A = 0; signal_in_B = 1; signal_in_C = 1;
  56.                                 break;
  57.                         case 7:
  58.                                 signal_in_A = 1; signal_in_B = 1; signal_in_C = 1;
  59.                                 break;
  60.                 }


  61.         }

  62. }

  63. void serial_init()
  64. {
  65.         TMOD = 0x20;
  66.         TH1 = 0xf3;
  67.         TL1 = 0xf3;
  68.         PCON = 0x80;
  69.         TR1 = 1;
  70.         SCON = 0x50;
  71.         ES = 1;
  72.         EA = 1;
  73. }

  74. void serial() interrupt 4
  75. {
  76.         received_data = SBUF;
  77.         RI = 0;
  78.         SBUF = received_data;
  79.         while(!TI); // wating for SBUF compeleting sending data
  80.         TI = 0;
  81. }

  82. void main()
  83. {
  84.         serial_init();
  85.         while(1)
  86.         {

  87.                 dynamic_scan();
  88.         }
  89. }
復制代碼




作者: wulin    時間: 2020-3-26 06:11
u8 received_data=10;//無符號字符型數據,初值大于一位數,顯示“.”。
void dynamic_scan()
{
        u8 counter;

        for(counter=0; counter<8; counter++)
        {
                P0=0x00;//消隱
                switch(counter)
                {
                        case 0:
                        signal_in_A = 0; signal_in_B = 0; signal_in_C = 0;
                        break;
                        case 1:
                        signal_in_A = 1; signal_in_B = 0; signal_in_C = 0;
                        break;
                        case 2:
                        signal_in_A = 0; signal_in_B = 1; signal_in_C = 0;
                        break;
                        case 3:
                        signal_in_A = 1; signal_in_B = 1; signal_in_C = 0;
                        break;
                        case 4:
                        signal_in_A = 0; signal_in_B = 0; signal_in_C = 1;
                        break;
                        case 5:
                        signal_in_A = 1; signal_in_B = 0; signal_in_C = 1;
                        break;
                        case 6:
                        signal_in_A = 0; signal_in_B = 1; signal_in_C = 1;
                        break;
                        case 7:
                        signal_in_A = 1; signal_in_B = 1; signal_in_C = 1;
                        break;
                }
                if(received_data>9) P0=0x80;//顯示“.”
                else P0=display_digit[received_data];//顯示范圍0~9
                delay(100);
        }
}
作者: HC6800-ES-V2.0    時間: 2020-3-26 08:48
你原來的程序,輸入0~9,都顯示2,其它的顯示.,沒什么大問題。
我修改了一點點,就可以達到你的目標要求了:輸入0~9,就顯示輸入的那個數值,輸入其它的,都顯示.。
#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

sbit signal_in_A = P2^2; //define the input pins for 74HC138
sbit signal_in_B = P2^3;
sbit signal_in_C = P2^4;

u8 display_digit[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
        0x7f, 0x6f};  
int received_data;

void delay(u16 i)
{
        while(i--);
}

void dynamic_scan()
{
        u8 counter;
        int is_digits;
        is_digits = received_data / 10;

        for(counter=0; counter<8; counter++)
        {
                if(is_digits==0)
                {
                        P0 = display_digit[received_data];//0x5b;
                        delay(100); // about 1s
                        P0 = 0x00; // erase shadows
                }

                if(is_digits!=0)
                {
                        P0 = 0x80;
                        delay(100); // about 1s
                        P0 = 0x00; // erase shadows
                }
                switch(counter)
                {
                        case 0:
                                signal_in_A = 0; signal_in_B = 0; signal_in_C = 0;
                                break;
                        case 1:
                                signal_in_A = 1; signal_in_B = 0; signal_in_C = 0;
                                break;
                        case 2:
                                signal_in_A = 0; signal_in_B = 1; signal_in_C = 0;
                                break;
                        case 3:
                                signal_in_A = 1; signal_in_B = 1; signal_in_C = 0;
                                break;
                        case 4:
                                signal_in_A = 0; signal_in_B = 0; signal_in_C = 1;
                                break;
                        case 5:
                                signal_in_A = 1; signal_in_B = 0; signal_in_C = 1;
                                break;
                        case 6:
                                signal_in_A = 0; signal_in_B = 1; signal_in_C = 1;
                                break;
                        case 7:
                                signal_in_A = 1; signal_in_B = 1; signal_in_C = 1;
                                break;
                }


        }

}

void serial_init()
{
        TMOD = 0x20;
        TH1 = 0xf3;
        TL1 = 0xf3;
        PCON = 0x80;
        TR1 = 1;
        SCON = 0x50;
        ES = 1;
        EA = 1;
}

void serial() interrupt 4
{
        received_data = SBUF;
        RI = 0;
        SBUF = received_data;
        while(!TI); // wating for SBUF compeleting sending data
        TI = 0;
}

void main()
{
        serial_init();
        while(1)
        {

                dynamic_scan();
        }
}

我在我的HC6800-ES-V2.0板子上通過,用的STC-ISP下載軟件中的串口功能就可以得到正確結果
作者: paradox666    時間: 2020-3-26 17:45
wulin 發表于 2020-3-26 06:11
u8 received_data=10;//無符號字符型數據,初值大于一位數,顯示“.”。
void dynamic_scan()
{

謝謝回復,但修改之后仍然是在串口中輸入任何數字都在數碼管上顯示了點。
作者: paradox666    時間: 2020-3-26 17:47
HC6800-ES-V2.0 發表于 2020-3-26 08:48
你原來的程序,輸入0~9,都顯示2,其它的顯示.,沒什么大問題。
我修改了一點點,就可以達到你的目標要求 ...

謝謝回復,是我發帖的時候復制粘貼沒有注意,我原來是跟你寫的一樣的,但是我燒錄了之后還是在串口輸入任何值數碼管上都是點。
作者: wulin    時間: 2020-3-26 20:15
paradox666 發表于 2020-3-26 17:45
謝謝回復,但修改之后仍然是在串口中輸入任何數字都在數碼管上顯示了點。

把串口暫時關閉,單試顯示重新,正常后再開串口。

  1. #include "reg52.h"
  2. #include "intrins.h"

  3. typedef unsigned char u8;
  4. typedef unsigned int u16;

  5. sbit signal_in_A = P2^2; //define the input pins for 74HC138
  6. sbit signal_in_B = P2^3;
  7. sbit signal_in_C = P2^4;

  8. u8 display_digit[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  9.         0x7f, 0x6f};  
  10. u8 received_data=10;

  11. void delay(u16 i)
  12. {
  13.         while(i--);
  14. }

  15. void dynamic_scan()
  16. {
  17.         u8 counter;
  18.         for(counter=3; counter<11; counter++)
  19.         {
  20.                 P0=0x00;//消隱
  21.                 switch(counter)
  22.                 {
  23.                         case 3:
  24.                         signal_in_A = 0; signal_in_B = 0; signal_in_C = 0;
  25.                         break;
  26.                         case 4:
  27.                         signal_in_A = 1; signal_in_B = 0; signal_in_C = 0;
  28.                         break;
  29.                         case 5:
  30.                         signal_in_A = 0; signal_in_B = 1; signal_in_C = 0;
  31.                         break;
  32.                         case 6:
  33.                         signal_in_A = 1; signal_in_B = 1; signal_in_C = 0;
  34.                         break;
  35.                         case 7:
  36.                         signal_in_A = 0; signal_in_B = 0; signal_in_C = 1;
  37.                         break;
  38.                         case 8:
  39.                         signal_in_A = 1; signal_in_B = 0; signal_in_C = 1;
  40.                         break;
  41.                         case 9:
  42.                         signal_in_A = 0; signal_in_B = 1; signal_in_C = 1;
  43.                         break;
  44.                         case 10:
  45.                         signal_in_A = 1; signal_in_B = 1; signal_in_C = 1;
  46.                         break;
  47.                 }
  48. //                if(received_data>9) P0=0x80;//顯示“.”
  49. //                else P0=display_digit[received_data];//顯示范圍0~9
  50.                 if(counter>9) P0=0x80;//顯示“.”
  51.                 else P0=display_digit[counter];//顯示范圍3~9
  52.                 delay(100);
  53.         }
  54. }
  55. /*
  56. void serial_init()
  57. {
  58.         TMOD = 0x20;
  59.         TH1 = 0xf3;
  60.         TL1 = 0xf3;
  61.         PCON = 0x80;
  62.         TR1 = 1;
  63.         SCON = 0x50;
  64.         ES = 1;
  65.         EA = 1;
  66. }

  67. void serial() interrupt 4
  68. {
  69.         received_data = SBUF;
  70.         RI = 0;
  71.         SBUF = received_data;
  72.         while(!TI); // wating for SBUF compeleting sending data
  73.         TI = 0;
  74. }
  75. */
  76. void main()
  77. {
  78. //        serial_init();
  79.         while(1)
  80.         {
  81.                 dynamic_scan();
  82.         }
  83. }
復制代碼









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