zoukankan      html  css  js  c++  java
  • 8051单片机波特率计算公式(配套C语言例程)

    摘自: http://www.shuihan.com/article/315

    8051单片机使用定时器1工作在方式2的情况下作为串口波特率发生器,其波特率=(2smod /32)×(定时器T1溢出率),其中smod是PCON<7>,表示是否波特率加倍,Fsoc是系统的晶振大小。

    波特率公式中:T1溢出率=溢出周期的倒数;溢出周期=(256-TH1)×12/Fosc;

    最终公式:

    波特率:Baud=(2smod × Fsoc)/(32 ×12×(256-TH1))

    我们一般不太关注波特率的计算,而是关心选用的传输速度(波特率)去反算定时器1(自动重装模式)的初值(TH1),所以将上面的公式导一下,得到TH1的公式:

    TH1=256-(Fsoc×2smod)/(12×32×Baud)

    下面针对串口发送程序,水寒写下例程,供大家参考。(我使用的是STC12C5A40S2调试,原则上在STC89C5x、AT89C5x等8051核心的单片机上都能够成功,由于程序比较简单,我没有试,但应该没有问题的)

     

     

    #include "Reg52.H"
    /*******************************************************************
    请提前计算一下所选晶振能达到的最高速度,波特率不能超过最高速度
    (1) 波特率加倍(SMOD=1):  Max_Baud = FOSC/12/16
    (2) 波特率不加倍(SMOD=0):Max_Baud = FOSC/12/32
    例如:22.1184MHz晶振,波特率加倍时,最大波特率=22118400/12/16=115200
    *******************************************************************/
    #define FOSC	22118400		//振荡频率
    #define BAUD	9600			//波特率
    #define SMOD	1			//是否波特率加倍
    #if SMOD
    	#define TC_VAL	(256-FOSC/16/12/BAUD)
    #else
    	#define TC_VAL	(256-FOSC/32/12/BAUD)
    #endif
    
    typedef unsigned char uint8;
    typedef unsigned int uint16;
    
    code const char str1[] = "Ther string is transmitted from 80C51!\r\n";
    code const char str2[] = "Author: xqlu(at)ysu.edu.cn\r\n";
    
    /***************函数声明*******************/
    void InitUART(void);
    void SendOneByte(uint8);
    void SendrStr(const uint8 *ptr);
    
    /****************主函数********************/
    void main(void)
    {
        uint8 i=0;
        InitUART();
    
        while(str2[i]!='\0')
        {
    	SendOneByte(str2[i++]);	
        }
    
        SendrStr(str1);
    
        while(1);
    }
    
    /****************中断服务函数***************/
    void UART_ISR(void) interrupt 4
    {
        uint8 RX_Data;
        //只响应“接收”中断,“发送”中断来了就直接抹掉
        if(RI)
       {
         RI = 0;				//串口中断标志不能自己清除,需要手动清除
          RX_Data=SBUF;
         SendOneByte(RX_Data);
       }
       else
         TI = 0;				//串口发中断是发送完缓冲区数据之后产生
    }
    
    /****************串口初始化函数*************/
    void InitUART(void)
    {
        TMOD = 0x20;
        SCON = 0x50;
        TH1 = TC_VAL;
        TL1 = TH1;
        PCON = 0x80; 			//发送速率加倍
         ES = 1;
        EA = 1;
        TR1 = 1;
    }
    /**************串口发送字符函数*************/
    void SendOneByte(uint8 c)
    {
        ES = 0;			//禁止发送中断
         SBUF = c;
        while(!TI);
        TI = 0;
        ES = 1;
    }
    /**************串口发送字符串函数*************/
    void SendrStr(const uint8 *ptr)
    {
        do
        {
    	SendOneByte(*ptr);
        }while(*ptr++!='\0');
    }
    
    
    
    

  • 相关阅读:
    预排序遍历树算法牺牲写性能的改进
    改造PAXOS算法消灭活锁
    扣减库存策略采用订单是否锁定库存方案
    [转]java-小技巧-001-Long序列化到前端不支持
    springboot-mybatis 批量insert
    VS2010 调试启动特别慢
    C# Winform App 获取当前路径
    DevExpress PivotGridControl控件
    (JavaScript)《JS面向对象编程指南》-- JavaScript基本数据类型、数组、循环
    (HTML5)HTML5 Web Notification桌面通知实践
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007790.html
Copyright © 2011-2022 走看看