关于C8051F020单片机串口通信的问题

youqing20000   2010-5-26 10:45 楼主
最近初学C8051,做串口通信时候写了如下程序。

#include


/************************************************
     函数:Timer1init
         功能: 定时器1初始化 作为波特率发生器 :9600
         说明:定时器1工作在8位自动重载模式下
*************************************************/
void Timer1init()
{
     CKCON  |= 0X00;                           //TIM=0    定时器1选用系统时钟/12
     TMOD    = 0X20;                                   //定时器1工作方式:8位自动重载的定时器
     TH1     = 0Xfd;                           //波特率9600
     TL1     = 0Xfd;
     ET1     = 0;                              //定时器1中断禁止  IE.3
     TR1     = 1;
}



/************************************************
    函数: UartInit
    功能: 串口初始化
*************************************************/
void UartInit()
{
     Timer1init();
     SCON0   = 0X40;             //串口选择方式1
     PCON    = 0x80;                     

}




unsigned char array[10]={200,0,200,0,200,0,200,0,200,0};
unsigned char i;

void main()
{       
   
        WDTCN = 0XDE;                                                                       
        WDTCN = 0XAD;                                   //禁止看门狗
        XBR0=0X04;
        XBR2=0X40;                                          //配置交叉开关
//        OSCICN |= 0X08;

        UartInit();
        Timer1init();
        for(i=0;i<10;i++)
                {
                        SBUF0=array;                                 //查询方式发送
                        while(!TI0);
                        TI0=0;
                       
                }
}





在KEIL上面仿真运行很好,但是下到板子上再用SSCOM看串口数据却出现问题:
1,串口数据是全0;
2,将串口的除地线以外的两跟线换位置以后,却没有数据发送。
3,直接将SBUF0写入数据,比如0X55,串口发送的却是F0
4,我检查过波特率,串口设置,硬件线路,应该是没什么问题的。



请教各位,这种情况是什么原因造成的,应该怎么处理?谢谢!第一帖。

回复评论 (12)

补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。
点赞  2010-5-26 10:50
引用: 引用 1 楼 cloy03 的回复:
补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。


首先,你这样去测试SBUF0是否写入是不对的,应该你读SBUF0是读了接收buf,而不是读发送buf。SBUF0虽然同名,但是,读和写,它们指向是不同地址而同名的SBUF0。你要判断是否写进去,是否发出,你只能去读发送是否完成的标志位。
点赞  2010-5-26 10:57
还有,你说,仿真下很好,是什么意思,完全可以正常发送吗?你说的仿真是在全速run,还是单步呢?
点赞  2010-5-26 10:58
如果写SBUF0=0X11;
则串口出现:
80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0C 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC C0 80 0C 0C 8C C0 C0 0C 0C 8E 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC C0 80 0C 0C 8C C0 C0 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0C 0C 8C C0 C0 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0C 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C 8C C0 80 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80 80 0C 0C 8C C0 C0 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC C0 80 0C 0C 8C C0 C0 0C 0C 8E 80 C0 0E 0C CC 80 80 0E 0C CC 80 80 0E 0C CC 80


请教这是为什么啊,我已经纠缠了一天半了。
点赞  2010-5-26 10:59
引用: 引用 2 楼 peasant_lee 的回复:
引用 1 楼 cloy03 的回复:
补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。


首先,你这样去测试SBUF0是否写入是不对的,应该你读SBUF0是读了接收buf,而不是读发送buf。SBUF0虽然同名,但是,读和写,它们指向是不同地址而同名的SBUF0。你要判断是否写进去,是否发出,你只能去读发送是否完成的标志位。



恩,我明白这一点了。谢谢。不过现在的问题是我的串口依旧没法发出我想要发出的数据,这是为什么呢?
点赞  2010-5-26 11:01
引用: 引用 3 楼 peasant_lee 的回复:
还有,你说,仿真下很好,是什么意思,完全可以正常发送吗?你说的仿真是在全速run,还是单步呢?



我说的 这“仿真”是不把程序下到板子上,只用KEIL的仿真器,然后点VIEW-SERIAL WINDOW-UART0看到的串口数据,而这个数据是我想要的。

但是下到板子,却不行。
点赞  2010-5-26 11:03
SCON0 = 0X40; //串口选择方式1
楼主这句是说串口的吗?但你的ren没打开吧
点赞  2010-5-26 14:11
呵呵,新手请谅解,原来楼主没用中断啊
点赞  2010-5-26 14:16
引用: 引用 8 楼 hnhappy 的回复:
呵呵,新手请谅解,原来楼主没用中断啊



是啊,就用查询做的。谢谢啊。可是到现在都还没有解决啊。
点赞  2010-5-26 17:08
貌似你一直都在发送,是不是没定义好那些停止位之类的,你能说一下你的板上串口现在是怎样配置的吗?就是数据多少位,起始,停止,校验位,都怎样设置?还有你上位机是怎样设置的?
点赞  2010-5-26 17:51
还有你仿真是全速运行的吗?然后再去查看VIEW-SERIAL WINDOW-UART0里面的数据?
点赞  2010-5-26 17:52
引用: 引用 11 楼 peasant_lee 的回复:
还有你仿真是全速运行的吗?然后再去查看VIEW-SERIAL WINDOW-UART0里面的数据?


是的。。谢谢你。根据你的说法,我已经找到错误所在了。是波特率的问题。
点赞  2010-5-27 09:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复