N76E003AT20 可用引脚数量18个,内核为51系列,CPU最大主频:16MHz 工作电压范围:2.4V~5.5V 程序存储容量:18KB 程序存储器类型:FLASH RAM总容量:1KB。
此前用该单片机做为主控设计了车载感应控制盒,当时没有记录开发过程,现在有个项目,我选择该芯片做设计,在此简单记录一下过程与遇到的问题。
项目为一个小型项目,做一个转接板,用于接收门禁机的串口数据并处理、接收C级串口锁体的数据并处理、然后根据相应的逻辑输出信号。
前期开发环境搭建和准备不进行阐述,手头有一个开发板,拿起来就用。
该项目软件预计一个工作日完成,N76E003AT20 有两个串口,我打算只使用一个串口进行一主多从收发。
软件方面,我首先要达到的目的就是,使用串口0进行打印输出,并且用串口0发送数据,单片机可以打印回传数据。这样就实现了串口0 可以打印信息,并且可以接收上位机数据并处理并发送。听上去是挺简单的,为什么要记录呢,因为在开发过程中我们总会时不时遇到一些自己能力之外(没考虑到)的问题,所以记录一下,以后再次使用可以进行参考。
首先是串口0初始化代码,非常简单,看注释
set_P06; set_P07; set_ES; //串口0中断 使能 set_EA; //全局中断使能 InitialUART0_Timer1(9600); // 波特率
串口中断函数
1 void SerialPort0_ISR(void) interrupt 4 2 { 3 if (RI==1) //接收完成标志 4 { /* if reception occur */ 5 clr_RI; /* clear reception flag for next reception *///清处标志 6 Rec_Uart_Buffer[u0RecParameter.Count] = SBUF;//SBUF数据寄存器 7 u0RecParameter.Count ++; 8 if(SBUF == 0x0A) 9 { 10 u0RecParameter.RecFlag =1; 11 } 12 } 13 }
接收数据处理函数
1 void Rec_Usart_Dispose(void) 2 { 3 //包头0xFB 0x55 4 uint8_t *p_buffer = NULL; 5 uint8_t i; 6 if(u0RecParameter.RecFlag ) //接收到了数据 7 { 8 9 for(i=0;i<u0RecParameter.Count;i++) 10 { 11 Send_Data_To_UART0(Rec_Uart_Buffer[i]);//接收到什么数据发送什么数据 12 } 13 for(i=0;i<u0RecParameter.Count;i++) 14 { 15 if(Rec_Uart_Buffer[i] == 0xFB)//找包头,此前用Strstr函数,不知为何无效 16 { 17 p_buffer = &Rec_Uart_Buffer[i]; 18 break; 19 } 20 } 21 22 if(p_buffer != NULL) 23 { 24 if((*(p_buffer+2) == 0x07)) 25 { 26 cmdFlag |= 0x01; // 开门指令 27 printf("cmd: 0x01\n"); 28 Send_Usart0_Arr(DoorCtr_Cmd_Opendoor,10); 29 } 30 if((*(p_buffer+2) == 0x05) && (*(p_buffer+6) == 0xE5)) 31 { 32 cmdFlag |= 0x02;//开门完成 33 printf("cmd: 0x02\n"); 34 } 35 if((*(p_buffer+2) == 0x05) && (*(p_buffer+6) == 0xE6)) 36 { 37 cmdFlag |= 0x04;//关门完成 38 printf("cmd: 0x02\n"); 39 } 40 } 41 memset(Rec_Uart_Buffer,0,UART_MAX_REC_LEN); 42 u0RecParameter.RecFlag = false; 43 u0RecParameter.Count = 0; 44 } 45 }
标签:新唐,set,N76E003AT20,void,u0RecParameter,串口,MCU,接收 From: https://www.cnblogs.com/qianmn/p/17729347.html