打印

串口通信

[复制链接]
890|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
892953881|  楼主 | 2015-5-25 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用PIC16f1509  这段是串口通信接收部分,不知道为什么进不了接收中断里,但是我用16f877a却可以收到数据 ,我看了这两个IC异步串行寄存器没什么很大差别。
求教不知道为什么进不了中断。
void Uart_initial()                        //串口通信初始化4M晶振
{
        SPBRGH=0; //25;   //BR=115200
        SPBRGL=8; //25;   //BR=115200
TXSTA=0X26;                        //发送状态和控制寄存器  使能发送,波特率设置高速
RCSTA=0X90;                        //接收状态和控制寄存器        串口使能打开,连续接收使能开
        BAUDCON=0X88;                //波特率控制寄存器
        TRISB5=1;                //RB5作为串口通信的输入
        TRISB7=0;                //RB7作为串口通信的输出
         
        GIE=1;           //
        TXIF=0;
        PEIE=1;
        RCIE=1;           //USART 接收中断允许位,1=允许
       RCIF=0;
}


//接收中断
void interrupt isr()                       
{
    if(RCIF)                                                                //接收中断
    {
                  RCIF=0;
          if((RCREG=='O'||RCREG=='a')&&!RC_bit)                                //接收到起始位
          {
                 RC_bit=1;                                                //起始接收标志位置位
                  RC_cnt=0;
                   RC_buf[RC_cnt]=RCREG;
            }                        
            else
           {
                    if(RC_bit&&RC_cnt<35)                        //没有接收到末位标志位,并且之前有接收到起始位
                   {
                         RC_cnt++;
                         RC_buf[RC_cnt]=RCREG;
                         if(RCREG=='\n')                                                        //收到结束位
                         {
                             RS_flag=1;                                                        //接收完成
                             RC_bit=0;                                                        //存储标志位

                           }
                   }
                   else
                    {
                           RC_bit=0;                                //否则接收到的是干扰信号从新接收
                     }
          }
    }
}





沙发
yklstudent| | 2015-5-25 21:05 | 只看该作者
本帖最后由 yklstudent 于 2015-5-25 21:11 编辑

看看手册,引脚口模式设置数字口试试

使用特权

评论回复
板凳
892953881|  楼主 | 2015-5-25 21:57 | 只看该作者
yklstudent 发表于 2015-5-25 21:05
看看手册,引脚口模式设置数字口试试

:lol谢谢。确实这个我忘了。我以为PIC系列单片机都一样的,真是非常感谢

使用特权

评论回复
地板
892953881|  楼主 | 2015-5-25 21:59 | 只看该作者
yklstudent 发表于 2015-5-25 21:05
看看手册,引脚口模式设置数字口试试

我试试看先

使用特权

评论回复
5
892953881|  楼主 | 2015-5-26 23:11 | 只看该作者
yklstudent 发表于 2015-5-25 21:05
看看手册,引脚口模式设置数字口试试

问题已解决谢谢。!!!

使用特权

评论回复
6
yklstudent| | 2015-5-26 23:24 | 只看该作者
892953881 发表于 2015-5-26 23:11
问题已解决谢谢。!!!

解决就好,最好能把解决的办法说下就最好了

使用特权

评论回复
7
892953881|  楼主 | 2015-5-27 21:52 | 只看该作者
yklstudent 发表于 2015-5-26 23:24
解决就好,最好能把解决的办法说下就最好了

就是端口未配置成数字端口。

使用特权

评论回复
8
892953881|  楼主 | 2015-5-28 21:55 | 只看该作者
yklstudent 发表于 2015-5-26 23:24
解决就好,最好能把解决的办法说下就最好了

您好!继续请教个问题,还是用pic16f1509做串口通信,一下是一部分串口发送的子程序,和要发送的字符串数组。当我执行RS_send_char(AUTO_Link);这个时候,串口会不断地发送AUTO_Link这个字符串数组,但是当我用ICD3 Debug的时候实际是只执行一次,然后烧录程式后就是正常的发送一次。但是我每次打开程式不Debug的话直接烧录程式就一直在循环发送。在什么都不改动的情况下,只有Debug后才正常只发送一次。不明白是为什么。

char AUTO_Link[]="at+auto_connect\r\n";
       
void RS_send_char(char *p)                //字符串数组发送函数
{
        for(;*p!='\n';)
        {
                TXREG=*p;
                while(!TXIF);
                TXIF=0;
                p++;
        }
        TXREG='\n';
        while(!TXIF);
        TXIF=0;
}



使用特权

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

本版积分规则

13

主题

42

帖子

2

粉丝