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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7047|回復: 11
收起左側

STC12C5A60S2單片機晶振22.1184,我想設置波特率115200,但接收的全部都是亂碼

[復制鏈接]
ID:365486 發表于 2018-8-18 22:51 | 顯示全部樓層 |閱讀模式
我的MCU是STC12C5A60S2,晶振22.1184,我想設置波特率115200,但接收的全部都是亂碼,9600的可以。麻煩大神幫忙解釋一下。萬分感謝!


代碼如下
  1. #include"STC_NEW_8051.H"
  2. #include"ctype.h"
  3. #include"stdio.h"
  4. #include"string.h"
  5. #include"intrins.h"
  6. #include"delay.h"
  7. #include"EEPROM.h"
  8. #include"GPIO_explain.h"
  9. #include"GPIO_verdict.h"

  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define ON 0
  13. #define OFF 1
  14. #define LOW 1
  15. #define HIGH 0
  16. unsigned int J;
  17. char xdata num[20];
  18. char xdata table[20];

  19. char xdata RX_date=0,RX_number=0;

  20. void init_time();

  21. void init_com();
  22. void init_num();

  23. void checkLED();

  24. void init_num()                 //數組初始化函數
  25. {
  26.     char i;
  27.     for(i=0; i<sizeof(num); i++)
  28.     {
  29.         num[ i]=0;[ i]
  30.     }
  31.     for(i=0; i<sizeof(table); i++)
  32.     {
  33.         table[ i]=0;[ i]
  34.     }
  35. }

  36. void init_com()                 //COM初始化
  37. {
  38. //    AUXR=AUXR|0x04;
  39. //    SCON=0x50;
  40. //    PCON=0x00;
  41. //    AUXR=AUXR|0x01;
  42. //    BRT=0xB8;         //波特率9600
  43. //    EA=1;
  44. //    ES=1;
  45. //    TI=0;
  46. //    RI=0;
  47. //    AUXR=AUXR|0x10;
  48. //


  49. //          TMOD=0x20;//0010 0000 設置計數器工作方式2
  50. //          SCON =0X50;//設置工作方式1  設定串行口工作方式,接收/發送控制以及設置狀態標志
  51. //          PCON =0X80;//波特率加倍
  52. //          TH1=0XFF;
  53. //          TL1=0XFA;
  54. //          ES =1;
  55. //          EA=1;
  56. //          TR1=1;



  57. PCON |= 0x80; //使能波特率倍速位SMOD
  58. SCON = 0x50; //8位數據,可變波特率
  59. AUXR |= 0x40; //定時器1時鐘為Fosc,即1T
  60. AUXR &= 0xFE; //串口1選擇定時器1為波特率發生器
  61. TMOD &= 0x0F; //清除定時器1模式位
  62. TMOD |= 0x20; //設定定時器1為8位自動重裝方式
  63. TL1 = 0xF4; //設定定時初值
  64. TH1 = 0xF4; //設定定時器重裝值
  65. ET1 = 0; //禁止定時器1中斷
  66. TR1 = 1; //啟動定時器1




  67. }
  68. void init_time()           //初始化定時器中斷
  69. {
  70.     TMOD=0x21;
  71.     PS=1;
  72.     TH0=(-2000)/256;
  73.     TL0=(-2000)%256;
  74.     ET0=1;
  75.     TR0=1;
  76.     EA=1;
  77. }


  78. //void send_byte(char date)
  79. //{
  80. //    ES=0;
  81. //    REN=0;
  82. //    SBUF=date;
  83. //    while(!TI);
  84. //    TI=0;
  85. //    REN=1;
  86. //    ES=1;
  87. //}

  88. void send_date(char *P)        //發送數據
  89. {
  90.     ES = 0;
  91.     REN=0;
  92.     while(*P!='\0')
  93.     {
  94.         SBUF=*P;
  95.         P++;
  96.         while(!TI);          /*TI是串口發送完成標志,發送完成TI值為1
  97.                         while(!TI) 的意思就是等待串口發送完成(未完成TI值為0,
  98. (!TI)值為1,循環,直到串口發送完成,
  99. TI為1,(!TI)值為0,退出循環,向下執行)*/


  100.         TI=0;               //發送中斷標志位,清0,取消此中斷申請        //TI
  101.     }
  102.     REN=1;

  103.     ES = 1;
  104.     init_num();
  105. }

  106. void command_compare()        //命令判斷函數
  107. {
  108.     int i,j;
  109.     if(RX_flage==1)
  110.     {
  111.         RX_flage=0;
  112.         for(i=0; i<sizeof(num); i++)
  113.         {
  114.             num[ i]= tolower(num[ i]);        //tolower是一種函數,功能是把字母字符轉換成小寫,非字母字符不做出處理。[ i][ i]
  115.         }
  116.         strncpy(table,num,strlen(num));
  117.         /*
  118.         strlen所作的僅僅是一個計數器的工作,它從內存的某個位置(可以是字符串開頭,
  119.         中間某個位置,甚至是某個不確定的內存區域)開始掃描,
  120.         直到碰到第一個字符串結束符'\0'為止,然后返回計數器值(長度不包含'\0')。[1]
  121.         */
  122.         if(strncmp(table,"start",5)==0) { /*strncmp函數用于比較特定長度的字符串。返回值:當string1大于string2時,返回1;等于時,返回0;小于時,返回-1。*/
  123.             RX_date=0x01;
  124.          
  125.         }else if(strncmp(table,"stop",4)==0){
  126. RX_date=0x02;

  127. }
  128.         else
  129.         {
  130.             RX_date=0x00;        //send_date(table);send_date(num);send_date("\n\r");
  131.             send_date("ERROR command\r\n");
  132.             ES=1;
  133.             REN=1;
  134.             init_num();
  135.             return;
  136.         }

  137.         switch(RX_date)
  138.         {
  139.         case 0x01:
  140.             start_flage=1;
  141. open_LED=ON        ;
  142.             checkLED();
  143.             init_num();
  144.             break;
  145. case 0x02:
  146. open_LED=OFF;
  147. init_num();
  148. break;
  149.         default:
  150.             RX_date=0x00;
  151.             init_num();
  152.             send_date("ERROR command\r\n");
  153.             break;
  154.         }
  155.         RX_date=0x00;
  156.         RX_number=0;
  157.         init_num();
  158.     }
  159. }




  160. void main()
  161. {

  162.     P0=0xff;
  163.     P1=0xff;
  164.     P2=0xff;
  165.     P3=0xff;
  166.     P4SW=0x00;                 //設置P4口為普通IO口
  167.     P1M1=0x00;
  168.     P1M0=0xff;        //P1強推輸出
  169.     P2M1=0x00;
  170.     P2M0=0xff;        //P2強推輸出

  171.     init_time();   //初始化計時器中斷
  172.     init_flage();  //初始化標志位
  173.     init_com();                 //初始化串口定義
  174.     init_num();        //清空串口中字符串
  175. send_date("\r\n Evan2018-01-07");  //在上電狀態下,加這句輸出語句,可以防止在接收的時候,第一個字符串匹配不上
  176.     while(1)
  177.     {
  178.         command_compare();
  179.     }
  180. }
  181. void time_0()interrupt 1 using 3
  182. {
  183.     unsigned int T;
  184.     TH0=(65535-2000)/256;
  185.     TL0=(65535-2000)%256;
  186.     T++;
  187. J++;
  188.     if(T==500)        {
  189.         T=0;
  190.         PCB_LED=!PCB_LED;
  191.     }
  192. }

  193. void RX_com() interrupt 4 using 0
  194. {
  195.     uchar temp;
  196.     char i;
  197.     if(RI)
  198.     {
  199.         temp=SBUF;
  200.         RI=0;
  201.         if(temp=='\n')         //換行'\n' 就是光標下移一行 卻不會移到這一行的開頭
  202.         {
  203.             return;
  204.         }
  205.         else
  206.         {
  207.             num[ i]=temp;[ i]
  208.             if(num[ i]=='\r')   //回車'\r'就是回到當前行的開頭 卻不會下移一行。  ‘\n\r’就是enter 回車的意思[ i]
  209.             {

  210.                 i=0;
  211.                 ES=0;
  212.                 REN=0;
  213.                 RX_flage=1;
  214.                 return;
  215.             }
  216.             i++;
  217.         }
  218.     }


  219. }
  220. void checkLED()
  221. {
  222.     if(K1==1)
  223.     {
  224.         send_date("\r\nRET1:FAIL END");
  225.     } else if(K1==0)
  226.     {
  227.         send_date("\r\nRET1:PASS END");
  228.     }



  229.     if(K2==1)
  230.     {
  231.         send_date("\r\nRET2:FAIL END");
  232.     } else if(K2==0)
  233.     {
  234.         send_date("\r\nRET2:PASS END");
  235.     }



  236.     if(K3==1)
  237.     {
  238.         send_date("\r\nRET3:FAIL END");
  239.     }        else if(K3==0)
  240.     {
  241.         send_date("\r\nRET3:PASS END");
  242.     }




  243.     if(K4==1)
  244.     {
  245.         send_date("\r\nRET4:FAIL END");
  246.     } else if(K4==0)
  247.     {
  248.         send_date("\r\nRET4:PASS END");
  249.     }

  250.     if(K5==1)
  251.     {
  252.         send_date("\r\nRET5:FAIL END");
  253.     } else if(K5==0)
  254.     {
  255.         send_date("\r\nRET5:PASS END");
  256.     }



  257.     if(K6==1)
  258.     {
  259.         send_date("\r\nRET6:FAIL END");
  260.     } else if(K6==0)
  261.     {
  262.         send_date("\r\nRET6:PASS END");
  263.     }
  264. }
復制代碼



回復

使用道具 舉報

ID:365486 發表于 2018-8-18 22:52 | 顯示全部樓層
試過各種方法,9600的波特率接收和發送都沒有問題。求大神幫助啊!萬分感謝!
回復

使用道具 舉報

ID:155507 發表于 2018-8-19 01:40 | 顯示全部樓層
  1. void UartInit(void)                //115200bps@22.1184MHz
  2. {
  3.         SCON = 0x50;                //8位數據,可變波特率
  4.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  5.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  6.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  7.         TL1 = 0xD0;                //設定定時初值
  8.         TH1 = 0xFF;                //設定定時初值
  9.         ET1 = 0;                //禁止定時器1中斷
  10.         TR1 = 1;                //啟動定時器1
  11. }




  12. void UartInit(void)                //115200bps@22.1184MHz
  13. {
  14.         SCON = 0x50;                //8位數據,可變波特率
  15.         AUXR &= 0xBF;                //定時器1時鐘為Fosc/12,即12T
  16.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  17.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  18.         TL1 = 0xFC;                //設定定時初值
  19.         TH1 = 0xFF;                //設定定時初值
  20.         ET1 = 0;                //禁止定時器1中斷
  21.         TR1 = 1;                //啟動定時器1
  22. }

復制代碼

評分

參與人數 1黑幣 +15 收起 理由
楊雪飛 + 15 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:365486 發表于 2018-8-19 11:50 | 顯示全部樓層
回復

使用道具 舉報

ID:96682 發表于 2018-8-19 13:27 | 顯示全部樓層
evanboys 發表于 2018-8-18 22:52
試過各種方法,9600的波特率接收和發送都沒有問題。求大神幫助啊!萬分感謝!

因為這波特率與芯片還能匹配吧
回復

使用道具 舉報

ID:365486 發表于 2018-8-20 01:16 | 顯示全部樓層
wc86110 發表于 2018-8-19 13:27
因為這波特率與芯片還能匹配吧

您的意思是芯片問題,不是軟件有問題對嗎?
另外請教下,誤差多大通訊會正常
回復

使用道具 舉報

ID:388197 發表于 2018-8-20 17:11 | 顯示全部樓層
有沒有設置波特率加倍?
回復

使用道具 舉報

ID:327030 發表于 2018-8-20 23:49 來自觸屏版 | 顯示全部樓層
你是不是用src-isp這個軟件算的波特率,這好像算的不準我用它一次都沒算對過
回復

使用道具 舉報

ID:388354 發表于 2018-8-21 00:03 | 顯示全部樓層
示波器抓波形看看
回復

使用道具 舉報

ID:82586 發表于 2018-8-21 11:55 | 顯示全部樓層
STC12C5A60S2,波特率做到115200沒問題的;使用內部波特率發生器,不要使用定時器;
回復

使用道具 舉報

ID:137736 發表于 2018-8-21 19:00 | 顯示全部樓層
晶振準么,寫個小程序,用一個端口輸出方波,用頻率計或示波器測一下。或者換11.059的晶體試試。
回復

使用道具 舉報

ID:387076 發表于 2018-8-21 20:34 | 顯示全部樓層
可以嘗試將晶振換成11.0592MHz,看看能不能使用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色在线免费视频 | 欧美精品1区| 北条麻妃一区二区三区在线观看 | 91av免费版 | 久久国产精品久久国产精品 | 97精品超碰一区二区三区 | www.精品国产| 国产1区在线 | 国产成人精品免高潮在线观看 | 亚洲国产网站 | 中文字幕亚洲一区二区三区 | 久久久精品影院 | 在线看片网站 | 操久久| 久久网一区二区三区 | 精品一二三区视频 | 欧美精品久久久 | 福利电影在线 | 91精品国产综合久久精品 | 国产精品视频999 | 国产精品高清一区二区三区 | 99re国产视频 | 国产在线一区二区 | 91色综合 | 国产精品不卡一区二区三区 | 成人精品视频99在线观看免费 | 国产精品乱码一区二区三区 | 日韩黄色av | 日韩欧美成人一区二区三区 | 亚洲美女一区二区三区 | www.伊人.com| 国产福利视频网站 | a视频在线播放 | 日韩av在线播 | 欧州一区 | 欧美精品在线视频 | 黄色一级片在线播放 | 日韩欧美精品一区 | 欧美在线一区二区三区 | 91资源在线 | 欧美日韩在线成人 |