找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2338|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)串口接收程序問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:902815 發(fā)表于 2021-4-9 10:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
下面的程序接收到一個(gè)16進(jìn)制數(shù),我想將其顯示到LCD上,但是只能顯示出部分位。(如串口接收到0xEB,計(jì)劃顯示23.5,但是只能顯示23,大佬們知道這是為啥嗎?)
單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="The temperature:";
  5. uchar table1[]="";
  6. uchar flag,temp;
  7. uchar j=0;
  8. sbit wela=P2^7;
  9. sbit dula=P2^6;
  10. sbit lcden=P3^4;
  11. sbit lcdrs=P3^5;
  12. void DelayMS(uint xms)                                  //延時(shí)大約1ms
  13. {
  14.         uint x,y;
  15.         for(x=xms;x>0;x--)
  16.                 for(y=110;y>0;y--);
  17. }
  18. void write_com(uchar com)
  19. {
  20.         lcdrs=0;                  //寫命令
  21.         P0=com;              
  22.         DelayMS(5);         
  23.         lcden=1;
  24.         DelayMS(5);
  25.         lcden=0;
  26. }
  27. void write_data(uchar date)
  28. {
  29.         lcdrs=1;                 //寫數(shù)據(jù)
  30.         P0=date;
  31.         DelayMS(5);
  32.         lcden=1;
  33.         DelayMS(5);
  34.         lcden=0;
  35. }
  36. void send(uchar dat)
  37. {
  38.         SBUF=dat;
  39.         while(TI==0);
  40.         TI=0;
  41. }
  42. void uartinit()//串口初始化函數(shù)
  43. {
  44.         SCON=0x50;//串口工作方式為模式1
  45.         TMOD=0x20;//定時(shí)器T1工作方式2
  46.         PCON=0x00;//SMOD=0
  47.         TH1=0xfd;//波特率為9600
  48.         TL1=0xfd;
  49.         EA=1;
  50.         ES=1;
  51.         TR1=1;//啟動(dòng)定時(shí)器
  52. }

  53. void init()                     //初始化函數(shù)
  54. {
  55.         dula=0;
  56.         wela=0;
  57.         lcden=0;
  58.         write_com(0x38);              //設(shè)置16*2顯示、5*7點(diǎn)陣、8位數(shù)據(jù)接口
  59.         write_com(0x0c);              //設(shè)置開顯示,不顯示光標(biāo)
  60.         write_com(0x06);              //寫一個(gè)字符后,地址指針自動(dòng)加一
  61.         write_com(0x01);              //顯示清零,數(shù)據(jù)指針清零
  62.         uartinit();
  63. }
  64. void main()
  65. {
  66.         uchar num=0;
  67.         uchar b=0;
  68.         init();
  69.         write_com(0x80);
  70.         for(b=0;b<16;b++)
  71.         {
  72.                 write_data(table[b]);
  73.                 DelayMS(5);
  74.         }
  75.         while(1)
  76.         {
  77.                 if(flag==1)
  78.                 {        
  79.                         ES=0;
  80.                         flag=0;
  81.                         if(temp>=100)
  82.                         {                                                                                                     
  83.                                 table1[1]=temp/100+48;           //ASCII碼轉(zhuǎn)換
  84.                                 table1[2]=temp%100/10+48;
  85.                                 table1[3]='.';
  86.                                 table1[4]=temp%10+48;
  87.                         }
  88.                         else if(temp>=10)                                                 //兩位數(shù),百位的零不顯示
  89.                         {
  90.                                 table1[1]=' ';           //ASCII碼轉(zhuǎn)換
  91.                                 table1[2]=temp%100/10+48;
  92.                                 table1[3]='.';
  93.                                 table1[4]=temp%10+48;
  94.                         }
  95.                         else                                                                   //一位數(shù),前面的兩個(gè)零都不顯示
  96.                         {
  97.                                 table1[1]=' ';           //ASCII碼轉(zhuǎn)換
  98.                                 table1[2]='0';
  99.                                 table1[3]='.';
  100.                                 table1[4]=temp%10+48;
  101.                         }
  102.                         write_com(0x80+0x40);
  103.                         for(b=1;b<5;b++)
  104.                         {
  105.                                 write_data(table1[b]);
  106.                                 DelayMS(5);
  107.                         }
  108.                         for(b=1;b<5;b++)
  109.                         {
  110.                                 send(table1[b]);
  111.                         }
  112.                         ES=1;
  113.                 }
  114.         }               
  115. }
  116. void ser() interrupt 4
  117. {
  118.         if(RI==1)
  119.         {
  120.                 RI=0;        
  121.                 temp=SBUF;
  122.                 flag=1;
  123.         }
  124. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:112099 發(fā)表于 2021-4-9 14:51 | 只看該作者
如果你直接讓他顯示一個(gè)定值,能正常顯示嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:883031 發(fā)表于 2021-4-9 15:28 | 只看該作者
直接送個(gè)"23.5"字符串,看能不能正常顯示
回復(fù)

使用道具 舉報(bào)

地板
ID:903000 發(fā)表于 2021-4-9 15:38 | 只看該作者
因?yàn)槟愕馁x值是從table1[1]開始的,table1[0]沒(méi)有被賦值
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2021-4-9 21:31 | 只看該作者
改這樣
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="The temperature:";
  5. uchar table1[4];
  6. uchar flag,temp;
  7. uchar j=0;
  8. sbit wela=P2^7;
  9. sbit dula=P2^6;
  10. sbit lcden=P3^4;
  11. sbit lcdrs=P3^5;

  12. void DelayMS(uint xms)                                  //延時(shí)大約1ms
  13. {
  14.         uint x,y;
  15.         for(x=xms;x>0;x--)
  16.                 for(y=110;y>0;y--);
  17. }
  18. void write_com(uchar com)
  19. {
  20.         lcdrs=0;                  //寫命令
  21.         P0=com;              
  22.         DelayMS(1);         
  23.         lcden=1;
  24.         DelayMS(1);
  25.         lcden=0;
  26. }
  27. void write_data(uchar date)
  28. {
  29.         lcdrs=1;                 //寫數(shù)據(jù)
  30.         P0=date;
  31.         DelayMS(1);
  32.         lcden=1;
  33.         DelayMS(1);
  34.         lcden=0;
  35. }
  36. void send(uchar dat)
  37. {
  38.         SBUF=dat;
  39.         while(TI==0);
  40.         TI=0;
  41. }
  42. void uartinit()//串口初始化函數(shù)
  43. {
  44.         SCON=0x50;//串口工作方式為模式1
  45.         TMOD=0x20;//定時(shí)器T1工作方式2
  46.         PCON=0x00;//SMOD=0
  47.         TH1=0xfd;//波特率為9600
  48.         TL1=0xfd;
  49.         EA=1;
  50.         ES=1;
  51.         TR1=1;//啟動(dòng)定時(shí)器
  52. }

  53. void init()                     //初始化函數(shù)
  54. {
  55.         dula=0;
  56.         wela=0;
  57.         lcden=0;
  58.         write_com(0x38);              //設(shè)置16*2顯示、5*7點(diǎn)陣、8位數(shù)據(jù)接口
  59.         write_com(0x0c);              //設(shè)置開顯示,不顯示光標(biāo)
  60.         write_com(0x06);              //寫一個(gè)字符后,地址指針自動(dòng)加一
  61.         write_com(0x01);              //顯示清零,數(shù)據(jù)指針清零

  62. }
  63. void main()
  64. {
  65.         uchar num=0;
  66.         uchar b=0;
  67.         uartinit();
  68.         init();
  69.         write_com(0x80);
  70.         for(b=0;b<16;b++)
  71.         {
  72.                 write_data(table[b]);
  73.                 DelayMS(5);
  74.         }
  75.         while(1)
  76.         {
  77.                 if(flag==1)
  78.                 {        
  79.                         ES=0;
  80.                         flag=0;
  81.                         if(temp>=100)
  82.                         {
  83.                                 table1[0]=temp/100%10+'0';           //ASCII碼轉(zhuǎn)換
  84.                                 table1[1]=temp/10%10+'0';
  85.                                 table1[2]='.';
  86.                                 table1[3]=temp%10+'0';
  87.                         }
  88.                         if(temp<100&&temp>=10)              //兩位數(shù),百位的零不顯示
  89.                         {
  90.                                 table1[0]=' ';           //ASCII碼轉(zhuǎn)換
  91.                                 table1[1]=temp/10%10+'0';
  92.                                 table1[2]='.';
  93.                                 table1[3]=temp%10+'0';
  94.                         }
  95.                         if(temp<10)        //一位數(shù),前面的兩個(gè)零都不顯示
  96.                         {
  97.                                 table1[0]=' ';           //ASCII碼轉(zhuǎn)換
  98.                                 table1[1]='0';
  99.                                 table1[2]='.';
  100.                                 table1[3]=temp%10+'0';
  101.                         }
  102.                         write_com(0x80+0x40);
  103.                         for(b=0;b<4;b++)
  104.                         {
  105.                                 write_data(table1[b]);
  106.                                 DelayMS(5);
  107.                         }
  108.                         for(b=0;b<4;b++)
  109.                         {
  110.                                 send(table1[b]);
  111.                         }
  112.                         ES=1;
  113.                 }
  114.         }               
  115. }

  116. void ser() interrupt 4
  117. {
  118.         RI=0;
  119.         temp=SBUF;
  120.         flag=1;
  121. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:902815 發(fā)表于 2021-4-10 20:33 | 只看該作者

您好,謝謝您的回復(fù),您的代碼我驗(yàn)證了一下可以實(shí)現(xiàn),請(qǐng)問(wèn)我的不能實(shí)現(xiàn)的原因是什么呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表