新闻中心

EEPW首页>嵌入式系统>设计应用> 模拟串口自动测量波特率的单片机程序

模拟串口自动测量波特率的单片机程序

作者: 时间:2012-08-02 来源:网络 收藏

void WByte(BYTE out)
{
//发送启始位
BYTE i=8;
BYTE tmp=out;
TR1=1;//开定时器
TX1=0;
WaitTF1();
//发送8位数据位
while(i--)
{
TX1=(tmp0x01); //先传低位
tmp=tmp>>1;
WaitTF1();
}
//发送校验位(无)
//发送结束位
TX1=1;
WaitTF1();
TR1=0;
}
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;cnt8;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;//定时器CLR
while(!RX1);//等待频率脚变高,这个是测低电平的
while(RX1);//等待脚变低,更换符号可以测正脉冲
TR1=1;//开启定时器
while(!RX1);//等待变高
TR1=0;//停止计数
//cyc=TH08;
//cyc=cyc+TL0;
return (TH18)+TL1;
}
void baud_t()
{
BYTE k;//复用变量
ULONG frq=0; //周期变量
for(k=0;k5;k++)// 变量复用大法
{
frq=frq+f_Test();//测试
}//测量5次取平均
frq=frq/5;
if(frq0xff)
{
k=0x100-(frq0xff);
min_mode=MIS_0;
}
else
{
if(frq / 2 0xff)
{//2400baud
k=0x100-((frq/2)0xff); //2分频
min_mode=MIS_2;
}
else if(frq / 4 0xff)
{//1200baud
k=0x100-((frq/4)0xff);//4分频
min_mode=MIS_4;
}
else if(frq / 8 0xff)
{//1200baud
k=0x100-((frq/8)0xff);//8分频
min_mode=MIS_8;
}
else if(frq / 16 0xff)
{//1200baud
k=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!n");
printf("Here:mode=%d,T1=0x%Xrn",min_mode,TH1);//这里如果你要使用keil请自己写字符串发送函数,和sprintf配合使用
printf("Could you please test another baudrate?rn");
printf("But I think that I couldn't to do.....rn");
}
}


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭