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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4372|回復: 6
打印 上一主題 下一主題
收起左側

單片機串口通訊程序波特率只能是4800,其他的波特率就會出錯

[復制鏈接]
跳轉到指定樓層
樓主
ID:149043 發表于 2017-10-13 17:05 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟入門單片機不久,在寫一個小程序,目標是從單片機從串口發送數據給單片機,單片機接受數據放進數組,新數據來到后和之前數組中的數據進行比較,如果相同不進入數組,不相同就進入數組,最后輸出數組中元素的個數,顯示到數碼管上。


這個是程序,單片機也可以從正常接收到數據,但是無法輸出正確的個數…,而且………這款單片機為什么只能用4800的波特率發送數據啊,只要用其他的波特率都會出錯啊?!??求大佬們幫忙找到程序中的錯誤,給我一些篩選比較方面的提示。。。

  1. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
  2. #include "intrins.h"
  3. #include "stdio.h"

  4. typedef unsigned int uint;          //對數據類型進行聲明定義
  5. typedef unsigned char uchar;

  6. #define RX0_Lenth 200
  7. uint date,count;

  8. char TimeOut;
  9. char idata  shuzu[];

  10. sbit LSA=P2^2;
  11. sbit LSB=P2^3;
  12. sbit LSC=P2^4;
  13. sbit Key_U=P3^2;

  14. uint count=1;

  15. uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~9的值
  16. uchar disp[4];
  17. void xianshi()
  18. {
  19.         disp[0]=smgduan[count/1000];//千位
  20.         disp[1]=smgduan[count%1000/100];//百位
  21.         disp[2]=smgduan[count%1000%100/10];//十位
  22.         disp[3]=smgduan[count%1000%100%10];//個位               
  23. }

  24. void InitUART()                             //串口1設置          上位機通訊
  25. {
  26.     TMOD = 0x20;               
  27.     SCON = 0x50;
  28.         PCON = 0x80; //加倍后為19200
  29.     TH1 = 0xF3;//2400,加倍后為4800
  30.     TL1 = TH1;
  31.     EA = 1;
  32.     ES = 1;
  33.     TR1 = 1;
  34. }
  35. /****************串行口1字節發送****************/
  36. void UART_SendOneByte(unsigned char c)
  37. {
  38.     SBUF = c;
  39.     while(!TI);           //若TI=0,在此等待
  40.     TI = 0;         
  41. }
  42. /****************串行口1字符發送****************/
  43. void SendStr1(unsigned char *s)
  44. {
  45. while(*s!='\0') //通過檢測是否字符串末尾
  46.   {
  47.   UART_SendOneByte(*s);
  48.   s++;
  49.   }
  50. }
  51. /*******************************************************************************
  52. * 函 數 名         : delay
  53. * 函數功能                   : 延時函數,i=1時,大約延時10us
  54. *******************************************************************************/
  55. void delay(uint i)
  56. {
  57.         while(i--);      
  58. }

  59. void Delayms(unsigned int t)                //@12.000MHz   
  60. {
  61.     unsigned char a,b;
  62.         while(t--)
  63.         {
  64.                    for(b=18;b>0;b--)
  65.                 for(a=152;a>0;a--);
  66.             _nop_();  //if Keil,require use intrins.h
  67.         }
  68. }

  69. /*******************************************************************************
  70. * 函 數 名         : DigDisplay
  71. * 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
  72. *******************************************************************************/
  73. void DigDisplay()
  74. {
  75.         uchar i;
  76.         for(i=0;i<4;i++)
  77.         {
  78.                 switch(i)         //位選,選擇點亮的數碼管,
  79.                 {
  80.                         case(0):
  81.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  82.                         case(1):
  83.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  84.                         case(2):
  85.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  86.                         case(3):
  87.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位      
  88.                 }
  89.                 P0=disp[3-i];//發送段碼
  90.                 delay(100); //間隔一段時間掃描      
  91.                 P0=0x00;//消隱
  92.         }
  93. }

  94. /*******************************************************************************
  95. * 函 數 名       : main
  96. * 函數功能                 : 主函數
  97. * 輸    入       : 無
  98. * 輸    出             : 無
  99. *******************************************************************************/
  100. void main()
  101. {      
  102.     InitUART();
  103.         while(1);
  104.         /*while(1)
  105.         {      
  106.                 if(!Key_U)                                        //判斷按鍵是否按下
  107.                 {
  108.                         Delayms(5);                                //延時消抖
  109.                         if(!Key_U)                                //判斷按鍵是否按下
  110.                         {                                       
  111.                                 while(!Key_U);                 //等待按鍵松開   
  112.                                 SendStr1("\nU\r");        //發送<LF>U<CR>           多標簽讀取指令                              
  113.                         }      
  114.                 }
  115.                 xianshi();
  116.                 DigDisplay();  //數碼管顯示函數      
  117.         }*/               
  118. }

  119. void UART_1Interrupt() interrupt 4          //串口1接收程序
  120. {
  121.     uint i;
  122.         if(RI)
  123.         {      
  124.             for(i=0;i<count;i++)
  125.             {
  126.                         date = SBUF;
  127.                 if(date != shuzu[i+1] )
  128.                 {
  129.                             if(count >= RX0_Lenth)        count = 0;
  130.                            shuzu[count] = date;
  131.                            count++;
  132.                 }
  133.                     }
  134.                 RI=0;
  135.                 SBUF = count;
  136.                 while(!TI);
  137.                 TI=0;
  138.         //        TimeOut = 5;
  139.         }      
  140. }
復制代碼



我用的就是這款開發版,波特率只能是4800,只要是其他的波特率就會出錯。。。

-1003127784.jpg (83.46 KB, 下載次數: 73)

-1003127784.jpg
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2017-10-13 22:32 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:123289 發表于 2017-10-14 19:25 | 只看該作者
串口中斷未規劃得好。
中斷收到一個字節后就退出來。
回復

使用道具 舉報

地板
ID:1064915 發表于 2023-6-19 10:14 | 只看該作者
單片機用12M晶振,9600誤差太大,4800還可以
回復

使用道具 舉報

5#
ID:624769 發表于 2023-6-19 13:00 | 只看該作者
joyb 發表于 2023-6-19 10:14
單片機用12M晶振,9600誤差太大,4800還可以

和12M 沒什么關系,我12M 用57600一樣沒事
問題的關鍵是他中斷里有了:
                SBUF = count;
                while(!TI);
這個東西,說實話,中斷里放了這個 他 4800 能用應該已經偷笑了。
回復

使用道具 舉報

6#
ID:744809 發表于 2023-6-19 15:07 | 只看該作者
188610329 發表于 2023-6-19 13:00
和12M 沒什么關系,我12M 用57600一樣沒事
問題的關鍵是他中斷里有了:
                SBUF = count; ...

STC89C51 12M用定時器0/定時器1最多只能用4800,11.0592M能用9600,更高的要22.1184M才行了。當然用STC8H8K、STC15\STC12等系列較新的51單片機,可以更快速率通信。STC89C51單片機用T2定時器,11.0592M的晶振可以用115200波特率。
回復

使用道具 舉報

7#
ID:883242 發表于 2023-6-20 13:15 | 只看該作者
這個問題搜舊帖子就行。BBS比Q群好太多的優點就在于此。
http://www.zg4o1577.cn/bbs/dpj-150703-1.html
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性久久 | 一区二区成人 | 一二区成人影院电影网 | 在线观看日韩 | 免费在线观看一区二区 | 91久久综合 | 成人av片在线观看 | 精品一二三区在线观看 | 91精品国产一二三 | 欧州一区二区 | 国产精品久久久久久一区二区三区 | 免费观看av网站 | 欧美成人影院 | 亚洲毛片在线观看 | 日本高清视频在线播放 | 欧美午夜精品久久久久久浪潮 | 色站综合| 国产在线观看不卡一区二区三区 | 欧美一区二区在线播放 | 在线精品一区二区三区 | 日本视频免费观看 | 欧美性猛片aaaaaaa做受 | 成人小视频在线观看 | 一区二区三区小视频 | 国产中的精品av涩差av | japanhdxxxx裸体 | 精品伊人久久 | 日日干夜夜操天天操 | 又爽又黄axxx片免费观看 | 国产精品久久久久久婷婷天堂 | 久久久久国产 | 久久最新 | 亚洲精品乱码8久久久久久日本 | 国产 欧美 日韩 一区 | 成人在线免费视频 | 国产草草视频 | 精品国产乱码久久久久久丨区2区 | 国产精品美女久久久久久久网站 | 国产精品视频一区二区三区 | 精品福利视频一区二区三区 | 国产精品久久久久久久久久久久久 |