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

QQ登錄

只需一步,快速開(kāi)始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:365486 發(fā)表于 2018-8-18 22:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我的MCU是STC12C5A60S2,晶振22.1184,我想設(shè)置波特率115200,但接收的全部都是亂碼,9600的可以。麻煩大神幫忙解釋一下。萬(wàn)分感謝!


代碼如下
  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()                 //數(shù)組初始化函數(shù)
  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 設(shè)置計(jì)數(shù)器工作方式2
  50. //          SCON =0X50;//設(shè)置工作方式1  設(shè)定串行口工作方式,接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志
  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位數(shù)據(jù),可變波特率
  59. AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
  60. AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
  61. TMOD &= 0x0F; //清除定時(shí)器1模式位
  62. TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
  63. TL1 = 0xF4; //設(shè)定定時(shí)初值
  64. TH1 = 0xF4; //設(shè)定定時(shí)器重裝值
  65. ET1 = 0; //禁止定時(shí)器1中斷
  66. TR1 = 1; //啟動(dòng)定時(shí)器1




  67. }
  68. void init_time()           //初始化定時(shí)器中斷
  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)        //發(fā)送數(shù)據(jù)
  89. {
  90.     ES = 0;
  91.     REN=0;
  92.     while(*P!='\0')
  93.     {
  94.         SBUF=*P;
  95.         P++;
  96.         while(!TI);          /*TI是串口發(fā)送完成標(biāo)志,發(fā)送完成TI值為1
  97.                         while(!TI) 的意思就是等待串口發(fā)送完成(未完成TI值為0,
  98. (!TI)值為1,循環(huán),直到串口發(fā)送完成,
  99. TI為1,(!TI)值為0,退出循環(huán),向下執(zhí)行)*/


  100.         TI=0;               //發(fā)送中斷標(biāo)志位,清0,取消此中斷申請(qǐng)        //TI
  101.     }
  102.     REN=1;

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

  106. void command_compare()        //命令判斷函數(shù)
  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是一種函數(shù),功能是把字母字符轉(zhuǎn)換成小寫(xiě),非字母字符不做出處理。[ i][ i]
  115.         }
  116.         strncpy(table,num,strlen(num));
  117.         /*
  118.         strlen所作的僅僅是一個(gè)計(jì)數(shù)器的工作,它從內(nèi)存的某個(gè)位置(可以是字符串開(kāi)頭,
  119.         中間某個(gè)位置,甚至是某個(gè)不確定的內(nèi)存區(qū)域)開(kāi)始掃描,
  120.         直到碰到第一個(gè)字符串結(jié)束符'\0'為止,然后返回計(jì)數(shù)器值(長(zhǎng)度不包含'\0')。[1]
  121.         */
  122.         if(strncmp(table,"start",5)==0) { /*strncmp函數(shù)用于比較特定長(zhǎng)度的字符串。返回值:當(dāng)string1大于string2時(shí),返回1;等于時(shí),返回0;小于時(shí),返回-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;                 //設(shè)置P4口為普通IO口
  167.     P1M1=0x00;
  168.     P1M0=0xff;        //P1強(qiáng)推輸出
  169.     P2M1=0x00;
  170.     P2M0=0xff;        //P2強(qiáng)推輸出

  171.     init_time();   //初始化計(jì)時(shí)器中斷
  172.     init_flage();  //初始化標(biāo)志位
  173.     init_com();                 //初始化串口定義
  174.     init_num();        //清空串口中字符串
  175. send_date("\r\n Evan2018-01-07");  //在上電狀態(tài)下,加這句輸出語(yǔ)句,可以防止在接收的時(shí)候,第一個(gè)字符串匹配不上
  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' 就是光標(biāo)下移一行 卻不會(huì)移到這一行的開(kāi)頭
  202.         {
  203.             return;
  204.         }
  205.         else
  206.         {
  207.             num[ i]=temp;[ i]
  208.             if(num[ i]=='\r')   //回車(chē)'\r'就是回到當(dāng)前行的開(kāi)頭 卻不會(huì)下移一行。  ‘\n\r’就是enter 回車(chē)的意思[ 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. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:365486 發(fā)表于 2018-8-18 22:52 | 只看該作者
試過(guò)各種方法,9600的波特率接收和發(fā)送都沒(méi)有問(wèn)題。求大神幫助!萬(wàn)分感謝!
回復(fù)

使用道具 舉報(bào)

板凳
ID:155507 發(fā)表于 2018-8-19 01:40 | 只看該作者
  1. void UartInit(void)                //115200bps@22.1184MHz
  2. {
  3.         SCON = 0x50;                //8位數(shù)據(jù),可變波特率
  4.         AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
  5.         AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
  6.         TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
  7.         TL1 = 0xD0;                //設(shè)定定時(shí)初值
  8.         TH1 = 0xFF;                //設(shè)定定時(shí)初值
  9.         ET1 = 0;                //禁止定時(shí)器1中斷
  10.         TR1 = 1;                //啟動(dòng)定時(shí)器1
  11. }




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

復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +15 收起 理由
楊雪飛 + 15 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:365486 發(fā)表于 2018-8-19 11:50 | 只看該作者
回復(fù)

使用道具 舉報(bào)

5#
ID:96682 發(fā)表于 2018-8-19 13:27 | 只看該作者
evanboys 發(fā)表于 2018-8-18 22:52
試過(guò)各種方法,9600的波特率接收和發(fā)送都沒(méi)有問(wèn)題。求大神幫助。∪f(wàn)分感謝!

因?yàn)檫@波特率與芯片還能匹配吧
回復(fù)

使用道具 舉報(bào)

6#
ID:365486 發(fā)表于 2018-8-20 01:16 | 只看該作者
wc86110 發(fā)表于 2018-8-19 13:27
因?yàn)檫@波特率與芯片還能匹配吧

您的意思是芯片問(wèn)題,不是軟件有問(wèn)題對(duì)嗎?
另外請(qǐng)教下,誤差多大通訊會(huì)正常
回復(fù)

使用道具 舉報(bào)

7#
ID:388197 發(fā)表于 2018-8-20 17:11 | 只看該作者
有沒(méi)有設(shè)置波特率加倍?
回復(fù)

使用道具 舉報(bào)

8#
ID:327030 發(fā)表于 2018-8-20 23:49 來(lái)自觸屏版 | 只看該作者
你是不是用src-isp這個(gè)軟件算的波特率,這好像算的不準(zhǔn)我用它一次都沒(méi)算對(duì)過(guò)
回復(fù)

使用道具 舉報(bào)

9#
ID:388354 發(fā)表于 2018-8-21 00:03 | 只看該作者
示波器抓波形看看
回復(fù)

使用道具 舉報(bào)

10#
ID:82586 發(fā)表于 2018-8-21 11:55 | 只看該作者
STC12C5A60S2,波特率做到115200沒(méi)問(wèn)題的;使用內(nèi)部波特率發(fā)生器,不要使用定時(shí)器;
回復(fù)

使用道具 舉報(bào)

11#
ID:137736 發(fā)表于 2018-8-21 19:00 | 只看該作者
晶振準(zhǔn)么,寫(xiě)個(gè)小程序,用一個(gè)端口輸出方波,用頻率計(jì)或示波器測(cè)一下;蛘邠Q11.059的晶體試試。
回復(fù)

使用道具 舉報(bào)

12#
ID:387076 發(fā)表于 2018-8-21 20:34 | 只看該作者
可以嘗試將晶振換成11.0592MHz,看看能不能使用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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