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');
    }
    
    
    
    

  • 相关阅读:
    Yield Usage Understanding
    Deadclock on calling async methond
    How to generate file name according to datetime in bat command
    Run Unit API Testing Which Was Distributed To Multiple Test Agents
    druid的关键参数+数据库连接池运行原理
    修改idea打开新窗口的默认配置
    spring boot -thymeleaf-url
    @pathvariable和@RequestParam的区别
    spring boot -thymeleaf-域对象操作
    spring boot -thymeleaf-遍历list和map
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007790.html
Copyright © 2011-2022 走看看