123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- /******************************************************************************************************
- IC : TM52F1386
-
- 演示效果 :
- 通过USB将开发板与电脑,打开电脑中的串口助手,设置对应端口,
- 9600波特率,8位数据位,无校验位,1位停止位。向学习板发送任
- 意1个字节数据,学习板会回传1个相同字节数据。
-
- 注意:
- 需要将底板的OP4端子的TX与RX跳线帽接好
-
- 时钟 :
- 快时钟系统主频为 18.432M/2 = 9.216M
- 分给定时器的时钟频率为9.216M/2 = 4.608M
- *********************************************************************************************************/
- #include <REGtenxTM52F1386.h>
- #include "TM52F1386_bsp.h"
- #include <intrins.h>
- #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 <<SCON2_REN2_POS; //允许接收,REN2=1
- UART2CON = (UART2CON &~ UART2CON_UART2BRP_MASK) | (UART2BRP << UART2CON_UART2BRP_POS);
- SCON2 = (SCON2 & ~RI2); //UART2 接收中断标志
- SCON2 = (SCON2 & ~TI2); // UART2 发送中断标志
-
- UART2_RECEPTION_ENABLE; //UART接收使能
- INTE1 = (INTE1 &~ INTE1_ES2_MASK) | 1 <<INTE1_ES2_POS; //ES2=1
- }
- /******************************************************************************************
- ** 函数名称: uart_recv
- ** 函数描述: uart2接收函数
- ** 输入参数: 无
- ** 输出参数: 无
- *******************************************************************************************/
- /*void uart_recv (unsigned char *buf, unsigned char len)
- {
- unsigned char i;
- for (i = 0; i < len; i++)
- {
- while ( (SCON2 & RI2) == 0);
- *buf = SBUF2;
- SCON2 = SCON2 & ~RI2; //清除标志位
- buf++;
- }
- }*/
- /******************************************************************************************
- ** 函数名称: uart_send
- ** 函数描述: uart2发送函数
- ** 输入参数: 无
- ** 输出参数: 无
- *******************************************************************************************/
- /*void uart_send (unsigned char *buf, unsigned char len)
- {
- unsigned char i;
- for (i = 0; i < len; i++)
- {
- SBUF2 = *buf;
- buf++;
- while ((SCON2 & TI2) == 0);
- SCON2 = SCON2 & ~TI2; //清除标志位
- }
- }*/
- /**********************************************************************************************************
- **函数名称 :uart1_irq
- **函数描述 :uart1中断入口
- **输 入 :None
- **输 出 :None
- **********************************************************************************************************/
- //void uart2_irq() interrupt 12 //测试版
- //{
- // unsigned char temp;
- // if(SCON2&RI2)
- // {
- // temp = SBUF2;
- //// //uart_receive_input(temp); // zigbee函数
- //// SCON2 = SCON2&~SCON2_RI2_MASK;
- //
- //// if (u8_RX_Index < u8_RX_Length )
- //// {
- // u8_RxBuf[u8_RX_Index] = temp; // 数据接收中
- // u8_RX_Index++;
- // if(u8_RX_Index>=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<len;i++)
- {
- UART2_send(u8_TxBuf[i]);
-
- }
- }
- void uart_send (unsigned char *buf, unsigned char len)
- {
- unsigned char i;
- for (i = 0; i < len; i++)
- {
- SBUF2 = *buf;
- buf++;
- while ((SCON2 & TI2) == 0);
- SCON2 = SCON2 & ~TI2; //清除标志位
- }
- }
- /******************************************************************************************
- ** 函数名称: main
- ** 函数描述: main函数
- ** 输入参数: 无
- ** 输出参数: 无
- *******************************************************************************************/
- /*void main (void)
- {
- bsp_clock_init(); // 系统快钟18.432 div 2 = 9.216Mhz
- uart2_init();
- while (1)
- {
- uart_recv (txrx_buf, 1);
- uart_send (txrx_buf, 1);
- // bsp_delay_ms(1000);
- }
- }*/
|