最近初学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,我检查过波特率,串口设置,硬件线路,应该是没什么问题的。
请教各位,这种情况是什么原因造成的,应该怎么处理?谢谢!第一帖。
补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。
引用: 引用 1 楼 cloy03 的回复:
补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。
首先,你这样去测试SBUF0是否写入是不对的,应该你读SBUF0是读了接收buf,而不是读发送buf。SBUF0虽然同名,但是,读和写,它们指向是不同地址而同名的SBUF0。你要判断是否写进去,是否发出,你只能去读发送是否完成的标志位。
还有,你说,仿真下很好,是什么意思,完全可以正常发送吗?你说的仿真是在全速run,还是单步呢?
如果写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
请教这是为什么啊,我已经纠缠了一天半了。
引用: 引用 2 楼 peasant_lee 的回复:
引用 1 楼 cloy03 的回复:
补充一下就是,写SBUF0以后,如果在后面再将它读出的时候,发现SBUF0的值一直是0,好像根本就没有写入。
首先,你这样去测试SBUF0是否写入是不对的,应该你读SBUF0是读了接收buf,而不是读发送buf。SBUF0虽然同名,但是,读和写,它们指向是不同地址而同名的SBUF0。你要判断是否写进去,是否发出,你只能去读发送是否完成的标志位。
恩,我明白这一点了。谢谢。不过现在的问题是我的串口依旧没法发出我想要发出的数据,这是为什么呢?
引用: 引用 3 楼 peasant_lee 的回复:
还有,你说,仿真下很好,是什么意思,完全可以正常发送吗?你说的仿真是在全速run,还是单步呢?
我说的 这“仿真”是不把程序下到板子上,只用KEIL的仿真器,然后点VIEW-SERIAL WINDOW-UART0看到的串口数据,而这个数据是我想要的。
但是下到板子,却不行。
SCON0 = 0X40; //串口选择方式1
楼主这句是说串口的吗?但你的ren没打开吧
引用: 引用 8 楼 hnhappy 的回复:
呵呵,新手请谅解,原来楼主没用中断啊
是啊,就用查询做的。谢谢啊。可是到现在都还没有解决啊。
貌似你一直都在发送,是不是没定义好那些停止位之类的,你能说一下你的板上串口现在是怎样配置的吗?就是数据多少位,起始,停止,校验位,都怎样设置?还有你上位机是怎样设置的?
还有你仿真是全速运行的吗?然后再去查看VIEW-SERIAL WINDOW-UART0里面的数据?
引用: 引用 11 楼 peasant_lee 的回复:
还有你仿真是全速运行的吗?然后再去查看VIEW-SERIAL WINDOW-UART0里面的数据?
是的。。谢谢你。根据你的说法,我已经找到错误所在了。是波特率的问题。