hailing 发表于 2018-9-8 08:21:04

请教,STC8A的串口2和3可以同时用定时器2做波特率发生器吗

请教,STC8A的串口2和3可以同时用定时器2做波特率发生器吗,串口2为4800 even 8 1 ,串口3为4800 N 8 1.

makesoft 发表于 2018-9-8 10:23:09

应该可以的,两个串口波特率一样,奇偶效验是各自串口设置的问题。

hailing 发表于 2018-9-8 10:30:04

makesoft 发表于 2018-9-8 10:23
应该可以的,两个串口波特率一样,奇偶效验是各自串口设置的问题。

谢谢                                 

饭桶 发表于 2018-9-8 11:25:42

如果想同时接收,估计是不能的。

hefq 发表于 2018-9-8 15:57:20

应该是可以的

小李非刀 发表于 2018-9-9 21:55:13

如果波特率相同,4个串口都可以使用定时器2。

饭桶 发表于 2018-9-10 15:53:56

小李非刀 发表于 2018-9-9 21:55
如果波特率相同,4个串口都可以使用定时器2。

是否能够同时独立响应中断?

国学芯用 发表于 2018-9-10 16:11:43

hailing 发表于 2018-9-10 16:47:24

国学芯用 发表于 2018-9-10 16:11


WINRAR打不开。

饭桶 发表于 2018-9-10 22:01:54

国学芯用 发表于 2018-9-10 16:11


你这个程序是使用四个定时器分别给四个串口的,倒是可以改成都使用定时器2。有空试试

饭桶 发表于 2018-9-10 22:02:30

主程序:

/*********************************************************/
#define MAIN_Fosc                24000000L      //定义主时钟

#include      "STC8xxxx.H"


/*************      功能说明      **************

4串口全双工中断方式收发通讯程序。

通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

默认参数:
所有设置均为 1位起始位, 8位数据位, 1位停止位, 无校验.
每个串口可以使用不同的波特率.
串口1(P3.0 P3.1): 115200bps.
串口2(P1.0 P1.1):57600bps.
串口3(P0.0 P0.1):38400bps.
串口4(P0.2 P0.3):19200bps.


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

/*************      本地常量声明      **************/
#define      RX1_Length      128                /* 接收缓冲长度 */
#define      RX2_Length      128                /* 接收缓冲长度 */
#define      RX3_Length      128                /* 接收缓冲长度 */
#define      RX4_Length      128                /* 接收缓冲长度 */

#define      UART_BaudRate1      115200UL         /* 波特率 */
#define      UART_BaudRate2         57600UL         /* 波特率 */
#define      UART_BaudRate3         38400UL         /* 波特率 */
#define      UART_BaudRate4         19200UL         /* 波特率 */


/*************      本地变量声明      **************/
u8      xdata      RX1_Buffer;      //接收缓冲
u8      xdata      RX2_Buffer;      //接收缓冲
u8      xdata      RX3_Buffer;      //接收缓冲
u8      xdata      RX4_Buffer;      //接收缓冲

u8      TX1_read,RX1_write;      //读写索引(指针).
u8      TX2_read,RX2_write;      //读写索引(指针).
u8      TX3_read,RX3_write;      //读写索引(指针).
u8      TX4_read,RX4_write;      //读写索引(指针).

bit      B_TX1_Busy,B_TX2_Busy,B_TX3_Busy,B_TX4_Busy;      // 发送忙标志


/*************      本地函数声明      **************/
void      UART1_config(u8 brt);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void      UART2_config(u8 brt);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
void      UART3_config(u8 brt);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
void      UART4_config(u8 brt);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
void         PrintString1(u8 *puts);
void         PrintString2(u8 *puts);
void         PrintString3(u8 *puts);
void         PrintString4(u8 *puts);




//========================================================================
// 函数: void main(void)
// 描述: 主函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void main(void)
{
      EAXRAM();

      UART1_config(1);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
      UART2_config(2);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
      UART3_config(3);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
      UART4_config(4);      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
      
      EA = 1;

      PrintString1("STC8 serial USART1 Test Prgramme!\r\n");
      PrintString2("STC8 serial USART2 Test Prgramme!\r\n");
      PrintString3("STC8 serial USART3 Test Prgramme!\r\n");
      PrintString4("STC8 serial USART4 Test Prgramme!\r\n");


      while (1)
      {

                if((TX1_read != RX1_write) && !B_TX1_Busy)      //收到过数据, 并且发送空闲
                {
                        B_TX1_Busy = 1;                //标志发送忙
                        SBUF = RX1_Buffer;      //发一个字节
                        if(++TX1_read >= RX1_Length)      TX1_read = 0;      //避免溢出处理
                }

                if((TX2_read != RX2_write) && !B_TX2_Busy)      //收到过数据, 并且发送空闲
                {
                        B_TX2_Busy = 1;                //标志发送忙
                        S2BUF = RX2_Buffer;      //发一个字节
                        if(++TX2_read >= RX2_Length)      TX2_read = 0;      //避免溢出处理
                }

                if((TX3_read != RX3_write) && !B_TX3_Busy)      //收到过数据, 并且发送空闲
                {
                        B_TX3_Busy = 1;                //标志发送忙
                        S3BUF = RX3_Buffer;      //发一个字节
                        if(++TX3_read >= RX3_Length)      TX3_read = 0;      //避免溢出处理
                }

                if((TX4_read != RX4_write) && !B_TX4_Busy)      //收到过数据, 并且发送空闲
                {
                        B_TX4_Busy = 1;                //标志发送忙
                        S4BUF = RX4_Buffer;      //发一个字节
                        if(++TX4_read >= RX4_Length)      TX4_read = 0;      //避免溢出处理
                }
      }
}


//========================================================================
// 函数: SetTimer2Baudraye(u16 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void      SetTimer2Baudraye(u16 dat)      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
      AUXR &= ~(1<<4);      //Timer stop
      AUXR &= ~(1<<3);      //Timer2 set As Timer
      AUXR |=(1<<2);      //Timer2 set as 1T mode
      T2H = dat / 256;
      T2L = dat % 256;
      IE2&= ~(1<<2);      //禁止中断
      AUXR |=(1<<4);      //Timer run enable
}


//========================================================================
// 函数: void      UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void      UART1_config(u8 brt)      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
{
      u8      i;
      /*********** 波特率使用定时器2 *****************/
      if(brt == 2)
      {
                AUXR |= 0x01;                //S1 BRT Use Timer2;
                SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate1);
      }

      /*********** 波特率使用定时器1 *****************/
      else
      {
                TR1 = 0;
                AUXR &= ~0x01;                //S1 BRT Use Timer1;
                AUXR |=(1<<6);      //Timer1 set as 1T mode
                TMOD &= ~(1<<6);      //Timer1 set As Timer
                TMOD &= ~0x30;                //Timer1_16bitAutoReload;
                TH1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) / 256;
                TL1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) % 256;
                ET1 = 0;      //禁止中断
      //      INT_CLKO &= ~0x02;      //不输出时钟
                INT_CLKO |=0x02;      //输出时钟
                TR1= 1;
      }
      /*************************************************/

      SCON = (SCON & 0x3f) | (1<<6);      // 8位数据, 1位起始位, 1位停止位, 无校验
//      PS= 1;      //高优先级中断
      ES= 1;      //允许中断
      REN = 1;      //允许接收
      P_SW1 = P_SW1 & 0x3f;                              P3n_push_pull(0x02);      //切换到 P3.0 P3.1
//      P_SW1 = (P_SW1 & 0x3f) | (1<<6);      P3n_push_pull(0x80);      //切换到P3.6 P3.7
//      P_SW1 = (P_SW1 & 0x3f) | (2<<6);      P1n_push_pull(0x80);      //切换到P1.6 P1.7 (必须使用内部时钟)

      for(i=0; i<RX1_Length; i++)                RX1_Buffer = 0;
      B_TX1_Busy= 0;
      TX1_read    = 0;
      RX1_write   = 0;
}


//========================================================================
// 函数: void      UART2_config(u8 brt)
// 描述: UART2初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void      UART2_config(u8 brt)      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
{
      u8      i;
      /*********** 波特率固定使用定时器2 *****************/
      if(brt == 2)      SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate2);

      S2CON &= ~(1<<7);      // 8位数据, 1位起始位, 1位停止位, 无校验
      IE2   |= 1;                        //允许中断
      S2CON |= (1<<4);      //允许接收
      P_SW2 &= ~1;      P1n_push_pull(0x02);      //切换到 P1.0 P1.1
//      P_SW2 |= 1;                P4n_push_pull(0x80);      //切换到 P4.6 P4.7

      for(i=0; i<RX2_Length; i++)                RX2_Buffer = 0;
      B_TX2_Busy= 0;
      TX2_read    = 0;
      RX2_write   = 0;
}

//========================================================================
// 函数: void      UART3_config(u8 brt)
// 描述: UART3初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void      UART3_config(u8 brt)      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
{
      u8      i;
      /*********** 波特率固定使用定时器2 *****************/
      if(brt == 2)
      {
                S3CON &= ~(1<<6);      //BRT select Timer2
                SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate3);
      }
      /*********** 波特率使用定时器3 *****************/
      else
      {
                S3CON |= (1<<6);      //BRT select Timer3
                T4T3M &= 0xf0;                //停止计数, 清除控制位
                IE2&= ~(1<<5);      //禁止中断
                T4T3M |=(1<<1);      //1T
                T4T3M &= ~(1<<2);      //定时
                T4T3M &= ~1;                //不输出时钟
                T3H = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) / 256;
                T3L = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) % 256;
                T4T3M |=(1<<3);      //开始运行
      }
      
      S3CON &= ~(1<<5);      //禁止多机通讯方式
      S3CON &= ~(1<<7);      // 8位数据, 1位起始位, 1位停止位, 无校验
      IE2   |=(1<<3);      //允许中断
      S3CON |=(1<<4);      //允许接收
      P_SW2 &= ~2;      P0n_push_pull(0x02);      //切换到 P0.0 P0.1
//      P_SW2 |= 2;                P5n_push_pull(0x02);      //切换到 P5.0 P5.1

      for(i=0; i<RX3_Length; i++)                RX3_Buffer = 0;
      B_TX3_Busy= 0;
      TX3_read    = 0;
      RX3_write   = 0;
}

//========================================================================
// 函数: void      UART4_config(u8 brt)
// 描述: UART4初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void      UART4_config(u8 brt)      // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
{
      u8      i;
      /*********** 波特率固定使用定时器2 *****************/
      if(brt == 2)
      {
                S4CON &= ~(1<<6);      //BRT select Timer2
                SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate4);
      }
      /*********** 波特率使用定时器3 *****************/
      else
      {
                S4CON |= (1<<6);      //BRT select Timer4
                T4T3M &= 0x0f;                //停止计数, 清除控制位
                IE2   &= ~(1<<6);      //禁止中断
                T4T3M |=(1<<5);      //1T
                T4T3M &= ~(1<<6);      //定时
                T4T3M &= ~(1<<4);      //不输出时钟
                T4H = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) / 256;
                T4L = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) % 256;
                T4T3M |=(1<<7);      //开始运行
      }
      
      S4CON &= ~(1<<5);      //禁止多机通讯方式
      S4CON &= ~(1<<7);      // 8位数据, 1位起始位, 1位停止位, 无校验
      IE2   |=(1<<4);      //允许中断
      S4CON |=(1<<4);      //允许接收
      P_SW2 &= ~4;      P0n_push_pull(0x08);      //切换到 P0.2 P0.3
//      P_SW2 |= 4;                P5n_push_pull(0x08);      //切换到 P5.2 P5.3

      for(i=0; i<RX4_Length; i++)                RX4_Buffer = 0;
      B_TX4_Busy= 0;
      TX4_read    = 0;
      RX4_write   = 0;
}


//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1字符串打印函数
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void PrintString1(u8 *puts)
{
    for (; *puts != 0;      puts++)
      {
                B_TX1_Busy = 1;                //标志发送忙
                SBUF = *puts;                //发一个字节
                while(B_TX1_Busy);      //等待发送完成
      }
}

//========================================================================
// 函数: void PrintString2(u8 *puts)
// 描述: 串口2字符串打印函数
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void PrintString2(u8 *puts)
{
    for (; *puts != 0;      puts++)
      {
                B_TX2_Busy = 1;                //标志发送忙
                S2BUF = *puts;                //发一个字节
                while(B_TX2_Busy);      //等待发送完成
      }
}

//========================================================================
// 函数: void PrintString3(u8 *puts)
// 描述: 串口3字符串打印函数
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void PrintString3(u8 *puts)
{
    for (; *puts != 0;      puts++)
      {
                B_TX3_Busy = 1;                //标志发送忙
                S3BUF = *puts;                //发一个字节
                while(B_TX3_Busy);      //等待发送完成
      }
}

//========================================================================
// 函数: void PrintString4(u8 *puts)
// 描述: 串口1字符串打印函数
// 参数: puts: 字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void PrintString4(u8 *puts)
{
    for (; *puts != 0;      puts++)
      {
                B_TX4_Busy = 1;                //标志发送忙
                S4BUF = *puts;                //发一个字节
                while(B_TX4_Busy);      //等待发送完成
      }
}



//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: 串口1中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{
      if(RI)
      {
                RI = 0;
                RX1_Buffer = SBUF;
                if(++RX1_write >= RX1_Length)      RX1_write = 0;
      }

      if(TI)
      {
                TI = 0;
                B_TX1_Busy = 0;
      }
}

//========================================================================
// 函数: void UART2_int (void) interrupt UART2_VECTOR
// 描述: 串口2中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void UART2_int (void) interrupt UART2_VECTOR
{
      if(RI2)
      {
                CLR_RI2();
                RX2_Buffer = S2BUF;
                if(++RX2_write >= RX2_Length)      RX2_write = 0;
      }

      if(TI2)
      {
                CLR_TI2();
                B_TX2_Busy = 0;
      }

}

//========================================================================
// 函数: void UART3_int (void) interrupt UART3_VECTOR
// 描述: 串口3中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void UART3_int (void) interrupt UART3_VECTOR
{
      if(RI3)
      {
                CLR_RI3();
                RX3_Buffer = S3BUF;
                if(++RX3_write >= RX3_Length)      RX3_write = 0;
      }

      if(TI3)
      {
                CLR_TI3();
                B_TX3_Busy = 0;
      }

}

//========================================================================
// 函数: void UART4_int (void) interrupt UART4_VECTOR
// 描述: 串口4中断函数
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2016-4-28
// 备注:
//========================================================================
void UART4_int (void) interrupt UART4_VECTOR
{
      if(RI4)
      {
                CLR_RI4();
                RX4_Buffer = S4BUF;
                if(++RX4_write >= RX4_Length)      RX4_write = 0;
      }

      if(TI4)
      {
                CLR_TI4();
                B_TX4_Busy = 0;
      }

}

饭桶 发表于 2018-9-10 22:02:58

头文件:

#ifndef      _STC8xxxx_H
#define      _STC8xxxx_H

#include <intrins.h>

/*BYTE Registers*/
sfr P0    = 0x80;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr      S4CON = 0x84;
sfr      S4BUF = 0x85;
sfr PCON= 0x87;

sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0= 0x8A;
sfr TL1= 0x8B;
sfr TH0= 0x8C;
sfr TH1= 0x8D;
sfr      AUXR = 0x8E;
sfr WAKE_CLKO = 0x8F;
sfr INT_CLKO= 0x8F;

sfr P1    = 0x90;
sfr P1M1= 0x91;      //P1M1.n,P1M0.n         =00--->Standard,      01--->push-pull                实际上1T的都一样
sfr P1M0= 0x92;      //                                        =10--->pure input,      11--->open drain
sfr P0M1= 0x93;      //P0M1.n,P0M0.n         =00--->Standard,      01--->push-pull
sfr P0M0= 0x94;      //                                        =10--->pure input,      11--->open drain
sfr P2M1= 0x95;      //P2M1.n,P2M0.n         =00--->Standard,      01--->push-pull
sfr P2M0= 0x96;      //                                        =10--->pure input,      11--->open drain
sfr PCON2 = 0x97;
sfr      AUXR2 = 0x97;

sfr SCON= 0x98;
sfr SBUF= 0x99;
sfr S2CON = 0x9A;      //
sfr S2BUF = 0x9B;      //

sfr P2    = 0xA0;
sfr BUS_SPEED = 0xA1;
sfr AUXR1 = 0xA2;
sfr P_SW1 = 0xA2;

sfr IE    = 0xA8;
sfr SADDR = 0xA9;
sfr WKTCL = 0xAA;      //唤醒定时器低字节
sfr WKTCH = 0xAB;      //唤醒定时器高字节
sfr      S3CON = 0xAC;
sfr S3BUF = 0xAD;
sfr TA    = 0xAE;
sfr IE2   = 0xAF;      //STC12C5A60S2系列

sfr P3    = 0xB0;
sfr P3M1= 0xB1;      //P3M1.n,P3M0.n         =00--->Standard,      01--->push-pull
sfr P3M0= 0xB2;      //                                        =10--->pure input,      11--->open drain
sfr P4M1= 0xB3;      //P4M1.n,P4M0.n         =00--->Standard,      01--->push-pull
sfr P4M0= 0xB4;      //                                        =10--->pure input,      11--->open drain
sfr IP2   = 0xB5;      //STC12C5A60S2系列
sfr IP2H= 0xB6;      //STC12C5A60S2系列
sfr IPH   = 0xB7;

sfr IP      = 0xB8;
sfr SADEN   = 0xB9;
sfr      P_SW2   = 0xBA;
sfr      VOCTRL    = 0xBB;
sfr ADC_CONTR = 0xBC;      //ADC控制寄存器
sfr ADC_RES   = 0xBD;      //ADC结果高字节
sfr ADC_RESL= 0xBE;      //ADC结果低字节

sfr P4      = 0xC0;
sfr WDT_CONTR = 0xC1;

sfr IAP_DATA= 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD   = 0xC5;
sfr IAP_TRIG= 0xC6;
sfr IAP_CONTR = 0xC7;

sfr ISP_DATA= 0xC2;
sfr ISP_ADDRH = 0xC3;
sfr ISP_ADDRL = 0xC4;
sfr ISP_CMD   = 0xC5;
sfr ISP_TRIG= 0xC6;
sfr ISP_CONTR = 0xC7;

sfr P5   = 0xC8;      //
sfr P5M1   = 0xC9;      //      P5M1.n,P5M0.n         =00--->Standard,      01--->push-pull
sfr P5M0   = 0xCA;      //                                        =10--->pure input,      11--->open drain
sfr P6M1   = 0xCB;      //      P5M1.n,P5M0.n         =00--->Standard,      01--->push-pull
sfr P6M0   = 0xCC;      //                                        =10--->pure input,      11--->open drain
sfr SPSTAT = 0xCD;      //
sfr SPCTL= 0xCE;      //
sfr SPDAT= 0xCF;      //

sfr PSW    = 0xD0;
sfr      T4T3M= 0xD1;
sfr      T4H    = 0xD2;
sfr      T4L    = 0xD3;
sfr      T3H    = 0xD4;
sfr      T3L    = 0xD5;
sfr      T2H    = 0xD6;
sfr      T2L    = 0xD7;

sfr      TH4    = 0xD2;
sfr      TL4    = 0xD3;
sfr      TH3    = 0xD4;
sfr      TL3    = 0xD5;
sfr      TH2    = 0xD6;
sfr      TL2    = 0xD7;

sfr CCON   = 0xD8;      //
sfr CMOD   = 0xD9;      //
sfr CCAPM0 = 0xDA;      //PCA模块0的工作模式寄存器。
sfr CCAPM1 = 0xDB;      //PCA模块1的工作模式寄存器。
sfr CCAPM2 = 0xDC;      //PCA模块2的工作模式寄存器。
sfr CCAPM3 = 0xDD;      //PCA模块3的工作模式寄存器。
sfr      ADCCFG = 0xDE;      //

sfr ACC    = 0xE0;
sfr      P7M1   = 0xE1;
sfr      P7M0   = 0xE2;
sfr      DPS    = 0xE3;
sfr      DPL1   = 0xE4;
sfr      DPH1   = 0xE5;
sfr      CMPCR1 = 0xE6;
sfr      CMPCR2 = 0xE7;

sfr      P6   = 0xE8;
sfr CL   = 0xE9;      //
sfr CCAP0L = 0xEA;      //PCA模块0的捕捉/比较寄存器低8位。
sfr CCAP1L = 0xEB;      //PCA模块1的捕捉/比较寄存器低8位。
sfr CCAP2L = 0xEC;      //PCA模块2的捕捉/比较寄存器低8位。
sfr CCAP3L = 0xED;      //PCA模块3的捕捉/比较寄存器低8位。
sfr      AUXINTIF = 0xEF;      //辅助中断标志 B6-INT4IF, B5-INT3IF, B4-INT2IF, B2-T4IF, B1-T3IF, B0-T2IF

sfr B      = 0xF0;
sfr      PWMCFG   = 0xF1;      //PWM配置寄存器
sfr PCA_PWM0 = 0xF2;      //PCA模块0 PWM寄存器。
sfr PCA_PWM1 = 0xF3;      //PCA模块1 PWM寄存器。
sfr PCA_PWM2 = 0xF4;      //PCA模块2 PWM寄存器。
sfr PCA_PWM3 = 0xF5;      //PCA模块3 PWM寄存器。
sfr      PWMIF    = 0xF6;      //PWM中断标志寄存器
sfr      PWMFDCR= 0xF7;      //PWM外部异常控制寄存器

sfr      P7   = 0xF8;
sfr CH   = 0xF9;
sfr CCAP0H = 0xFA;                //PCA模块0的捕捉/比较寄存器高8位。
sfr CCAP1H = 0xFB;                //PCA模块1的捕捉/比较寄存器高8位。
sfr CCAP2H = 0xFC;                //PCA模块2的捕捉/比较寄存器高8位。
sfr CCAP3H = 0xFD;                //PCA模块3的捕捉/比较寄存器高8位。
sfr      PWMCR= 0xFE;                //PWM控制寄存器
sfr      RSTCFG = 0xFF;                //


//                                     7    6    5    4    3   2       1       0      Reset Value
//INT_CLKO:中断与时钟输出控制寄存器-   EX4EX3EX2   -   T2CLKOT1CLKOT0CLKO    0000,0000
#define      INT4_Enable()      INT_CLKO |= (1 << 6)
#define      INT3_Enable()      INT_CLKO |= (1 << 5)      
#define      INT2_Enable()      INT_CLKO |= (1 << 4)      
#define      INT1_Enable()      EX1 = 1
#define      INT0_Enable()      EX0 = 1

#define      INT4_Disable()      INT_CLKO &= ~(1 << 6)
#define      INT3_Disable()      INT_CLKO &= ~(1 << 5)      
#define      INT2_Disable()      INT_CLKO &= ~(1 << 4)      
#define      INT1_Disable()      EX1 = 0
#define      INT0_Disable()      EX0 = 0

//                               7    6       5       4      3    2   1   0      Reset Value
//AUXINTIF:辅助中断标志寄存器-INT4IFINT3IFINT2IF   -   T4IFT3IFT2IF    0000,0000
#define      INT4IF      0x40
#define      INT3IF      0x20
#define      INT2IF      0x10
#define      T4IF      0x04
#define      T3IF      0x02
#define      T2IF      0x01

#define      INT4_Clear()      AUXINTIF &= ~INT4IF                /* 清除外中断4标志位 */
#define      INT3_Clear()      AUXINTIF &= ~INT3IF                /* 清除外中断3标志位 */
#define      INT2_Clear()      AUXINTIF &= ~INT2IF                /* 清除外中断2标志位 */
#define      INT1_Clear()      IE1 = 0                                        /* 清除外中断1标志位 */
#define      INT0_Clear()      IE0 = 0                                        /* 清除外中断0标志位 */

#define      INT0_Fall()                IT0 = 1                /* INT0 下降沿中断         */
#define      INT0_RiseFall()      IT0 = 0                /* INT0 下降沿上升沿均中断   */
#define      INT1_Fall()                IT1 = 1                /* INT1 下降沿中断         */
#define      INT1_RiseFall()      IT0 = 0                /* INT1 下降沿上升沿均中断   */


//===============================================================
#define      EAXSFR()                P_SW2 |=0x80                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */
#define      EAXRAM()                P_SW2 &= ~0x80                /* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展RAM(XRAM) */

#define CLKSEL      (*(unsigned char volatile xdata *)0xfe00)
#define      CKSEL                (*(unsigned char volatile xdata *)0xfe00)      /* 主时钟源选择    */
#define      CLKDIV                (*(unsigned char volatile xdata *)0xfe01)      /* 主时钟分频      */
#define      IRC24MCR      (*(unsigned char volatile xdata *)0xfe02)      /* IRC 24MHZ控制   */
#define      XOSCCR                (*(unsigned char volatile xdata *)0xfe03)      /* XOSC控制      */
#define      IRC32KCR      (*(unsigned char volatile xdata *)0xfe04)      /* IRC 32KHZ控制   */

#define      MainFosc_IRC24M()      CKSEL = (CKSEL & ~0x03)                        /* 选择内部24MHZ时钟 */
#define      MainFosc_XTAL()                CKSEL = (CKSEL & ~0x03) | 0x01      /* 选择外部晶振或时钟 */
#define      EXT_CLOCK()                        XOSCCR = 0x80                                        /* 选择外部时钟 */
#define      EXT_CRYSTAL()                XOSCCR = 0xC0                                        /* 选择外部晶振 */
#define      MainFosc_IRC32K()      CKSEL =CKSEL | 0x03                        /* 选择内部32K时钟 */
#define      MainFosc_OutP54()      CKSEL = (CKSEL & ~0x08)                        /* 从P5.4输出主时钟分频 */
#define      MainFosc_OutP16()      CKSEL = (CKSEL |0x08)                        /* 从P1.6输出主时钟分频 */
#define      MCLKO_None()                CKSEL = (CKSEL &0x0f)                        /* 主时钟不输出         */
#define      MCLKO_DIV1()                CKSEL = (CKSEL &0x0f) | 0x10      /* 主时钟1分频输出 */
#define      MCLKO_DIV2()                CKSEL = (CKSEL &0x0f) | 0x20      /* 主时钟2分频输出*/
#define      MCLKO_DIV4()                CKSEL = (CKSEL &0x0f) | 0x40      /* 主时钟4分频输出*/
#define      MCLKO_DIV8()                CKSEL = (CKSEL &0x0f) | 0x60      /* 主时钟8分频输出*/
#define      MCLKO_DIV16()                CKSEL = (CKSEL &0x0f) | 0x80      /* 主时钟16分频输出*/
#define      MCLKO_DIV32()                CKSEL = (CKSEL &0x0f) | 0xa0      /* 主时钟32分频输出*/
#define      MCLKO_DIV64()                CKSEL = (CKSEL &0x0f) | 0xc0      /* 主时钟64分频输出*/
#define      MCLKO_DIV128()                CKSEL = (CKSEL &0x0f) | 0xe0      /* 主时钟128分频输出*/

#define      MCLKO_P54      0x00      /* 从P5.4输出主时钟分频 */
#define      MCLKO_P16      0x08      /* 从P1.6输出主时钟分频 */
#define      MCLKO_0                0x00      /* 主时钟不输出         */
#define      MCLKO_1                0x10      /* 主时钟1分频输出 */
#define      MCLKO_2                0x20      /* 主时钟2分频输出*/
#define      MCLKO_4                0x40      /* 主时钟4分频输出*/
#define      MCLKO_8                0x60      /* 主时钟8分频输出*/
#define      MCLKO_16      0x80      /* 主时钟16分频输出*/
#define      MCLKO_32      0xa0      /* 主时钟32分频输出*/
#define      MCLKO_64      0xc0      /* 主时钟64分频输出*/
#define      MCLKO_128      0xe0      /* 主时钟128分频输出*/


#define      P0PU                (*(unsigned char volatile xdata *)0xfe10)      /* P0 1.5K Pull Up Enable*/
#define      P1PU                (*(unsigned char volatile xdata *)0xfe11)      /* P1 1.5K Pull Up Enable*/
#define      P2PU                (*(unsigned char volatile xdata *)0xfe12)      /* P2 1.5K Pull Up Enable*/
#define      P3PU                (*(unsigned char volatile xdata *)0xfe13)      /* P3 1.5K Pull Up Enable*/
#define      P4PU                (*(unsigned char volatile xdata *)0xfe14)      /* P4 1.5K Pull Up Enable*/
#define      P5PU                (*(unsigned char volatile xdata *)0xfe15)      /* P5 1.5K Pull Up Enable*/
#define      P6PU                (*(unsigned char volatile xdata *)0xfe16)      /* P6 1.5K Pull Up Enable*/
#define      P7PU                (*(unsigned char volatile xdata *)0xfe17)      /* P7 1.5K Pull Up Enable*/

#define      P0NCS                (*(unsigned char volatile xdata *)0xfe18)      /* P0 Non Schmit Trigger0: 使能端口施密特触发功能(默认), 1: 禁止*/
#define      P1NCS                (*(unsigned char volatile xdata *)0xfe19)      /* P1 Non Schmit Trigger*/
#define      P2NCS                (*(unsigned char volatile xdata *)0xfe1a)      /* P2 Non Schmit Trigger*/
#define      P3NCS                (*(unsigned char volatile xdata *)0xfe1b)      /* P3 Non Schmit Trigger*/
#define      P4NCS                (*(unsigned char volatile xdata *)0xfe1c)      /* P4 Non Schmit Trigger*/
#define      P5NCS                (*(unsigned char volatile xdata *)0xfe1d)      /* P5 Non Schmit Trigger*/
#define      P6NCS                (*(unsigned char volatile xdata *)0xfe1e)      /* P6 Non Schmit Trigger*/
#define      P7NCS                (*(unsigned char volatile xdata *)0xfe1f)      /* P7 Non Schmit Trigger*/

#define      I2CCFG                (*(unsigned char volatile xdata *)0xfe80)      /*   */
#define      I2CMSCR                (*(unsigned char volatile xdata *)0xfe81)      /*   */
#define      I2CMSST                (*(unsigned char volatile xdata *)0xfe82)      /*   */
#define      I2CSLCR                (*(unsigned char volatile xdata *)0xfe83)      /*   */
#define      I2CSLST                (*(unsigned char volatile xdata *)0xfe84)      /*   */
#define      I2CSLADR      (*(unsigned char volatile xdata *)0xfe85)      /*   */
#define      I2CTXD                (*(unsigned char volatile xdata *)0xfe86)      /*   */
#define      I2CRXD                (*(unsigned char volatile xdata *)0xfe87)      /*   */

#define PWM0T1      (*(unsigned intvolatile xdata *)0xff00)
#define PWM0T2      (*(unsigned intvolatile xdata *)0xff02)
#define PWM1T1      (*(unsigned intvolatile xdata *)0xff10)
#define PWM1T2      (*(unsigned intvolatile xdata *)0xff12)
#define PWM2T1      (*(unsigned intvolatile xdata *)0xff20)
#define PWM2T2      (*(unsigned intvolatile xdata *)0xff22)
#define PWM3T1      (*(unsigned intvolatile xdata *)0xff30)
#define PWM3T2      (*(unsigned intvolatile xdata *)0xff32)
#define PWM4T1      (*(unsigned intvolatile xdata *)0xff40)
#define PWM4T2      (*(unsigned intvolatile xdata *)0xff42)
#define PWM5T1      (*(unsigned intvolatile xdata *)0xff50)
#define PWM5T2      (*(unsigned intvolatile xdata *)0xff52)
#define PWM6T1      (*(unsigned intvolatile xdata *)0xff60)
#define PWM6T2      (*(unsigned intvolatile xdata *)0xff62)
#define PWM7T1      (*(unsigned intvolatile xdata *)0xff70)      
#define PWM7T2      (*(unsigned intvolatile xdata *)0xff72)
#define PWMC      (*(unsigned intvolatile xdata *)0xfff0)
#define TADCP            (*(unsigned intvolatile xdata *)0xfff3)      /* 在 ETADC==1 的情况下,每一个周期中, 当Counter计数到 TADCP 时,自动启动 ADC */

#define PWM0T1H   (*(unsigned char volatile xdata *)0xff00)      /* PWM0T1计数高字节 */
#define PWM0T1L   (*(unsigned char volatile xdata *)0xff01)      /* PWM0T1计数低字节 */
#define PWM0T2H   (*(unsigned char volatile xdata *)0xff02)      /* PWM0T2计数高字节 */
#define PWM0T2L   (*(unsigned char volatile xdata *)0xff03)      /* PWM0T2计数低字节 */
#define PWM0CR      (*(unsigned char volatile xdata *)0xff04)      /* PWM0控制         */
#define PWM0HLD   (*(unsigned char volatile xdata *)0xff05)      /*          */

#define PWM1T1H   (*(unsigned char volatile xdata *)0xff10)      /* PWM1T1计数高字节 */
#define PWM1T1L   (*(unsigned char volatile xdata *)0xff11)      /* PWM1T1计数低字节 */
#define PWM1T2H   (*(unsigned char volatile xdata *)0xff12)      /* PWM1T2计数高字节 */
#define PWM1T2L   (*(unsigned char volatile xdata *)0xff13)      /* PWM1T2计数低字节 */
#define PWM1CR      (*(unsigned char volatile xdata *)0xff14)      /* PWM1控制         */
#define PWM1HLD   (*(unsigned char volatile xdata *)0xff15)      /*          */

#define PWM2T1H   (*(unsigned char volatile xdata *)0xff20)      /* PWM2T1计数高字节 */
#define PWM2T1L   (*(unsigned char volatile xdata *)0xff21)      /* PWM2T1计数低字节 */
#define PWM2T2H   (*(unsigned char volatile xdata *)0xff22)      /* PWM2T2计数高字节 */
#define PWM2T2L   (*(unsigned char volatile xdata *)0xff23)      /* PWM2T2计数低字节 */
#define PWM2CR      (*(unsigned char volatile xdata *)0xff24)      /* PWM2控制         */
#define PWM2HLD   (*(unsigned char volatile xdata *)0xff25)      /*          */

#define PWM3T1H   (*(unsigned char volatile xdata *)0xff30)      /* PWM3T1计数高字节 */
#define PWM3T1L   (*(unsigned char volatile xdata *)0xff31)      /* PWM3T1计数低字节 */
#define PWM3T2H   (*(unsigned char volatile xdata *)0xff32)      /* PWM3T2计数高字节 */
#define PWM3T2L   (*(unsigned char volatile xdata *)0xff33)      /* PWM3T2计数低字节 */
#define PWM3CR      (*(unsigned char volatile xdata *)0xff34)      /* PWM3控制         */
#define PWM3HLD   (*(unsigned char volatile xdata *)0xff35)      /*          */

#define PWM4T1H   (*(unsigned char volatile xdata *)0xff40)      /* PWM4T1计数高字节 */
#define PWM4T1L   (*(unsigned char volatile xdata *)0xff41)      /* PWM4T1计数低字节 */
#define PWM4T2H   (*(unsigned char volatile xdata *)0xff42)      /* PWM4T2计数高字节 */
#define PWM4T2L   (*(unsigned char volatile xdata *)0xff43)      /* PWM4T2计数低字节 */
#define PWM4CR      (*(unsigned char volatile xdata *)0xff44)      /* PWM4控制         */
#define PWM4HLD   (*(unsigned char volatile xdata *)0xff45)      /*          */

#define PWM5T1H   (*(unsigned char volatile xdata *)0xff50)      /* PWM5T1计数高字节 */
#define PWM5T1L   (*(unsigned char volatile xdata *)0xff51)      /* PWM5T1计数低字节 */
#define PWM5T2H   (*(unsigned char volatile xdata *)0xff52)      /* PWM5T2计数高字节 */
#define PWM5T2L   (*(unsigned char volatile xdata *)0xff53)      /* PWM5T2计数低字节 */
#define PWM5CR      (*(unsigned char volatile xdata *)0xff54)      /* PWM5控制         */
#define PWM5HLD   (*(unsigned char volatile xdata *)0xff15)      /*          */

#define PWM6T1H   (*(unsigned char volatile xdata *)0xff60)      /* PWM6T1计数高字节 */
#define PWM6T1L   (*(unsigned char volatile xdata *)0xff61)      /* PWM6T1计数低字节 */
#define PWM6T2H   (*(unsigned char volatile xdata *)0xff62)      /* PWM6T2计数高字节 */
#define PWM6T2L   (*(unsigned char volatile xdata *)0xff63)      /* PWM6T2计数低字节 */
#define PWM6CR      (*(unsigned char volatile xdata *)0xff64)      /* PWM6控制         */
#define PWM6HLD   (*(unsigned char volatile xdata *)0xff65)      /*          */

#define PWM7T1H   (*(unsigned char volatile xdata *)0xff70)      /* PWM7T1计数高字节 */      
#define PWM7T1L   (*(unsigned char volatile xdata *)0xff71)      /* PWM7T1计数低字节 */
#define PWM7T2H   (*(unsigned char volatile xdata *)0xff72)      /* PWM7T2计数高字节 */
#define PWM7T2L   (*(unsigned char volatile xdata *)0xff73)      /* PWM7T2计数低字节 */
#define PWM7CR      (*(unsigned char volatile xdata *)0xff74)      /* PWM7控制         */
#define PWM7HLD   (*(unsigned char volatile xdata *)0xff75)      /*          */

#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)      /* PWM计数器高字节*/
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)      /* PWM计数器低字节*/
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)      /* PWM时钟选择      */
#define TADCPH      (*(unsigned char volatile xdata *)0xfff3)      /* 在 ETADC==1 的情况下,每一个周期中, 当Counter计数到 TADCP 时,自动启动 ADC*/
#define TADCPL      (*(unsigned char volatile xdata *)0xfff4)      /* 触发ADC选择低字节*/


#define      PWM0_ID                0
#define      PWM1_ID                1
#define      PWM2_ID                2
#define      PWM3_ID                3
#define      PWM4_ID                4
#define      PWM5_ID                5
#define      PWM6_ID                6
#define      PWM7_ID                7

#define      PwmClk_T2      0

//                  7   6   5   4   3      2       1      0      Reset Value
//PWMnCR:PWMn控制   ENCnO   -   -   -   PWMn_PSEPWMnIECnT2SIECnT1SI   0000,0000
#define      PWM_ENCnO                0x80      /* PWM管脚选择位 */
#define      PWM_CnINI                0x40      /* PWM管脚选择位 */
#define      PWMn_PS_0                0x00      /* PWM管脚选择位 */
#define      PWMn_PS_1                0x08      /* PWM管脚选择位 */
#define      PWMn_PS_2                0x10      /* PWM管脚选择位 */
#define      PWM_ECnI                0x04      /* 允许PWM中断   */
#define      PWM_ECnT2SI                0x02      /* 允许T2翻转时中断 */
#define      PWM_ECnT1SI                0x01      /* 允许T1翻转时中断 */

#define      PWM0_P20      0x00
#define      PWM0_P10      0x08
#define      PWM0_P60      0x10
#define      PWM1_P21      0x00
#define      PWM1_P11      0x08
#define      PWM1_P61      0x10
#define      PWM2_P22      0x00
#define      PWM2_P12      0x08
#define      PWM2_P62      0x10
#define      PWM3_P23      0x00
#define      PWM3_P13      0x08
#define      PWM3_P63      0x10
#define      PWM4_P24      0x00
#define      PWM4_P14      0x08
#define      PWM4_P64      0x10
#define      PWM5_P25      0x00
#define      PWM5_P15      0x08
#define      PWM5_P65      0x10
#define      PWM6_P26      0x00
#define      PWM6_P16      0x08
#define      PWM6_P66      0x10
#define      PWM7_P27      0x00
#define      PWM7_P17      0x08
#define      PWM7_P67      0x10

//                      7      6    5   4   3210   Reset Value
//PWMCFG:配置寄存器CBIFETADC-   -   ----    0000,0000
#define      CBIF      0x80      /* PWM计数器归零中断标志位 */
#define      ETADC      0x40      /* PWM与ADC关联, 由TADCP设置触发时刻. */

//                        7   6   5   4   3   2   1   0   Reset Value
//PWMIF: 中断标志寄存器C7IFC6IFC5IFC4IFC3IFC2IFC1IFC0IF    0000,0000
#define      C7IF      0x80
#define      C6IF      0x40      /* 第n通道的PWM中断标志位 */
#define      C5IF      0x20
#define      C4IF      0x10
#define      C3IF      0x08
#define      C2IF      0x04
#define      C1IF      0x02
#define      C0IF      0x01

//                        7   6   5   4   3   2   1   0   Reset Value
//PWMFDCR: 异常检测控制寄存器C7IFC6IFC5IFC4IFC3IFC2IFC1IFC0IF    0000,0000
#define      INVCMP                0x80      /* 0: 比较器结果由低变高为异常信号, 1: 比较器结果由高变低为异常信号 */
#define      INVIO                0x40      /* 0: P3.5由低变高为异常信号, 1: P3.5由高变低为异常信号*/
#define      INVP35                0x40      /* 0: P3.5由低变高为异常信号, 1: P3.5由高变低为异常信号*/
#define      ENFD                0x20      /* 0: 关闭PWM外部异常检测功, 1: 允许PWM外部异常检测功 */
#define      FLTFLIO                0x10      /* 0: 发生WM外部异常时,PWM的输出口不变,1: 发生WM外部异常时,PWM的输出口立即被设置为高阻输入模式。(注:只有ENCnO==1所对应的端口才会被强制悬空) */
#define      EFDI                0x08      /* 1: 使能PWM异常检测中断, 0: 关闭PWM异常检测中断(FDIF依然会被硬件置位) */
#define      FDCMP                0x04      /* 1: 设定PWM异常检测源为比较器输出(异常类型由INVCMP设定), 0: 比较器与PWM无关 */
#define      FDIO                0x02      /* 1: P3.5设置为PWM异常检测, 异常类型由INVIO设定, 0: P3.5与PWM无关 */
#define      FDIF                0x01      /* 异常中断标志位, 当发生PWM异常(比较器的输出由低变高或者P3.5的电平由低变高)时,硬件自动将此位置1, 并置位中断标志.需要软件清零 */
#define      PWM_FaultDetect_Enable()      PWMFDCR |=0x20                /* 使能PWM的外部异常检测功能 */
#define      PWM_FaultDetect_Disable()      PWMFDCR &= ~0x20                /* 禁止PWM的外部异常检测功能 */

//                        7   6    543210   Reset Value
//PWMCR: PWM控制寄存器ENPWMECBI------   0000,0000
#define      ENPWM      0x80      /* 使能PWM波形发生器,PWM计数器开始计数 */
#define      ECBI      0x40      /* 使能PWM计数器归零中断 */
#define      PWM_Enable()      PWMCR |=0x80      /* 使能PWM波形发生器,PWM计数器开始计数 */
#define      PWM_Disable()      PWMCR &= ~0x80      /* 关闭PWM波形发生器 */



/*BIT Registers*/
/*PSW   */
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 F1   = PSW^1;
sbit P    = PSW^0;

/*TCON*/
sbit TF1= TCON^7;      //定时器1溢出中断标志位
sbit TR1= TCON^6;      //定时器1运行控制位
sbit TF0= TCON^5;      //定时器0溢出中断标志位
sbit TR0= TCON^4;      //定时器0运行控制位
sbit IE1= TCON^3;      //外中断1标志位
sbit IT1= TCON^2;      //外中断1信号方式控制位,1:下降沿中断,0:上升下降均中断。
sbit IE0= TCON^1;      //外中断0标志位
sbit IT0= TCON^0;      //外中断0信号方式控制位,1:下降沿中断,0:上升下降均中断。

/*P0*/
sbitP00 = P0^0;
sbitP01 = P0^1;
sbitP02 = P0^2;
sbitP03 = P0^3;
sbitP04 = P0^4;
sbitP05 = P0^5;
sbitP06 = P0^6;
sbitP07 = P0^7;

/*P1*/
sbitP10 = P1^0;
sbitP11 = P1^1;
sbitP12 = P1^2;
sbitP13 = P1^3;
sbitP14 = P1^4;
sbitP15 = P1^5;
sbitP16 = P1^6;
sbitP17 = P1^7;

sbitRXD2      = P1^0;
sbitTXD2      = P1^1;
sbitCCP1      = P1^0;
sbitCCP0      = P1^1;
sbitSPI_SS    = P1^2;
sbitSPI_MOSI= P1^3;
sbitSPI_MISO= P1^4;
sbitSPI_SCLK= P1^5;

sbitSPI_SS_2    = P2^4;
sbitSPI_MOSI_2= P2^3;
sbitSPI_MISO_2= P2^2;
sbitSPI_SCLK_2= P2^1;

sbitSPI_SS_3    = P5^4;
sbitSPI_MOSI_3= P4^0;
sbitSPI_MISO_3= P4^1;
sbitSPI_SCLK_3= P4^3;

/*P2*/
sbitP20 = P2^0;
sbitP21 = P2^1;
sbitP22 = P2^2;
sbitP23 = P2^3;
sbitP24 = P2^4;
sbitP25 = P2^5;
sbitP26 = P2^6;
sbitP27 = P2^7;

/*P3*/
sbitP30 = P3^0;
sbitP31 = P3^1;
sbitP32 = P3^2;
sbitP33 = P3^3;
sbitP34 = P3^4;
sbitP35 = P3^5;
sbitP36 = P3^6;
sbitP37 = P3^7;

sbit RXD= P3^0;
sbit TXD= P3^1;
sbit INT0 = P3^2;
sbit INT1 = P3^3;
sbit T0   = P3^4;
sbit T1   = P3^5;
sbit WR   = P3^6;
sbit RD   = P3^7;
sbit CCP2= P3^7;

sbit CLKOUT0   = P3^5;
sbit CLKOUT1   = P3^4;

/*P4*/
sbitP40 = P4^0;
sbitP41 = P4^1;
sbitP42 = P4^2;
sbitP43 = P4^3;
sbitP44 = P4^4;
sbitP45 = P4^5;
sbitP46 = P4^6;
sbitP47 = P4^7;

/*P5*/
sbitP50 = P5^0;
sbitP51 = P5^1;
sbitP52 = P5^2;
sbitP53 = P5^3;
sbitP54 = P5^4;
sbitP55 = P5^5;
sbitP56 = P5^6;
sbitP57 = P5^7;

/*P6*/
sbitP60 = P6^0;
sbitP61 = P6^1;
sbitP62 = P6^2;
sbitP63 = P6^3;
sbitP64 = P6^4;
sbitP65 = P6^5;
sbitP66 = P6^6;
sbitP67 = P6^7;

/*P7*/
sbitP70 = P7^0;
sbitP71 = P7^1;
sbitP72 = P7^2;
sbitP73 = P7^3;
sbitP74 = P7^4;
sbitP75 = P7^5;
sbitP76 = P7^6;
sbitP77 = P7^7;


/*SCON*/
sbit SM0= SCON^7;      //SM0/FE                SM0 SM1 = 00 ~ 11: 方式0~3
sbit SM1= SCON^6;      //
sbit SM2= SCON^5;      //多机通讯
sbit REN= SCON^4;      //接收允许
sbit TB8= SCON^3;      //发送数据第8位
sbit RB8= SCON^2;      //接收数据第8位
sbit TI   = SCON^1;      //发送中断标志位
sbit RI   = SCON^0;      //接收中断标志位

/*IE   */
sbit EA   = IE^7;      //中断允许总控制位
sbit ELVD = IE^6;      //低压监测中断允许位
sbit EADC = IE^5;      //ADC 中断 允许位
sbit ES   = IE^4;      //串行中断 允许控制位
sbit ET1= IE^3;      //定时中断1允许控制位
sbit EX1= IE^2;      //外部中断1允许控制位
sbit ET0= IE^1;      //定时中断0允许控制位
sbit EX0= IE^0;      //外部中断0允许控制位

sbit ACC0 = ACC^0;
sbit ACC1 = ACC^1;
sbit ACC2 = ACC^2;
sbit ACC3 = ACC^3;
sbit ACC4 = ACC^4;
sbit ACC5 = ACC^5;
sbit ACC6 = ACC^6;
sbit ACC7 = ACC^7;

sbit B0 = B^0;
sbit B1 = B^1;
sbit B2 = B^2;
sbit B3 = B^3;
sbit B4 = B^4;
sbit B5 = B^5;
sbit B6 = B^6;
sbit B7 = B^7;


//                                                      7   6   5    4    3    2    1   0    Reset Value
//sfr IE2       = 0xAF;                -   -   -    -    -    -   ESPIES2   0000,0000B      //Auxiliary Interrupt   
#define                SPI_INT_ENABLE()                IE2 |=2      /* 允许SPI中断                */
#define                SPI_INT_DISABLE()                IE2 &= ~2      /* 允许SPI中断                */
#define                UART2_INT_ENABLE()                IE2 |=1      /* 允许串口2中断      */
#define                UART2_INT_DISABLE()                IE2 &= ~1      /* 允许串口2中断      */

//                                          7   6   5    4    3    2    1    0    Reset Value
//sfr IP      = 0xB8; //中断优先级低位      PPCAPLVDPADCPS   PT1PX1PT0PX0   0000,0000
//--------
sbit PPCA      = IP^7;      //PCA 模块中断优先级
sbit PLVD      = IP^6;      //低压监测中断优先级
sbit PADC      = IP^5;      //ADC 中断优先级
sbit PS         = IP^4;      //串行中断0优先级设定位
sbit PT1      = IP^3;      //定时中断1优先级设定位
sbit PX1      = IP^2;      //外部中断1优先级设定位
sbit PT0      = IP^1;      //定时中断0优先级设定位
sbit PX0      = IP^0;      //外部中断0优先级设定位

//                                           7      6      5   4   3   2    1   0      Reset Value
//sfr IPH   = 0xB7; //中断优先级高位       PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0H   0000,0000
//sfr IP2   = 0xB5; //                     -      -      -   -   -   -   PSPI   PS2   xxxx,xx00
//sfr IP2H= 0xB6; //                     -      -      -   -   -   -   PSPIHPS2Hxxxx,xx00
#define                PPCAH      0x80
#define                PLVDH      0x40
#define                PADCH      0x20
#define                PSH                0x10
#define                PT1H      0x08
#define                PX1H      0x04
#define                PT0H      0x02
#define                PX0H      0x01

#define                PCA_InterruptFirst()      PPCA = 1
#define                LVD_InterruptFirst()      PLVD = 1
#define                ADC_InterruptFirst()      PADC = 1
#define                UART1_InterruptFirst()      PS   = 1
#define                Timer1_InterruptFirst()      PT1= 1
#define                INT1_InterruptFirst()      PX1= 1
#define                Timer0_InterruptFirst()      PT0= 1
#define                INT0_InterruptFirst()      PX0= 1


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


//                     7      6   5    4    3    2   1      0      Reset Value
//sfr CMPCR1 = 0xE6;   CMPENCMPIFPIENIEPISNISCMPOECMPRES      00000000B
#define      CMPEN      0x80      //1: 允许比较器, 0: 禁止,关闭比较器电源
#define      CMPIF      0x40      //比较器中断标志, 包括上升沿或下降沿中断, 软件清0
#define      PIE                0x20      //1: 比较结果由0变1, 产生上升沿中断
#define      NIE                0x10      //1: 比较结果由1变0, 产生下降沿中断
#define      PIS                0x08      //输入正极性选择, 0: 选择内部P3.7做正输入,         1: 由ADC_CHS所选择的ADC输入端做正输入.
#define      NIS                0x04      //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入, 1: 选择外部P3.6做输入.
#define      CMPOE      0x02      //1: 允许比较结果输出, 0: 禁止.
#define      CMPRES      0x01      //比较结果, 1: CMP+电平高于CMP-,0: CMP+电平低于CMP-,只读

#define      CMP_P_P37      0x00      //输入正极性选择, 0: 选择内部P3.7做正输入
#define      CMP_P_ADC      0x08      //输入正极性选择, 1: 由ADC_CHS所选择的ADC输入端做正输入.
#define      CMP_N_GAP      0x00      //输入负极性选择, 0: 选择内部BandGap电压BGv做负输入.
#define      CMP_N_P36      0x04      //输入负极性选择, 1: 选择外部P3.6做输入.

#define      CMPO_P34()      P_SW2 &= ~0x08      //结果输出到P3.4.
#define      CMPO_P41()      P_SW2 |=0x08      //结果输出到P4.1.

//                     7      6       543210    Reset Value
//sfr CMPCR2 = 0xE7;   INVCMPODISFLT       LCDTY       00001001B
#define      INVCMPO      0x80      //1: 比较器输出IO取反,0: 不取反
#define      DISFLT      0x40      //1: 关闭0.1uF滤波,   0: 允许
#define      LCDTY      0x00      //0~63, 比较结果变化延时周期数



/*************************************************************************************************/
//                     7   6   5    4    3    2   1   0       Reset Value
//sfr SCON= 0x98;   SM0   SM1   SM2RENTB8RB8TIRI      00000000B               //S1 Control

#define                S1_DoubleRate()                PCON|=0x80
#define                S1_SHIFT()                        SCON&=0x3f

#define                S1_8bit()                        SCON   =(SCON & 0x3f) | 0x40
#define                S1_9bit()                        SCON   =(SCON & 0x3f) | 0xc0
#define                S1_RX_Enable()                SCON|=0x10
#define                S1_RX_Disable()                SCON&= ~0x10
#define                TI1                                        TI                                        /* 判断TI1是否发送完成                                                               */
#define                RI1                                        RI                                        /* 判断RI1是否接收完成                                                               */
#define                SET_TI1()                        TI = 1                              /* 设置TI1(引起中断)                                                               */
#define                CLR_TI1()                        TI = 0                              /* 清除TI1                                                                                       */
#define                CLR_RI1()                        RI = 0                              /* 清除RI1                                                                                       */
#define                S1TB8_SET()                        TB8 = 1                              /* 设置TB8                                                                                       */
#define                S1TB8_CLR()                        TB8 = 0                              /* 清除TB8                                                                                       */
#define                S1_Int_Enable()                ES   =1                        /* 串口1允许中断                                                                         */
#define                S1_Int_Disable()      ES   =0                        /* 串口1禁止中断                                                                         */
#define         S1_BRT_UseTimer1()      AUXR&= ~1
#define         S1_BRT_UseTimer2()      AUXR|=1
#define                S1_USE_P30P31()                P_SW1 &= ~0xc0                                                //UART1 使用P30 P31口      默认
#define                S1_USE_P36P37()                P_SW1=(P_SW1 & ~0xc0) | 0x40      //UART1 使用P36 P37口
#define                S1_USE_P16P17()                P_SW1=(P_SW1 & ~0xc0) | 0x80      //UART1 使用P16 P17口
#define                S1_TXD_RXD_SHORT()      PCON2 |=(1<<4)      //将TXD与RXD连接中继输出
#define                S1_TXD_RXD_OPEN()      PCON2 &= ~(1<<4)      //将TXD与RXD连接中继断开      默认

//                                                7      6      5      4      3      2   1   0      Reset Value
//sfr S2CON = 0x9A;                S2SM0    -    S2SM2S2RENS2TB8S2RB8S2TIS2RI      00000000B               //S2 Control

#define                S2_MODE0()                        S2CON &= ~(1<<7)      /* 串口2模式0,8位UART,波特率 = 定时器2的溢出率 / 4 */
#define                S2_MODE1()                        S2CON |=(1<<7)      /* 串口2模式1,9位UART,波特率 = 定时器2的溢出率 / 4 */
#define                S2_8bit()                        S2CON &= ~(1<<7)      /* 串口2模式0,8位UART,波特率 = 定时器2的溢出率 / 4 */
#define                S2_9bit()                        S2CON |=(1<<7)      /* 串口2模式1,9位UART,波特率 = 定时器2的溢出率 / 4 */
#define                S2_RX_Enable()                S2CON |=(1<<4)      /* 允许串2接收                                                                                 */
#define                S2_RX_Disable()                S2CON &= ~(1<<4)      /* 禁止串2接收                                                                                 */
#define                TI2                                        (S2CON & 2)               /* 判断TI2是否发送完成                                                               */
#define                RI2                                        (S2CON & 1)               /* 判断RI2是否接收完成                                                               */
#define                SET_TI2()                        S2CON |=(1<<1)      /* 设置TI2(引起中断)                                                               */
#define                CLR_TI2()                        S2CON &= ~(1<<1)      /* 清除TI2                                                                                       */
#define                CLR_RI2()                        S2CON &= ~1                        /* 清除RI2                                                                                       */
#define                S2TB8_SET()                        S2CON |=(1<<3)      /* 设置TB8                                                                                       */
#define                S2TB8_CLR()                        S2CON &= ~(1<<3)      /* 清除TB8                                                                                       */
#define                S2_Int_Enable()                IE2   |=1                        /* 串口2允许中断                                                                         */
#define                S2_Int_Disable()      IE2   &= ~1                        /* 串口2禁止中断                                                                         */
#define                S2_USE_P10P11()                P_SW2 &= ~1                        /* UART2 使用P1口      默认                                                         */
#define                S2_USE_P46P47()                P_SW2 |=1                        /* UART2 使用P4口                                                                         */

//                                                7      6      5      4      3      2   1   0      Reset Value
//sfr S3CON = 0xAC;                S3SM0S3ST3S3SM2S3RENS3TB8S3RB8S3TIS3RI      00000000B               //S3 Control

#define                S3_MODE0()                        S3CON &= ~(1<<7)      /* 串口3模式0,8位UART,波特率 = 定时器的溢出率 / 4*/
#define                S3_MODE1()                        S3CON |=(1<<7)      /* 串口3模式1,9位UART,波特率 = 定时器的溢出率 / 4*/
#define                S3_8bit()                        S3CON &= ~(1<<7)      /* 串口3模式0,8位UART,波特率 = 定时器的溢出率 / 4*/
#define                S3_9bit()                        S3CON |=(1<<7)      /* 串口3模式1,9位UART,波特率 = 定时器的溢出率 / 4*/
#define                S3_RX_Enable()                S3CON |=(1<<4)      /* 允许串3接收                                                                           */
#define                S3_RX_Disable()                S3CON &= ~(1<<4)      /* 禁止串3接收                                                                           */
#define                TI3                                        (S3CON & 2) != 0      /* 判断TI3是否发送完成                                                               */
#define                RI3                                        (S3CON & 1) != 0      /* 判断RI3是否接收完成                                                               */
#define                SET_TI3()                        S3CON |=(1<<1)      /* 设置TI3(引起中断)                                                               */
#define                CLR_TI3()                        S3CON &= ~(1<<1)      /* 清除TI3                                                                                       */
#define                CLR_RI3()                        S3CON &= ~1                        /* 清除RI3                                                                                       */
#define                S3TB8_SET()                        S3CON |=(1<<3)      /* 设置TB8                                                                                       */
#define                S3TB8_CLR()                        S3CON &= ~(1<<3)      /* 清除TB8                                                                                       */
#define                S3_Int_Enable()                IE2   |=(1<<3)      /* 串口3允许中断                                                                     */
#define                S3_Int_Disable()      IE2   &= ~(1<<3)      /* 串口3禁止中断                                                                     */
#define         S3_BRT_UseTimer3()      S3CON |=(1<<6)      /* BRT select Timer3                                                               */
#define         S3_BRT_UseTimer2()      S3CON &= ~(1<<6)      /* BRT select Timer2                                                               */
#define                S3_USE_P00P01()                P_SW2 &= ~2                        /* UART3 使用P0口      默认                                                   */
#define                S3_USE_P50P51()                P_SW2 |=2                        /* UART3 使用P5口                                                                     */

//                                                7      6      5      4      3      2   1   0      Reset Value
//sfr S4CON = 0x84;                S4SM0S4ST4S4SM2S4RENS4TB8S4RB8S4TIS4RI      00000000B               //S4 Control

#define                S4_MODE0()                        S4CON &= ~(1<<7)      /* 串口4模式0,8位UART,波特率 = 定时器的溢出率 / 4*/
#define                S4_MODE1()                        S4CON |=(1<<7)      /* 串口4模式1,9位UART,波特率 = 定时器的溢出率 / 4*/
#define                S4_8bit()                        S4CON &= ~(1<<7)      /* 串口4模式0,8位UART,波特率 = 定时器的溢出率 / 4*/
#define                S4_9bit()                        S4CON |=(1<<7)      /* 串口4模式1,9位UART,波特率 = 定时器的溢出率 / 4*/
#define                S4_RX_Enable()                S4CON |=(1<<4)      /* 允许串4接收                                                                           */
#define                S4_RX_Disable()                S4CON &= ~(1<<4)      /* 禁止串4接收                                                                           */
#define                TI4                                        (S4CON & 2) != 0      /* 判断TI3是否发送完成                                                             */
#define                RI4                                        (S4CON & 1) != 0      /* 判断RI3是否接收完成                                                             */
#define                SET_TI4()                        S4CON |=2                        /* 设置TI3(引起中断)                                                             */
#define                CLR_TI4()                        S4CON &= ~2                        /* 清除TI3                                                                                     */
#define                CLR_RI4()                        S4CON &= ~1                        /* 清除RI3                                                                                     */
#define                S4TB8_SET()                        S4CON |=8                        /* 设置TB8                                                                                     */
#define                S4TB8_CLR()                        S4CON &= ~8                        /* 清除TB8                                                                                     */
#define                S4_Int_Enable()                IE2   |=(1<<4)      /* 串口4允许中断                                                                     */
#define                S4_Int_Disable()      IE2   &= ~(1<<4)      /* 串口4禁止中断                                                                     */
#define         S4_BRT_UseTimer4()      S4CON |=(1<<6)      /* BRT select Timer4                                                               */
#define         S4_BRT_UseTimer2()      S4CON &= ~(1<<6)      /* BRT select Timer2                                                               */
#define                S4_USE_P02P03()                P_SW2 &= ~4                        /* UART4 使用P0口      默认                                                   */
#define                S4_USE_P52P53()                P_SW2 |=4                        /* UART4 使用P5口                                                                     */




/**********************************************************/
//                                                   7   6       5      4   3      2      1      0    Reset Value
//sfr AUXR= 0x8E;                T0x12 T1x12 UART_M0x6T2RT2_C/T T2x12 EXTRAMS1ST20000,0000      //Auxiliary Register

#define         ExternalRAM_enable()                AUXR |=2                /* 允许外部XRAM,禁止使用内部1024RAM   */
#define         InternalRAM_enable()                AUXR &= ~2                /* 禁止外部XRAM,允许使用内部1024RAM   */
#define                S1_M0x6()                                        AUXR |=(1<<5)      /* UART Mode0 Speed is 6x Standard       */
#define                S1_M0x1()                                        AUXR &= ~(1<<5)      /* default,      UART Mode0 Speed is Standard */

//====================================
#define                Timer0_16bitAutoReload()      TMOD &= ~0x03                                        /* 16位自动重装      */
#define                Timer0_16bit()                              TMOD= (TMOD & ~0x03) | 0x01      /* 16位         */
#define                Timer0_8bitAutoReload()                TMOD= (TMOD & ~0x03) | 0x02      /* 8位自动重装      */
#define                Timer0_16bitAutoRL_NoMask()      TMOD |=0x03                /* 16位自动重装不可屏蔽中断      */
#define         Timer0_Run()                                 TR0 = 1                              /* 允许定时器0计数                        */
#define         Timer0_Stop()                                 TR0 = 0                              /* 禁止定时器0计数                        */
#define                Timer0_Gate_INT0_P32()                TMOD |=(1<<3)                /* 时器0由外部INT0高电平允许定时计数 */
#define                Timer0_AsTimer()                        TMOD &= ~(1<<2)                /* 时器0用做定时器      */
#define                Timer0_AsCounter()                        TMOD |=(1<<2)                /* 时器0用做计数器      */
#define                Timer0_AsCounterP34()                TMOD |=(1<<2)                /* 时器0用做计数器      */
#define         Timer0_1T()                                        AUXR |=(1<<7)                /* Timer0 clodk = fo      */
#define         Timer0_12T()                              AUXR &= ~(1<<7)                /* Timer0 clodk = fo/12      12分频,      default      */
#define                Timer0_CLKO_Enable()                INT_CLKO |=1                        /* 允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。      */
#define                Timer0_CLKO_Disable()                INT_CLKO &= ~1
#define                Timer0_CLKO_Enable_P34()      INT_CLKO |=1                        /* 允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。      */
#define                Timer0_CLKO_Disable_P34()      INT_CLKO &= ~1
#define         Timer0_InterruptEnable()      ET0 = 1                              /* 允许Timer1中断.*/
#define         Timer0_InterruptDisable()      ET0 = 0                              /* 禁止Timer1中断.*/

#define                T0_Load(n)                                        TH0 = (n) / 256,      TL0 = (n) % 256
#define                T0_Load_us_1T(n)                        Timer0_AsTimer(),Timer0_1T(), Timer0_16bitAutoReload(),TH0=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)/256, TL0=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)%256
#define                T0_Load_us_12T(n)                        Timer0_AsTimer(),Timer0_12T(),Timer0_16bitAutoReload(),TH0=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)/256,TL0=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)%256
#define                T0_Frequency_1T_P35(n)                ET0=0,Timer0_AsTimer(),Timer0_1T(),Timer0_16bitAutoReload(),TH0=(65536-(n/2+MAIN_Fosc/2)/(n))/256,TL0=(65536-(n/2+MAIN_Fosc/2)/(n))%256,INT_CLKO |= bit0,TR0=1                /* fx=fosc/(2*M)/n,M=1 or M=12 */
#define                T0_Frequency_12T_P35(n)                ET0=0,Timer0_AsTimer(),Timer0_12T(),Timer0_16bitAutoReload(),TH0=(65536-(n/2+MAIN_Fosc/24)/(n))/256,TL0=(65536-(n/2+MAIN_Fosc/24)/(n))%256,INT_CLKO |= bit0,TR0=1      /* fx=fosc/(2*M)/n,M=1 or M=12 */

//====================================
#define                Timer1_16bitAutoReload()      TMOD &= ~0x30                                        /* 16位自动重装      */
#define                Timer1_16bit()                              TMOD= (TMOD & ~0x30) | 0x10      /* 16位                        */
#define                Timer1_8bitAutoReload()                TMOD= (TMOD & ~0x30) | 0x20      /* 8位自动重装      */
#define         Timer1_Run()                                 TR1 = 1                              /* 允许定时器1计数                        */
#define         Timer1_Stop()                                 TR1 = 0                              /* 禁止定时器1计数                        */
#define                Timer1_Gate_INT1_P33()                TMOD |=(1<<7)                /* 时器1由外部INT1高电平允许定时计数      */
#define                Timer1_AsTimer()                        TMOD &= ~(1<<6)                /* 时器1用做定时器                        */
#define                Timer1_AsCounter()                        TMOD |=(1<<6)                /* 时器1用做计数器                        */
#define                Timer1_AsCounterP35()                TMOD |=(1<<6)                /* 时器1用做计数器                        */
#define         Timer1_1T()                                        AUXR |=(1<<6)                /* Timer1 clodk = fo                */
#define         Timer1_12T()                              AUXR &= ~(1<<6)                /* Timer1 clodk = fo/12      12分频,      default      */
#define                Timer1_CLKO_Enable()                INT_CLKO |=2                        /* 允许 T1 溢出脉冲在T1(P3.4)脚输出,Fck1 = 1/2 T1 溢出率,T1可以1T或12T。      */
#define                Timer1_CLKO_Disable()                INT_CLKO &= ~2
#define                Timer1_CLKO_Enable_P35()      INT_CLKO |=2                        /* 允许 T1 溢出脉冲在T1(P3.4)脚输出,Fck1 = 1/2 T1 溢出率,T1可以1T或12T。      */
#define                Timer1_CLKO_Disable_P35()      INT_CLKO &= ~2
#define         Timer1_InterruptEnable()      ET1 = 1                              /* 允许Timer1中断.      */
#define         Timer1_InterruptDisable()      ET1 = 0                              /* 禁止Timer1中断.      */

#define                T1_Load(n)                                        TH1 = (n) / 256,      TL1 = (n) % 256
#define                T1_Load_us_1T(n)                        Timer1_AsTimer(),Timer1_1T(), Timer1_16bitAutoReload(),TH1=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)/256, TL1=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)%256
#define                T1_Load_us_12T(n)                        Timer1_AsTimer(),Timer1_12T(),Timer1_16bitAutoReload(),TH1=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)/256,TL1=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)%256
#define                T1_Frequency_1T_P34(n)                ET1=0,Timer1_AsTimer(),Timer1_1T(),Timer1_16bitAutoReload(),TH1=(65536-(n/2+MAIN_Fosc/2)/(n))/256,TL1=(65536-(n/2+MAIN_Fosc/2)/(n))%256,INT_CLKO |= bit1,TR1=1                /* fx=fosc/(2*M)/n,M=1 or M=12 */
#define                T1_Frequency_12T_P34(n)                ET1=0,Timer1_AsTimer(),Timer1_12T(),Timer1_16bitAutoReload(),TH1=(65536-(n/2+MAIN_Fosc/24)/(n))/256,TL1=(65536-(n/2+MAIN_Fosc/24)/(n))%256,INT_CLKO |= bit1,TR1=1      /* fx=fosc/(2*M)/n,M=1 or M=12 */

//====================================
#define         Timer2_Run()                                 AUXR |=(1<<4)      /* 允许定时器2计数      */
#define         Timer2_Stop()                                 AUXR &= ~(1<<4)      /* 禁止定时器2计数      */
#define                Timer2_AsTimer()                        AUXR &= ~(1<<3)      /* 时器2用做定时器      */
#define                Timer2_AsCounter()                        AUXR |=(1<<3)      /* 时器2用做计数器      */
#define                Timer2_AsCounterP31()                AUXR |=(1<<3)      /* 时器2用做计数器      */
#define         Timer2_1T()                                        AUXR |=(1<<2)      /* Timer0 clock = fo      */
#define         Timer2_12T()                              AUXR &= ~(1<<2)      /* Timer0 clock = fo/12      12分频,      default      */
#define                Timer2_CLKO_Enable()                INT_CLKO |=4                /* 允许 T2 溢出脉冲在T1(P3.0)脚输出,Fck2 = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer2_CLKO_Disable()                INT_CLKO &= ~4
#define                Timer2_CLKO_Enable_P30()      INT_CLKO |=4                /* 允许 T2 溢出脉冲在T1(P3.0)脚输出,Fck2 = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer2_CLKO_Disable_P30()      INT_CLKO &= ~4
#define         Timer2_InterruptEnable()      IE2|=(1<<2)      /* 允许Timer2中断.      */
#define         Timer2_InterruptDisable()      IE2&= ~(1<<2)      /* 禁止Timer2中断.      */

#define                T2_Load(n)                                        TH2 = (n) / 256,      TL2 = (n) % 256
#define                T2_Load_us_1T(n)                        Timer2_AsTimer(),Timer2_1T(), TH2=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)/256, TL2=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)%256
#define                T2_Load_us_12T(n)                        Timer2_AsTimer(),Timer2_12T(),TH2=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)/256,TL2=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)%256
#define                T2_Frequency_1T_P30(n)                Timer2_InterruptDisable(),Timer2_AsTimer(),Timer2_1T(), TH2=(65536-(n/2+MAIN_Fosc/2)/(n))/256, TL2=(65536-(n/2+MAIN_Fosc/2)/(n))%256, Timer2_CLKO_Enable_P30(),Timer2_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */
#define                T2_Frequency_12T_P30(n)                Timer2_InterruptDisable(),Timer2_AsTimer(),Timer2_12T(),TH2=(65536-(n/2+MAIN_Fosc/24)/(n))/256,TL2=(65536-(n/2+MAIN_Fosc/24)/(n))%256,Timer2_CLKO_Enable_P30(),Timer2_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */

//====================================
#define         Timer3_Run()                                 T4T3M |=(1<<3)      /* 允许定时器3计数      */
#define         Timer3_Stop()                                 T4T3M &= ~(1<<3)      /* 禁止定时器3计数      */
#define                Timer3_AsTimer()                        T4T3M &= ~(1<<2)      /* 时器3用做定时器      */
#define                Timer3_AsCounter()                        T4T3M |=(1<<2)      /* 时器3用做计数器, P0.5为外部脉冲      */
#define                Timer3_AsCounterP05()                T4T3M |=(1<<2)      /* 时器3用做计数器, P0.5为外部脉冲      */
#define         Timer3_1T()                                        T4T3M |=(1<<1)      /* 1T模式      */
#define         Timer3_12T()                              T4T3M &= ~(1<<1)      /* 12T模式,      default      */
#define                Timer3_CLKO_Enable()                T4T3M |=1                        /* 允许T3溢出脉冲在T3(P0.4)脚输出,Fck = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer3_CLKO_Disable()                T4T3M &= ~1                        /* 禁止T3溢出脉冲在T3(P0.4)脚输出      */
#define                Timer3_CLKO_Enable_P04()      T4T3M |=1                        /* 允许T3溢出脉冲在T3(P0.4)脚输出,Fck = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer3_CLKO_Disable_P04()      T4T3M &= ~1                        /* 禁止T3溢出脉冲在T3(P0.4)脚输出      */
#define         Timer3_InterruptEnable()      IE2|=(1<<5)                /* 允许Timer3中断.      */
#define         Timer3_InterruptDisable()      IE2&= ~(1<<5)                /* 禁止Timer3中断.      */

#define                T3_Load(n)                                        TH3 = (n) / 256,      TL3 = (n) % 256
#define                T3_Load_us_1T(n)                        Timer3_AsTimer(),Timer3_1T(), TH3=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)/256, TL3=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)%256
#define                T3_Load_us_12T(n)                        Timer3_AsTimer(),Timer3_12T(),TH3=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)/256,TL3=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)%256
#define                T3_Frequency_1T_P04(n)                Timer3_InterruptDisable(),Timer3_AsTimer(),Timer3_1T(), TH3=(65536-(n/2+MAIN_Fosc/2)/(n))/256, TL3=(65536-(n/2+MAIN_Fosc/2)/(n))%256, Timer3_CLKO_P04_Enable,Timer3_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */
#define                T3_Frequency_12T_P04(n)                Timer3_InterruptDisable(),Timer3_AsTimer(),Timer3_12T(),TH3=(65536-(n/2+MAIN_Fosc/24)/(n))/256,TL3=(65536-(n/2+MAIN_Fosc/24)/(n))%256,Timer3_CLKO_P04_Enable,Timer3_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */

//====================================
#define         Timer4_Run()                                 T4T3M |=(1<<7)      /* 允许定时器4计数      */
#define         Timer4_Stop()                                 T4T3M &= ~(1<<7)      /* 禁止定时器4计数      */
#define                Timer4_AsTimer()                        T4T3M &= ~(1<<6)      /* 时器4用做定时器*/
#define                Timer4_AsCounter()                        T4T3M |=(1<<6)      /* 时器4用做计数器, P0.7为外部脉冲      */
#define                Timer4_AsCounterP07()                T4T3M |=(1<<6)      /* 时器4用做计数器, P0.7为外部脉冲      */
#define         Timer4_1T()                                        T4T3M |=(1<<5)      /* 1T模式      */
#define         Timer4_12T()                              T4T3M &= ~(1<<5)      /* 12T模式,      default      */
#define                Timer4_CLKO_Enable()                T4T3M |=(1<<4)      /* 允许T4溢出脉冲在T4(P0.6)脚输出,Fck = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer4_CLKO_Disable()                T4T3M &= ~(1<<4)      /* 禁止T4溢出脉冲在T4(P0.6)脚输出      */
#define                Timer4_CLKO_Enable_P06()      T4T3M |=(1<<4)      /* 允许T4溢出脉冲在T4(P0.6)脚输出,Fck = 1/2 T2 溢出率,T2可以1T或12T。      */
#define                Timer4_CLKO_Disable_P06()      T4T3M &= ~(1<<4)      /* 禁止T4溢出脉冲在T4(P0.6)脚输出      */
#define         Timer4_InterruptEnable()      IE2|=(1<<6)                /* 允许Timer4中断.      */
#define         Timer4_InterruptDisable()      IE2&= ~(1<<6)                /* 禁止Timer4中断.      */

#define                T4_Load(n)                                        TH4 = (n) / 256,      TL4 = (n) % 256
#define                T4_Load_us_1T(n)                        Timer4_AsTimer(),Timer4_1T(), TH4=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)/256, TL4=(65536-((MAIN_Fosc/1000)*(n)+500)/1000)%256
#define                T4_Load_us_12T(n)                        Timer4_AsTimer(),Timer4_12T(),TH4=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)/256,TL4=(65536-((MAIN_Fosc/12000)*(n)+500)/1000)%256
#define                T4_Frequency_1T_P06(n)                Timer4_InterruptDisable(),Timer4_AsTimer(),Timer4_1T(), TH4=(65536-(n/2+MAIN_Fosc/2)/(n))/256, TL4=(65536-(n/2+MAIN_Fosc/2)/(n))%256, Timer4_CLKO_P06_Enable(),Timer4_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */
#define                T4_Frequency_12T_P06(n)                Timer4_InterruptDisable(),Timer4_AsTimer(),Timer4_12T(),TH4=(65536-(n/2+MAIN_Fosc/24)/(n))/256,TL4=(65536-(n/2+MAIN_Fosc/24)/(n))%256,Timer4_CLKO_P06_Enable(),Timer4_Run()      /* fx=fosc/(2*M)/n,M=1 or M=12 */
//====================================================================================================================

//sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
//                                    7   6   5      4       3      2   1   0   Reset Value
//                                  WDT_FLAG-EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0    xx00,0000
#define D_WDT_FLAG                        (1<<7)
#define D_EN_WDT                        (1<<5)
#define D_CLR_WDT                        (1<<4)      /* auto clear      */
#define D_IDLE_WDT                        (1<<3)      /* WDT counter when Idle      */
#define D_WDT_SCALE_2                0
#define D_WDT_SCALE_4                1
#define D_WDT_SCALE_8                2                /* T=393216*N/fo      */
#define D_WDT_SCALE_16                3
#define D_WDT_SCALE_32                4
#define D_WDT_SCALE_64                5
#define D_WDT_SCALE_128                6
#define D_WDT_SCALE_256                7

#define      WDT_reset(n)      WDT_CONTR = D_EN_WDT + D_CLR_WDT + D_IDLE_WDT + (n)                /* 初始化WDT,喂狗 */


//                                                7   6      5    4   3      2    1   0   Reset Value
//sfr PCON   = 0x87;      SMODSMOD0LVDFPOF   GF1    GF0   PD   IDL    0001,0000         //Power Control
//SMOD                //串口双倍速
//SMOD0
#define                LVDF                (1<<5)      /* P4.6低压检测标志 */
//POF
//GF1
//GF0
//#define         D_PD                2                /* set 1, power down mode */
//#define         D_IDLE                1                /* set 1, idle mode */
#define                MCU_IDLE()                        PCON |= 1      /* MCU 进入 IDLE 模式 */
#define                MCU_POWER_DOWN()      PCON |= 2      /* MCU 进入 睡眠 模式 */


//sfr ISP_CMD   = 0xC5;
#define                ISP_STANDBY()      ISP_CMD = 0                /* ISP空闲命令(禁止)*/
#define                ISP_READ()                ISP_CMD = 1                /* ISP读出命令                */
#define                ISP_WRITE()                ISP_CMD = 2                /* ISP写入命令                */
#define                ISP_ERASE()                ISP_CMD = 3                /* ISP擦除命令                */

//sfr ISP_TRIG= 0xC6;
#define         ISP_TRIG()      ISP_TRIG = 0x5A,      ISP_TRIG = 0xA5                /* ISP触发命令 */

//                                                          7    6    5      4    3    2    1   0    Reset Value
//sfr IAP_CONTR = 0xC7;                IAPEN SWBS SWRST CFAIL-   WT2WT1   WT0   0000,x000      //IAP Control Register
#define ISP_EN                        (1<<7)
#define ISP_SWBS                (1<<6)
#define ISP_SWRST                (1<<5)
#define ISP_CMD_FAIL      (1<<4)
#define ISP_WAIT_1MHZ      7
#define ISP_WAIT_2MHZ      6
#define ISP_WAIT_3MHZ      5
#define ISP_WAIT_6MHZ      4
#define ISP_WAIT_12MHZ      3
#define ISP_WAIT_20MHZ      2
#define ISP_WAIT_24MHZ      1
#define ISP_WAIT_30MHZ      0

#if (MAIN_Fosc >= 24000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_30MHZ
#elif (MAIN_Fosc >= 20000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_24MHZ
#elif (MAIN_Fosc >= 12000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_20MHZ
#elif (MAIN_Fosc >= 6000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_12MHZ
#elif (MAIN_Fosc >= 3000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_6MHZ
#elif (MAIN_Fosc >= 2000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_3MHZ
#elif (MAIN_Fosc >= 1000000L)
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_2MHZ
#else
      #define                ISP_WAIT_FREQUENCY      ISP_WAIT_1MHZ
#endif



/* ADC Register */
//                                                                7       6      5       4         3      2    1    0   Reset Value
//sfr ADC_CONTR = 0xBC;                ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000      /* AD 转换控制寄存器 */
//sfr ADC_RES= 0xBD;                ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2          0000,0000      /* A/D 转换结果高8位 */
//sfr ADC_RESL = 0xBE;                                                                                                ADCV.1 ADCV.0          0000,0000      /* A/D 转换结果低2位 */
//sfr ADC_CONTR= 0xBC;      //直接用MOV操作,不要用与或


//sfr SPCTL= 0xCE;      SPI控制寄存器
//   7       6       5       4       3       2       1       0            Reset Value
//      SSIG      SPEN      DORD      MSTR      CPOL      CPHA      SPR1      SPR0                0x00

#define      SPI_SSIG_None()                SPCTL |=(1<<7)                /* 1: 忽略SS脚      */
#define      SPI_SSIG_Enable()      SPCTL &= ~(1<<7)                /* 0: SS脚用于决定主从机      */
#define      SPI_Enable()                SPCTL |=(1<<6)                /* 1: 允许SPI      */
#define      SPI_Disable()                SPCTL &= ~(1<<6)                /* 0: 禁止SPI      */
#define      SPI_LSB_First()                SPCTL |=(1<<5)                /* 1: LSB先发      */
#define      SPI_MSB_First()                SPCTL &= ~(1<<5)                /* 0: MSB先发      */
#define      SPI_Master()                SPCTL |=(1<<4)                /* 1: 设为主机      */
#define      SPI_Slave()                        SPCTL &= ~(1<<4)                /* 0: 设为从机      */
#define      SPI_SCLK_NormalH()      SPCTL |=(1<<3)                /* 1: 空闲时SCLK为高电平      */
#define      SPI_SCLK_NormalL()      SPCTL &= ~(1<<3)                /* 0: 空闲时SCLK为低电平      */
#define      SPI_PhaseH()                SPCTL |=(1<<2)                /* 1:         */
#define      SPI_PhaseL()                SPCTL &= ~(1<<2)                /* 0:         */
#define      SPI_Speed(n)                SPCTL = (SPCTL & ~3) | (n)      /*设置速度, 0 -- fosc/4, 1 -- fosc/16, 2 -- fosc/64, 3 -- fosc/128      */

//sfr SPDAT= 0xCF; //SPI Data Register                                                   0000,0000
//sfr SPSTAT= 0xCD;      //SPI状态寄存器
//   7       6      5   4   3   2   1   0            Reset Value
//      SPIF      WCOL      -      -      -      -      -      -
#define      SPIF      0x80                /* SPI传输完成标志。写入1清0。*/
#define      WCOL      0x40                /* SPI写冲突标志。写入1清0。*/

#define                SPI_USE_P12P13P14P15()      AUXR1 &= ~0x0c                                        /* 将SPI切换到P12(SS) P13(MOSI) P14(MISO) P15(SCLK)(上电默认)。*/
#define                SPI_USE_P24P23P22P21()      AUXR1 = (AUXR1 & ~0x0c) | 0x04      /* 将SPI切换到P24(SS) P23(MOSI) P22(MISO) P21(SCLK)。*/
#define                SPI_USE_P54P40P41P43()      AUXR1 = (AUXR1 & ~0x0c) | 0x08      /* 将SPI切换到P54(SS) P40(MOSI) P41(MISO) P43(SCLK)。*/


/*
;PCA_PWMn:    7       6   5   4   3   2   1       0
;                        EBSn_1      EBSn_0      -      -      -      -      EPCnH      EPCnL
;B5-B2:                保留
;B1(EPCnH):      在PWM模式下,与CCAPnH组成9位数。
;B0(EPCnL):      在PWM模式下,与CCAPnL组成9位数。
*/
#define                PWM0_NORMAL()      PCA_PWM0 &= ~2                                        /* PWM0正常输出(默认)      */
#define                PWM0_OUT_0()      PCA_PWM0 |=2, CCAP0H = 0xff      /* PWM0一直输出0                */
#define                PWM0_OUT_1()      PCA_PWM0 &= ~2, CCAP0H = 0                /* PWM0一直输出1                */

#define                PWM1_NORMAL()      PCA_PWM1 &= ~2                                        /* PWM1正常输出(默认)      */
#define                PWM1_OUT_0()      PCA_PWM1 |=2, CCAP1H = 0xff      /* PWM1一直输出0                */
#define                PWM1_OUT_1()      PCA_PWM1 &= ~2, CCAP1H = 0                /* PWM1一直输出1                */

#define                PWM2_NORMAL()      PCA_PWM2 &= ~2                                        /* PWM2正常输出(默认)      */
#define                PWM2_OUT_0()      PCA_PWM2 |=2, CCAP2H = 0xff      /* PWM2一直输出0                */
#define                PWM2_OUT_1()      PCA_PWM2 &= ~2, CCAP2H = 0                /* PWM2一直输出1                */

#define                PWM3_NORMAL()      PCA_PWM3 &= ~2                                        /* PWM3正常输出(默认)      */
#define                PWM3_OUT_0()      PCA_PWM3 |=2, CCAP3H = 0xff      /* PWM3一直输出0                */
#define                PWM3_OUT_1()      PCA_PWM3 &= ~2, CCAP3H = 0                /* PWM3一直输出1                */


//                                                7   6   5   4   3   2   1   0   Reset Value
//sfr CCON   = 0xD8;      CF    CR    -   -    CCF3CCF2CCF1CCF0   00xx,xx00      //PCA 控制寄存器。
sbit CCF0= CCON^0;      /* PCA 模块0中断标志,由硬件置位,必须由软件清0。      */
sbit CCF1= CCON^1;      /* PCA 模块1中断标志,由硬件置位,必须由软件清0。      */
sbit CCF2= CCON^2;      /* PCA 模块2中断标志,由硬件置位,必须由软件清0。      */
sbit CCF3= CCON^3;      /* PCA 模块3中断标志,由硬件置位,必须由软件清0。      */
sbit CR    = CCON^6;      /* 1: 允许PCA计数器计数,必须由软件清0。*/
sbit CF    = CCON^7;      /* PCA计数器溢出(CH,CL由FFFFH变为0000H)标志。PCA计数器溢出后由硬件置位,必须由软件清0。*/

//                                       7   6   5   4   3   2   1   0    Reset Value
//sfr CMOD= 0xD9;      CIDL   -   -   -   CPS2   CPS1CPS0ECF   0xxx,0000      //PCA 工作模式寄存器。
#define PCA_IDLE_OFF()                CMOD |=(1<<7)                              /* IDLE状态PCA停止计数。      */
#define PCA_IDLE_ON()                CMOD &= ~(1<<7)                              /* IDLE状态PCA继续计数。      */
#define PCA_CLK_12T()                CMOD &= ~0x0E                              /* PCA计数脉冲选择 fosc/12      */
#define PCA_CLK_2T()                CMOD = (CMOD & ~0x0E) + 2      /* PCA计数脉冲选择 fosc/2      */
#define PCA_CLK_T0()                CMOD = (CMOD & ~0x0E) + 4      /* PCA计数脉冲选择Timer0中断,Timer0可通过AUXR寄存器设置成工作在12T或1T模式。      */
#define PCA_CLK_ECI()                CMOD = (CMOD & ~0x0E) + 6      /* PCA计数脉冲选择从ECI/P3.4脚输入的外部时钟,最大 fosc/2。      */
#define PCA_CLK_1T()                CMOD = (CMOD & ~0x0E) + 8      /* PCA计数脉冲选择 Fosc      */
#define PCA_CLK_4T()                CMOD = (CMOD & ~0x0E) + 10      /* PCA计数脉冲选择 Fosc/4      */
#define PCA_CLK_6T()                CMOD = (CMOD & ~0x0E) + 12      /* PCA计数脉冲选择 Fosc/6      */
#define PCA_CLK_8T()                CMOD = (CMOD & ~0x0E) + 14      /* PCA计数脉冲选择 Fosc/8      */
#define PCA_INT_ENABLE()      CMOD |=1                                        /* PCA计数器溢出中断允许位,1---允许CF(CCON.7)产生中断。      */
#define PCA_INT_DISABLE()      CMOD &= ~1                                        /* PCA计数器溢出中断禁止。      */

//                                          7      6       5      4       3       2       1      0    Reset Value
//sfr AUXR1 = 0xA2;          S1_S1S1_S0CCP_S1   CCP_S0SPI_S1   SPI_S0    -   DPS   0100,0000      //Auxiliary Register 1

#define                PCA_USE_P12P17P16P15P14()      AUXR1 &= ~0x30                                        /* 将PCA/PWM切换到P12(ECI) P17(CCP0) P16(CCP1) P15(CCP2) P14(CCP3)(上电默认) */
#define                PCA_USE_P22P23P24P25P26()      AUXR1 = (AUXR1 & ~0x30) | 0x10      /* 将PCA/PWM切换到P22(ECI) P23(CCP0) P24(CCP1) P25(CCP2) P26(CCP3) */
#define                PCA_USE_P74P70P71P72P73()      AUXR1 = (AUXR1 & ~0x30) | 0x20      /* 将PCA/PWM切换到P74(ECI) P70(CCP0) P71(CCP1) P72(CCP2) P73(CCP3) */
#define                PCA_USE_P35P33P32P31P30()      AUXR1 = (AUXR1 & ~0x30) | 0x30      /* 将PCA/PWM切换到P35(ECI) P33(CCP0) P32(CCP1) P31(CCP2) P30(CCP3) */

#define                DPS_SEL1()                AUXR1 |=1                /* 1:选择DPTR1。      */
#define                DPS_SEL0()                AUXR1 &= ~1                /* 0:选择DPTR0(上电默认)。      */


/*                                                                        7   6       5       4   3   2   1   0   Reset Value
//sfr CCAPM0 = 0xDA;      PWM 寄存器-   ECOM0CCAPP0CCAPN0MAT0TOG0PWM0ECCF0   x000,0000      //PCA 模块0
//sfr CCAPM1 = 0xDB;      PWM 寄存器-   ECOM1CCAPP1CCAPN1MAT1TOG1PWM1ECCF1   x000,0000      //PCA 模块1
//sfr CCAPM2 = 0xDC;      PWM 寄存器-   ECOM2CCAPP2CCAPN2MAT2TOG2PWM2ECCF2   x000,0000      //PCA 模块2
//sfr CCAPM3 = 0xDD;      PWM 寄存器-   ECOM3CCAPP3CCAPN3MAT3TOG3PWM3ECCF3   x000,0000      //PCA 模块3
;ECOMn = 1:      允许比较功能。
;CAPPn = 1:      允许上升沿触发捕捉功能。
;CAPNn = 1:      允许下降沿触发捕捉功能。
;MATn= 1:      当匹配情况发生时,允许CCON中的CCFn置位。
;TOGn= 1:      当匹配情况发生时,CEXn将翻转。(CEX0/PCA0/PWM0/P3.7,CEX1/PCA1/PWM1/P3.5)
;PWMn= 1:      将CEXn设置为PWM输出。
;ECCFn = 1:      允许CCON中的CCFn触发中断。
;ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
;0   0   0    0    0    0   0                00H      未启用任何功能。
;x   1   0    0    0    0   x               20H      16位CEXn上升沿触发捕捉功能。
;x   0   1    0    0    0   x               10H      16位CEXn下降沿触发捕捉功能。
;x   1   1    0    0    0   x               30H      16位CEXn/PCAn边沿(上、下沿)触发捕捉功能。
;1   0   0    1    0    0   x               48H      16位软件定时器。
;1   0   0    1    1    0   x               4CH      16位高速脉冲输出。
;1   0   0    0    0    1   0                42H      8位PWM。无中断
;1   1   0    0    0    1   1                63H      8位PWM。低变高可产生中断
;1   0   1    0    0    1   1                53H      8位PWM。高变低可产生中断
;1   1   1    0    0    1   1                73H      8位PWM。低变高或高变低均可产生中断
;*******************************************************************
;*******************************************************************/
#define                PCA0_none()                              CCAPM0 = 0
#define                PCA0_PWM(nbit)                        CCAPM0 = 0x42,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
#define                PCA0_PWM_rise_int(nbit) CCAPM0 = 0x63,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
#define                PCA0_PWM_fall_int(nbit) CCAPM0 = 0x53,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
#define                PCA0_PWM_edge_int(nbit) CCAPM0 = 0x73,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
#define                PCA0_capture_rise()                CCAPM0 = (0x20 + 1)
#define                PCA0_capture_fall()                CCAPM0 = (0x10 + 1)
#define                PCA0_capture_edge()                CCAPM0 = (0x30 + 1)
#define                PCA0_16bit_Timer()                CCAPM0 = (0x48 + 1)
#define                PCA0_High_Pulse()                CCAPM0 = (0x4C + 1)

#define                PCA1_none()                              CCAPM1 = 0
#define                PCA1_PWM(nbit)                        CCAPM1 = 0x42,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
#define                PCA1_PWM_rise_int(nbit) CCAPM1 = 0x63,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
#define                PCA1_PWM_fall_int(nbit) CCAPM1 = 0x53,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
#define                PCA1_PWM_edge_int(nbit) CCAPM1 = 0x73,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
#define                PCA1_capture_rise()                CCAPM1 = (0x20 + 1)
#define                PCA1_capture_fall()                CCAPM1 = (0x10 + 1)
#define                PCA1_capture_edge()                CCAPM1 = (0x30 + 1)
#define                PCA1_16bit_Timer()                CCAPM1 = (0x48 + 1)
#define                PCA1_High_Pulse()                CCAPM1 = (0x4C + 1)

#define                PCA2_none()                              CCAPM2 = 0
#define                PCA2_PWM(nbit)                        CCAPM2 = 0x42,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA2_PWM_rise_int(nbit) CCAPM2 = 0x63,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA2_PWM_fall_int(nbit) CCAPM2 = 0x53,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA2_PWM_edge_int(nbit) CCAPM2 = 0x73,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA2_capture_rise()                CCAPM2 = (0x20 + 1)
#define                PCA2_capture_fall()                CCAPM2 = (0x10 + 1)
#define                PCA2_capture_edge()                CCAPM2 = (0x30 + 1)
#define                PCA2_16bit_Timer()                CCAPM2 = (0x48 + 1)
#define                PCA2_High_Pulse()                CCAPM2 = (0x4C + 1)

#define                PCA3_none()                              CCAPM3 = 0
#define                PCA3_PWM(nbit)                        CCAPM3 = 0x42,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA3_PWM_rise_int(nbit) CCAPM3 = 0x63,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA3_PWM_fall_int(nbit) CCAPM3 = 0x53,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA3_PWM_edge_int(nbit) CCAPM3 = 0x73,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
#define                PCA3_capture_rise()                CCAPM3 = (0x20 + 1)
#define                PCA3_capture_fall()                CCAPM3 = (0x10 + 1)
#define                PCA3_capture_edge()                CCAPM3 = (0x30 + 1)
#define                PCA3_16bit_Timer()                CCAPM3 = (0x48 + 1)
#define                PCA3_High_Pulse()                CCAPM3 = (0x4C + 1)


/**********************************************************/
typedef         unsigned char      u8;
typedef         unsigned int      u16;
typedef         unsigned long      u32;

/**********************************************************/
#define NOP1()_nop_()
#define NOP2()NOP1(),NOP1()
#define NOP3()NOP2(),NOP1()
#define NOP4()NOP3(),NOP1()
#define NOP5()NOP4(),NOP1()
#define NOP6()NOP5(),NOP1()
#define NOP7()NOP6(),NOP1()
#define NOP8()NOP7(),NOP1()
#define NOP9()NOP8(),NOP1()
#define NOP10() NOP9(),NOP1()
#define NOP11() NOP10(),NOP1()
#define NOP12() NOP11(),NOP1()
#define NOP13() NOP12(),NOP1()
#define NOP14() NOP13(),NOP1()
#define NOP15() NOP14(),NOP1()
#define NOP16() NOP15(),NOP1()
#define NOP17() NOP16(),NOP1()
#define NOP18() NOP17(),NOP1()
#define NOP19() NOP18(),NOP1()
#define NOP20() NOP19(),NOP1()
#define NOP21() NOP20(),NOP1()
#define NOP22() NOP21(),NOP1()
#define NOP23() NOP22(),NOP1()
#define NOP24() NOP23(),NOP1()
#define NOP25() NOP24(),NOP1()
#define NOP26() NOP25(),NOP1()
#define NOP27() NOP26(),NOP1()
#define NOP28() NOP27(),NOP1()
#define NOP29() NOP28(),NOP1()
#define NOP30() NOP29(),NOP1()
#define NOP31() NOP30(),NOP1()
#define NOP32() NOP31(),NOP1()
#define NOP33() NOP32(),NOP1()
#define NOP34() NOP33(),NOP1()
#define NOP35() NOP34(),NOP1()
#define NOP36() NOP35(),NOP1()
#define NOP37() NOP36(),NOP1()
#define NOP38() NOP37(),NOP1()
#define NOP39() NOP38(),NOP1()
#define NOP40() NOP39(),NOP1()
#define NOP(N)NOP##N()


/**********************************************/
#define      Pin0                0x01      //IO引脚 Px.0
#define      Pin1                0x02      //IO引脚 Px.1
#define      Pin2                0x04      //IO引脚 Px.2
#define      Pin3                0x08      //IO引脚 Px.3
#define      Pin4                0x10      //IO引脚 Px.4
#define      Pin5                0x20      //IO引脚 Px.5
#define      Pin6                0x40      //IO引脚 Px.6
#define      Pin7                0x80      //IO引脚 Px.7
#define      PinAll                0xFF      //IO所有引脚

#define P0n_standard(bitn)                        P0M1 &= ~(bitn),      P0M0 &= ~(bitn)      /* 00*/
#define P0n_push_pull(bitn)                        P0M1 &= ~(bitn),      P0M0 |=(bitn)      /* 01*/
#define P0n_pure_input(bitn)                P0M1 |=(bitn),      P0M0 &= ~(bitn)      /* 10*/
#define P0n_open_drain(bitn)                P0M1 |=(bitn),      P0M0 |=(bitn)      /* 11*/

#define P1n_standard(bitn)                        P1M1 &= ~(bitn),      P1M0 &= ~(bitn)
#define P1n_push_pull(bitn)                        P1M1 &= ~(bitn),      P1M0 |=(bitn)
#define P1n_pure_input(bitn)                P1M1 |=(bitn),      P1M0 &= ~(bitn)
#define P1n_open_drain(bitn)                P1M1 |=(bitn),      P1M0 |=(bitn)

#define P2n_standard(bitn)                        P2M1 &= ~(bitn),      P2M0 &= ~(bitn)
#define P2n_push_pull(bitn)                        P2M1 &= ~(bitn),      P2M0 |=(bitn)
#define P2n_pure_input(bitn)                P2M1 |=(bitn),      P2M0 &= ~(bitn)
#define P2n_open_drain(bitn)                P2M1 |=(bitn),      P2M0 |=(bitn)

#define P3n_standard(bitn)                        P3M1 &= ~(bitn),      P3M0 &= ~(bitn)
#define P3n_push_pull(bitn)                        P3M1 &= ~(bitn),      P3M0 |=(bitn)
#define P3n_pure_input(bitn)                P3M1 |=(bitn),      P3M0 &= ~(bitn)
#define P3n_open_drain(bitn)                P3M1 |=(bitn),      P3M0 |=(bitn)

#define P4n_standard(bitn)                        P4M1 &= ~(bitn),      P4M0 &= ~(bitn)
#define P4n_push_pull(bitn)                        P4M1 &= ~(bitn),      P4M0 |=(bitn)
#define P4n_pure_input(bitn)                P4M1 |=(bitn),      P4M0 &= ~(bitn)
#define P4n_open_drain(bitn)                P4M1 |=(bitn),      P4M0 |=(bitn)

#define P5n_standard(bitn)                        P5M1 &= ~(bitn),      P5M0 &= ~(bitn)
#define P5n_push_pull(bitn)                        P5M1 &= ~(bitn),      P5M0 |=(bitn)
#define P5n_pure_input(bitn)                P5M1 |=(bitn),      P5M0 &= ~(bitn)
#define P5n_open_drain(bitn)                P5M1 |=(bitn),      P5M0 |=(bitn)

#define P6n_standard(bitn)                        P6M1 &= ~(bitn),      P6M0 &= ~(bitn)
#define P6n_push_pull(bitn)                        P6M1 &= ~(bitn),      P6M0 |=(bitn)
#define P6n_pure_input(bitn)                P6M1 |=(bitn),      P6M0 &= ~(bitn)
#define P6n_open_drain(bitn)                P6M1 |=(bitn),      P6M0 |=(bitn)

#define P7n_standard(bitn)                        P7M1 &= ~(bitn),      P7M0 &= ~(bitn)
#define P7n_push_pull(bitn)                        P7M1 &= ~(bitn),      P7M0 |=(bitn)
#define P7n_pure_input(bitn)                P7M1 |=(bitn),      P7M0 &= ~(bitn)
#define P7n_open_drain(bitn)                P7M1 |=(bitn),      P7M0 |=(bitn)


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


//sfr INT_CLKO = 0x8F;      //附加的 SFR WAKE_CLKO (地址:0x8F)
/*
    7   6    5    4   3   2      1       0         Reset Value
    -EX4EX3EX2-   T2CLKO   T1CLKOT0CLKO      0000,0000B
b6 -EX4      : 外中断INT4允许
b5 -EX3      : 外中断INT3允许
b4 -EX2      : 外中断INT2允许
b2 - T1CLKO    : 允许 T2 溢出脉冲在P3.0脚输出,Fck1 = 1/2 T1 溢出率
b1 - T1CLKO    : 允许 T1 溢出脉冲在P3.4脚输出,Fck1 = 1/2 T1 溢出率
b0 - T0CLKO    : 允许 T0 溢出脉冲在P3.5脚输出,Fck0 = 1/2 T0 溢出率
*/

#define                LVD_InterruptEnable()                ELVD = 1
#define                LVD_InterruptDisable()                ELVD = 0


//sfr WKTCL = 0xAA;      //STC11F\10和STC15系列 唤醒定时器低字节
//sfr WKTCH = 0xAB;      //STC11F\10和STC15系列 唤醒定时器高字节
//      B7                B6      B5      B4      B3      B2      B1      B0                B7      B6      B5      B4      B3      B2      B1      B0
//      WKTEN                              S11      S10      S9      S8                S7      S6      S5      S4      S3      S2      S1      S0      n * 560us
#define                WakeTimerDisable()                WKTCH &= 0x7f      /* WKTEN = 0                禁止睡眠唤醒定时器 */
#define                WakeTimerSet(scale)                WKTCL = (scale) % 256,WKTCH = (scale) / 256 | 0x80      /* WKTEN = 1      允许睡眠唤醒定时器 */



//sfr BUS_SPEED = 0xA1; //Stretch register      -   ---   -   -EXRTS1EXRTSS0 xxxx,xx10
#define                BUS_SPEED_1T()      BUS_SPEED = 0
#define                BUS_SPEED_2T()      BUS_SPEED = 1
#define                BUS_SPEED_4T()      BUS_SPEED = 2
#define                BUS_SPEED_8T()      BUS_SPEED = 3

/*   interrupt vector */
#define                INT0_VECTOR                0
#define                TIMER0_VECTOR      1
#define                INT1_VECTOR                2
#define                TIMER1_VECTOR      3
#define                UART1_VECTOR      4
#define                ADC_VECTOR                5
#define                LVD_VECTOR                6
#define                PCA_VECTOR                7
#define                UART2_VECTOR      8
#define                SPI_VECTOR                9
#define                INT2_VECTOR                10
#define                INT3_VECTOR                11
#define                TIMER2_VECTOR      12
#define                INT4_VECTOR                16
#define                UART3_VECTOR      17
#define                UART4_VECTOR      18
#define                TIMER3_VECTOR      19
#define                TIMER4_VECTOR      20
#define                CMP_VECTOR                21
#define                PWM_VECTOR                22
#define                PWMFD_VECTOR      23
#define                I2C_VECTOR                24


#define      TRUE      1
#define      FALSE      0

//=============================================================

//========================================

#define      PolityLow                        0      //低优先级中断
#define      PolityHigh                        1      //高优先级中断

//========================================

#define                ENABLE                1
#define                DISABLE                0

#endif

饭桶 发表于 2018-9-10 22:04:02

如果能实现四个串口用一个定时器还实现了不同波特率那就牛了!

hailing 发表于 2018-9-10 22:19:51

饭桶 发表于 2018-9-10 22:04
如果能实现四个串口用一个定时器还实现了不同波特率那就牛了!

谢谢,看来51用了多个串口后定时器没多少了

小李非刀 发表于 2018-9-12 22:56:50

饭桶 发表于 2018-9-10 15:53
是否能够同时独立响应中断?

单片机所有中断在硬件上都是相互独立、互不干扰的。

饭桶 发表于 2018-9-12 23:24:16

小李非刀 发表于 2018-9-12 22:56
单片机所有中断在硬件上都是相互独立、互不干扰的。

但是定时器是一个啊,赋值和溢出时刻只能是一个啊

小李非刀 发表于 2018-9-15 23:09:03

饭桶 发表于 2018-9-10 15:53
是否能够同时独立响应中断?

定时器仅仅是给串口提供时钟,各个串口各自独立收发、响应中断、各自数据格式,互不相关。

小李非刀 发表于 2018-9-15 23:10:01

饭桶 发表于 2018-9-12 23:24
但是定时器是一个啊,赋值和溢出时刻只能是一个啊

不明白你问什么。STC8A系列有5个定时器。

饭桶 发表于 2018-9-16 09:35:51

小李非刀 发表于 2018-9-15 23:09
定时器仅仅是给串口提供时钟,各个串口各自独立收发、响应中断、各自数据格式,互不相关。 ...

如果用一个定时器给多个串口共用做波特率发生器,要求波特率得相同,这就说明不是完全独立的!

饭桶 发表于 2018-9-16 09:36:26

小李非刀 发表于 2018-9-15 23:10
不明白你问什么。STC8A系列有5个定时器。

本文讨论的是一个定时器共用问题,没说有几个定时器。

su33691 发表于 2018-9-16 09:52:36

非要抬杠,有意义吗?版主也不欠你半毛钱。

hailing 发表于 2018-9-16 10:59:11

焊好板子测试了下代码,UART2和UART3使用相同的波特率使用同一个定时器是可以的,可以设置1个串口为偶校验,另外1个串口为无校验。

小李非刀 发表于 2018-9-17 16:49:26

饭桶 发表于 2018-9-16 09:35
如果用一个定时器给多个串口共用做波特率发生器,要求波特率得相同,这就说明不是完全独立的! ...

那你是要求一个定时器同时提供几个溢出率?这是办不到的。每个串口都独立,串口模块的时钟可以都选择定时器2,也可以各自占用一个定时器。
一个定时器,只有一个溢出率,只能提供一种波特率。

小李非刀 发表于 2018-9-17 16:51:35

hailing 发表于 2018-9-16 10:59
焊好板子测试了下代码,UART2和UART3使用相同的波特率使用同一个定时器是可以的,可以设置1个串口为偶校验 ...

4个串口都可以同时使用定时器2做波特率,各个串口的工作方式可以不同。
可以理解成,定时器提供给串口模块一个工作时钟。波特率由这个时钟产生。
页: [1]
查看完整版本: 请教,STC8A的串口2和3可以同时用定时器2做波特率发生器吗