历史上的今天
返回首页

历史上的今天

今天是:2024年12月13日(星期五)

正在发生

2018年12月13日 | 关于89C52单片机11.0592M晶振产生115200波特率的方法

2018-12-13 来源:eefocus

当然下面所讨论产生115200波特率的最大难题就是因为它的时钟周期是等于12个机器周期的(12T模式)


定时器T1要想作为波特率发生器,必须是工作在8位自动重装载模式下,并且禁止使能T1的中断! 


还有一个重要的寄存器就是PCON了,最高位SMOD可以使得波特率加倍!当然这里由于这里的8位自动重装载模式的限制,也并不是像我们想象的那样,既然可以产生9600的波特率那个加倍以下不就是115200了嘛?!


Too young, Too simple!


先看两个公式吧,, 


当波特率不加倍使用定时器T1,产生波特率的计算方法:


TH1 = TL1 = 256 - 晶振值/12/2/16/波特率


使用波特率加倍后的计算公式为:


TH1 = TL1 = 256 - 晶振值/12/16/波特率


当我们不加倍的时候,产生的最大波特率(让TH1 = 0xFF) 28800


加倍后产生的最大波特率为57600(刚好就是28800的两倍)


所以就增强型的51单片机89C52来说,T0是可定不能作为波特率发生器的,而T1貌似又达不到要求,没辙了吗? 别忘了,它还有T2呢!!!


先来简单的认识一下T2及其有关的寄存器!


先看主要的,咱们要用的! 


①作为波特率发生器


T2CON的TCLK和RCLK位为0(默认)时,串行口发送和接受的波特率由定时器1提供;置位为1时,由定时器2提供。可以一个通过定时器1,一个通过定时器2,这样可以获得发送和接受时不同的波特率。


注意的地方: 定时器2作为定时器时,递增频率为晶振频率的12分频,而定时器2作为波特率发生器时,它的递增频率为晶振频率的2分频。


定时器2作为波特率发生器的时候,TH2溢出并不会置位TF2,所以此时可以不用禁止定时器2中断,若是EXEN2位被置位时,可以将T2EX作为附加的外部中断。


定时器2作为波特率发生器的时候,不要对TH2和TL2读写,可以读陷阱寄存器,但是也不要写。当对定时器2的陷阱寄存器进行访问时,应关闭定时器(TR2清0)。


波特率 = 模式1和模式3的波特率=(振荡器频率/32) * [65535-(RCAP2H,RCAP2L)]


115200时对应的初值


#include

#include


void init_com( void ) 

   SCON=0x50;   

   TH2=0xFF;           

   TL2=0xFD;   

   RCAP2H=0xFF;   

   RCAP2L=0xFD; 


/*****************/

   TCLK=1;   

   RCLK=1;   

   C_T2=0;   

   EXEN2=0;


/*****************/

   TR2=1 ;

   TI = 1;

}


void main()

{

    init_com();


    while(1)

    {

         printf("Hello World\n");

    }

}

这里写图片描述


然后再次选择115200的波特率实验现象 


emmmmm,本来写到这里这篇算是完结了,,但是突然的收尾似乎显得有点意犹未尽,没错,想说的还没说完,继续造起来,一起来再来领悟一下神奇的T2以及探索一下还有哪些神奇的操作。


这里写图片描述


继续来看T2吧, 


对了,它自身定时功能。。


16位自动重装模式中,定时器2可通过C/T2位配置为定时器/计数器,根据外部使能标志位EXEN2的置位和清0,可分为两种情况:


  定时器2为16位自动重装的普通定时器,由陷阱寄存器提供重装的值,只需要预设一下即可,可用于定时精度要求高,定时时间长(16位)的情况。


A1、T2MOD=0x00(DCEN=0;默认情况);


与上一种情况相比,此时16位自动重新装载可由外部T2EX的负跳变,和溢出任意一种触发,并都能产生中断。


A2、T2MOD=0x01(DCEN=1);


 此时允许T2EX控制计数的方向;T2EX=0时,重装的值为0FF和0FF,递减计数与陷阱寄存器预存值相等时,置位TF2产生中断。T2EX=1时;自动重装值为陷阱寄存器中的值,溢出时置位TF2产生中断。


#include "reg51.h"


typedef unsigned char BYTE;

typedef unsigned int WORD;


//-----------------------------------------------


/* define constants */

#define FOSC 11059200L


#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode


/* define SFR */

sbit ET2 = IE^5;


sfr T2CON = 0xc8;                   //timer2 control register

sbit TF2  = T2CON^7;

sbit TR2  = T2CON^2;


sfr T2MOD = 0xc9;                   //timer2 mode register

sfr RCAP2L = 0xca;

sfr RCAP2H = 0xcb;

sfr TL2 = 0xcc;

sfr TH2 = 0xcd;


sbit TEST_LED = P1^0;               //work LED, flash once per second


/* define variables */

WORD count;                         //1000 times counter


//-----------------------------------------------


/* Timer2 interrupt routine */

void tm2_isr() interrupt 5 using 1

{

    TF2 = 0;

    if (count-- == 0)               //1ms * 1000 -> 1s

    {

        count = 1000;               //reset counter

        TEST_LED = ! TEST_LED;      //work LED flash

    }

}


//-----------------------------------------------


/* main program */

void main()

{

    RCAP2L = TL2 = T1MS;            //initial timer2 low byte

    RCAP2H = TH2 = T1MS >> 8;       //initial timer2 high byte

    TR2 = 1;                        //timer2 start running

    ET2 = 1;                        //enable timer2 interrupt

    EA = 1;                         //open global interrupt switch

    count = 0;                      //initial counter


    while (1);                      //loop

}


②当然不外乎还有时钟输出功能 


可参考这里看下其他时钟输出


52系列单片机,可设定定时器/计数器2通过T2(p1^0)引脚输出时钟。


P1^0除了可以作为普通I/O口外,还可以作为定时器2的外部计数输入和时钟信号输出。


 C/T2=0并且T2MOD的T2OE位为1时,可将定时器2选为时钟信号发生器,自动装初值。设置公式:


  时钟信号输出频率=(振荡器频率/4)* (65535-N)


1


2


3


在时钟输出模式下,计数器溢出不会产生中断请求。这种功能相当于定时器2可同时作为波特率发生器和时钟发生器。


因为此时外部中断并没有被暂用,若是在设置上不冲突的话可能同时还可以响应T2EX引入的外部信号,这个只是猜想,还没有用实验证明过,哈哈*


注:单片机对于外来脉冲信号具有计数功能,但是有要求: 计数脉冲的最高频率=振荡器的频率/24 


并且为了确保给定电平在电平变化之前能被采样一次,则这个电平至少要维持一个机器周期。


#include "reg51.h"


typedef unsigned char BYTE;

typedef unsigned int WORD;


//-----------------------------------------------


/* define constants */

#define FOSC 11059200L


#define F38_4KHz    (65536-18432000/4/38400)


/* define SFR */


sfr T2CON = 0xc8;                   //timer2 control register

sbit TF2  = T2CON^7;

sbit TR2  = T2CON^2;


sfr T2MOD = 0xc9;                   //timer2 mode register

sfr RCAP2L = 0xca;

sfr RCAP2H = 0xcb;

sfr TL2 = 0xcc;

sfr TH2 = 0xcd;


sbit T2 = P1^0;                     //Clock Output pin


//-----------------------------------------------


/* main program */

void main()

{

    T2MOD = 0x02;                   //enable timer2 output clock

    RCAP2L = TL2 = F38_4KHz;        //initial timer2 low byte

    RCAP2H = TH2 = F38_4KHz >> 8;   //initial timer2 high byte

    TR2 = 1;                        //timer2 start running

    EA = 1;                         //open global interrupt switch


    while (1);                      //loop

}


其实,额,,虽然51很是LOW,但是有限的资源玩的花了,有了更多更大的资源后,也更能会合理利用,那才是本事对不对。。。


嗯,就是这样。。


对了,除了T2还有哪些种方法嘞? 


1,把11.0592M换成22.1184M晶振。那么当在TH1=0xff时,刚好可以产生115200波特率。


2、换个IT的单片机。。。哈哈。。


推荐阅读

史海拾趣

Cressall Power Resistors公司的发展小趣事

为了确保产品质量和稳定供应,Cressall投入大量资源建设质量管理体系。公司引入了先进的质量管理方法和工具,对生产过程中的每一个环节进行严格把控。同时,公司还建立了完善的质量检测体系,确保出厂产品的合格率。这些措施有效提升了公司的产品质量和客户满意度,为公司的长远发展奠定了坚实的基础。

安国国际(ALCOR)公司的发展小趣事

近年来,安国国际将发展重心放在U盘控制IC的开发上。随着USB技术的不断升级和SSD市场的蓬勃发展,安国积极抢占USB 3.0、USB 3.1及SSD控制IC的市场先机。公司的U盘控制IC不仅支持新一代3D NAND技术,还具备高性能、低功耗等优点,深受市场欢迎。通过持续的技术创新和市场拓展,安国在U盘控制IC领域取得了显著成绩。

歌尔(Goertek)公司的发展小趣事

安国国际在创立初期便展现出强大的研发实力。1997年,公司成功推出了世界第一颗单一整合的USB键盘集线器控制IC,这一创新成果奠定了安国在IC专业设计领域的领导地位。随后,在1998年,安国将总部迁往台湾,以便为全球客户提供更及时的技术支持和服务,同时与晶圆代工厂紧密配合,确保产品质量和技术水平。

Elpakco Inc公司的发展小趣事

Elpakco Inc公司始终将产品质量视为企业的生命线。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到产品出厂检测,每一个环节都严格把关。正是这种对品质的坚持,让Elpakco Inc的产品在市场上赢得了良好的口碑,越来越多的客户开始选择信赖Elpakco Inc的品牌。

BROTHER公司的发展小趣事

随着全球市场的不断扩大,BROTHER意识到要实现持续发展,必须走国际化道路。因此,公司在上世纪五十年代开始积极实施国际化战略。首先,BROTHER在美国纽约建立了销售总部,以更好地服务北美市场。随后,公司又在欧洲等地建立生产基地和销售网络,进一步拓展国际市场。通过国际化战略的实施,BROTHER不仅提升了品牌知名度和市场份额,还积累了丰富的跨国经营经验。

Actel公司的发展小趣事

随着全球环保意识的提高,BROTHER公司也积极践行环保理念,推动绿色生产。公司注重节能减排和资源循环利用,采用环保材料和生产工艺,减少对环境的影响。同时,BROTHER还开展了一系列环保公益活动,宣传环保理念,提高公众环保意识。通过践行环保理念,BROTHER不仅赢得了社会的认可和尊重,还为公司的可持续发展奠定了坚实基础。

以上五个故事只是BROTHER公司在电子行业发展历程中的一部分缩影。实际上,BROTHER的发展还涉及更多的细节和方面。但无论如何,BROTHER始终坚持创新、质量、服务和环保的理念,不断追求卓越和完美,为电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

请教:读取CEdit的内容写入txt文件是乱码

功能是读取edit控件中显示的内容,将内容存储到txt文件中 现在文件可以创建,也可以写入,就是打开txt文件显示乱码。 请教明白人 谢谢 void CDATASTOREDlg::OnSave() {     UpdateData(TRUE);     SYSTEMTIME Time;  ...…

查看全部问答>

关于msp430f2132的脉冲捕获(2)

从网上找到一个例子,但不能进入中断,请老师们帮助分析. #include "msp430x21x2.h" unsigned int start,end,width; unsigned int start2,end2,width2; unsigned char overflow; float number; float number2; float fre; fl ...…

查看全部问答>

B772三极管的问题?

请问: 1:B772是什么类型的三极管? 答:是PNP三极管! 2:B772在电路中起什么作用的? 3:为什么接在B772上的B极是9.1V电压,C极是12V电压,E极是9.3V电压,在这个电路中B772是什么作用呢?我不要行不行?…

查看全部问答>

DS18B20初始化失败

麻烦大家帮我看下,  我的DS18B20初始化失败。   我用protues仿真,用一盏小灯做指示, 程序读不出数据,逐步检测发现程序卡在DS18B20初始化的初始化部分。 可是我去查看了datasheet也没能查出原因来··。   麻烦 ...…

查看全部问答>

TMS28035的官网例程的问题

在TI官网上下载的TMS320F28035的例程: 1)DSP2803x_Device.h中:extern cregister volatile unsigned int IFR; 其中关键字\"cregister\"不能识别,为灰色,导致Main函数里的IER IFR 都不能识别 2)在CCSV5环境下,声明一个中断函数 interrupt void ep ...…

查看全部问答>

AVR单片机定时0

//ICC-AVR application builder : 2013-7-18 下午 08:03:54 // Target : M128 // Crystal: 16.000Mhz #include #include typedef unsigned char uchar; uchar i; void port_init(void) { PORTA = 0xff; DDRA  = 0xff; PORTE ...…

查看全部问答>

求购EXP430G2 launchpad口袋实验平台扩展板

如题,求购求购EXP430G2 launchpad口袋实验平台扩展板,即带有128段LCD的那块 或者还有什么其他方法可以获得,知道的请说下,谢谢! 东西如下图: …

查看全部问答>

【Nucleo心得】+(九)BlueNRG的应用程序命令接口ACI解读

BlueNRG的应用程序命令接口ACI解读 1、应用程序命令接口概述BlueNRG定位于BLE网络协处理器(BLE Network Co-Processor),也就是为系统的应用程序(Application)增加BLE通讯功能。BlueNRG通过SPI接口与Application通讯,其中Application通过SPI ...…

查看全部问答>

收闲置zigbee或者蓝牙开发板

收闲置zigbee或者蓝牙开发板,联系 QQ 1989701604 …

查看全部问答>

【任性DIY】D几个可调移动电源

暂时也没有什么好的diy点子,工作上要用到24v移动电源来测试,就顺便记录一下发上来了。 没啥技术含量,全是体力活。 上一个理想中的效果图。 然而,现实总是不尽人意。打印机挤料不顺,而且莫名其妙模型变成了镜像。。 算了,本着能用就行的 ...…

查看全部问答>