打印
[技术问答]

新唐单片机串口接收问题

[复制链接]
2337|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
819109964|  楼主 | 2018-12-28 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用的一款新唐的单片机N76E003,串口能发数据,但是接收中断就是进不去,该怎么解决呢,求大神指导呀
void InitUart()
{         

    P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
        P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
       
        IE|=0X90;
    SCON = 0x50;             //UART0 Mode1,REN=1,TI=1
    TMOD |= 0x20;            //Timer1 Mode1
   
    set_SMOD;                //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;                //Serial port 0 baud rate clock source = Timer1

    TH1 = 256 - (1000000/BAUD+1);               /*16 MHz */

    set_TR1;

}
void InitTimer0()
{
        TMOD = 0X00;
        TIMER0_MODE1_ENABLE;                        //模式1: 16位定时器/计数器
//        TIMER1_MODE0_ENABLE;
   
        clr_T0M;                                                                        //T0M=0定时器1的时钟选择为1/12系统时钟
//        clr_T1M;
   
        TL0=-(FOSC/12/1000);
        TH0=-(FOSC/12/1000)>>8;         //赋初始值
//        TH1 = TH1_INIT;
//        TL1 = TL1_INIT;
   
        set_ET0;                                    //1 =使能由TF0 (TCON.5) 产生的中断
//        set_ET1;                                    //enable Timer1 interrupt
        set_EA;                                     //使能总中断
       
        set_TR0;                                    ////定时器0启动
//        set_TR1;
}
/********************************************************************************
*    定时器0中断函数
*********************************************************************************/
void Timer0_ISR (void) interrupt 1          //interrupt address is 0x000B
{
//    TH0 = TH0_INIT;
//    TL0 = TL0_INIT;
    TL0=-(FOSC/12/1000);
        TH0=-(FOSC/12/1000)>>8;         //赋初始值
        i++;
        if(i>=200)
        {
//        P12 = ~P12;
                i=0;                                                                                                                        // GPIO toggle when interrupt
        }
       
        /******串口接收是否成功判断****************************/
        TimeInterval++;
        if((TimeInterval>5)&&countnumber)
        {
                Rx_OK=1;
        }
        if(TimeInterval>6)
        {
                TimeInterval=0;
        }   
}
void SendData(unsigned char *output,unsigned char outlength)
{       
  //        ES=0;                //关闭串口中断
    while(outlength--)
        {
           TI=0;
           SBUF=*(output++);
           while(!TI);
           TI=0;
        }
//        ES=1;        //开串口接收中断   
}

/*********************************************************************************
函数名称:  UARTInterrupt
*输入参数:共 个参数;
*输出参数:共 个参数;
*返回值:                  无
*需储存的参数: 共 个参数
*功能介绍:
                串口中断接收函数
*修改日志:
*********************************************************************************/
void UARTInterrupt(void) interrupt 4 //using 0
{
        if(RI)
    {
                P12 = ~P12;
                if(Rx_OK==0)
                {
                    if(TimeInterval>=5)
                        {
                                countnumber=0;
                        }
                        ReceiveData[countnumber++]=SBUF;//将接收到的数据保存到缓冲区内       
                }
                TimeInterval=0;
                RI=0;
        //        ET1=1;                //当接收到数据后,将定时器1开启。
    }
           if(TI ==1) {
                clr_TI;
//                usart1_ti = 1;
        }
}
沙发
je段| | 2018-12-29 09:12 | 只看该作者
提示: 该帖被管理员或版主屏蔽
板凳
tianxj01| | 2018-12-29 15:58 | 只看该作者
很好用的啊,这是官方common.c提供的 官方UART0 MODE1 带中断的初始化函数,自己去对比一下有什么不同:
void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
{
                P06_Quasi_Mode;
                P07_Quasi_Mode;
       
    SCON = 0x52;     //UART0 Mode1,REN=1,TI=1
    TMOD |= 0x20;    //Timer1 Mode1
   
    set_SMOD;        //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;        //Serial port 0 baud rate clock source = Timer1


#ifdef FOSC_160000
    TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */
#endif           
#ifdef FOSC_221184
    TH1 = 256 - (1382400/u32Baudrate);              /*22.1184 MHz */
#endif
    set_TR1;
}

使用特权

评论回复
地板
xinpian101| | 2018-12-30 13:54 | 只看该作者
官方的例子就用的很好

使用特权

评论回复
5
yiyigirl2014| | 2018-12-30 16:57 | 只看该作者
6
wanduzi| | 2018-12-30 19:30 | 只看该作者
下载BSP,里面有个例子是中断的。

使用特权

评论回复
7
wakayi| | 2019-1-8 12:01 | 只看该作者
楼主确认已经发送数据了吗

使用特权

评论回复
8
huangcunxiake| | 2019-1-8 17:38 | 只看该作者
解决了吗

使用特权

评论回复
9
xuanhuanzi| | 2019-1-8 19:56 | 只看该作者
楼主今年还没来呢,看来问题解决了。多看官方例子和手册。注意例子的注释说明,可能有错误的。

使用特权

评论回复
10
xuanhuanzi| | 2019-1-8 21:53 | 只看该作者
void SerialPort1_ISR(void) interrupt 15 
{
    if (RI_1==1)
    {                                       /* if reception occur */
        clr_RI_1;                             /* clear reception flag for next reception */
        UART_BUFFER[u16CNT] = SBUF_1;
        u16CNT ++;
                                riflag =1;
    }
    if(TI_1==1)
    {
        clr_TI_1;                             /* if emission occur */
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝