打印

C8051F410单片机485通讯一直接收0

[复制链接]
7939|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gluebi|  楼主 | 2013-3-28 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机是SILICON的8051F410,MAX485芯片
代码和电路图如下,程序功能是当上位机通过串口有东西发下去时,单片机会进入接收中断返回对应的值
问题是我上位机还没发东西下去,单片机就不断返回给我SBUF0的值,而且都是0
一开始分析是485芯片A,B两点间按图中所连的电压差大于0.2V导致MAX485芯片RO输出为0,但是把R9去掉以后
还是一样不停接收0,求各位大牛看看到底问题出在哪里了,感激不尽
ps:是否需要给RX增加内部弱上拉?

#include <c8051F410.h>

#define SYSCLK 24500000
#define BAUDRATE 9600

unsigned char UART_Buffer[64];
unsigned char UART_Data=0;
unsigned char Byte;                          
unsigned char temp;
sbit comm=P0^7;
sbit LASER=P2^6;

//P0.4 digital push_pull UART TX
//P0.5 digital open_drain UART RX
void PORT_Init(void)
{
        //P2MDout=0x00;
        P0MDOUT|=0x90;          // Enable UTX as push-pull output
        XBR0=0X01;              // Enable UART on P0.4(TX) and P0.5(RX)   
        XBR1=0X40;              // Enable crossbar and weak pull-ups
}

void SYSCLK_Init (void)
{
        OSCICN=0X87;            // Configure internal oscillator for 24.5MHz
        RSTSRC=0X04;                        // Enable missing clock detector
}

// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
void UART0_Init(void)
{
        SCON0 = 0x10;                         // SCON0: 8-bit variable bit rate
                                                        // level of STOP bit is ignored
                                                        // RX enabled
                                                        // ninth bits are zeros
                                                        // clear RI0 and TI0 bits
        TH1 = 0x96;
        CKCON &= ~0x0B;
        TL1 = TH1;                                 // init Timer1
        TMOD &= ~0xf0;                         // TMOD: timer 1 in 8-bit autoreload
        TMOD |= 0x20;
        TR1 = 1;                                 // START Timer1
        IP |= 0x10;                                 // Make UART high priority

        ES0=1;
}

void UART0_Interrupt(void)interrupt 4
{
        //char i;

        if (RI0==1)
        {               
                RI0=0;       
                Byte=20;                                // Clear interrupt flag
                //temp=SBUF0;                        // Read a character from UART
                comm=0;
                LASER=0;
        }
}

void main(void)
{
        unsigned int i, j;


        PCA0MD &= ~0x40;              // WDTE = 0 (clear watchdog timer enable)
        PORT_Init();                         // Initialize Port I/O
        SYSCLK_Init ();                         // Initialize Oscillator
        UART0_Init();
       
        EA=1;
        temp=10;

        LASER=1;

        comm=0;
           UART_Data=0;

        UART_Data=14;
       

        Byte=1;
        comm=0;

        while(1)
        {               
                if(Byte==20)
                {
                        for (i=0; i<UART_Data; i++)
                        {
                                UART_Buffer=temp;
                        }
                         comm=1;
                        for(i=0;i<14;i++)
                        {                                                                           
                                SBUF0 = UART_Buffer;
                                while(!TI0);
                                TI0 = 0;                               
                        }
                        Byte=1;
                        comm=0;
                }
        }
}

相关帖子

沙发
gluebi|  楼主 | 2013-3-28 10:07 | 只看该作者
不小心在DIY区发了个相同的帖子,只要这贴解决了,那贴也给分

使用特权

评论回复
板凳
nino_1| | 2013-3-28 10:26 | 只看该作者
单片机没有程序时会有这种现象吗?

使用特权

评论回复
地板
gluebi|  楼主 | 2013-3-28 10:36 | 只看该作者
不会,单片机单独发送是没有问题的,但是接收就是有问题。。。

使用特权

评论回复
5
nino_1| | 2013-3-28 10:38 | 只看该作者
gluebi 发表于 2013-3-28 10:36
不会,单片机单独发送是没有问题的,但是接收就是有问题。。。

你的意思是如果上位机工作,收到的就是正常数据,不工作时还是会一直接收0?

使用特权

评论回复
6
gluebi|  楼主 | 2013-3-28 11:00 | 只看该作者
现在的情况是,不管我上位机发送不发送东西下去,单片机的接收SBUF都会不停收到0,然后产生中断

使用特权

评论回复
7
delin17| | 2013-3-28 11:33 | 只看该作者
请用示波器抓一下波形,就知道是那边的问题了。

使用特权

评论回复
8
xuyaqi| | 2013-3-28 13:08 | 只看该作者
485通信从软硬件都不等同于232通信,各方在不发送时一定要处于接收状态,而且发送前一定要确信总线处于闲置状态。楼主的问题估计下位机没处在接收状态。

使用特权

评论回复
9
gluebi|  楼主 | 2013-3-28 13:47 | 只看该作者
dwh000 发表于 2013-3-28 12:29
485是半双工,你做了方向控制了吗?

程序里的COMM就是控制通讯方向的,初始为0,485处于接收状态,接收完毕后置1,改为发送状态,发送完毕后,重新置0

使用特权

评论回复
10
gluebi|  楼主 | 2013-3-28 13:54 | 只看该作者
xuyaqi 发表于 2013-3-28 13:08
485通信从软硬件都不等同于232通信,各方在不发送时一定要处于接收状态,而且发送前一定要确信总线处于闲置 ...

肯定是处于接收状态的,因为我的程序只有进入接收中断以后才会让单片机回数据给上位机,我现在的问题是“单片机处于接收状态,上位机还没发送数据下去,单片机就会一直收到0”,而且我检查过寄存器设置,内部是弱上拉的
我检查过发送功能,单独的发送没有问题,数据不会出错,说明物理层连接没有问题
我的程序的功能是上位机发什么数据,下位机接收原数据后就再次返回给上位机,但是因为下位机不断接收0,所以返回给我上位机的信息都是错的
硬件上,我的MAX485,A,B两端分别做了上下拉,RO和DI没有上下拉

使用特权

评论回复
11
gluebi|  楼主 | 2013-3-28 14:00 | 只看该作者
xuyaqi 发表于 2013-3-28 13:08
485通信从软硬件都不等同于232通信,各方在不发送时一定要处于接收状态,而且发送前一定要确信总线处于闲置 ...

我确定410是处于接收状态的,但是上位机我用串口调试工具不发送数据下去,他自己会发送信息下去么?因为单片机接收到的是0,会不会是上位机的串口调试工具一直在发送NULL下去?

使用特权

评论回复
12
yklstudent| | 2013-3-28 15:37 | 只看该作者
上位机软件没有这么2吧 、多半还是下位机这边的问题
又或者是连接线的问题、

使用特权

评论回复
13
grandnie| | 2013-3-28 17:16 | 只看该作者
我之前也碰到过,MAX485芯片坏了,换个,现在市场上的MAX485芯片很多是假的,质量不保证。

使用特权

评论回复
评论
gluebi 2013-4-1 19:53 回复TA
最后解决的办法有两个:1.检查A,B线是否接对,检查通讯模块MAX485芯片是否供电正常 2.延长MAX485转换时的等待时间 
14
ningling_21| | 2013-3-28 17:20 | 只看该作者
示波器测试一下MCU-RX,TX波形,应该就知道了...

使用特权

评论回复
15
gluebi|  楼主 | 2013-3-28 20:46 | 只看该作者
grandnie 发表于 2013-3-28 17:16
我之前也碰到过,MAX485芯片坏了,换个,现在市场上的MAX485芯片很多是假的,质量不保证。
...

max485芯片坏了会只有发送可以,接收不可以?

使用特权

评论回复
16
gluebi|  楼主 | 2013-3-28 22:36 | 只看该作者
grandnie 发表于 2013-3-28 17:16
我之前也碰到过,MAX485芯片坏了,换个,现在市场上的MAX485芯片很多是假的,质量不保证。
...

还有个问题,485三条线,A,B,GND,GND要接么,我现在都没接GND

使用特权

评论回复
17
lark100| | 2013-3-28 23:55 | 只看该作者
需要接地!!

使用特权

评论回复
18
gluebi|  楼主 | 2013-3-29 15:44 | 只看该作者
dwh000 发表于 2013-3-29 07:49
485不需要接地,可以两线,传输,你用的什么485芯片啊?

MAX485,楼上一个说要接地,一个说不用。。。

使用特权

评论回复
19
yhhsky| | 2013-3-29 19:21 | 只看该作者

使用特权

评论回复
20
yhhsky| | 2013-3-29 22:38 | 只看该作者

使用特权

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

本版积分规则

11

主题

39

帖子

1

粉丝