找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机新人求助,串口接受数据在数码管上显示

[复制链接]
跳转到指定楼层
楼主
晶振为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. }
复制代码



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

使用道具 举报

沙发
ID:213173 发表于 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);
        }
}
回复

使用道具 举报

板凳
ID:164602 发表于 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下载软件中的串口功能就可以得到正确结果
回复

使用道具 举报

地板
ID:715844 发表于 2020-3-26 17:45 | 只看该作者
wulin 发表于 2020-3-26 06:11
u8 received_data=10;//无符号字符型数据,初值大于一位数,显示“.”。
void dynamic_scan()
{

谢谢回复,但修改之后仍然是在串口中输入任何数字都在数码管上显示了点。
回复

使用道具 举报

5#
ID:715844 发表于 2020-3-26 17:47 | 只看该作者
HC6800-ES-V2.0 发表于 2020-3-26 08:48
你原来的程序,输入0~9,都显示2,其它的显示.,没什么大问题。
我修改了一点点,就可以达到你的目标要求 ...

谢谢回复,是我发帖的时候复制粘贴没有注意,我原来是跟你写的一样的,但是我烧录了之后还是在串口输入任何值数码管上都是点。
回复

使用道具 举报

6#
ID:213173 发表于 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. }
复制代码




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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