下面是我自己写了一个串口程序.用C8051F340,但是却进不了中断....各位大侠帮我看看是什么问题啊...另外.我DEBUG后,KEIL中Peripherals中下拉菜单中只有Reset CPU.这是什么问题啊...小弟在此谢谢各位大侠了!!!
#include <c8051f340.h> #include <stdio.h> #include <string.h>
unsigned int xdata SendBuffer[512]; //发送缓冲区 unsigned int xdata ReceiveBuffer[512]; //接收缓冲区 unsigned int Flag_NewMessage; //新消息标志位 unsigned int Frame_Lenth; //待发送数据长度 unsigned int Data_len, Data_LRC; //数据长度和校验和计算结果 unsigned int Send_count = 0, Receive_count = 0; //初始化发送和接收计数器 unsigned char LRC_Data = 0; //校验和 unsigned char Star_flag = 0; //帧开始标志 unsigned char Data_flag = 0; //数据开始标志 unsigned char LRC_flag = 0; //校验和标志 unsigned char Uart_Spi = 0x50; //与存储部分通信接口 unsigned char B_Star = 0, B_End = 0; //帧开始和结束
#define STX 0x02 //帧开始标志 #define ETX 0x03 //帧结束标志 #define DATA_OK 0x83 //正确接收响应 #define DATA_ERROR 0x38 //接收出错响应 #define STR_flag 0x7E //开始握手标志 #define END_flag 0x7F //结束握手标志 #define CON_flag 0x7D //暂停结束标志 #define DATA_flag 0x7C //数据开始标志
void Uart_PackageSend(unsigned char MESSAGE_ID,unsigned int Lenth);
/*************************************************** 函数名:Baud_Init() 功 能:设置UART0数据传输的波特率. ***************************************************/ void Baud_Init() { TMOD = 0x20; //T1工作在方式2 CKCON = 0x08; //T1使用系统时钟 TCON = 0x40; //启动定时器T1 TH1 = 0xCC; //设置T1的初始值 TL1 = 0xCC; //波特率=115200 }
/************************************************** 函数名:Uart_Init() 功 能:完成串口硬件的初始化,使串口处于可收发状态. **************************************************/ void Uart_Init() { SCON0 = 0x50; //UART0工作在可变波特率8位数据传输模式,允许UART0接收,REN0=1 IE = 0x90; //开启总中断,允许UART0中断 PS0 = 1; //设置UART0中断为高优先级 }
/************************************************************ 函数名:Uart_ISR() 功 能:串口中断服务程序,完成一帧数据的接收和发送.在传送时, 按数据长度Frame_Lenth将发送缓冲区的数据依次发出.在接 收时完成一帧数据的接收并校验,在校验正确后置一标志以 示有新消息,供其他接口查询. *************************************************************/ void Uart_ISR() interrupt 4 { int i=0; if (TI0) { TI0 = 0; if (Send_count < Frame_Lenth) { SBUF0 = SendBuffer[Send_count]; Send_count++; } else Send_count = 0;
} if (RI0) { RI0 = 0; B_Star = SBUF0; if (B_Star == STX) { Star_flag = 1; //置帧开始标志位 goto end; } while (Star_flag ) { switch (i) { case 0 : Data_len = SBUF0; Data_LRC = SBUF0; Data_len <<= 8; i++; break; case 1 : Data_len |= SBUF0; Data_LRC ^= SBUF0; i++; break; default: Data_flag = SBUF0; } if (Data_flag == DATA_flag) //查询数据开始标志位 { if (Receive_count < Data_len) { ReceiveBuffer[Receive_count] = SBUF0; Data_LRC ^= SBUF0; Receive_count++; } else Receive_count = 0; B_End = SBUF0; if (B_End == ETX) { LRC_flag = 1; } if (LRC_flag) { LRC_Data = SBUF0; if (Data_LRC == LRC_Data) { Star_flag = 0; //清帧开始标志 Uart_Spi = 0x35; //传送完一帧数据,告诉SPI可以取数据 SBUF0 = DATA_OK; //返回DATA_OK给上位机 } else SBUF0 = DATA_ERROR; //返回DATA_ERROR给上位机 } } } end:; } }
/************************************************************** 函数名:Uart_Scan() 功 能:查询新消息标志,如果有新消息完成消息的解析. **************************************************************/ void Uart_Scan() { if (SBUF0 == STR_flag) { Uart_PackageSend(STR_flag,1); //返回开始握手信号 ET0 = 0 ; } if (SBUF0 == END_flag) { Uart_PackageSend(END_flag,1); //返回结束握手信号 Uart_Spi = 0x30; //所有数据传送完 ET0 = 1; } if (Uart_Spi == 0x50) { Uart_PackageSend(CON_flag,1); //发送暂停结束信号 } }
/************************************************************** 函数名:Uart_PackageSend(MESSAGE_ID) 参 数:消息标识 功 能:根据消息的标识,对消息的内容进行打包,并启动传送. **************************************************************/ void Uart_PackageSend(unsigned char MESSAGE_ID,unsigned int Lenth) { int i = 0, j = 0; unsigned int len; len = Lenth; SendBuffer[0] = STX; len >>= 8; SendBuffer[1] = len; Data_LRC = len; SendBuffer[2] = Lenth; Data_LRC ^= Lenth; for (i = 0; i < Lenth; i++) { SendBuffer[i + 3] = MESSAGE_ID; Data_LRC ^= MESSAGE_ID; } SendBuffer[Lenth + 3] = ETX; SendBuffer[Lenth + 4] = Data_LRC; Frame_Lenth = Lenth + 4; /*for (j = 0; j < Frame_Lenth; j++) { break; } */ }
/****************************** 函数名:main() 功 能:主函数 ******************************/ void main() { Baud_Init(); Uart_Init(); Uart_Scan(); TI0=1; while(1); }
|