-
2021-05-17 16:48:01
#include "STC15F2K60S2.h" #include "stdio.h" uchar Uart1_Read[50]; //存储接收SBUF内容 uchar RI_ms; //第RI_ms(ms)没有接收数据 uchar Uart1_Read_count; //接收到第Uart1_Read_count个字节数据 bit Uart1_Read_flag; //0-串口1没有在接收,1-串口1正在接收数据 void Rst_Array(uchar str[])//清除数组 { uchar i; for(i=0;i<sizeof(str)/sizeof(uchar);i++) { str[i]=0; } } void Timer1Init(void) //1毫秒@11.0592MHz { AUXR |= 0x40; //定时器时钟1T模式 TMOD &= 0x0F; //设置定时器模式 TL1 = 0xCD; //设置定时初值 TH1 = 0xD4; //设置定时初值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1=1; } void UartInit(void) //115200bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //串口1选择定时器2为波特率发生器 AUXR |= 0x04; //定时器2时钟为Fosc,即1T T2L = 0xE8; //设定定时初值 T2H = 0xFF; //设定定时初值 AUXR |= 0x10; //启动定时器2 EA=1; TI=1; ES=1; } void Timeer() interrupt 3 { if(RI==0){RI_ms++;}//当串口没有在接收数据时开始计时 else{RI_ms=0;} //当串口在接收数据时计时清零 if(RI_ms==50){Uart1_Read_count=0;Uart1_Read_flag=0;}//当计时达到一定时间,说明数据接收完毕,将读计数Uart1_Read_flag清零 } void Uart1() interrupt 4 { if(RI) { RI=0; //重置标志位 RI_ms=0; //当串口在接收数据时计时清零 Uart1_Read_flag=1; //将正在读取标志位置1; Uart1_Read[Uart1_Read_count++]=SBUF; //将缓冲区数据存入数组 } } void Uart1_Reading_Finished()//读取完毕进行字符串判断 { if(Uart1_Read_flag==0)//当接收数据完毕时进行判断,将需要判断的字符串放入该if里 { if(Uart1_Read[0]=='S'&&Uart1_Read[1]=='T') { Rst_Array(Uart1_Read); printf("%s\n","abc"); } } } void main() { uchar char_test=8; uint int_test=2000; UartInit(); Timer1Init(); // char:%bu int:%hu long:%lu; //(1)b:八位 //(2)h:十六位(默认) //(3)l:三十二位 //一条语句中如果有一个占位符选择错误,那么该语句中后面的占位符都将无法正常输出! printf("char :%bu int:%hu\n",char_test,int_test); printf("char :%hu int:%hu char:%bu\n",char_test,int_test,char_test);//该条错误;用于测试是否会影响到下面语句输出,测试得出只会影响到当前语句。 printf("char :%bu int:%hu\n",char_test,int_test); while(1) { Uart1_Reading_Finished();//读取完毕进行字符串判断 } }
更多相关内容 -
STC15单片机 串口2收发
2018-08-08 15:03:42本代码主要是STC15单片机通过串口2进行收发通信,可以进行一次性多个数据收发 -
通信_单片机串口通信_STC15串口通信_
2021-10-01 18:34:53STC15单片机实现双机串口通信, 型号“IAP15W4K58S4” -
【STC单片机】STC15串口收发示例程序模板
2022-02-05 10:55:27【STC单片机】STC15串口收发示例程序模板【STC单片机】STC15串口收发示例程序模板
- 程序源码来源于STC15官方的《STC15试验箱》修改,源代码的内容比较笼统,没注意串口定义的引脚的话,是没法用的。特此在此基础上进行了修改,去掉了不常用的设置内容,简化代码,增加直观可用性,方便移植使用。
- 验证对象:
STC15F2K60S2
单片机,外部晶振11.0592MHz
以及STC15W408AS
单片机外部晶振16MHz
,采用自制开发板, - 《【开源STC15开发板】STC15F2K60S2开发板》
- 《【开源分享】自制STC15W408AS开发板》
按照使用用途:串口收发模式和串口发送模式
- 串口收发模式:即可以发送也可以接收。
这种模式下,串口需要占用单片机运行内存,接收内容的代码需要放在主程序while循环中进行。
/**以下内容放到while里面**/ if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲 { SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回 B_TX1_Busy = 1; if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0; }
- 串口发送模式:只保留发送功能模式。
这种模式下,只有在程序需要调用串口打印时才使能,随调随用。适合串口作为调试输出时使用。
按照输出方式:自定义输出模式和printf输出模式
- 自定义输出模式:自定义的输出串口打印。
void PrintString1(u8 *puts) //发送一个字符串 { for (; *puts != 0; puts++) //遇到停止符0结束 { SBUF = *puts; B_TX1_Busy = 1; while(B_TX1_Busy); } }
printf
输出模式:printf
输出串口打印。
printf
输出方式调用了头文件stdio.h
,输出内容比较灵活,程序文件会增大。char putchar(unsigned char c) { SBUF = c; //发送数据 B_TX1_Busy = 1; while(B_TX1_Busy); // while(!TI); //等待发送完成 // TI=0; //清零发送标志位; return c; }
printf
输出模式编译大小
- 自定义输出模式编译大小
- 所需头文件需要自己添加:
STC15Fxxxx.H
串口收发模式程序代码
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ /************* 功能说明 ************** 双串口全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回. ******************************************/ #define MAIN_Fosc 11059200uL //定义主时钟 //#include "stdio.h" #include "STC15Fxxxx.H" #define Baudrate1 9600L #define UART1_BUF_LENGTH 32 u8 TX1_Cnt; //发送计数 u8 RX1_Cnt; //接收计数 bit B_TX1_Busy; //发送忙标志 u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲 void UART1_config(); // 选择波特率使用Timer2做波特率 // char putchar(unsigned char c);//串口打印函数 void PrintString1(u8 *puts); void delay_ms(unsigned int ms);//延时函数 //======================================================================== // 函数: void main(void) // 描述: 主函数。 //======================================================================== void main(void) { P1M1 |=0x00; P1M0 |=0x01;//设置P10为推挽输出 // P0M1 = 0; P0M0 = 0; //设置为准双向口 // P1M1 = 0; P1M0 = 0; //设置为准双向口 // P2M1 = 0; P2M0 = 0; //设置为准双向口 // P3M1 = 0; P3M0 = 0; //设置为准双向口 // P4M1 = 0; P4M0 = 0; //设置为准双向口 // P5M1 = 0; P5M0 = 0; //设置为准双向口 // P6M1 = 0; P6M0 = 0; //设置为准双向口 // P7M1 = 0; P7M0 = 0; //设置为准双向口 S1_USE_P30P31(); UART1_config(); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1; //允许总中断 PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //UART1发送一个字符串 while (1) { // PrintString1("\t perseverance51 \r\n"); // delay_ms(500); // P10 = ~P10; if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲 { SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回 B_TX1_Busy = 1; if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0; } } } //======================================================================== // 函数: void PrintString1(u8 *puts) // 描述: 串口1发送字符串函数。 // 参数: puts: 字符串指针. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== ///* void PrintString1(u8 *puts) //发送一个字符串 { for (; *puts != 0; puts++) //遇到停止符0结束 { SBUF = *puts; B_TX1_Busy = 1; while(B_TX1_Busy); } } //*/ //---------------------------------------------------------- // 函数名称:putchar(unsigned char c) // 函数功能:串口发送一个字节 // 功能:包含stdio.h实现printf打印 //---------------------------------------------------------- // char putchar(unsigned char c) //{ // SBUF = c; //发送数据 // B_TX1_Busy = 1; // while(B_TX1_Busy); while(!TI); //等待发送完成 TI=0; //清零发送标志位; // return c; //} //======================================================================== // 函数: SetTimer2Baudraye(u16 dat) // 描述: 设置Timer2做波特率发生器。 // 参数: dat: Timer2的重装值. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void SetTimer2Baudraye(u16 dat) // 选择波特率使用Timer2做波特率 { AUXR &= ~(1<<4); //Timer stop AUXR &= ~(1<<3); //Timer2 set As Timer AUXR |= (1<<2); //Timer2 set as 1T mode TH2 = dat / 256; TL2 = dat % 256; IE2 &= ~(1<<2); //禁止中断 AUXR |= (1<<4); //Timer run enable } //======================================================================== // 函数: void UART1_config(u8 brt) // 描述: UART1初始化函数。 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_config() // 选择波特率使用Timer2做波特率 { /*********** 波特率使用定时器2 *****************/ SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //S1 BRT Use Timer2; AUXR |= 0x04; //定时器时钟1T模式 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1); AUXR |= 0x10; //定时器2开始计时 //SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率 // PS = 1; //高优先级中断 ES = 1; //允许中断 REN = 1; //允许接收 P_SW1 &= 0x3f;//串口在[P3.0/RxD,P3.1/TxD] P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟) // PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE PCON2 |=0x00; B_TX1_Busy = 0; TX1_Cnt = 0; RX1_Cnt = 0; } //======================================================================== // 函数: void UART1_int (void) interrupt UART1_VECTOR // 描述: UART1中断函数。 // 参数: nine. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_int (void) interrupt UART1_VECTOR { if(RI) { RI = 0; RX1_Buffer[RX1_Cnt] = SBUF; if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出 } if(TI) { TI = 0; B_TX1_Busy = 0; } } //======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void delay_ms(unsigned int ms) { unsigned int i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms); }
自定义输出模式代码
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ /************* 功能说明 ************** 双串口全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回. ******************************************/ #define MAIN_Fosc 11059200uL //定义主时钟 //#include "stdio.h" #include "STC15Fxxxx.H" #define Baudrate1 9600L #define UART1_BUF_LENGTH 32 u8 TX1_Cnt; //发送计数 u8 RX1_Cnt; //接收计数 bit B_TX1_Busy; //发送忙标志 u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲 void UART1_config(); // 选择波特率使用Timer2做波特率 // char putchar(unsigned char c);//串口打印函数 void PrintString1(u8 *puts); void delay_ms(unsigned int ms);//延时函数 //======================================================================== // 函数: void main(void) // 描述: 主函数。 //======================================================================== void main(void) { P1M1 |=0x00; P1M0 |=0x01;//设置P10为推挽输出 // P0M1 = 0; P0M0 = 0; //设置为准双向口 // P1M1 = 0; P1M0 = 0; //设置为准双向口 // P2M1 = 0; P2M0 = 0; //设置为准双向口 // P3M1 = 0; P3M0 = 0; //设置为准双向口 // P4M1 = 0; P4M0 = 0; //设置为准双向口 // P5M1 = 0; P5M0 = 0; //设置为准双向口 // P6M1 = 0; P6M0 = 0; //设置为准双向口 // P7M1 = 0; P7M0 = 0; //设置为准双向口 S1_USE_P30P31(); UART1_config(); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1; //允许总中断 PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //UART1发送一个字符串 while (1) { // PrintString1("\t perseverance51 \r\n"); delay_ms(500); P10 = ~P10; if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲 { SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回 B_TX1_Busy = 1; if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0; } } } //======================================================================== // 函数: void PrintString1(u8 *puts) // 描述: 串口1发送字符串函数。 // 参数: puts: 字符串指针. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== ///* void PrintString1(u8 *puts) //发送一个字符串 { for (; *puts != 0; puts++) //遇到停止符0结束 { SBUF = *puts; B_TX1_Busy = 1; while(B_TX1_Busy); } } //*/ //---------------------------------------------------------- // 函数名称:putchar(unsigned char c) // 函数功能:串口发送一个字节 // 功能:包含stdio.h实现printf打印 //---------------------------------------------------------- // char putchar(unsigned char c) //{ // SBUF = c; //发送数据 // B_TX1_Busy = 1; // while(B_TX1_Busy); while(!TI); //等待发送完成 TI=0; //清零发送标志位; // return c; //} //======================================================================== // 函数: SetTimer2Baudraye(u16 dat) // 描述: 设置Timer2做波特率发生器。 // 参数: dat: Timer2的重装值. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void SetTimer2Baudraye(u16 dat) // 选择波特率使用Timer2做波特率 { AUXR &= ~(1<<4); //Timer stop AUXR &= ~(1<<3); //Timer2 set As Timer AUXR |= (1<<2); //Timer2 set as 1T mode TH2 = dat / 256; TL2 = dat % 256; IE2 &= ~(1<<2); //禁止中断 AUXR |= (1<<4); //Timer run enable } //======================================================================== // 函数: void UART1_config(u8 brt) // 描述: UART1初始化函数。 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_config() // 选择波特率使用Timer2做波特率 { /*********** 波特率使用定时器2 *****************/ SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //S1 BRT Use Timer2; AUXR |= 0x04; //定时器时钟1T模式 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1); AUXR |= 0x10; //定时器2开始计时 //SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率 // PS = 1; //高优先级中断 ES = 1; //允许中断 REN = 1; //允许接收 P_SW1 &= 0x3f;//串口在[P3.0/RxD,P3.1/TxD] P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟) // PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE PCON2 |=0x00; B_TX1_Busy = 0; TX1_Cnt = 0; RX1_Cnt = 0; } //======================================================================== // 函数: void UART1_int (void) interrupt UART1_VECTOR // 描述: UART1中断函数。 // 参数: nine. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_int (void) interrupt UART1_VECTOR { if(RI) { RI = 0; RX1_Buffer[RX1_Cnt] = SBUF; if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出 } if(TI) { TI = 0; B_TX1_Busy = 0; } } //======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void delay_ms(unsigned int ms) { unsigned int i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms); }
printf模式输出方式
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ /************* 功能说明 ************** 双串口全双工中断方式收发通讯程序。 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回. ******************************************/ #define MAIN_Fosc 11059200uL //定义主时钟 #include "stdio.h" #include "STC15Fxxxx.H" #define Baudrate1 9600L #define UART1_BUF_LENGTH 32 u8 TX1_Cnt; //发送计数 u8 RX1_Cnt; //接收计数 bit B_TX1_Busy; //发送忙标志 u8 idata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲 void UART1_config(); // 选择波特率使用Timer2做波特率 char putchar(unsigned char c);//串口打印函数 //void PrintString1(u8 *puts); void delay_ms(unsigned int ms);//延时函数 //======================================================================== // 函数: void main(void) // 描述: 主函数。 //======================================================================== void main(void) { P1M1 |=0x00; P1M0 |=0x01;//设置P10为推挽输出 // P0M1 = 0; P0M0 = 0; //设置为准双向口 // P1M1 = 0; P1M0 = 0; //设置为准双向口 // P2M1 = 0; P2M0 = 0; //设置为准双向口 // P3M1 = 0; P3M0 = 0; //设置为准双向口 // P4M1 = 0; P4M0 = 0; //设置为准双向口 // P5M1 = 0; P5M0 = 0; //设置为准双向口 // P6M1 = 0; P6M0 = 0; //设置为准双向口 // P7M1 = 0; P7M0 = 0; //设置为准双向口 S1_USE_P30P31(); UART1_config(); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1; //允许总中断 printf("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //UART1发送一个字符串 while (1) { printf("\t perseverance51 \r\n"); delay_ms(500); P10 = ~P10; if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲 { SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回 B_TX1_Busy = 1; if(++TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0; } } } //======================================================================== // 函数: void PrintString1(u8 *puts) // 描述: 串口1发送字符串函数。 // 参数: puts: 字符串指针. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== ///* //void PrintString1(u8 *puts) //发送一个字符串 //{ // for (; *puts != 0; puts++) //遇到停止符0结束 // { // SBUF = *puts; // B_TX1_Busy = 1; // while(B_TX1_Busy); // } //} //*/ //---------------------------------------------------------- // 函数名称:putchar(unsigned char c) // 函数功能:串口发送一个字节 // 功能:包含stdio.h实现printf打印 //---------------------------------------------------------- char putchar(unsigned char c) { SBUF = c; //发送数据 B_TX1_Busy = 1; while(B_TX1_Busy); // while(!TI); //等待发送完成 // TI=0; //清零发送标志位; return c; } //======================================================================== // 函数: SetTimer2Baudraye(u16 dat) // 描述: 设置Timer2做波特率发生器。 // 参数: dat: Timer2的重装值. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void SetTimer2Baudraye(u16 dat) // 选择波特率使用Timer2做波特率 { AUXR &= ~(1<<4); //Timer stop AUXR &= ~(1<<3); //Timer2 set As Timer AUXR |= (1<<2); //Timer2 set as 1T mode TH2 = dat / 256; TL2 = dat % 256; IE2 &= ~(1<<2); //禁止中断 AUXR |= (1<<4); //Timer run enable } //======================================================================== // 函数: void UART1_config(u8 brt) // 描述: UART1初始化函数。 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_config() // 选择波特率使用Timer2做波特率 { /*********** 波特率使用定时器2 *****************/ SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x01; //S1 BRT Use Timer2; AUXR |= 0x04; //定时器时钟1T模式 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1); AUXR |= 0x10; //定时器2开始计时 //SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率 // PS = 1; //高优先级中断 ES = 1; //允许中断 REN = 1; //允许接收 P_SW1 &= 0x3f;//串口在[P3.0/RxD,P3.1/TxD] P_SW1 |= 0x00; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟) // PCON2 |= (1<<4); //内部短路RXD与TXD, 做中继, ENABLE,DISABLE PCON2 |=0x00; B_TX1_Busy = 0; TX1_Cnt = 0; RX1_Cnt = 0; } //======================================================================== // 函数: void UART1_int (void) interrupt UART1_VECTOR // 描述: UART1中断函数。 // 参数: nine. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_int (void) interrupt UART1_VECTOR { if(RI) { RI = 0; RX1_Buffer[RX1_Cnt] = SBUF; if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0; //防溢出 } if(TI) { TI = 0; B_TX1_Busy = 0; } } //======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void delay_ms(unsigned int ms) { unsigned int i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms); }
- 头文件
STC15Fxxxx.H
内容
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ #ifndef _STC15Fxxxx_H #define _STC15Fxxxx_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 AUXR2 = 0x8F; sfr RL_TL0 = 0x8A; sfr RL_TL1 = 0x8B; sfr RL_TH0 = 0x8C; sfr RL_TH1 = 0x8D; 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 CLK_DIV = 0x97; sfr PCON2 = 0x97; sfr SCON = 0x98; sfr SBUF = 0x99; sfr S2CON = 0x9A; // sfr S2BUF = 0x9B; // sfr P1ASF = 0x9D; //只写,模拟输入(AD或LVD)选择 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 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 IPH2 = 0xB6; //STC12C5A60S2系列 sfr IPH = 0xB7; sfr IP = 0xB8; sfr SADEN = 0xB9; sfr P_SW2 = 0xBA; sfr ADC_CONTR = 0xBC; //带AD系列 sfr ADC_RES = 0xBD; //带AD系列 sfr ADC_RESL = 0xBE; //带AD系列 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 RL_T4H = 0xD2; sfr RL_T4L = 0xD3; sfr RL_T3H = 0xD4; sfr RL_T3L = 0xD5; sfr RL_T2H = 0xD6; sfr RL_T2L = 0xD7; sfr CCON = 0xD8; // sfr CMOD = 0xD9; // sfr CCAPM0 = 0xDA; //PCA模块0的工作模式寄存器。 sfr CCAPM1 = 0xDB; //PCA模块1的工作模式寄存器。 sfr CCAPM2 = 0xDC; //PCA模块2的工作模式寄存器。 sfr ACC = 0xE0; sfr P7M1 = 0xE1; sfr P7M0 = 0xE2; 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 B = 0xF0; sfr PCA_PWM0 = 0xF2; //PCA模块0 PWM寄存器。 sfr PCA_PWM1 = 0xF3; //PCA模块1 PWM寄存器。 sfr PCA_PWM2 = 0xF4; //PCA模块2 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位。 /* 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 */ sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7; /* P1 */ sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15 = P1^5; sbit P16 = P1^6; sbit P17 = P1^7; sbit RXD2 = P1^0; sbit TXD2 = P1^1; sbit CCP1 = P1^0; sbit CCP0 = P1^1; sbit SPI_SS = P1^2; sbit SPI_MOSI = P1^3; sbit SPI_MISO = P1^4; sbit SPI_SCLK = P1^5; /* P2 */ sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; /* P3 */ sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; sbit P36 = P3^6; sbit P37 = 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 */ sbit P40 = P4^0; sbit P41 = P4^1; sbit P42 = P4^2; sbit P43 = P4^3; sbit P44 = P4^4; sbit P45 = P4^5; sbit P46 = P4^6; sbit P47 = P4^7; /* P5 */ sbit P50 = P5^0; sbit P51 = P5^1; sbit P52 = P5^2; sbit P53 = P5^3; sbit P54 = P5^4; sbit P55 = P5^5; sbit P56 = P5^6; sbit P57 = P5^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允许控制位 /* IP */ /* 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优先级设定位 */ 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; - - - - - - ESPI ES2 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; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 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; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000 //sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00 //sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,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 /*************************************************************************************************/ /*************************************************************************************************/ #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_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连接中继断开 默认 #define S1_BRT_UseTimer2() AUXR |= 1 #define S1_BRT_UseTimer1() AUXR &= ~1 // 7 6 5 4 3 2 1 0 Reset Value //sfr S2CON = 0x9A; S2SM0 - S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B //S2 Control #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_MODE0() S2CON &= ~(1<<7) //串口2模式0,8位UART,波特率 = 定时器2的溢出率 / 4 #define S2_MODE1() S2CON |= (1<<7) //串口2模式1,9位UART,波特率 = 定时器2的溢出率 / 4 #define S2_RX_EN() S2CON |= (1<<4) //允许串2接收 #define S2_RX_Disable() S2CON &= ~(1<<4) //禁止串2接收 #define TI2 (S2CON & 2) != 0 #define RI2 (S2CON & 1) != 0 #define SET_TI2() S2CON |= 2 #define CLR_TI2() S2CON &= ~2 #define CLR_RI2() S2CON &= ~1 #define S2TB8_SET() S2CON |= 8 #define S2TB8_CLR() S2CON &= ~8 #define S2_Int_en() IE2 |= 1 //串口2允许中断 #define S2_USE_P10P11() P_SW2 &= ~1 //UART2 使用P1口 默认 #define S2_USE_P46P47() P_SW2 |= 1 //UART2 使用P4口 #define S3_USE_P00P01() P_SW2 &= ~2 //UART3 使用P0口 默认 #define S3_USE_P50P51() P_SW2 |= 2 //UART3 使用P5口 #define S4_USE_P02P03() P_SW2 &= ~4 //UART4 使用P0口 默认 #define S4_USE_P52P53() P_SW2 |= 4 //UART4 使用P5口 /**********************************************************/ #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_AsCounterP32() TMOD |= 4 //时器0用做计数器 #define Timer0_AsTimer() TMOD &= ~4 //时器0用做定时器 #define Timer0_ExtControlP34() TMOD |= 4 //时器0由外部INT0高电平允许定时计数 #define Timer0_Run() TR0 = 1 //允许定时器0计数 #define Timer0_Stop() TR0 = 0 //禁止定时器0计数 #define Timer0_InterruptEnable() ET0 = 1 //允许Timer1中断. #define Timer0_InterruptDisable() ET0 = 0 //禁止Timer1中断. #define Timer1_16bitAutoReload() TMOD &= ~0x30 //16位自动重装 #define Timer1_16bit() TMOD = (TMOD & ~0x30) | 0x10 //16位 #define Timer1_8bitAutoReload() TMOD = (TMOD & ~0x30) | 0x20 //8位自动重装 #define Timer1_16bitAutoRL_NoMask() TMOD |= 0x30 //16位自动重装不可屏蔽中断 #define Timer1_AsCounterP33() TMOD |= (1<<6) //时器1用做计数器 #define Timer1_AsTimer() TMOD &= ~(1<<6) //时器1用做定时器 #define Timer1_ExtControlP35() TMOD |= (1<<7) //时器1由外部INT1高电平允许定时计数 #define Timer1_Run() TR1 = 1 //允许定时器1计数 #define Timer1_Stop() TR1 = 0 //禁止定时器1计数 #define Timer1_InterruptEnable() ET1 = 1 //允许Timer1中断. #define Timer1_InterruptDisable() ET1 = 0 //禁止Timer1中断. // 7 6 5 4 3 2 1 0 Reset Value //sfr AUXR = 0x8E; T0x12 T1x12 UART_M0x6 T2R T2_C/T T2x12 EXTRAM S1ST2 0000,0000 //Auxiliary Register #define Timer0_1T() AUXR |= (1<<7) //Timer0 clodk = fo #define Timer0_12T() AUXR &= ~(1<<7) //Timer0 clodk = fo/12 12分频, default #define Timer1_1T() AUXR |= (1<<6) //Timer1 clodk = fo #define Timer1_12T() AUXR &= ~(1<<6) //Timer1 clodk = fo/12 12分频, default #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 Timer2_Run() AUXR |= (1<<4) //允许定时器2计数 #define Timer2_Stop() AUXR &= ~(1<<4) //禁止定时器2计数 #define Timer2_AsCounterP31() AUXR |= (1<<3) //时器2用做计数器 #define Timer2_AsTimer() AUXR &= ~(1<<3) //时器2用做定时器 #define Timer2_1T() AUXR |= (1<<2) //Timer0 clodk = fo #define Timer2_12T() AUXR &= ~(1<<2) //Timer0 clodk = fo/12 12分频, default #define Timer2_InterruptEnable() IE2 |= (1<<2) //允许Timer2中断. #define Timer2_InterruptDisable() IE2 &= ~(1<<2) //禁止Timer2中断. #define ExternalRAM_enable() AUXR |= 2 //允许外部XRAM,禁止使用内部1024RAM #define InternalRAM_enable() AUXR &= ~2 //禁止外部XRAM,允许使用内部1024RAM #define T0_pulseP34_enable() AUXR2 |= 1 //允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。 #define T0_pulseP34_disable() AUXR2 &= ~1 #define T1_pulseP35_enable() AUXR2 |= 2 //允许 T1 溢出脉冲在T1(P3.4)脚输出,Fck1 = 1/2 T1 溢出率,T1可以1T或12T。 #define T1_pulseP35_disable() AUXR2 &= ~2 #define T2_pulseP30_enable() AUXR2 |= 4 //允许 T2 溢出脉冲在T1(P3.0)脚输出,Fck2 = 1/2 T2 溢出率,T2可以1T或12T。 #define T2_pulseP30_disable() AUXR2 &= ~4 #define T0_pulseP35(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,AUXR2 |= bit0,TR0=1 //fx=fosc/(2*M)/n, M=1 or M=12 #define T1_pulseP34(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,AUXR2 |= bit1,TR1=1 //fx=fosc/(2*M)/n, M=1 or M=12 #define T2_pulseP30(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,AUXR2 |= bit2,Timer2_Run() //fx=fosc/(2*M)/n, M=1 or M=12 #define Timer0_Load(n) TH0 = (n) / 256, TL0 = (n) % 256 #define Timer1_Load(n) TH1 = (n) / 256, TL1 = (n) % 256 #define Timer2_Load(n) TH2 = (n) / 256, TL2 = (n) % 256 #define Timer0_Load_us(n) TH0=(65536-MainFosc_KHZ*(n)/1000)/256,TL0=(65536-MainFosc_KHZ*(n)/1000)%256 #define Timer1_Load_us(n) TH1=(65536-MainFosc_KHZ*(n)/1000)/256,TL1=(65536-MainFosc_KHZ*(n)/1000)%256 #define Timer2_Load_us(n) TH2=(65536-MainFosc_KHZ*(n)/1000)/256,TL2=(65536-MainFosc_KHZ*(n)/1000)%256 //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; SMOD SMOD0 LVDF POF 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 - WT2 WT1 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 &= ~3 //PWM0正常输出(默认) #define PWM0_OUT_0() PCA_PWM0 |= 3 //PWM0一直输出0 #define PWM0_OUT_1() PCA_PWM0 &= ~3, CCAP0H = 0 //PWM0一直输出1 #define PWM1_NORMAL() PCA_PWM1 &= ~3 //PWM0正常输出(默认) #define PWM1_OUT_0() PCA_PWM1 |= 3 //PWM0一直输出0 #define PWM1_OUT_1() PCA_PWM1 &= ~3, CCAP1H = 0 //PWM1一直输出1 #define PWM2_NORMAL() PCA_PWM2 &= ~3 //PWM1正常输出(默认) #define PWM2_OUT_0() PCA_PWM2 |= 3 //PWM2一直输出0 #define PWM2_OUT_1() PCA_PWM2 &= ~3, CCAP2H = 0 //PWM2一直输出1 // 7 6 5 4 3 2 1 0 Reset Value //sfr CCON = 0xD8; CF CR - - - CCF2 CCF1 CCF0 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 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 CPS1 CPS0 ECF 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计数脉冲选择外部晶振/12。 fosc/12 #define PCA_CLK_2T() CMOD = (CMOD & ~0x0E) + 2 //PCA计数脉冲选择外部晶振/2。 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/1 #define PCA_CLK_4T() CMOD = (CMOD & ~0x0E) + 10 //PCA计数脉冲选择外部晶振/4。 Fosc/4 #define PCA_CLK_6T() CMOD = (CMOD & ~0x0E) + 12 //PCA计数脉冲选择外部晶振/6。 Fosc/6 #define PCA_CLK_8T() CMOD = (CMOD & ~0x0E) + 14 //PCA计数脉冲选择外部晶振/8。 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_S1 S1_S0 CCP_S1 CCP_S0 SPI_S1 SPI_S0 - DPS 0100,0000 //Auxiliary Register 1 #define PCA_USE_P12P11P10P37() AUXR1 &= ~0x30 //将PCA/PWM切换到P12(ECI) P11(CCP0) P10(CCP1) P37(CCP2)(上电默认)。 #define PCA_USE_P34P35P36P37() AUXR1 = (AUXR1 & ~0x30) | 0x10 //将PCA/PWM切换到P34(ECI) P35(CCP0) P36(CCP1) P37(CCP2)。 #define PCA_USE_P24P25P26P27() AUXR1 = (AUXR1 & ~0x30) | 0x20 //将PCA/PWM切换到P24(ECI) P25(CCP0) P26(CCP1) P27(CCP2)。 #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 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000 //PCA 模块0 //sfr CCAPM1 = 0xDB; PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000 //PCA 模块1 //sfr CCAPM2 = 0xDC; PWM 寄存器 - ECOM2 CAPP2 CAPN2 MAT2 TOG2 PWM2 ECCF2 x000,0000 //PCA 模块2 ;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) /* Above is STC additional SFR or change */ /**********************************************************/ 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() /**********************************************/ /****************************************************************/ //sfr INT_CLKO = 0x8F; //附加的 SFR WAKE_CLKO (地址:0x8F) /* 7 6 5 4 3 2 1 0 Reset Value - EX4 EX3 EX2 - T2CLKO T1CLKO T0CLKO 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 CLK_DIV = 0x97; //Clock Divder 系统时钟分频 - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000 #define SYSTEM_CLK_1T() CLK_DIV &= ~0x07 //default #define SYSTEM_CLK_2T() CLK_DIV = (CLK_DIV & ~0x07) | 1 #define SYSTEM_CLK_4T() CLK_DIV = (CLK_DIV & ~0x07) | 2 #define SYSTEM_CLK_8T() CLK_DIV = (CLK_DIV & ~0x07) | 3 #define SYSTEM_CLK_16T() CLK_DIV = (CLK_DIV & ~0x07) | 4 #define SYSTEM_CLK_32T() CLK_DIV = (CLK_DIV & ~0x07) | 5 #define SYSTEM_CLK_64T() CLK_DIV = (CLK_DIV & ~0x07) | 6 #define SYSTEM_CLK_128T() CLK_DIV = CLK_DIV | 7 #define MCLKO_P54_None() CLK_DIV &= ~0xc0 //主时钟不输出 #define MCLKO_P54_DIV1() CLK_DIV = (CLK_DIV & ~0xc0) | 0x40 //主时钟不分频输出 #define MCLKO_P54_DIV2() CLK_DIV = (CLK_DIV & ~0xc0) | 0x80 //主时钟2分频输出 #define MCLKO_P54_DIV4() CLK_DIV = CLK_DIV | 0xc0 //主时钟4分频输出 #define MCLKO_P34_None() CLK_DIV &= ~0xc0 //主时钟不输出 #define MCLKO_P34_DIV1() CLK_DIV = (CLK_DIV & ~0xc0) | 0x40 //主时钟不分频输出 #define MCLKO_P34_DIV2() CLK_DIV = (CLK_DIV & ~0xc0) | 0x80 //主时钟2分频输出 #define MCLKO_P34_DIV4() CLK_DIV = CLK_DIV | 0xc0 //主时钟4分频输出 //sfr BUS_SPEED = 0xA1; //Stretch register - - - - - - EXRTS1 EXRTSS0 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 TRUE 1 #define FALSE 0 //============================================================= //======================================== #define PolityLow 0 //低优先级中断 #define PolityHigh 1 //高优先级中断 //======================================== #define MCLKO_None 0 #define MCLKO_DIV1 1 #define MCLKO_DIV2 2 #define MCLKO_DIV4 3 #define ENABLE 1 #define DISABLE 0 #define STC15F_L2K08S2 8 #define STC15F_L2K16S2 16 #define STC15F_L2K24S2 24 #define STC15F_L2K32S2 32 #define STC15F_L2K40S2 40 #define STC15F_L2K48S2 48 #define STC15F_L2K56S2 56 #define STC15F_L2K60S2 60 #define IAP15F_L2K61S2 61 #endif
程序源码
链接:https://pan.baidu.com/s/1dx-vQrqeaIziiSrofzsZWA 提取码:5ozg
-
STC15F104W的串口发送函数
2020-04-18 17:57:09STC15F104W的串口发送函数,测试正常好用。作为无线发送部分配合无线的串口模块挺好用的。实际测试48小时,每100ms发送2个字节,没遇到故障。 -
STC15串口使用总结
2015-07-27 18:58:30STC15串口通信的使用介绍,有详细的代码,总结了STC15系类单片机串口的配置。 -
STC15串口配置调用
2019-09-02 15:18:21该工程实现对STC15系列单片机的串口配置以及调用,操作简单,易懂,适合小白上手。 -
STC15W4K32S4 4个串口同时收发程序
2021-03-10 10:38:08STC15W4K32S4 4个串口同时收发程序,STC15W4K32S4 4个串口同时收发程序,STC15W4K32S4 4个串口同时收发程序STC15W4K32S4 4个串口同时收发程序 -
STC15W4K系列单片机,串口4接收数据,串口1发送
2018-09-10 00:46:44本代码适用于STC15全系列单片机,可以将串口4接收到的数据在串口1发送,本程序不仅仅适用于UART1和UART4,简单的改造就可以支持4串口。代码条理性强,注释全面。 -
STC15 串口一 接收 发送 基本程序
2019-02-09 16:35:25使用串口一方便通过串口助手测试某些功能 ...STC15F2Kxx.H> #include "textUart1.h" char UAR[20],temp,rec_flag=0; static void Uart1_Init(void) //@11.0592MHz { EA=0; ACC = P_SW...使用串口一方便通过串口助手测试某些功能
//textUart1.c #include <STC15F2Kxx.H> #include "textUart1.h" char UAR[20],temp,rec_flag=0; static void Uart1_Init(void) //@11.0592MHz { EA=0; ACC = P_SW1; · ACC &= ~(S1_S0 | S1_S1); //S1_S0=0 S1_S1=0 P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD) AUXR |= 0x40; //定时器1为1T模式 AUXR &= 0xFE; //选择定时器1为波特率发生器 TMOD = 0x00; //定时器1为模式0(16位自动重载) TL1 = (65536 - (FOSC/4/BAUD)); //设置波特率重装值 TH1 = (65536 - (FOSC/4/BAUD))>>8; SCON = 0x50; //8位可变波特率 TR1 = 1; //定时器1开始启动 ES = 1; EA=1; } /***************************************************************************/ void send1_Byte(unsigned char c) { SBUF = c; while(!TI); //发送完会自动置1 TI=0; } /*---------------------------- 发送字符串 ----------------------------*/ void Send1_String(char *s) { while (*s){ //检测字符串结束标志 send1_Byte(*s++); } } /************************************************************* 串口接收到的数据存入UAR数组中,当接收到0x0D时表示数据接收结束 **************************************************************/ void UART1_Interrupt() interrupt 4 //串口中断函数接收程序 { static unsigned char i; if (RI){ RI=0; temp = SBUF; UAR[i]=temp;//接收到的数据存入数组UAR中 i++; if(temp==0x0D){ i=0; rec_flag=1;//定义接收完成标志位 } } } /***********************************************************************/ void UART1_config() { Uart1_Init();//串口一初始化 Send1_String("STC15F4K48S4\r\nUart is ok !\r\n");//发送字符串检测是否初始化成功 } /*******************************************************************************/ void uart1_printf(const char *fmt,...) //串口打印函数 { va_list ap; char xdata string[500]; va_start(ap,fmt); vsprintf(string,fmt,ap); Send1_String(string); va_end(ap); }
//textUart1.h #ifndef __textUart1_H__ #define __textUart1_H__ #include <STC15F2Kxx.H> #include "stdio.h" #include <stdarg.h> #include <string.h> #define S1_S0 0x40 #define S1_S1 0x80 #define FOSC 11059200 //系统时钟 #define BAUD 115200 //波特率设定115200,也可设置9600 extern char UAR[20],rec_flag;//全局量 void send1_Byte(unsigned char c); void Send1_String(char *s); void UART1_config(); void uart1_printf(const char *fmt,...); #endif
主函数 #include <STC15F2Kxx.H> #include "textUart1.h" void main(void) { P3M0 = 0X00; //配置端口工作模式(有推挽模式,准双向口工作模式等) P3M1 = 0X00; UART1_config(); //串口1初始化 uart1_printf("UART1 is good! \r\n"); while(1); }
效果:
-
宏晶STC15系列单片机串口驱动程序
2020-01-15 10:01:12宏晶STC15系列单片机串口驱动程序 #define COM_TX1_Lenth 128 #define COM_RX1_Lenth 128 #define COM_TX2_Lenth 128 #define COM_RX2_Lenth 128 #define USART1 1 #define USART2 2 #define UART_ShiftRight... -
STC15W408AS_串口程序
2021-02-26 15:59:45测试单片机型号:STC15W408AS 注意事项 1.串口波特率使用的是定时器2作为波特率发生器 2.波特率为115200bps@MCU频率22.1184MHz 3.串口接收数据使用完后,需要加UartEmp();函数清零接收数组。 4.接收数据为字符串时,... -
STC15F104W串口发送接收程序
2020-04-29 12:07:55STC15F104W单片机串口发送接收例程,可参考,有源代码! STC15F104W单片机串口发送接收例程,可参考,有源代码! STC15F104W单片机串口发送接收例程,可参考,有源代码! -
【STC15系列】STC15软串口输出打印示例程序
2022-01-27 19:19:18【STC15系列】STC15虚拟串口输出打印示例程序【STC15系列】STC15软串口打印输出示例程序
- 演示效果
本例程是使用STC15系列MCU做的模拟串口。用户根据自己的时钟和波特率自行设置后编译下载。我定义的是P2.1作为模拟串口发送端,可以格局个人需求切换到任意IO引脚。通过P3.0串口下载程序,使用P2.1虚拟串口,作为串口数据打印输出。
对串口打印函数进行了 重映射,采用printf格式打印输出
- 如果不需要使用可以使用原函数
//重写putchar函数 char putchar(unsigned char c) { TxSend(c); return c; }
- 在不需要printf打印函数时,可以使用保留字符串打印函数
void PrintString(unsigned char code *puts) { for (; *puts != 0; puts++) TxSend(*puts); }
- 位时间函数
这个 位时间函数中的参数如果改变会,出现异常,我在使用官方提供的《STC15系列库函数与例程测试版V2.0》中的
38-比较器做ADC-C语言-模拟串口
调试过程中发现,该函数中的104
参数必须是80
才行,如果是104就是乱码输出。//======================================================================== // 函数: void BitTime(void) /**1 个起始位,8 个数据位,0 个校验位,1 个停止位, * :8,N,1;8 个数据位,一个停止位,无校验位。 * 波特率:9600,位宽度:8,停止位:1 * 传输一个字节(8 位)的数据,在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据 * 1 秒可以发送 9600 位,那么用 9600/10 ,就是1秒可以发送 960 个字节数据, * 则每发送一个字节需要的时间就是:1/960 ~= 0.00104166…s ~= 1.0416667 ms。 */ //======================================================================== void BitTime(void) { u16 i; i = ((MAIN_Fosc / 100) * 104) / 130000L - 1; //根据主时钟来计算位时间 104 while(--i); }
- 定时器配置函数(非必须内容)
/************************ 定时器配置 ****************************/ void Timer_config(void) { TIM_InitTypeDef TIM_InitStructure; //结构定义 TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask TIM_InitStructure.TIM_Polity = PolityHigh; //指定中断优先级, PolityHigh,PolityLow TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext TIM_InitStructure.TIM_ClkOut = ENABLE; //是否输出高速脉冲, ENABLE或DISABLE // TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD)); //初值, TIM_InitStructure.TIM_Value = 65536 - MAIN_Fosc / 100000UL; //初值,同上 TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2 }
上面代码中
TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD)); //初值, TIM_InitStructure.TIM_Value = 65536 - MAIN_Fosc / 100000UL; //初值,同上
,任意一个配置都行。但是在《STC15系列库函数与例程测试版V2.0》中的38-比较器做ADC-C语言-模拟串口
实例中必须使用TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD));
//初值,按照原配置不该动的话,则虚拟串口输出的是乱码,不要问为什么我知道这一点,这是我采坑调试出来的。源代码并没有人和说明该函数的参数是怎么配置来的。希望后面的人不要踩这个坑了。主程序
/*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ /* --- Web: www.GXWMCU.com --------------------------------------------*/ /* --- QQ: 800003751 -------------------------------------------------*/ /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */ /*---------------------------------------------------------------------*/ #include "stdio.h" #include "config.h" #include "timer.h" #include "GPIO.h" /************* 外部函数和变量声明 *****************/ /************* 本地常量声明 **************/ /************* 本地变量声明 **************/ #define MAIN_Fosc 11059200L //定义主时钟 #define BAUD 9600 //串口波特率 sbit P_TXD = P2^1; //定义模拟串口发送端,可以是任意IO void TxSend(u8 dat); void PrintString(unsigned char code *puts); char putchar(unsigned char c); /************* 本地函数声明 **************/ //======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。 // 参数: ms,要延时的ms数, 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void delay_ms(unsigned int ms) { unsigned int i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms); } /************************ IO口配置 ****************************/ void GPIO_config(void) { GPIO_InitTypeDef GPIO_InitStructure; //结构定义 GPIO_InitStructure.Pin = GPIO_Pin_0; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化 GPIO_InitStructure.Pin = GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作 GPIO_InitStructure.Mode = GPIO_OUT_PP; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP GPIO_Inilize(GPIO_P2,&GPIO_InitStructure); //初始化 } /************************ 定时器配置 ****************************/ void Timer_config(void) { TIM_InitTypeDef TIM_InitStructure; //结构定义 TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask TIM_InitStructure.TIM_Polity = PolityHigh; //指定中断优先级, PolityHigh,PolityLow TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源:TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext TIM_InitStructure.TIM_ClkOut = ENABLE; //是否输出高速脉冲, ENABLE或DISABLE // TIM_InitStructure.TIM_Value = (65536 - (MAIN_Fosc/4/BAUD)); //初值, TIM_InitStructure.TIM_Value = 65536 - MAIN_Fosc / 100000UL; //初值,同上 TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2 } /******************** task A **************************/ void main(void) { //将P2.1口设置为推挽输出模式 // P2M1=0x00; // P2M0=0x02; P10 = 0; // GPIO_config();//这个配置与软串口输出无关 // Timer_config();//这个配置与软串口输出无关 EA = 1; printf("\t STC15F2K60S2\r\n"); while (1) { printf("\t Perseverance520 \r\n"); P10 = ~P10; delay_ms(500); } } //======================================================================== // 函数: void BitTime(void) // 描述: 位时间函数。 // 参数: none. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void BitTime(void) { u16 i; i = ((MAIN_Fosc / 100) * 104) / 130000L - 1; //根据主时钟来计算位时间 104 while(--i); } //======================================================================== // 函数: void TxSend(uchar dat) // 描述: 模拟串口发送一个字节。9600,N,8,1 // 参数: dat: 要发送的数据字节. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void TxSend(u8 dat) { u8 i; EA = 0; P_TXD = 0; BitTime(); for(i=0; i<8; i++) { if(dat & 1) P_TXD = 1; else P_TXD = 0; dat >>= 1; BitTime(); } P_TXD = 1; EA = 1; BitTime(); BitTime(); } //======================================================================== // 函数: void PrintString(unsigned char code *puts) // 描述: 模拟串口发送一串字符串。9600,N,8,1 // 参数: *puts: 要发送的字符指针. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //======================================================================== void PrintString(unsigned char code *puts) { for (; *puts != 0; puts++) TxSend(*puts); } //重写putchar函数 char putchar(unsigned char c) { TxSend(c); return c; }
程序源码
链接:https://pan.baidu.com/s/1DokConGCqAHSgGAeTzJJ0Q 提取码:pk08
- 演示效果
-
STC15F2K60S2串口通信程序代码
2017-06-18 18:57:22STC15F2K60S2串口通信程序代码 -
STC15/STC15F2K60S2/STC15W4K32S4系列读取超声波测距模块HC-SR04距离串口显示代码实例
2017-08-06 17:28:36STC15/STC15F2K60S2/STC15W4K32S4系列读取超声波测距模块HC-SR04距离串口显示代码实例 -
STC15 T2定时器串口通信
2020-01-19 09:26:01是用STC15W系列单片机(本例直接可用STC15W401-408AS的MCU)直接测试功能的KEIL4工程。经过T2定时器产生波特率,采用默认的串口与电脑连接进行异步串口通信(UART)。 -
stc15 串口控制舵机旋转ABCD+-控制
2017-06-19 14:25:54keil 4.0 stc15单片机P10口控制舵机 -
第一次创建STC15串口程序模板
2019-03-16 11:08:35第一次编辑STC15串口通讯程序模板STC15W4K56S4最小系统Keil编程创建工程创建主程序编辑主程序 每次开始项目总是要从头开始,制作一个串口通讯程序作为模板是一个项目开始的好开端。 STC15W4K56S4最小系统 选择这... -
stc15w408as串口通讯
2018-03-20 16:55:31关于单片机stc15w408as串口通讯程序代码!!!!!!!! -
stc15串口
2019-04-11 00:37:57http://blog.sina.com.cn/s/blog_c20212c40101j29x.html https://blog.csdn.net/qq_29562209/article/details/80840042 http://blog.sina.com.cn/s/blog_787c9e7d0102wlve.html -
STC15F2K60S2-串口1收发数据_offerhkz_flatwnn_stc15f串口1_stc15f2k60s2_bre
2021-10-02 00:07:52STC15F260S2串口程序,可实现多种字符切换。 -
STC15W204S串口通信超声波测试.c
2020-06-08 11:10:45/*开机自检,串口未通信电源指示灯亮,呼吸灯急速闪烁, 应用模式 0为静默待机 1为距离模式 2为急速返回模式 实际距离小于预设宽度返回1///实际距离大约预设返回0 3改灯光效果 6位数据,接管电源灯-电源灯亮-... -
基于STC15W系列多串口通信-4串口相互通信.rar
2020-07-24 15:28:04STC15W系列,四个串口之间的通信程序,任一端口发送的内容可以在其它端口显示出来,采用库函数编程。代码短小,经调试可用。 -
stc15单片机nRF24L01无线发射ESP8266串口WiFi模块实验例程源码(11例).zip
2022-04-12 19:34:15stc15单片机nRF24L01无线发射ESP8266串口WiFi模块实验例程源码(11例): ESP8266串口WiFi模块 AP+STATION 模式stc15单片机 实验例程源码 ESP8266串口WiFi模块 STATION 模式stc15单片机 实验例程源码 ESP8266串口WiFi... -
7.STC15W408AS单片机串口通信
2021-07-20 14:13:36STC15W408AS只有一个串口,串口1,有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。 一、串口1相关寄存器 下面只把接下来我需要的寄存器和寄存器的位说明一下。 1.1 控制... -
STC15W串口通信梳理
2021-11-12 11:02:43STC15W的串口与51的串口设置有所区别,从网上找了很多资料,供大家参考, 特别感谢如下作者: STC15W串口通信的一些梳理 - 会咬鸢的风(王泽锋) - 博客园 一 STC15W串口对应引脚: 由此我们得到四个串口... -
STC15/STC15F2K60S2/STC15W4K32S4系列读取MPU6050陀螺仪串口显示代码
2017-07-15 14:13:20STC15/STC15F2K60S2/STC15W4K32S4系列读取MPU6050陀螺仪串口显示代码 -
STC15 单片机 串口使用
2021-01-03 23:02:00在研究串口前,我们需要看一下所有的寄存器 首先是SCON,主要是用来设置串口的工作方式 详细参数其实不需要知道的非常非常清楚,因为我们一般都是有默认情况的 文档写着麻烦,直接上例程 /*** 串口控制发送函数 **... -
STC8G_stc8g1k08a烧录_STC8g串口程序_stc8g1k08apudn_stc8g
2021-09-11 05:30:29ad数据采集和串口功能,stc单片机串口库低功耗模式