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

发布者:等放假的Lwj最新更新时间:2015-07-16 来源: 51hei关键字:模拟串口  自适应波特率 手机看文章 扫描二维码
随时随地手机看文章
这个是在12T的8051上面用的模拟串口程序,配合22.1184M的晶振,加上6T的双倍速,波特率可以上38400……但是我认为和某些STC的芯片比,还是差了一点,所以说,看官门看注释吧。开启帧请发送没有连续低电平的字符,类似0×55,0xff,0x7f如此等等,如果有连续低电平很容易造成判断失误……这个程序可以用在STC的自动冷启动模块里(STC15F101系列就行,很便宜的,注意是八位装载模式顺便把T1X12关了~然后补偿可以顺便减小一点,顺便说一句,用AT89C51来做也行)。这个在24M/22.1184M/11.0592M均工作正常,11.0592能到9600,24能到38400。不过,我提个醒,如果看官们真拿这个做STC冷启的时候一定要限制波特率小于等于4800。要不然的话。串口正常通讯的时候,这个模块同步上去,把你的电断了,连接掐了,然后估计你会拼命找程序是不是跑飞,浪费很多时间,……

顺便说一句,这个程序也有另外一个用途,在晶振不准的时候仍然可以和电脑以标准波特率通讯。方法就是规定好帧格式,然后上位机不停换波特率找到没有误码率的波特率,然后根据下位机的应答计算出下位机的时钟频率,这个是受了老妖ISP的启发才想到的~大家可以参考我发布的另2篇文章:模拟串口自动测量波特率的单片机程序http://www.51hei.com/mcu/1537.html ,下面这个网页是用11.0592兆的晶振模拟串口接收发发送的已经通过本人测试http://www.51hei.com/mcu/1418.html

上代码:

/*
 * 自适应波特率模拟串口程序,
 * BY 万致远@rwzy.co.cc
 * CRYSTAL:任意
 */
#include 
#include 
#include 
#define MIS_0 0
#define MIS_2 1
#define MIS_4 2
#define MIS_8 3 
#define MIS_16 4 

BYTE min_mode;//减倍模式
void WaitTF1()
{
	while(!TF1);
	TF1=0;
	if(min_mode==MIS_2)
	{// /2
		while(!TF1);
		TF1=0;
	}
	else if(min_mode == MIS_4)
	{// /4
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
	}
	else if(min_mode == MIS_8)
	{// /8
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
	}
	else if(min_mode == MIS_16)
	{// /16
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
		while(!TF1);
		TF1=0;
	}
}

void WByte(BYTE out)
{
    //发送启始位
    BYTE i=8;
    BYTE tmp=out;
    TR1=1;//开定时器
    TX1=0;
    WaitTF1();
    //发送8位数据位
    while(i--)
    {
        TX1=(tmp&0x01);     //先传低位
        tmp=tmp>>1;
        WaitTF1();
    }
    //发送校验位(无)
    //发送结束位
    TX1=1;
    WaitTF1();
    TR1=0;
}    [page]
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;//定时器CLR
	while(!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)
		{//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!
");
		printf("Here:mode=%d,T1=0x%X
",min_mode,TH1);
		printf("Could you please test another baudrate?
");
		printf("But I think that I couldn't to do.....
");
	}
}

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

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

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

Clock=12(256-R)*B

关键字:模拟串口  自适应波特率 引用地址:再次发模拟串口,51自适应波特率

上一篇:数码管电子钟
下一篇:模拟串口自动测量波特率的单片机程序

推荐阅读最新更新时间:2024-03-16 14:25

MCS-51单片机的内部结构
1、8051单片机片内并行接口 2、MCS-51的内部资源 3、 MCS-51的芯片引脚 图1-8 MCS-51引脚图 4、单片机的工作方式 单片机的工作方式包括:复位方式、程序执行方式、单步执行方式、低功耗操作方式以及EPROM编程和校验方式。 1. 复位方式:经典的上电复位电路 2. 程序执行方式:(1)执行内部程序;(2)执行外部程序 3. 单步执行方式:用于调试程序和系统 4. 低功耗操作方式 5. 编程和校验
[单片机]
MCS-<font color='red'>51</font>单片机的内部结构
英特尔RealSense负责人谈L515激光雷达传感器
英特尔发布了新型的RealSense激光雷达相机L515,它是世界上最小,最节能的激光雷达相机,能够每秒捕获数百万个深度点,并采用了一项新技术,以创新方式将激光雷达集成到智能设备中。 RealSense专家开发了革命性的固态激光雷达固态摄像机系列。新型英特尔实感激光雷达相机L515具有无与伦比的深度质量和能效,能够每秒生成2300万个准确的深度点,使其非常适合各种场景。 在我们看来,L515与苹果新推出的iPad Pro中的激光雷达传感器有相似之处。我们很幸运能够向英特尔新兴成长与孵化(EGI)部门的企业副总裁兼RealSense总经理Sagi Ben Moshe采访。 以下是文章详情 问:作为全球领先的微处理器供
[传感器]
用AT89C2051设计的多功能密码锁
本站介绍一种由AT89C2051编程实现的控制电路,具有按键有效指示、输入错误、解码有效指示、控制开锁、定时中断、错误报警、密码修改等功能;8位10进制密码,保密好使用范围广,特适用家庭、宾馆等场所。 一、硬件电路: AT89C2051是与MCS-51系列兼容的一种高性能单片机,具有2KB片内ROM、256字节片内RAM,可以不需扩展外程序、数据存储器,可满足一般的程序需求,从硬件组成可以看出该密码锁有一个3X4阵列的键盘,只需7条I/O引脚就可以了余下的I/O引脚可以开发其他控制功能,如:控制空调、电灯、风扇等。 二、功能实现 键盘扫描所用引脚P1.0-P1.6,其中P1.4-P1.6这3条引脚用于输出扫描信号,
[单片机]
用AT89C20<font color='red'>51</font>设计的多功能密码锁
使用8051单片机原理的步进电机控制
步进电机是一种无刷同步电机,它将完整的旋转分为若干步。每个步进电动机将具有一些固定的步进角,并且电动机以该角度旋转。在本文中,我将向您展示如何使用两个不同的驱动器(L293D和ULN 2003)将步进电机与8051连接。此外,此处还将说明使用8051单片机的步进电机控制。 使用8051单片机原理的步进电机控制 这些电路的主要原理是使步进电机以特定的步进角步进旋转。由于控制器无法提供电动机所需的电流,因此ULN2003 IC和L293D电动机驱动器用于驱动步进电动机。 电路1:使用8051单片机和L293D进行步进电机控制 该项目中的第一个电路是使用L293D电机驱动器IC实现的。由于L293D电动机驱动器具有四个输出引脚的
[单片机]
使用80<font color='red'>51</font>单片机原理的步进电机控制
51单片机-asm与C混合编程
  一是源程序中直接混合嵌入,二是做成库函数调用,三是做成是中间文件在链接中加入。   在单片机应用系统设计中,过去主要采用汇编语言开发程序。汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差。C语言程序开发是近年来单片机系统开发应用所采用的主要开发方式之一,C 语言功能丰富、表达能力强、使用灵活方便、开发周期短、可读性强、可移植性好。但是,采用C 语言编程还是存在着如对硬件没有汇编方便、效率没有汇编高、编写延时程序精确度不高等缺点,因而现在单片机系统开发中经常用到C 语言与汇编语言混合编程技术。混合编程技术可以把C 语言和汇编语言的优点结合起来,编写出性能优良的程序
[单片机]
<font color='red'>51</font>单片机-asm与C混合编程
自制简单51单片机编程器(烧写器)
AT89C51是一款应用最为广泛的8051单片机,更重要的是他具有反复烧写(FLASH)的特性。一般情况下可重复烧写1000次,这样为初学者试验提供了一个廉价的平台。为了满足广大单片机爱好者动手的需要,本人利用半个月的时间,参考国外资料,实际设计制作成功一款简单的AT89C51/52/55单片机编程器。由于单片机编程时序不同,这一款编程器仅仅支持ATMEL公司的AT89C51, AT89C52, AT89C55芯片,不支持华邦或飞利浦兼容芯片。下面是单片机编程器电路图. 注:元器件清单见附录 工作原理简述: Q2, Q4以及周围的几个元件构成了电平转换电路,这样节省了1片max 232芯片,在要求不高的场合,这个电路在
[单片机]
自制简单<font color='red'>51</font>单片机编程器(烧写器)
单片机C语言C51的运算符及表达式
1. 赋值运算符 赋值运算符“=”,在C51中,它的功能是将一个数据的值赋给一个变量,如x=10。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式,在赋值表达式的后面加一个分号“;”就构成了赋值语句,一个赋值语句的格式如下: 变量=表达式; 执行时先计算出右边表达式的值,然后赋给左边的变量。例如: x=8+9; /*将8+9的值赋绐变量x*/ x=y=5; /*将常数5同时赋给变量x和y*/ 在C51中,允许在一个语句中同时给多个变量赋值,赋值顺序自右向左。 2. 算术运算符 C51中支持的算术运算符有: + 加或取正值运算符 - 减或取负值运算符
[单片机]
一文详解80C51单片机的指令系统
指令是指示计算机执行某种操作的命令,计算机能识别执行的只能是二进制代码,以二进制代码来描述指令功能的语言,称为机器语言。 由于机器语言不便于人们识别,记忆,理解和使用,因此便对每条机器语言指令用助记符号来形象表示,这就便形成了汇编语言。 一条指令是机器语言的一个语句,包括操作码字段和操作数字段。一台计算机所具有的全部指令的集合,称为这台计算机的指令系统。 不同的微处理器,其指令系统一般是不同的。 80C51单片机指令系统共有111条指令,具体特点如下: 1)执行时间短,单机器周期指令(64条),双机器周期指令(45条),而四机器周期指令只有2条; 2)指令编码字节少,单字节指令(49条),双字节指令(45条)和最长的三字节
[单片机]
一文详解80C<font color='red'>51</font>单片机的指令系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved