新闻中心

EEPW首页>嵌入式系统>设计应用> 再次发模拟串口,51自适应波特率

再次发模拟串口,51自适应波特率

作者: 时间:2016-11-29 来源:网络 收藏
void putchar(char ch){WByte(ch);}BYTE RByte(){BYTE in=0;BYTE cnt;while(RX1==1);//等待RXD变低,启动定时器,这个是阻塞模式TR1=1;//同步开定时器//这里……//while(!TF1);//TF1=0; WaitTF1();if(min_mode !=0){while(!TF1);//注意这里的周期稍微长。要补偿TF1=0;}for(cnt=0;cnt<8;cnt++){in=in >>1;//从高移到低if(RX1==1) in = in | 0x80;//如果RXD=1,则最高置位WaitTF1();//等待一位过去}while(!TF1);//注意这里的周期稍微长。要补偿TF1=0;TR1=0;//关闭定时器return in;}UINT f_Test(void)//测试脉宽{TMOD=0x10;//设置计数器1为方式一计数器模式TH1=0;TL1=0;//定时器CLRwhile(!RX1);//等待频率脚变高,这个是测低电平的while(RX1);//等待脚变低,更换符号可以测正脉冲TR1=1;//开启定时器while(!RX1);//等待变高TR1=0;//停止计数//cyc=TH0<<8;//cyc=cyc+TL0;return (TH1<<8)+TL1;}void baud_t(){BYTE k;//复用变量 ULONG frq=0; //周期变量for(k=0;k<5;k++)// 变量复用大法{frq=frq+f_Test();//测试}//测量5次取平均frq=frq/5;if(frq<0xff){k=0x100-(frq&0xff);min_mode=MIS_0;}else{if(frq / 2 < 0xff){//2400baudk=0x100-((frq/2)&0xff); //2分频min_mode=MIS_2;}else if(frq / 4 < 0xff){//1200baudk=0x100-((frq/4)&0xff);//4分频min_mode=MIS_4;}else if(frq / 8 < 0xff){//1200baudk=0x100-((frq/8)&0xff);//8分频min_mode=MIS_8;}else if(frq / 16 < 0xff){//1200baudk=0x100-((frq/16)&0xff);//16分频min_mode=MIS_16;}}if(k > 0x50){k=k+6;//加补偿,因为if语句让机器周期加长//如果对于STC的新MCU,这里要按照情况调整}TMOD=0x20;//设置定时器1为自动装载模式TH1=k;//载入新波特率TL1=k;}void main(){while(1){baud_t();//测量波特率,阻塞模式printf("Hello world!");printf("Here:mode=%d,T1=0x%X",min_mode,TH1);printf("Could you please test another baudrate?");printf("But I think that I couldnt to do.....");}}

完整的源代码下载:http://www.51hei.com/f/molic.rar
转自:万致远的博客http://www.rwzy.co.cc

本文引用地址://m.amcfsurvey.com/article/201611/323397.htm

顺便说一下,根据重载值计算波特率的公式是:

R=重载值
Clock=系统时钟(HZ)
B=波特率

Clock=12(256-R)*B


上一页 1 2 下一页

评论


技术专区

关闭