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

enjoy21cn 2009-05-29 07:01:27
急啊!单片机串口通信程序问题!
在keilC中编译通过,可是输出的只有“FDhb8000FDhb8000FDhb8000FDhb8000”。
我想要的结果是输出"MA20000"字符串后,延时120毫秒输出“FDhb8000”到串口。
这个程序怎么样修改才可以得到我所要的结果呢。
请高手指点一下。



#include <reg52.h>
#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”到串口。
...全文
858 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
enjoy21cn 2009-06-02
  • 打赏
  • 举报
回复
我这个程序加了一段发送回车键0x0D的程序,
void SendEndChar(void)
{
SBUF=0x0D;
while(TI==0){ }
TI=0;
}
现在可以发送数据了,但为什么驱动那边还是不识别呢?
请高手指点一下。
enjoy21cn 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 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;
}
[/Quote]

我的晶振是11.0592MHZ,AT89S52单片机
gyc198215 2009-05-31
  • 打赏
  • 举报
回复
首先你的晶振是多少的?请确定。我下面这个是初始化的 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;
}
mlcabcd 2009-05-31
  • 打赏
  • 举报
回复
LZ写的出现太麻烦了
shuiyan 2009-05-30
  • 打赏
  • 举报
回复
输出那么多字符干吗?刚开始越简单越好。
只需要输出一个字符,然后用
for(i=0;i<10000;i++);
实现最简单的延时。然后再将这个循环做成Delay函数,并精确之。
等掌握了基本方法,就可以尝试去学定时器中断了。
enjoy21cn 2009-05-30
  • 打赏
  • 举报
回复
回ele01
编译通过,但显示的时候FDhb8000MA20000

delay(120); //延迟120ms

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

之后就正常了,是我希望的
1:先FDhb8000
2:延时120毫秒
3:再输出MA20000
最后就截止
enjoy21cn 2009-05-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shuiyan 的回复:]
输出那么多字符干吗?刚开始越简单越好。
只需要输出一个字符,然后用
for(i=0;i <10000;i++);
实现最简单的延时。然后再将这个循环做成Delay函数,并精确之。
等掌握了基本方法,就可以尝试去学定时器中断了。
[/Quote]

其实应该是字符串,因为要通过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是结束符号。
enjoy21cn 2009-05-30
  • 打赏
  • 举报
回复
在此先谢谢大家的帮忙!目前问题已经有点眉目了!

有以下几个问题请教大家:
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 <reg52.h>
#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[i];
while(!TI);
TI=0;
}
delay(1200); //延迟1200ms

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

}
enjoy21cn 2009-05-29
  • 打赏
  • 举报
回复
思路还是有的!但就是实现的问题啊,以前没怎么研究过,所以还是希望大家指点一下。
enjoy21cn 2009-05-29
  • 打赏
  • 举报
回复
谢谢大家!
ele01 2009-05-29
  • 打赏
  • 举报
回复
把第二个字符串的a[i]改成b[i]我直接复制上面的 所以没改过来 你自己改下
zyzhang365 2009-05-29
  • 打赏
  • 举报
回复
初始化的时候把flag初始化为1试试。
ele01 2009-05-29
  • 打赏
  • 举报
回复
为什么要有2个while(1)?程序的逻辑有点不明白。你的DELAY函数用在哪里?
你的串口中断是用来干什么?输入一个a,但a体现在你的主程序中了吗?
一句话 你的编程能力要好好的加强了。我给你个程序吧,编译通过 由于附近没有开发板,无法显示,你自己去看看。

#include <reg52.h>
#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[i];
while(!TI);
TI=0;
}
delay(120); //延迟120ms

for(i=0;i<8;i++) //发送第二个字符串
{
SBUF=a[i];
while(!TI);
TI=0;
}
}
}
shuiyan 2009-05-29
  • 打赏
  • 举报
回复
怎么两个都是 if(flag==1) 的判断?
至少有个if(flag==0)的吧。
zyzhang365 2009-05-29
  • 打赏
  • 举报
回复
也就是说刚开始的时候,
if(flag == 1)
不满足。

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



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

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧