久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2401|回復: 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. }
復制代碼




回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久国产成人免费 | 国产高清精品一区二区三区 | 超碰97人人人人人蜜桃 | 国产精品av久久久久久毛片 | 日韩高清一区 | 欧美亚洲国产日韩 | 日本超碰 | 国产精品成人一区 | 99久久精品免费视频 | 在线欧美小视频 | 国产成人精品区一区二区不卡 | 亚洲综合在线视频 | 一区二区国产精品 | 九九热精品视频在线观看 | 欧美福利久久 | 久久伊人影院 | 国产欧美视频一区二区 | 国产成人福利在线观看 | 亚洲91视频 | 国产精品乱码一区二区三区 | 成人久久18免费网站麻豆 | 一区二区三区中文字幕 | 国产香蕉视频在线播放 | 国产精品乱码一区二三区小蝌蚪 | 九九热最新地址 | av中文字幕在线 | 91大神在线资源观看无广告 | 欧美日韩视频 | 日韩免费福利视频 | 在线看av网址 | 亚洲欧美在线一区 | 中国一级毛片免费 | 日日日干干干 | 国产欧美日韩在线观看 | 午夜无码国产理论在线 | 99亚洲国产精品 | av资源中文在线天堂 | 91干b| 日韩成人高清在线 | 国产在线一区二区三区 | 六月色婷 |