我的MCU是STC12C5A60S2,晶振22.1184,我想设置波特率115200,但接收的全部都是乱码,9600的可以。麻烦大神帮忙解释一下。万分感谢!
代码如下
- #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() //数组初始化函数
- {
- 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 设置计数器工作方式2
- // SCON =0X50;//设置工作方式1 设定串行口工作方式,接收/发送控制以及设置状态标志
- // PCON =0X80;//波特率加倍
- // TH1=0XFF;
- // TL1=0XFA;
- // ES =1;
- // EA=1;
- // TR1=1;
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0x50; //8位数据,可变波特率
- AUXR |= 0x40; //定时器1时钟为Fosc,即1T
- AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
- TMOD &= 0x0F; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xF4; //设定定时初值
- TH1 = 0xF4; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- }
- void init_time() //初始化定时器中断
- {
- 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) //发送数据
- {
- ES = 0;
- REN=0;
- while(*P!='\0')
- {
- SBUF=*P;
- P++;
- while(!TI); /*TI是串口发送完成标志,发送完成TI值为1
- while(!TI) 的意思就是等待串口发送完成(未完成TI值为0,
- (!TI)值为1,循环,直到串口发送完成,
- TI为1,(!TI)值为0,退出循环,向下执行)*/
- TI=0; //发送中断标志位,清0,取消此中断申请 //TI
- }
- REN=1;
- ES = 1;
- init_num();
- }
- void command_compare() //命令判断函数
- {
- int i,j;
- if(RX_flage==1)
- {
- RX_flage=0;
- for(i=0; i<sizeof(num); i++)
- {
- num[ i]= tolower(num[ i]); //tolower是一种函数,功能是把字母字符转换成小写,非字母字符不做出处理。[ i][ i]
- }
- strncpy(table,num,strlen(num));
- /*
- strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,
- 中间某个位置,甚至是某个不确定的内存区域)开始扫描,
- 直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。[1]
- */
- if(strncmp(table,"start",5)==0) { /*strncmp函数用于比较特定长度的字符串。返回值:当string1大于string2时,返回1;等于时,返回0;小于时,返回-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; //设置P4口为普通IO口
- P1M1=0x00;
- P1M0=0xff; //P1强推输出
- P2M1=0x00;
- P2M0=0xff; //P2强推输出
- init_time(); //初始化计时器中断
- init_flage(); //初始化标志位
- init_com(); //初始化串口定义
- init_num(); //清空串口中字符串
- send_date("\r\n Evan2018-01-07"); //在上电状态下,加这句输出语句,可以防止在接收的时候,第一个字符串匹配不上
- 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' 就是光标下移一行 却不会移到这一行的开头
- {
- return;
- }
- else
- {
- num[ i]=temp;[ i]
- if(num[ i]=='\r') //回车'\r'就是回到当前行的开头 却不会下移一行。 ‘\n\r’就是enter 回车的意思[ 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");
- }
- }
复制代码
|