STC12c-UART1 串口 PC通信

  •   一般情况下,编写串口通信程序的基本步骤如下:
  1.  配置串口为模式 1    ( SCON = 0x50)// 0101 0000
  2.  配置定时器 T1 为模式 2,即自动重装模式           (配置T1为 8位重装载 模式 -> 产生波特率用 )(TMOD = 0x20) //0010 0000
  3.  根据波特率计算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 进行波特率加倍(因为有些晶振选用的波特率偏差太大,得加倍Baud才能缩小偏差)
  4.  打开定时器控制寄存器 TR1,让定时器跑起来产生Baud 。 // TR = 1;

 

Step 1.

 

Step 2.

 

 

Step 3.

定时器的重载值计算公式为:

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

和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波
特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:

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

  • 公式中数字的含义这里解释一下,
  • 256 是 8 位定时器的溢出值,也就是 TL1 的溢出值,
  • 晶振值就是 11059200,
  • 12 是说 1 个机器周期等于 12 个时钟周期,
  • 值得关注的是这个 16,我们来重点说明。在 IO 口模拟串口通信接收数据的时候,采集的是这一位数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,这样一旦受到意外干扰读错一次数据,也依然可以保证最终数据的正确性   
  • “晶振值/12/2/16/波特率”这个地方计算的时候,出现不能除尽,或者出现小数怎么办,出现偏差,理解我们的晶振为何使用 11.0592M 了
  • 11.0592M晶振  可以整除大部分,所以尽量用这个,本次实验用的是12M的

 

Step 4.

 

 

  •  TR = 1  / TCON = 0x40

程序:

(一)UART_Init.c

#include<UART_Init.h>
#include<reg52.h>

void UART_Init()
{
    SCON = 0x50;   //0101 0000
    TMOD = 0X20;   //0010 0000   配置T1为 8位重装载 模式(产生波特率用)
    PCON = 0x80;   //8位为SMOD ,=1为 开启倍频,=0关闭倍频

    TH1 =0xF3;//4800
    TL1 =0xF3;
    
    EA = 1;     //  需要 串口中断 就要开 总中断EA  
    ES = 1;     //     需要 串口中断 就开
    TR1 = 1; //启动T1
}

(二)main.c (在串口中断中 写你想做的事,或用标志flag 在main中写)

#include<reg52.h>
#include<UART_Init.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED0 = P2^0;
//uchar UartRxBuffer[64] = {0};        //串口接收数据

uchar ReceiveData;
void Uart_server() interrupt 4           //串口中断 号  是 4
{
       ES = 0;
    RI = 0;//清除接收中断标志位

    ReceiveData=SBUF;//出去,接,收到的数据
    SBUF=ReceiveData;//将接收到的数据放入到发送寄存器

    switch(ReceiveData)
    {
        case 1:LED0=~LED0;break;
    }
     ES = 1;
    while(!TI);             //等待发送数据完成
    TI=0;
    
}

//////////////////////////void main()
{
    UART_Init();                    
    while(1)
    {
     ;
    }
}

 

posted @ 2020-04-22 11:54  ONE_MEE  阅读(726)  评论(0)    收藏  举报