|
我的MCU是STC12C5A60S2,晶振22.1184,我想設(shè)置波特率115200,但接收的全部都是亂碼,9600的可以。麻煩大神幫忙解釋一下。萬(wàn)分感謝!

代碼如下
- #include"STC_NEW_8051.H"
- #include"ctype.h"
- #include"stdio.h"
- #include"string.h"
- #include"intrins.h"
- #include"delay.h"
- #include"EEPROM.h"
- #include"GPIO_explain.h"
- #include"GPIO_verdict.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ON 0
- #define OFF 1
- #define LOW 1
- #define HIGH 0
- unsigned int J;
- char xdata num[20];
- char xdata table[20];
- char xdata RX_date=0,RX_number=0;
- void init_time();
- void init_com();
- void init_num();
- void checkLED();
- void init_num() //數(shù)組初始化函數(shù)
- {
- char i;
- for(i=0; i<sizeof(num); i++)
- {
- num[ i]=0;[ i]
- }
- for(i=0; i<sizeof(table); i++)
- {
- table[ i]=0;[ i]
- }
- }
- void init_com() //COM初始化
- {
- // AUXR=AUXR|0x04;
- // SCON=0x50;
- // PCON=0x00;
- // AUXR=AUXR|0x01;
- // BRT=0xB8; //波特率9600
- // EA=1;
- // ES=1;
- // TI=0;
- // RI=0;
- // AUXR=AUXR|0x10;
- //
- // TMOD=0x20;//0010 0000 設(shè)置計(jì)數(shù)器工作方式2
- // SCON =0X50;//設(shè)置工作方式1 設(shè)定串行口工作方式,接收/發(fā)送控制以及設(shè)置狀態(tài)標(biāo)志
- // PCON =0X80;//波特率加倍
- // TH1=0XFF;
- // TL1=0XFA;
- // ES =1;
- // EA=1;
- // TR1=1;
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR |= 0x40; //定時(shí)器1時(shí)鐘為Fosc,即1T
- AUXR &= 0xFE; //串口1選擇定時(shí)器1為波特率發(fā)生器
- TMOD &= 0x0F; //清除定時(shí)器1模式位
- TMOD |= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
- TL1 = 0xF4; //設(shè)定定時(shí)初值
- TH1 = 0xF4; //設(shè)定定時(shí)器重裝值
- ET1 = 0; //禁止定時(shí)器1中斷
- TR1 = 1; //啟動(dòng)定時(shí)器1
- }
- void init_time() //初始化定時(shí)器中斷
- {
- TMOD=0x21;
- PS=1;
- TH0=(-2000)/256;
- TL0=(-2000)%256;
- ET0=1;
- TR0=1;
- EA=1;
- }
- //void send_byte(char date)
- //{
- // ES=0;
- // REN=0;
- // SBUF=date;
- // while(!TI);
- // TI=0;
- // REN=1;
- // ES=1;
- //}
- void send_date(char *P) //發(fā)送數(shù)據(jù)
- {
- ES = 0;
- REN=0;
- while(*P!='\0')
- {
- SBUF=*P;
- P++;
- while(!TI); /*TI是串口發(fā)送完成標(biāo)志,發(fā)送完成TI值為1
- while(!TI) 的意思就是等待串口發(fā)送完成(未完成TI值為0,
- (!TI)值為1,循環(huán),直到串口發(fā)送完成,
- TI為1,(!TI)值為0,退出循環(huán),向下執(zhí)行)*/
- TI=0; //發(fā)送中斷標(biāo)志位,清0,取消此中斷申請(qǐng) //TI
- }
- REN=1;
- ES = 1;
- init_num();
- }
- void command_compare() //命令判斷函數(shù)
- {
- int i,j;
- if(RX_flage==1)
- {
- RX_flage=0;
- for(i=0; i<sizeof(num); i++)
- {
- num[ i]= tolower(num[ i]); //tolower是一種函數(shù),功能是把字母字符轉(zhuǎn)換成小寫(xiě),非字母字符不做出處理。[ i][ i]
- }
- strncpy(table,num,strlen(num));
- /*
- strlen所作的僅僅是一個(gè)計(jì)數(shù)器的工作,它從內(nèi)存的某個(gè)位置(可以是字符串開(kāi)頭,
- 中間某個(gè)位置,甚至是某個(gè)不確定的內(nèi)存區(qū)域)開(kāi)始掃描,
- 直到碰到第一個(gè)字符串結(jié)束符'\0'為止,然后返回計(jì)數(shù)器值(長(zhǎng)度不包含'\0')。[1]
- */
- if(strncmp(table,"start",5)==0) { /*strncmp函數(shù)用于比較特定長(zhǎng)度的字符串。返回值:當(dāng)string1大于string2時(shí),返回1;等于時(shí),返回0;小于時(shí),返回-1。*/
- RX_date=0x01;
-
- }else if(strncmp(table,"stop",4)==0){
- RX_date=0x02;
- }
- else
- {
- RX_date=0x00; //send_date(table);send_date(num);send_date("\n\r");
- send_date("ERROR command\r\n");
- ES=1;
- REN=1;
- init_num();
- return;
- }
- switch(RX_date)
- {
- case 0x01:
- start_flage=1;
- open_LED=ON ;
- checkLED();
- init_num();
- break;
- case 0x02:
- open_LED=OFF;
- init_num();
- break;
- default:
- RX_date=0x00;
- init_num();
- send_date("ERROR command\r\n");
- break;
- }
- RX_date=0x00;
- RX_number=0;
- init_num();
- }
- }
- void main()
- {
- P0=0xff;
- P1=0xff;
- P2=0xff;
- P3=0xff;
- P4SW=0x00; //設(shè)置P4口為普通IO口
- P1M1=0x00;
- P1M0=0xff; //P1強(qiáng)推輸出
- P2M1=0x00;
- P2M0=0xff; //P2強(qiáng)推輸出
- init_time(); //初始化計(jì)時(shí)器中斷
- init_flage(); //初始化標(biāo)志位
- init_com(); //初始化串口定義
- init_num(); //清空串口中字符串
- send_date("\r\n Evan2018-01-07"); //在上電狀態(tài)下,加這句輸出語(yǔ)句,可以防止在接收的時(shí)候,第一個(gè)字符串匹配不上
- while(1)
- {
- command_compare();
- }
- }
- void time_0()interrupt 1 using 3
- {
- unsigned int T;
- TH0=(65535-2000)/256;
- TL0=(65535-2000)%256;
- T++;
- J++;
- if(T==500) {
- T=0;
- PCB_LED=!PCB_LED;
- }
- }
- void RX_com() interrupt 4 using 0
- {
- uchar temp;
- char i;
- if(RI)
- {
- temp=SBUF;
- RI=0;
- if(temp=='\n') //換行'\n' 就是光標(biāo)下移一行 卻不會(huì)移到這一行的開(kāi)頭
- {
- return;
- }
- else
- {
- num[ i]=temp;[ i]
- if(num[ i]=='\r') //回車(chē)'\r'就是回到當(dāng)前行的開(kāi)頭 卻不會(huì)下移一行。 ‘\n\r’就是enter 回車(chē)的意思[ i]
- {
- i=0;
- ES=0;
- REN=0;
- RX_flage=1;
- return;
- }
- i++;
- }
- }
- }
- void checkLED()
- {
- if(K1==1)
- {
- send_date("\r\nRET1:FAIL END");
- } else if(K1==0)
- {
- send_date("\r\nRET1:PASS END");
- }
- if(K2==1)
- {
- send_date("\r\nRET2:FAIL END");
- } else if(K2==0)
- {
- send_date("\r\nRET2:PASS END");
- }
- if(K3==1)
- {
- send_date("\r\nRET3:FAIL END");
- } else if(K3==0)
- {
- send_date("\r\nRET3:PASS END");
- }
- if(K4==1)
- {
- send_date("\r\nRET4:FAIL END");
- } else if(K4==0)
- {
- send_date("\r\nRET4:PASS END");
- }
- if(K5==1)
- {
- send_date("\r\nRET5:FAIL END");
- } else if(K5==0)
- {
- send_date("\r\nRET5:PASS END");
- }
- if(K6==1)
- {
- send_date("\r\nRET6:FAIL END");
- } else if(K6==0)
- {
- send_date("\r\nRET6:PASS END");
- }
- }
復(fù)制代碼
|
|