Testboard

Testboard

小组等级:     E币:187  (E币换礼)

#1楼主:代码不到20行的串口程序,但调试很郁闷,好心人路过,帮个忙

文章发表于:2009-06-23 06:56

代码不到20行的串口程序,但调试很郁闷,好心人路过,帮个忙

 

最近做东西的时候遇到个问题,就是想实现一段程序(这个程序以前已实现过),从串口调试工具发送以字节的数据,让单片机接收,然后在让他返回过来,现在的情况就是返回个数字没问题,就是单片机接收不到,以下是不已修改过的程序,有高手帮我看看,在线等着,还有就是单片机向串口调试发送数据的时候,我在串口调试上按“打开串口”,“关闭串口”,会发生接收来的数字变了,然后我在打开关闭几次,显示的数字才会正常,怪了
void UartInit(void)
{
SCON=0x50;        //方式1,充许接收
TMOD=0x20;       //T/C1方式2定时         
TH1=0xFD;         //波特率9600,Fosc=11.0592MHz
TL1=0xFD;
TR1=1;             //
}
/***********************************/
void send(unsigned char send_data)
{
SBUF=send_data;
while(!TI)   ;
TI=0;
}
/**********************************/
unsigned char rev(void)
{
while(!RI)   ;
return SBUF;
RI=0;
}
/*********************************/
void main(void)
{
unsigned char temp;
UartInit();
while(1)
   {                    //最简单的用查询的方式发送和接收数据。
   temp=rev();   //串口调试助手发送一数据至单片机
   send(temp);    //返回数据给串口调试助手。
   }
}

norman33

   小组等级:     E币:157  (E币换礼)

#2

文章发表于:2010-01-04 16:01

楼主的代码很有问题

首先在我的keil里面如果仅仅include<reg52.h>的话是不能直接操作SCON的只能操作SM0 SM1等,其实接收的时候你并没有查询数据收到的RI状态而是在REV里面死等,同时REV的也没定义返回参数就用return了。等等还有不少小问题。我发一个我调试成功最简单的串行代码给楼主,望楼主仔细比对找出问题。

#include <reg52.h>

#define uchar unsigned char

uchar date_in;
bit date_in_flag;

void inicom();
void initimer();

void main()
{
inicom();
initimer();
 while(1)
  {
  if (date_in_flag == 1)
    {
  ES= 0;
  date_in_flag= 0;
  REN= 0;
  SBUF= date_in;
    while(!TI);
  REN= 1;
  TI= 0;
  ES= 1;
  }
  }

}

void inicom()
{
PCON&=0x7f;  //开串行中断并设置波特率为9600
SM0=0;
SM1=1;
REN=1;
ES=1;
}

void initimer()
{
TMOD=0x20;   //定时器1,工作在mode2,预置位0xfa,开总中断和定时器中断
TL1=0xfd;
TH1=0xfd;
EA=1;
TR1=1;
}

 

void com() interrupt 4
{
P1=SBUF;
date_in=SBUF;
date_in_flag=1;
RI=0;
}

这套代码简单的接受串行传来的数据并发送回pc,在keil u2+串行调试助手执行成功。晶振11.0592MHz

xixu2008

   小组等级:     E币:111  (E币换礼)

#3

文章发表于:2009-10-25 15:16

我最近也在弄串口通讯,也挺头疼的。电脑应该收到CHINA这个字符串,但每次都是收到一个C,你也顺便帮我看看吧啊。

#include<reg52.h>
char *p;
char flag;
static int num;
void main()
{ num="0";
 p="CHINA"; 
 TMOD=0x20;   //定义定时器1工作方式为2
 TH1=0xfd;
 TL1=0xfd;    // 给定时器赋初值,使其波特率为9600  
 EA=1;        //开总中断   
 ES=1;        //打开串口中断 
 ET1=1;       //允许定时器1中断 
 TR1=1;     //定时器1开始计时 
 SM0=0;   
 SM1=1;     //选择串口为方式1 
 REN=1;     // 允许串行接受  
 SBUF=*p;  //传第一个数据
 while(1)  ;
}
void chuan() interrupt 4
{
   TI="0";  //关闭中断标志
   flag="SBUF"; 
   if(flag=='\0')
     ES="0";
 else
 {  //指针后移一个
 p++;
 SBUF=*p;  //传送下一个数据
 }
}

Testboard

   小组等级:     E币:187  (E币换礼)

#4

文章发表于:2009-06-23 12:43

唉,没人顶,自己顶下先

Total , Page /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

所有小组精华文章