4861|16

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急啊!单片机串口通信程序问题! [复制链接]

急啊!单片机串口通信程序问题!
在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”到串口。

最新回复

众位楼主,如果想要用    单片机实现液晶显示的方案可以跟我索取。  dwin99@live.cn   详情 回复 发表于 2009-8-29 20:37
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
也就是说刚开始的时候,
if(flag == 1)
不满足。

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



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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么两个都是 if(flag==1) 的判断?
至少有个if(flag==0)的吧。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
为什么要有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;
    }
  }
}
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
初始化的时候把flag初始化为1试试。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
把第二个字符串的a改成b我直接复制上面的 所以没改过来 你自己改下
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢大家!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
思路还是有的!但就是实现的问题啊,以前没怎么研究过,所以还是希望大家指点一下。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

9
 
回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
最后就截止
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

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

回复

60

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 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是结束符号。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
在此先谢谢大家的帮忙!目前问题已经有点眉目了!

有以下几个问题请教大家:
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

  }
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

13
 
LZ写的出现太麻烦了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
首先你的晶振是多少的?请确定。我下面这个是初始化的 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;
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 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单片机
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
我这个程序加了一段发送回车键0x0D的程序,
void SendEndChar(void)
{
    SBUF=0x0D;
        while(TI==0){ }
        TI=0;
}
现在可以发送数据了,但为什么驱动那边还是不识别呢?
请高手指点一下。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
众位楼主,如果想要用    单片机实现液晶显示的方案可以跟我索取。  dwin99@live.cn
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
直播报名最后1周:艾迈斯欧司朗 OSP 开放协议,从氛围灯动态照明到传感器交互融合
直播时间:4月22日(周二)10:00
直播奖励:京东卡、蓝牙温湿度计、定制水杯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 3

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表