STC12C5A60S2双串口通信

发布者:cheng1984最新更新时间:2019-05-21 来源: eefocus关键字:STC12C5A60S2  双串口  通信 手机看文章 扫描二维码
随时随地手机看文章

STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。

下面是一段双串口通信的程序:



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

时间:2012.11.24

芯片:STC12C5A60S2

晶振:22.1184MHz  波特率:9600bps

引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0

    串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2

功能描述:STC12双串口通信(中断方式)

          当串行口1接收数据后,将此数据由串行口2发送出去

          当串行口2接收数据后,将此数据由串行口1发送出去

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

#include

#define S2RI 0x01 //串口2接收中断请求标志位

#define S2TI 0x02 //串口2发送中断请求标志位

unsigned char flag1,flag2,temp1,temp2;

/****************串行口初始化函数****************/

void InitUART(void)

{

    TMOD = 0x20;    //定时器1工作在方式2  8位自动重装

    SCON = 0x50;    //串口1工作在方式1  10位异步收发 REN=1允许接收

    TH1 = 0xFA;    //定时器1初值

    TL1 = TH1;

    TR1 = 1;    //定时器1开始计数

    EA =1; //开总中断

    ES =1; //开串口1中断

 

    S2CON = 0x50;   //串口2工作在方式1  10位异步收发 S2REN=1允许接收

    BRT = 0xFA;    //独立波特率发生器初值

    AUXR = 0x10;    //BRTR=1 独立波特率发生器开始计数

    IE2 =0x01; //开串口2中断  ES2=1

}

/****************串行口1发送****************/

void UART_1SendOneByte(unsigned char c)

{

    SBUF = c;

    while(!TI);    //若TI=0,在此等待

    TI = 0;  

}

/****************串行口2发送****************/

void UART_2SendOneByte(unsigned char c)

{

    S2BUF = c;

    while(!(S2CON&S2TI));  //若S2TI=0,在此等待

    S2CON&=~S2TI;   //S2TI=0

}

/*****************主函数******************/

void main(void)

{

    InitUART(); //串行口初始化

while(1)

{

//如果串口1接收到数据,将此数据由串口2发送

if(flag1==1)

{

flag1=0;

UART_2SendOneByte(temp1);

}

//如果串口2接收到数据,将此数据由串口1发送

if(flag2==1)

{

flag2=0;

UART_2SendOneByte(temp2);

}

}

}

/************串行口1中断处理函数*************/

void UART_1Interrupt(void) interrupt 4

{

if(RI==1)

{

RI=0;

flag1=1;

temp1=SBUF;

}

}

/************串行口2中断处理函数*************/

void UART_2Interrupt(void) interrupt 8

{

if(S2CON&S2RI)

{

S2CON&=~S2RI;

flag2=1;

temp2=S2BUF;

}


12C5A60S2.h的头文件如下:

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

//新一代 1T 8051系列 单片机内核特殊功能寄存器 C51 Core SFRs

//                                          7     6      5       4     3    2    1     0   Reset Value

sfr ACC  = 0xE0; //Accumulator                                                              0000,0000

sfr B    = 0xF0; //B Register                                                               0000,0000

sfr PSW  = 0xD0; //Program Status Word      CY    AC    F0    RS1   RS0    OV    F1    P    0000,0000

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

sbit CY  = PSW^7;

sbit AC  = PSW^6;

sbit F0  = PSW^5;

sbit RS1 = PSW^4;

sbit RS0 = PSW^3;

sbit OV  = PSW^2;

sbit P   = PSW^0;

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

sfr SP   = 0x81; //Stack Pointer                                                            0000,0111

sfr DPL  = 0x82; //Data Pointer Low Byte                                                    0000,0000

sfr DPH  = 0x83; //Data Pointer High Byte                                                   0000,0000

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

//新一代 1T 8051系列 单片机系统管理特殊功能寄存器

//                                          7     6      5    4     3      2    1     0     Reset Value

sfr PCON   = 0x87; //Power Control        SMOD  SMOD0  LVDF  POF   GF1    GF0   PD   IDL    0001,0000

//                                        7     6       5      4     3      2      1      0   Reset Value

sfr AUXR  = 0x8E; //Auxiliary Register  T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS  0000,0000

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

sfr AUXR1 = 0xA2; //Auxiliary Register 1  -  PCA_P4  SPI_P4  S2_P4  GF2    ADRJ   -    DPS  0000,0000

/*

PCA_P4:

    0, 缺省PCA 在P1 口

    1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,

                                   PCA0/PWM0 从P1.3 切换到P4.2 口

                                   PCA1/PWM1 从P1.4 切换到P4.3 口

SPI_P4:

    0, 缺省SPI 在P1 口

    1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口

                               MISO 从P1.6 切换到P4.2 口

                               MOSI 从P1.5 切换到P4.1 口

                               SS 从P1.4 切换到P4.0 口

S2_P4: 

    0, 缺省UART2 在P1 口

    1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口

                                 RxD2 从P1.2 切换到P4.2 口

GF2: 通用标志位

ADRJ:

    0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器

    1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器

DPS: 0, 使用缺省数据指针DPTR0

     1,使用另一个数据指针DPTR1

*/

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

sfr WAKE_CLKO = 0x8F; //附加的 SFR WAK1_CLKO

/*

      7            6          5          4          3       2       1      0         Reset Value

   PCAWAKEUP  RXD_PIN_IE  T1_PIN_IE  T0_PIN_IE  LVD_WAKE    _    T1CLKO  T0CLKO      0000,0000B

b7 - PCAWAKEUP : PCA 中断可唤醒 powerdown。

b6 - RXD_PIN_IE : 当 P3.0(RXD) 下降沿置位 RI 时可唤醒 powerdown(必须打开相应中断)。

b5 - T1_PIN_IE : 当 T1 脚下降沿置位 T1 中断标志时可唤醒 powerdown(必须打开相应中断)。

b4 - T0_PIN_IE : 当 T0 脚下降沿置位 T0 中断标志时可唤醒 powerdown(必须打开相应中断)。

b3 - LVD_WAKE : 当 CMPIN 脚低电平置位 LVD 中断标志时可唤醒 powerdown(必须打开相应中断)。

b2 - 

b1 - T1CLKO : 允许 T1CKO(P3.5) 脚输出 T1 溢出脉冲,Fck1 = 1/2 T1 溢出率

b0 - T0CLKO : 允许 T0CKO(P3.4) 脚输出 T0 溢出脉冲,Fck0 = 1/2 T1 溢出率

*/

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

sfr CLK_DIV = 0x97; //Clock Divder          -     -      -       -     -  CLKS2 CLKS1 CLKS0 xxxx,x000

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

sfr BUS_SPEED = 0xA1; //Stretch register      -     -    ALES1   ALES0   -   RWS2  RWS1  RWS0 xx10,x011

/*

ALES1 and ALES0:

00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle

01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles.

10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default)

11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.

RWS2,RWS1,RWS0:

  000 : The MOVX read/write pulse is 1 clock cycle. 

  001 : The MOVX read/write pulse is 2 clock cycles.

  010 : The MOVX read/write pulse is 3 clock cycles.

  011 : The MOVX read/write pulse is 4 clock cycles. (default)

  100 : The MOVX read/write pulse is 5 clock cycles.

  101 : The MOVX read/write pulse is 6 clock cycles.

  110 : The MOVX read/write pulse is 7 clock cycles.

  111 : The MOVX read/write pulse is 8 clock cycles.

*/

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

//新一代 1T 8051系列 单片机中断特殊功能寄存器

//有的中断控制、中断标志位散布在其它特殊功能寄存器中,这些位在位地址中定义

//其中有的位无位寻址能力,请参阅 新一代 1T 8051系列 单片机中文指南

//                                           7     6     5    4     3    2    1    0   Reset Value

sfr IE      = 0xA8;  //中断控制寄存器        EA  ELVD  EADC   ES   ET1  EX1  ET0  EX0  0x00,0000

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

[1] [2] [3] [4]
关键字:STC12C5A60S2  双串口  通信 引用地址:STC12C5A60S2双串口通信

上一篇:STC12C5A60S2 AD 转换详解
下一篇:STC12C5A60S2 串口中断接收程序

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved