【N76E003AT20】新唐MCU使用记录

发布时间 2023-09-26 09:18:21作者: Qianm

  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 }