/****************************************************************************************************** IC : TM52F1386 演示效果 : 通过USB将开发板与电脑,打开电脑中的串口助手,设置对应端口, 9600波特率,8位数据位,无校验位,1位停止位。向学习板发送任 意1个字节数据,学习板会回传1个相同字节数据。 注意: 需要将底板的OP4端子的TX与RX跳线帽接好 时钟 : 快时钟系统主频为 18.432M/2 = 9.216M 分给定时器的时钟频率为9.216M/2 = 4.608M *********************************************************************************************************/ #include #include "TM52F1386_bsp.h" #include #include "uart2.h" #include "HLW8110.h" #include "zigbee.h" // 波特率=(SMOD+1) x F SYSCLK /(32 x 2 x (256 – TH1)) #define SMOD_PRICE 1 #define FRC_HZ 18432000 #define FRC_DIV 2 #define BAUD4800 4800 #define BAUD9600 9600 #define BAUD19200 19200 #define BAUD38400 38400 #define BAUD57600 57600 #define BAUD115200 115200 // 必须在系统一分频下 #define CKS_EVEN_ODD 0 //0:EVEN 1:ODD #define UART2BRP (unsigned int)(FRC_HZ/FRC_DIV/32/BAUD9600) //计算不同波特率下的UART2BRP /********************************************************************************************************** **函数名称 :uart1_gpio_init **函数描述 :串口IO初始化 **输 入 :None **输 出 :None **********************************************************************************************************/ void uart2_gpio_init() { PORTIDX = PORT1; PINMOD10 = PINMOD10&0x00 | PIN_L_MODE_OD_IPU | PIN_H_MODE_PP; P1_1 = 1; // tx P1_0 = 1; // rx // p55,54 SET_REG(PORTIDX, 5); SET_REG_BITS(PINMOD54, PINMOD5, PIN_MODE_PP); // 配置为CMOS推挽输出 P5_5 = 0; //A SET_REG(PORTIDX, 5); SET_REG_BITS(PINMOD54, PINMOD4, PIN_MODE_PP); // 配置为CMOS推挽输出 P5_4 = 0; //B } void open_first_passageway(void) { P5_4 = 1; //B //P5_4 = 0; //B P5_5 = 0; //A //P5_5 = 0; //A } void open_second_passageway(void) //对应实际第三路 { // P5_4 = 1; //B // P5_5 = 0; //A P5_4 = 0; //B P5_5 = 1; //A } void open_third_passageway(void) //对应实际第二路 { // P5_4 = 0; //B // P5_5 = 1; //A P5_4 = 0; //B //P5_4 = 1; //B P5_5 = 0; //A //P5_5 = 0; //A } void close_all_passageway(void) { P5_4 = 1; //B P5_5 = 1; //A } /****************************************************************************************** ** 函数名称: uart2_init ** 函数描述: uart初始化函数 9600-8-1 无校验(轮询接收) ** 输入参数: 无 ** 输出参数: 无 *******************************************************************************************/ void uart2_init(void) { uart2_gpio_init(); UART2_9Bits; SCON2 = (SCON2&~SCON2_REN2_MASK) | 1 <=9) // { // u8_RX_Index =0; // } //// //// B_Rx_Data_ING = 1; // 置数据接收标志位 //// } //// else //// { //// B_Rx_Finish = TRUE; // 数据接收完毕 //// u8_RX_Index = 0; //// } // SCON2 = SCON2&~SCON2_RI2_MASK; // } //} //void uart2_irq() interrupt 12 //测试版 //{ // unsigned char temp; // if(SCON2&RI2) // { // temp = SBUF2; // if (u8_RX_Index < u8_RX_Length ) // { // u8_RxBuf[u8_RX_Index] = temp; // 数据接收中 // u8_RX_Index++; // B_Rx_Data_ING = 1; // 置数据接收标志位 // } // else // { // B_Rx_Finish = TRUE; // 数据接收完毕 // u8_RX_Index = 0; // } // SCON2 = SCON2&~SCON2_RI2_MASK; // } //} void uart2_irq() interrupt 12 // { unsigned char temp; unsigned char xdata dat=0; //必须定义成Xdata类型,这样才能将数据存放到A寄存器里,配合PSW实现奇偶判断 unsigned char i=0, tmp=0,total=0; if(SCON2&RI2) { temp = SCON2&RB82; dat = SBUF2; tmp = dat; for(i=0;i<8;i++) { if((tmp&0x01)==1) { total++; } tmp>>=1; } #if (CKS_EVEN_ODD==0) //接收偶校验数据值 //if(((RB82==0)&&(P==0)) ||((RB82==1)&&(P==1))) //P为PSW寄存器里面成员,单片机都能根据A中1的个数的奇偶自动令P置位或清零,奇为1,偶为0 if(((temp==0)&&(total%2==0)) ||((temp==0x04)&&(total%2==1))) //奇为1,偶为0 { if (u8_RX_Index < u8_RX_Length ) { u8_RxBuf[u8_RX_Index] = dat; // 数据接收中 u8_RX_Index++; B_Rx_Data_ING = 1; // 置数据接收标志位 // if(u8_RX_Index>9) // { // u8_RX_Index = 0; // } } else { B_Rx_Finish = TRUE; // 数据接收完毕 u8_RX_Index = 0; } } #else //接收奇校验数据值 //if(((RB82==1)&&(P==0)) ||((RB82==0)&&(P==1))) if(((temp==0x04)&&(total%2==0)) ||((temp==0)&&(total%2==1))) { if (u8_RX_Index < u8_RX_Length ) { u8_RxBuf[u8_RX_Index] = dat; // 数据接收中 u8_RX_Index++; B_Rx_Data_ING = 1; // 置数据接收标志位 } else { B_Rx_Finish = TRUE; // 数据接收完毕 u8_RX_Index = 0; } } #endif SCON2 = SCON2&~SCON2_RI2_MASK; } } /********************************************************************************************************** **函数名称 UART1_send **函数描述 :uart1发送单字节数据 **输 入 char **输 出 :None **********************************************************************************************************/ //void UART2_send(unsigned char c) // 发送单字节 //{ // // while (busy) // // ; // // busy = 1; // SBUF2 = c; // 发送单字节 // while((SCON2&TI2) == 0);// 等待发送完成 // SCON2 = SCON2&~SCON2_TI2_MASK; //} void UART2_send(unsigned char tx_dat) { unsigned char i=0,total=0; unsigned char xdata dat; dat = tx_dat; for(i=0;i<8;i++) { if((dat&0x01)==1) { total++; } dat>>=1; } #if CKS_EVEN_ODD if((total%2)!=0) //奇为1,偶为0 {SCON2 &= ~TB82;} else {SCON2 |= TB82;} #else if((total%2)==0) {SCON2 &= ~TB82;} else {SCON2 |= TB82;} #endif SBUF2 = tx_dat; // 发送单字节 while((SCON2&TI2) == 0);// 等待发送完成 //SCON2 = SCON2&~SCON2_TI2_MASK; SCON2 = SCON2 & ~TI2; //清除标志位 } /********************************************************************************************************** **函数名称 UART1_send_buf **函数描述 :uart1发送字符串 **输 入 char **输 出 :None **********************************************************************************************************/ void UART2_send_buf(char *s) // 发送字符串 { while (*s) { UART2_send(*s++); } } void Start_Send_UartData(unsigned char len) { unsigned char i; for(i=0;i