对嵌入式十分感兴趣,最近在研究uc/osII,正准备去买块简单的开发版呢,突然在论坛看到了MCU开发板DIY的通知,只希望能申请上,必定把我学习uc/osII的全过程与大家分享!!
祈祷中。。。
-------------------------------------------------------串口问题求解--------------------------------------------------
板子终于是焊好了,结果上电后发现电源短路,测试了好久才终于找到问题--电源线在电路板背面USB标示下面那一点和地连到一块了,此中的周折就不细说了吧。高兴地开始一个一个模块地测试,结果第一个串口就被难住了,而且是想了很多方法都解决不了,伤心呀...
说说我遇到的问题吧,强烈希望大家能给我提点意见,我实在是想不出我这板子的问题出在哪里。
(1)我的电路板能下载程序,这说明串口的基本功能应该没什么大问题。
(2)串口测试代码如下,这程序非常简单,串口波特率为9600,方式三 ,主程序的while循环中用串口反复发送0X11,0X22,0X33,发送过程中依次点亮几个LED指示一下, 当串口接收到第一个数据后停止主动发送,并将接收到的数据重新发送回去。
//串口测试代码
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag = 1;
uchar array[100] = 0;
sbit P17 = P1^7;
void Initial_uart(void)
{
TMOD = 0X20;//定时器一 自动装入
TL1 = 0XF9;//9600,24M
TH1 = 0XF9;
SCON = 0XD8;//方式三
PCON = 0X00;//波特率不加倍
TR1= 1;//启动定时器一
}
void delay( unsigned long i )
{
int j = 1000;
for( ;j > 0;j-- )
{
for( ;i > 0;i-- )
{
i++;
i--;
}
}
}
void serial(void) interrupt 4 using 2
{
if(RI == 1)
{
RI = 0;
array[89] = SBUF;
SBUF = array[89];
while( TI == 0 );
TI = 0;
flag = 0;
}
}
main()
{
uchar temp1 = 0x11;
uchar temp2 = 0x22;
uchar temp3 = 0x33;
EA = 1;//CPU开中断
ES = 1;//串口开中断
flag = 1;//
Initial_uart();
P1 = 0xff;
delay(500);
P1 = 0xfe;
while(1)
{
if(flag == 1)
{
SBUF = temp1;
while(TI==0);
P1 = ~0x01;
TI=0;
delay(50000);
SBUF = temp2;
while(TI==0);
P1 = ~0x02;
TI=0;
delay(50000);
SBUF = temp3;
while(TI==0);
P1 = ~0x04;
TI=0;
delay(50000);
}
delay(50000);
}
}
(3)程序运行起来后,LED闪烁正常且上位机能接收到数据,但是接收到的数据中间总会出现一些错误。例如接收到的数据如下:
11 22 33 11 22 33 11 22 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 73 11 22 33 11 22 33 11 22 33 11 22 33 1162 73 11 22 33 11 22 33 11 22 33 11 22 33 11 62 33 11 22 33 11 22 33
(4)我的分析:能收到数据,且数据绝大部分正确,数据个数也没有出现异常,这说明串口初始化应该没有错误,故排除软件的错误。但是硬件如果出问题,那为什么可以下载程序?问题可能出在哪里?请大家给我点建议,感激不尽!
---------------------------------------------------------------------------------------------------------------------------