两个C8051f04x芯片的串口uart的通讯问题,请高手帮忙,我没啥分,只能感谢你了。。

chaengli   2008-5-19 08:37 楼主
这是我毕业设计的一部分,目前只是要求能有单片机a向b发送一个字节即可,剩下的就能整明白了,但是我的单片机b怎么也收不到信息呀。发送端只是发送一个字节,接受端节收到这个字节后将把字节显示在LCD1602上,程序源代码如下:(我现在不明白为什么接收不到,可能是因为时钟设置的有问题吧,请高手帮帮忙,我已经调试了一个礼拜了,还不好使)
//---------------------------------------------------
//发送端源代码:
//---------------------------------------------------
#include


//宏定义
#define uchar unsigned char
#define uint unsigned int
#define SYSCLK 3062500   
#define BAUDRATE 4800
#define SMODVAL 0
#define PCONVAL 0X00
#define TXVAL (256-SYSCLK*(SMODVAL+1)/BAUDRATE/384)

//定义全局变量
uchar one='a';


//--------------------------------------------------------------------------------
//延时函数
//--------------------------------------------------------------------------------
void Delay(int t)
{
        int i;
        int j;
        for(i=0;i         {
                for(j=0;j<100;)
                {
                        j++;
                }
        }
}
//-----------------------------------------------------------------------------
//端口初始化程序
//-----------------------------------------------------------------------------
void PORT_Init(void)  
{  
        XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100  
        XBR1 = 0x00;  
        XBR2 = 0x40; //交*开关使能  
        P0MDOUT  = 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011  
}  
//------------------------------------------------------------------------------
//串口初始化程序
//------------------------------------------------------------------------------
void UART0_Init(void)  
{  
        SCON0 = 0x50; //选择串口方式1,波特率可变 SCON0=0101,0000  
        TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器  
       
       
        ES0 = 1; //UART0中断开启  
        TR1 = 1; //启动定时器T1  
        PCON  |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1  
        TI0 = 1; //声明TX0就绪,可以发送  
       

        TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bps  
        TL1 = (int)TXVAL;  
        TR0 = 1;  
}
//-------------------------------------------------------------------------------
//发送一个字节程序
//-------------------------------------------------------------------------------
void Send_Char(uchar ch)
{
        SBUF0 = ch; //送入缓冲区
        while(TI0 == 0); //等待发送完毕
        TI0 = 0; //软件清零
}

//--------------------------------------------------------------------------------
//串口中断响应程序
//--------------------------------------------------------------------------------
void UART0_ISR(void) interrupt 4 using 1
{
        if(TI0==1) //中断标志 TI0=1 数据发送完毕
        {
                Delay(10);
                TI0=0;
                Delay(10);


        }
        return;

}
//--------------------------------------------------------------------------------
//主方法
//--------------------------------------------------------------------------------
main()
{

        WDTCN = 0xde; //禁止看门狗
        WDTCN = 0xad;
       
        SFRPAGE = CONFIG_PAGE;
        PORT_Init(); //端口初始化
        SFRPAGE = UART0_PAGE;
        UART0_Init(); //串口初始化
        EA = 1; //开全局中断
       
       
        SFRPAGE = LEGACY_PAGE;

        Delay(100);
        while(1)
        {
                Send_Char(one);               
                Delay(10);
        }
}
//--------------------------------------------------------------------------------
//程序结束
//--------------------------------------------------------------------------------
接受端的端口配置基本和a芯片相同,接收中断函数如下:
//--------------------------------------------------------------------------------
//串口中断响应程序
//--------------------------------------------------------------------------------
void UART0_ISR(void) interrupt 4 using 1
{
        uchar one;
        BYTE LCDOUT;

        if(RI0) //中断标志 RI0=1 数据完整接收
        {
                RI0 = 0; //软件清零
                one = SBUF0; //读缓冲
                LCDOUT=(BYTE)one;//
                Delay(1);
                lcd_wdat(LCDOUT);//显示字符在LCD1602上
                Delay(1);
        }
        while(1);

}

回复评论 (5)

建议调试步骤如下:
1. 先确认A和B的串口配置是否正确,引脚,波特率,数据位,校验位,停止位。
2. 先确认A有没有发出数据。方法:1)经过RS232电路转换,接到PC机,用串口工具看。2)用示波器抓波形。
3. 确认B能不能正确接收数据。方法: 经过RS232电路转换,接到PC机,用串口工具发送数据,B接收到数据后,控制某个IO口变化电压,以此判断。

PORT_Init()中,
    P0MDOUT  = 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口 0000,0011
什么意思?TX.RX都配成输出吗?如果是这样,那RX应该配置输入。
点赞  2008-5-19 10:01
同意楼上。先和上位机通信试试,如果能发送数据,那证明串口初始化已经成功。接收也就好做了。
点赞  2008-5-24 19:25
学习!!!
点赞  2008-9-11 14:22
RX0不能设置成推挽输出!
点赞  2008-9-11 17:25
欢迎大家到我的博客看看

http://c8051fmcu.blog.sohu.com
点赞  2008-9-13 16:17
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复