找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口如何输入两位数字进行判断?

[复制链接]
跳转到指定楼层
楼主
ID:715844 发表于 2020-3-26 23:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用STC89C52单片机,晶振为12MHz,串口通讯,工作方式为1,SMOD=1,波特率为4800,当接收到一位数字的时候,在一个数码管上显示这个数字,如果不是一位数字,则在数码管上显示一个“点”符号。我的代码实现了从串口输入0-9时,再数码管上显示对应数字,但是当输入两位数时,由于char是一位字节的限制,只能显示第一位数字,要如何修改我的代码才能进行判断后当从串口输入两位数字时在数码管上显示点?
求论坛里各位大神帮助!

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

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

  5. sbit LSA = P2^2; //define the input pins for 74HC138
  6. sbit LSB = P2^3;
  7. sbit LSC = P2^4;

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

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

  15. u8 char2hex(u8 chr)
  16. {
  17.         if(chr>='0'&&chr<='9')
  18.                 return (chr-'0');
  19.         else
  20.                 return ('a');
  21. }

  22. void display()
  23. {
  24.         u8 counter;

  25.         for(counter=0; counter<8; counter++)
  26.         {
  27.                 switch(counter)
  28.                 {
  29.                         case 0:
  30.                                 LSA = 0; LSB = 0; LSC = 0;
  31.                                 break; // exit from switch loop
  32.                         case 1:
  33.                                 LSA = 1; LSB = 0; LSC = 0;
  34.                                 break;
  35.                         case 2:
  36.                                 LSA = 0; LSB = 1; LSC = 0;
  37.                                 break;
  38.                         case 3:
  39.                                 LSA = 1; LSB = 1; LSC = 0;
  40.                                 break;
  41.                         case 4:
  42.                                 LSA = 0; LSB = 0; LSC = 1;
  43.                                 break;
  44.                         case 5:
  45.                                 LSA = 1; LSB = 0; LSC = 1;
  46.                                 break;
  47.                         case 6:
  48.                                 LSA = 0; LSB = 1; LSC = 1;
  49.                                 break;
  50.                         case 7:
  51.                                 LSA = 1; LSB = 1; LSC = 1;
  52.                                 break;
  53.                 }
  54.                 P0 = saved_data[counter];
  55.                 delay(100);
  56.                 P0 = 0x00; // erase shoadows
  57.         }
  58. }

  59. void serial_init()
  60. {
  61.         TMOD = 0x20;
  62.         TH1 = 0xf3;
  63.         TL1 = 0xf3;
  64.         PCON = 0x80;
  65.         TR1 = 1;
  66.         SCON = 0x50;
  67.         ES = 1;
  68.         EA = 1;
  69. }

  70. void main()
  71. {
  72.         serial_init();
  73.         while(1);
  74. }

  75. void serial() interrupt 4
  76. {
  77.         u8 received_data;
  78.         if(RI==1)
  79.         {
  80.                 received_data = SBUF;
  81.                 RI = 0;
  82.                 SBUF = received_data;
  83.                 while(!TI);
  84.                 received_data = char2hex(received_data);
  85.                 if (received_data!='a')
  86.                 {
  87.                         saved_data[0] = 0x00;
  88.                         saved_data[1] = 0x00;
  89.                         saved_data[2] = 0x00;               
  90.                         saved_data[3] = 0x00;
  91.                         saved_data[4] = 0x00;
  92.                         saved_data[5] = 0x00;
  93.                         saved_data[6] = 0x00;
  94.                         saved_data[7] = display_digit[received_data];
  95.                 }
  96.                 else
  97.                 {
  98.                         saved_data[0] = 0x80;
  99.                         saved_data[1] = 0x80;
  100.                         saved_data[2] = 0x80;               
  101.                         saved_data[3] = 0x80;
  102.                         saved_data[4] = 0x80;
  103.                         saved_data[5] = 0x80;
  104.                         saved_data[6] = 0x80;
  105.                         saved_data[7] = 0x80;        
  106.                 }
  107.         }
  108.         display();
  109. }
复制代码




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

使用道具 举报

沙发
ID:65956 发表于 2020-3-27 08:33 | 只看该作者
开串口接收缓冲区,先把接收数据缓存下来,接收完后再去判断接收到的数据,根据数据再去判断要用还是不用,取有用的信息给显示就可以了
回复

使用道具 举报

板凳
ID:697917 发表于 2020-3-27 09:03 | 只看该作者
数字都显示的原理是利用余晖动态显示,实际是不同位的数字来回切换,你的代码中只有接收中断进行过接收数字显示。即每位只显示1次100ms,之后停留在最新的那条中。当然显示不了全部的内容。
终端中不要进行太多内容操作。设个标志,外面查询标志去做处理。
回复

使用道具 举报

地板
ID:715844 发表于 2020-3-27 14:47 | 只看该作者
黎明初至 发表于 2020-3-27 09:03
数字都显示的原理是利用余晖动态显示,实际是不同位的数字来回切换,你的代码中只有接收中断进行过接收数字 ...

谢谢回复,但是我不是想显示两位数字,我是想在输入两位数字的时候数码管显示一个点(即'.')。但是数码管上显示的都是数字。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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