找回密码
 立即注册

QQ登录

只需一步,快速开始

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

让单片机串口接收数据然后用数码管显示 但程序十位数字出现就很快消失

[复制链接]
跳转到指定楼层
楼主
ID:331899 发表于 2018-5-21 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写的程序是让单片机接收数据已数码管的形式显示,为什么我的我一个程序十位数字出现就很快消失,个位显示;而第二个程序确实现的很好?大佬们,求解答
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit we = P2^7;
  5. sbit du = P2^6;
  6. uchar counter,time_counter;
  7. uchar code leddata[]={

  8.                 0x3F,  //"0"
  9.                 0x06,  //"1"
  10.                 0x5B,  //"2"
  11.                 0x4F,  //"3"
  12.                 0x66,  //"4"
  13.                 0x6D,  //"5"
  14.                 0x7D,  //"6"
  15.                 0x07,  //"7"
  16.                 0x7F,  //"8"
  17.                 0x6F,  //"9"
  18.                 0x77,  //"A"
  19.                 0x7C,  //"B"
  20.                 0x39,  //"C"
  21.                 0x5E,  //"D"
  22.                 0x79,  //"E"
  23.                 0x71,  //"F"
  24.                 0x76,  //"H"
  25.                 0x38,  //"L"
  26.                 0x37,  //"n"
  27.                 0x3E,  //"u"
  28.                 0x73,  //"P"
  29.                 0x5C,  //"o"
  30.                 0x40,  //"-"
  31.                 0x00,  //熄灭
  32.                 0x00  //自定义

  33.                          };
  34. void delay(uint z)
  35. {
  36.         uint x,y;
  37.         for(x = z; x > 0; x--)
  38.                 for(y = 114; y > 0 ; y--);
  39. }      
  40. void UART_init()
  41. {
  42.         TMOD = 0x20;          //T1工作模式2  8位自动重装
  43.         TH1 = 0xfa;
  44.         TL1 = 0xfa;         //比特率9600
  45.         TR1 = 1;
  46.         SM0 = 0;
  47.         SM1 = 1;                 //串口工作方式1 10位异步
  48.         REN = 1;                //串口允许接收
  49. /*        EA  = 1;                //开总中断
  50.         ES  = 1;                //串口中断打开        */         
  51. }
  52. void display(uchar i)
  53. {
  54.         uchar shi,ge;
  55.         shi = i / 10; //求模
  56.         ge  = i % 10; //求余
  57.         P0 = 0xff;
  58.         we = 1;
  59.         P0 = 0xfe; //点亮第一位数码管
  60.         we = 0;

  61.         du = 1;
  62.         P0 = leddata[shi];
  63.         du = 0;
  64.         delay(1);

  65.         P0 = 0xff;
  66.         we = 1;
  67.         P0 = 0xfd;//点亮第二位数码管
  68.         we = 0;

  69.         du = 1;
  70.         P0 = leddata[ge];
  71.         du = 0;
  72.         delay(1);      
  73. }
  74. void main()
  75. {
  76.         UART_init(); //串口初始化
  77.         while(1)
  78.         {
  79.            while(!RI)
  80.             RI = 0;
  81.            display(SBUF);
  82.         }      
  83. }


  84. #include <reg52.h>
  85. #define uchar unsigned char
  86. #define uint  unsigned int
  87. sbit we = P2^7;
  88. sbit du = P2^6;
  89. uchar counter,time_counter;
  90. uchar code leddata[]={

  91.                 0x3F,  //"0"
  92.                 0x06,  //"1"
  93.                 0x5B,  //"2"
  94.                 0x4F,  //"3"
  95.                 0x66,  //"4"
  96.                 0x6D,  //"5"
  97.                 0x7D,  //"6"
  98.                 0x07,  //"7"
  99.                 0x7F,  //"8"
  100.                 0x6F,  //"9"
  101.                 0x77,  //"A"
  102.                 0x7C,  //"B"
  103.                 0x39,  //"C"
  104.                 0x5E,  //"D"
  105.                 0x79,  //"E"
  106.                 0x71,  //"F"
  107.                 0x76,  //"H"
  108.                 0x38,  //"L"
  109.                 0x37,  //"n"
  110.                 0x3E,  //"u"
  111.                 0x73,  //"P"
  112.                 0x5C,  //"o"
  113.                 0x40,  //"-"
  114.                 0x00,  //熄灭
  115.                 0x00  //自定义

  116.                          };
  117. void delay(uint z)
  118. {
  119.         uint x,y;
  120.         for(x = z; x > 0; x--)
  121.                 for(y = 114; y > 0 ; y--);
  122. }      
  123. void UART_init()
  124. {
  125.         TMOD = 0x20;          //T1工作模式2  8位自动重装
  126.         TH1 = 0xfa;
  127.         TL1 = 0xfa;         //比特率9600
  128.         TR1 = 1;
  129.         SM0 = 0;
  130.         SM1 = 1;                 //串口工作方式1 10位异步
  131.         REN = 1;                //串口允许接收
  132. /*        EA  = 1;                //开总中断
  133.         ES  = 1;                //串口中断打开        */         
  134. }
  135. void display(uchar i)
  136. {
  137.         uchar shi,ge;
  138.         shi = i / 10; //求模
  139.         ge  = i % 10; //求余
  140.         P0 = 0xff;
  141.         we = 1;
  142.         P0 = 0xfe; //点亮第一位数码管
  143.         we = 0;

  144.         du = 1;
  145.         P0 = leddata[shi];
  146.         du = 0;
  147.         delay(1);

  148.         P0 = 0xff;
  149.         we = 1;
  150.         P0 = 0xfd;//点亮第二位数码管
  151.         we = 0;

  152.         du = 1;
  153.         P0 = leddata[ge];
  154.         du = 0;
  155.         delay(1);      
  156. }
  157. void main()
  158. {
  159.         UART_init(); //串口初始化
  160.         while(1)
  161.         {
  162.            if(RI)
  163.            {
  164.               RI = 0;
  165.            }
  166.            display(SBUF);
  167.         }      
  168. }
复制代码



评分

参与人数 1黑币 +10 收起 理由
cciejs12345 + 10 赞一个!

查看全部评分

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

使用道具 举报

沙发
ID:213173 发表于 2018-5-22 08:32 | 只看该作者
while(!RI)是停留等待条件成立才继续运行,if(RI)是判断条件是否成立,不停留,可以继续运行。
回复

使用道具 举报

板凳
ID:330198 发表于 2018-5-22 08:53 | 只看该作者
你第一个和第二个唯一的区别就是清除RI标志位的语句,用if判断不满足条件还会继续执行,但是用while如果不满足就会一直停在这,这就是你数码管很快消失的原因。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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