首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

求教一个C8051F310单片机的串口通信有关问题

2012-09-28 
求教一个C8051F310单片机的串口通信问题我刚开始接触单片机,做了一个程序,实现的功能就是从PC机上接收一个

求教一个C8051F310单片机的串口通信问题
我刚开始接触单片机,做了一个程序,实现的功能就是从PC机上接收一个字符串,然后就回发到PC机上,利用串口调试助手来发送和接收显示,但是做了好几天,都没找到毛病,希望有人能指教一下.程序如下:
//波特率为115200 
#include <c8051f310.h> 
#define uchar unsigned char
#define uint unsigned int 
#define MaxLen 100  
//---------------------------------------- 
//硬件地址 
//---------------------------------------- 
sbit LED1=P3^3;  
sbit LED2=P3^4;  
uint readflag=0;//读标志
uchar idata RxData[MaxLen]; //接收数据存放位置

//----------------------------------------- 
// 端口初始化 
// P0.4 - UART TX 
// P0.5 - UART RX 
//----------------------------------------- 
void PORT_Init (void) 

  P3MDOUT |= 0x18; // 使能 LED p3.3, p3.4为推挽输出 
  XBR0 = 0x01; // 交叉开关使能 UART P0.4(TX) and P0.5(RX) 
  XBR1 = 0x40; //使能交叉开关 

//----------------------------------------- 
// 系统时钟初始化 
//----------------------------------------- 
void SYSCLK_Init (void) 

  OSCICN |= 0x83; // 配置内部振荡器的的最大频率 1000 0011  
  RSTSRC = 0x04; // 使能始终丢失检测寄存器 

//----------------------------------------- 
// 串口初始化 
//----------------------------------------- 
void UART0_Init (void) 

  SCON0 = 0x10; //波特率可编程8位UART,UART接收允许  
  CKCON = 0x08; //定器1使用系统时钟(=0x08可将波特率设为115200,=00可将波特率设为9600)  
  TMOD = 0x20; //定时器1设为自动重装8位计数定时器 
  TH1=0X96; //为波特率装定时器初值 
  TL1=TH1;
  TR1 = 1; //起动定时器1  

//----------------------------------------- 
// 延时程序
//----------------------------------------- 
void Delayms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<200;j++);

//------------------------------------- 
//串口发送一个字节 
//------------------------------------- 
void Putchar(char c) 

  SBUF0=c; //发送一个字节 
  while(TI0==0); //等待发完一个字节 
  TI0=0; //清除发送中断标志 
  //readflag -=1;

//------------------------------------- 
//串口发送接收到的数据存储区中的字符串 
//------------------------------------- 
void Putsting(char *ptr) 

int i=0;
while(*(ptr+i) != '\0') //判断是否发完一个字符串 

Putchar(*ptr); 
ptr++; 
i++;
//LED1=1;
};

//LED1=~LED1;
}  
 
//---------------------- 
//系统初始化 
//--------------------- 
void sys_init(void) 

PCA0MD &= ~0x40; // 禁止看门狗 
PORT_Init(); // 初始化端口I/O 
  SYSCLK_Init (); //初始化系统时钟 
  UART0_Init(); //串口初始化 
ES0=1; //开串行中断 
TI0=0;
//TR0=1; 



//延时2秒后灯灭
LED1=1;
LED2=1;
Delayms(2000);
LED1=0;
LED2=0;

//----------------------------------------- 
// 串行中断服务程序 
//----------------------------------------- 
void UART0_ISR (void) interrupt 4 

uint i=0;
uchar temp_Tx;
if(RI0==1) 

RI0=0; //复位接收中断标志位 
temp_Tx=SBUF0; //接收数据到缓存 
//flag_Tx=1; //打开中断发数标志位 

  i++;
if(i > MaxLen-1)
{
i = 0;
}
  RxData[i]=temp_Tx;
readflag=1;

TI0=0; //复位发送中断标志位 


//----------------------------------------- 
// 主程序 
//----------------------------------------- 
  void main (void)  
  { 
  
sys_init();//初始化系统 
 


EA=1; //开总中断 
 
  while(1) 
  { 
if(readflag)
{
readflag=0;
Putsting(RxData); 
LED2=1;
}
 }  


[解决办法]
起码你自己要定位
是发送错误了,还是接收问题?
是没有显示,还是显示乱码?
是中断不进,还是进去不出来?
[解决办法]
波特率太高了吧、你调低点试试,19200试试
还有可能是开发板的问题
你可以找另外一块开发板来下载程序,看能不能通讯
还有你到底是什么问题,是不能不能接受还是不能显示。?
或者是收到乱码?

热点排行