7320|16

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51串口中断的问题 [复制链接]

刚接触单片机不久,想做一个串口收发的实验,可是 怎么也收不到数据,各位谁帮忙看看这段程序那里有问题呢?
#include
unsigned char rxbuf[8];
unsigned char  tx_count=0,rx_count=0,rx_temp;
void initUart()
{
        SCON=0x50;
        TMOD=0x20;
        PCON=0x80;
        TH1=0xf3;
        TL1=0xf3;
        TR1=1;
        ES=1;
        EA=1;
}
main()
{
        initUart();
        while(1)
        {
        if(rx_count==8)
                {
                   TI=1;
                   rx_count=0;
                }
         }
}         
void serial() interrupt 4         //串口中断
{
    if(TI)
    {                     
      if(tx_count < 8)
        {
                  
            SBUF = rxbuf[tx_count];
                        tx_count++;
        }
                       
            if(tx_count>=8)
                {
                        TI = 0;
                        tx_count=0;
        }       
    }
    if(RI)
    {

        rx_temp=SBUF;
                 if(rx_count < 8)
                          {
                rxbuf[rx_count]=rx_temp;
                rx_count++;
                           }       
        RI=0;
    }
}

最新回复

不懂,帮顶  详情 回复 发表于 2008-9-5 14:48
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的发送函数不对吧,在串口中断中应该写发送
if( tx_count < 8 )
{
    SBUF  =  rxbuf[ tx_count ];
    while( !TI );
    TI = 0;
    tx_count++;
}
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
还要多多试验inituart的配置才行。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
收到一个字节就要青标致位了啊

好准备收下一个字节
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 wanyeye 的回复:
收到一个字节就要青标致位了啊

好准备收下一个字节

RI我清0了呀
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习贴,感觉协议有点奇怪。
if(rx_count < 8)
  {
      rxbuf[rx_count]=rx_temp;
      rx_count++;
  }

当rx_count 大于或等于的时候楼主没有将其清0;当程序执行到
TI=1;的时候就进入了串口中断里面,这时候的rx_count 应该还是等于8的吧?
我也是新手,个人感觉是这有问题,楼主可以试下。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 wangjianqun 的回复:
引用 3 楼 wanyeye 的回复:
收到一个字节就要青标致位了啊

好准备收下一个字节

RI我清0了呀

我在main函数里清的0
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用错了 汗。。。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 1 楼 jennyvenus 的回复:
你的发送函数不对吧,在串口中断中应该写发送
if( tx_count < 8 )
{
    SBUF  =  rxbuf[ tx_count ];
    while( !TI );
    TI = 0;
    tx_count++;
}

还有这也是,要清标志位
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
我改了一下
if(rx_count==8)
{
  TI=1;
  rx_count=0;
}
改成
if(rx_count==8)
{  
  rx_count=0;
  TI=1;
}
有返回数据 比如我用PC端输入 01 02 03 04 05 06 07 08 正确应该回显和这个一样的数值,
可是却返回一堆80,而且是不停的发,没找到原因
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
void usart0_isr(void) interrupt 4 using 1
{
        unsigned char temp;
        SFRPAGE = 0;
        if(RI0)        //receive interrupt flag occur
        {
                RI0 = FALSE;       
                temp = SBUF0;

#if 1        //i could delete the routine for some season.
                if(usart0_receive_ok)
                {
                        return;        //discard the received data or send a error command
                                        //to report communication over-run
                }
#endif

                if(usart0_receiveing)
                {
               
                        if(usart0_received_len)//receive the data
                        {
                                usart0_recive_buf[usart0_received_length] = temp;
                                usart0_received_length++;
                                usart0_expect_receive_len--;
                                if(usart0_expect_receive_len==0)
                                {
                                        usart0_receive_ok = TRUE;
                                        USART_LED = LED_OFF;
                                }
                                return;
                        }
                        else        //receive the length for data
                        {
                                usart0_expect_receive_len = temp;
                                usart0_recive_buf[1] = temp;
                                usart0_received_length = 2;
                                usart0_received_len = TRUE;
                                return;
                        }
                }
       
                else if(temp == RECEIVE_BOOT_CODE)//receive boot code
                {
                        usart0_receiveing = TRUE;
                        usart0_recive_buf[0] = RECEIVE_BOOT_CODE;
                        USART_LED = LED_ON;
                        usart0_RS232_1s = 0;
                        return;
                }
                //return;        //discard the received data
        }
}


给你一段参考
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

12
 

        //send interrupt flag occur
        if(TI0)
        {
                TI0 = FALSE;
                if(usart0_sending)
                {
                        usart0_expect_send_len--;
                        if(usart0_expect_send_len > 0) //continue send data
                        {
                                usart0_sended_length++;
                                SBUF0 = usart0_send_buf[usart0_sended_length];
                                return;
                        }
                        else        //send over
                        {
                                if(usart0_current_command == USART0_CMD_SET_BAUT_RATE)
                                {
                                        set_usart0_baut_rate(*(usart0_recive_buf + 3));
                                }
                                usart0_sending = FALSE;
                                USART_LED = LED_OFF;
                                return;
                        }                       
                }
        }

发送部分


首先你要保证你配置没有问题, 另,进了就要清标志
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

13
 
再补充下

你的程序不够规范也,刚开始嘛, 最好先把流程画好, 再写代码,
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
先查硬件边接有没有问题,然后用现存的软件测试一下,再调试程序。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

15
 
TI没有清零,每发一个字节都需要清零。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 
tx_count=7时,执行发送,+1,此时tx_count=8,被if(tx_count>=8)判断,tx_count=0了。发送会引起的中断,在下一次进入时,由于tx_count=0,从而引起发个不停。
  if(TI)
    {
        TI = 0;
        if(tx_count < 8)    //是否发送结束
        {
            SBUF = rxbuf[tx_count];
            
        }
      
        tx_count++;
    }
在主程序中将tx_count清零比较好
while(1)
{
if(rx_count==8)
{  
   rx_count=0;
  tx_count=0;//增加这一句
   TI=1;
}
}  
接收部分是没有问题的。

 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

17
 
不懂,帮顶
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表