社区导航

 

搜索
查看: 3214|回复: 16

急啊!单片机串口通信程序问题!

[复制链接]

90

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:01 | 显示全部楼层 |阅读模式
急啊!单片机串口通信程序问题!
在keilC中编译通过,可是输出的只有“FDhb8000FDhb8000FDhb8000FDhb8000”。
我想要的结果是输出"MA20000"字符串后,延时120毫秒输出“FDhb8000”到串口。
这个程序怎么样修改才可以得到我所要的结果呢。
请高手指点一下。



#include
#define uint unsigned int
uint i,j;
unsigned char flag,a;
void delay(uint);
void main()
{
  
         TMOD=0x20;//设置定时器1为工作方式2
         TH1=0xfd;//波特率是9600
         TL1=0xfd;
         TR1=1;
         REN=1;
         SM0=0;
         SM1=1;
         EA=1;//中断模式开
         ES=1;
         while(1)
                 {
                 /*        if(RI==1)查询方式
                         {
                         RI=0;
                         P1=SBUF;
                         }*/
                         if(flag==1)
                                 {
                                         ES=0;
                                         flag=0;
                                         SBUF='M';//28;        字符串
                                         while(!TI);         
                                         TI=0;//定时器关
                                         SBUF='A';//28;         
                                         while(!TI);         
                                         TI=0;
                                         SBUF='2';//28;         
                                         while(!TI);         
                                         TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);         
                                     TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);
                                     TI=0;
                                     SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         ES=1;
                                 }
                                 
         while(1)
                 {
              if(flag==1)
                                 {
                                         ES=0;
                                         flag=0;
                                         SBUF='F';//28;        字符串
                                         while(!TI);         
                                         TI=0;//定时器关
                                         SBUF='D';//28;         
                                         while(!TI);         
                                         TI=0;
                                         SBUF='h';//28;         
                                         while(!TI);         
                                         TI=0;
                                         SBUF='b';//28;         
                                         while(!TI);         
                                     TI=0;
                                         SBUF='8';//28;         
                                         while(!TI);
                                     TI=0;
                                     SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         SBUF='0';//28;         
                                         while(!TI);
                                         TI=0;
                                         ES=1;
                                 }
         }
}
}
/*延时i毫秒*/
void delay(uint i)
{
uint j;
     while(i--)
     {
     for(j=120;j <125;j++)
     {}
     }
}
  
void ser() interrupt 4
{
         RI=0;
//        P1=SBUF;
         a=SBUF;
         flag=1;
}
  
  
在keilC中编译通过,可是输出的只有“FDhb8000FDhb8000FDhb8000FDhb8000”。
我想要的结果是输出"MA20000"字符串后,延时120毫秒输出“FDhb8000”到串口。

100

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:53 | 显示全部楼层
也就是说刚开始的时候,
if(flag == 1)
不满足。

然后被里面的while(1)给抓住了。



Lz觉得你的程序思路很清楚吗?

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:54 | 显示全部楼层
怎么两个都是 if(flag==1) 的判断?
至少有个if(flag==0)的吧。

回复

使用道具 举报

113

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:54 | 显示全部楼层
为什么要有2个while(1)?程序的逻辑有点不明白。你的DELAY函数用在哪里?
你的串口中断是用来干什么?输入一个a,但a体现在你的主程序中了吗?
一句话 你的编程能力要好好的加强了。我给你个程序吧,编译通过 由于附近没有开发板,无法显示,你自己去看看。

#include
#define uint unsigned int
#define uchar unsigned char
uchar a[7]={'M','A','2','0','0','0','0'};
uchar b[8]={'F','D','h','b','8','0','0','0'};
void delay(uint i)           //延迟nMS函数
{
  uint k;
  while(i--)
  for(k=0;k<120;k++){;}
}

void uini()           //串口初始化
{
  TMOD=0x20;
  TH1=0xfd;TL1=0xfd;
  TR1=1;
  SCON=0x50;
}

void main()
{
  uini();
  while(1)
  {
    uint i;
    for(i=0;i<7;i++)         //发送第一个字符串
    {
    SBUF=a;
    while(!TI);        
    TI=0;
    }
    delay(120);                        //延迟120ms

    for(i=0;i<8;i++)        //发送第二个字符串
    {
    SBUF=a;
    while(!TI);        
    TI=0;
    }
  }
}

回复

使用道具 举报

89

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:55 | 显示全部楼层
初始化的时候把flag初始化为1试试。

回复

使用道具 举报

92

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 19:56 | 显示全部楼层
把第二个字符串的a改成b我直接复制上面的 所以没改过来 你自己改下

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 23:34 | 显示全部楼层
谢谢大家!

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-29 23:48 | 显示全部楼层
思路还是有的!但就是实现的问题啊,以前没怎么研究过,所以还是希望大家指点一下。

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-30 00:17 | 显示全部楼层
回ele01
编译通过,但显示的时候FDhb8000MA20000

delay(120); //延迟120ms

    for(i=0;i <8;i++) //发送第二个字符串
    {
    SBUF=b;
    while(!TI);      
    TI=0;
    }
    delay(120); //延迟120ms

之后就正常了,是我希望的
1:先FDhb8000
2:延时120毫秒
3:再输出MA20000
最后就截止

回复

使用道具 举报

135

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-30 00:30 | 显示全部楼层
输出那么多字符干吗?刚开始越简单越好。
只需要输出一个字符,然后用
for(i=0;i<10000;i++);
实现最简单的延时。然后再将这个循环做成Delay函数,并精确之。
等掌握了基本方法,就可以尝试去学定时器中断了。

回复

使用道具 举报

91

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-30 10:20 | 显示全部楼层
引用 9 楼 shuiyan 的回复:
输出那么多字符干吗?刚开始越简单越好。
只需要输出一个字符,然后用
for(i=0;i <10000;i++);
实现最简单的延时。然后再将这个循环做成Delay函数,并精确之。
等掌握了基本方法,就可以尝试去学定时器中断了。


其实应该是字符串,因为要通过RS232通讯口控制驱动,指令格式如下
指令结构
驱动器采用ASCII 码指令与上位机通讯。
ASCII码指令的构成:
发送端:指令+(参数)+0x0D
回应端:#+数据+0x0D+0x0A
? 指令:仅使用字母的字符串;
? 参数:指令后为ASCII码数字,有些指令后面无参数;
? 结束符:发送端以0x0D(回车)结束,回应端以0x0D,0x0A(换行)结束;

是不是可以在uchar a[7]={'M','A','2','0','0','0','0'};
中这样设置
如下:
uchar a[7]={'M','A','2','0','0','0','0'','0','x','0','D',};
指令是MA,参数是20000,0x0D是结束符号。

回复

使用道具 举报

114

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-30 21:02 | 显示全部楼层
在此先谢谢大家的帮忙!目前问题已经有点眉目了!

有以下几个问题请教大家:
1:如果发送端:指令+(参数)+0x0D,程序中还需要怎么修改?因为最终输出要的是ASIIC码。
2:输出一组"MA20000",“F9608000,"M2880000"”字符串后将程序关闭。有没有好的操作办法?
3: 目前的输出是M2880000 MA20000 FD96000 间隔1200毫秒。理想输出MA200000 F9608000 M28800000x0D"




//要通过RS232通讯口控制驱动,指令格式如下
指令结构
驱动器采用ASCII 码指令与上位机通讯。
ASCII码指令的构成:
发送端:指令+(参数)+0x0D
回应端:#+数据+0x0D+0x0A
  指令:仅使用字母的字符串;
  参数:指令后为ASCII码数字,有些指令后面无参数;
  结束符:发送端以0x0D(回车)结束,回应端以0x0D,0x0A(换行)结束;

是不是可以在uchar a[7]={'M','A','2','0','0','0','0'};
中这样设置
如下:
uchar a[11]={'M','A','2','0','0','0','0'','0','x','0','D',};
指令是MA,参数是20000,0x0D是结束符号。


//程序要的结果是输出"MA20000"字“FD96000,"MD2880000x0D"”到串口。
//下面程序已经编译通过,在实验板上也通过了。

#include
#define uint unsigned int
#define uchar unsigned char
uchar a[7]={'M','A','2','0','0','0','0'};
uchar b[8]={'F','D','9','6','0','0','0','0'};
uchar c[12]={'M','D','2','8','8','0','0','0','0','x','0','D'};
void delay(uint i)  //延迟nMS函数
{
  uint k;
  while(i--)
  for(k=0;k <1200;k++){;}
}

void uini()  //串口初始化
{
  TMOD=0x20;
  TH1=0xfd;TL1=0xfd;
  TR1=1;
  SCON=0x50;
}

void main()
{
  uini();
  while(1)
  {
    uint i;
    for(i=0;i <7;i++) //发送第一个字符串
    {
    SBUF=a;
    while(!TI);     
    TI=0;
    }
    delay(1200); //延迟1200ms

    for(i=0;i <8;i++) //发送第二个字符串
    {
    SBUF=b;
    while(!TI);     
    TI=0;
    }
    delay(1200); //延迟1200ms
    for(i=0;i <12;i++) //发送第三个字符串
    {
    SBUF=c;
    while(!TI);     
    TI=0;
    }
    delay(1200); //延迟1200ms

  }

回复

使用道具 举报

132

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-31 14:25 | 显示全部楼层
LZ写的出现太麻烦了

回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-31 15:06 | 显示全部楼层
首先你的晶振是多少的?请确定。我下面这个是初始化的 16MHZ,stc5410AD单片机
void init_uart(void)
{
  ES    = 0;

  SCON  = 0x50; //8位数据位,没有奇偶校验
  TMOD  = 0x21;
  TH1 = 0x73;//2400
  TL1 = 0x73;
  TR1   = 1;               //启动定
  
  ES    = 1;
}
发送如下:
void Send_Byte( u8 byte)
{
        TI    = 0;
        SBUF  = byte;
        while( TI== 0)
        {
        }

        TI = 0;
}

回复

使用道具 举报

98

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-5-31 17:14 | 显示全部楼层
引用 13 楼 gyc198215 的回复:
首先你的晶振是多少的?请确定。我下面这个是初始化的 16MHZ,stc5410AD单片机
void init_uart(void)
{
ES    = 0;

SCON  = 0x50; //8位数据位,没有奇偶校验
TMOD  = 0x21;
TH1 = 0x73;//2400
TL1 = 0x73;
TR1   = 1;               //启动定

ES    = 1;
}
发送如下:
void Send_Byte( u8 byte)
{
TI    = 0;
SBUF  = byte;
while( TI== 0)
{
}

TI = 0;
}


我的晶振是11.0592MHZ,AT89S52单片机

回复

使用道具 举报

111

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-6-2 11:28 | 显示全部楼层
我这个程序加了一段发送回车键0x0D的程序,
void SendEndChar(void)
{
    SBUF=0x0D;
        while(TI==0){ }
        TI=0;
}
现在可以发送数据了,但为什么驱动那边还是不识别呢?
请高手指点一下。

回复

使用道具 举报

94

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2009-8-29 20:37 | 显示全部楼层
众位楼主,如果想要用    单片机实现液晶显示的方案可以跟我索取。  dwin99@live.cn

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-27 03:28 , Processed in 0.450816 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表