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

enjoy21cn 2009-05-29 10:55:46
急啊!单片机串口通信程序问题!

编译没有通过,还没找出原因,请高手指点一下。
是不是程序结构有问题!请高手指点哈。在此谢谢大家啦!

/************************************************************************************************************
程序要的结果是输出"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(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;
}


}
}
/************************************************************************************************************
延时子程序
延时i毫秒


************************************************************************************************************/
void delay(uint i)
{
uint j;
while(i--)
{
for(j=120;j<125;j++)
{}
}
}
/************************************************************************************************************
子程序



************************************************************************************************************/
void init()
(
/* TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd; //波特率是9600
TL1=0xfd; //初值
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;//中断模式开
ES=1;*/
while( )
{
if(flag==1)
{
ES=0;
flag=0;
SBUF='MA480000';//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;
}
}

void ser() interrupt 4
{
RI=0;
// P1=SBUF;
a=SBUF;
flag=1;
}
...全文
193 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
longxiao881 2010-01-19
  • 打赏
  • 举报
回复
还是结构化的程序好理解
galle 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 dew2901 的回复:]
C/C++ code//下如何在帖子里加有颜色的代码//不要板砖哈,我是菜鸟
[/Quote]
呵呵呵!
dew2901 2010-01-13
  • 打赏
  • 举报
回复



//下如何在帖子里加有颜色的代码

//不要板砖哈,我是菜鸟



dew2901 2010-01-13
  • 打赏
  • 举报
回复
void send_str(uint8 str[])
{
uint8 i;
for(i=0;str[i]!='\0';i++)
{
send_char(str[i]);
}
}





void send_str(uint8 str[])
{
uint8 i;
for(i=0;str[i]!='\0';i++)
{
send_char(str[i]);
}
}

dew2901 2010-01-13
  • 打赏
  • 举报
回复


#include <reg52.h>


void main(void)
lxhhl258 2009-12-10
  • 打赏
  • 举报
回复
1. void init()之后是"{",而不是"("

2.void init()中的while()没有加入循环条件

所以编译是通不过的!
tcdzyq 2009-12-10
  • 打赏
  • 举报
回复

/*******************************************************

发送两个字符串,第一个发送完,延时120ms后发送第二个字符串

*******************************************************/

#include "reg52.h"

#ifndef uint8
#define uint8 unsigned char
#endif

#define pro_end() while(1)


void delay120ms(void)
{
uint8 i,j;
for(i=240;i!=0;--i)
for(j=240;j!=0;--j);
}

void src_init(void)
{

TMOD= 0x20; //设置定时器1为工作方式2
TH1 = 0xfd; //波特率是9600
TL1 = 0xfd; //初值
TR1 = 1; // timer 1 run
SCON =0x50;//方式1,允许中断
EA=1; //全局中断
}

void send_char(uint8 x)
{
SBUF = x;
while(!TI);
TI=0;
}

void send_str(uint8 str[])
{
uint8 i;
for(i=0;str[i]!='\0';i++)
{
send_char(str[i]);
}
}

main(void)
{
uint8 str1[]="MA20000";
uint8 str2[]="FDhb8000";
uint8 i;
src_init(); //初始化

send_str(str1); //发第一个字串
delay120ms(); //延时
send_str(str2); //发第二个字串

pro_end(); //结束
}

以上代码供参考,按楼主要求写的,用起来更灵活些.
hanshi001 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lxhhl258 的回复:]
1. void init()之后是"{",而不是"(" 

2.void init()中的while()没有加入循环条件

所以编译是通不过的!
[/Quote]

问题太多,但这是编译不过的主因。
tcdzyq 2009-12-10
  • 打赏
  • 举报
回复
呵呵,不少书写错误.而且如果直接按楼主代码改为可以编译过的,功能也不对.
给个思路吧,可以定义两个字符串,一个是"MA20000",另一个是“FDhb8000”,然后可以将字符串按字符发送,第一个发完延时发第二个,之后兜死循环停止.这样程序比较清晰些.
v1liuzhenkun 2009-06-03
  • 打赏
  • 举报
回复
为什么不用汇编!
lV运用 2009-06-03
  • 打赏
  • 举报
回复
程序太杂,多建立函数或过程
evanlee100 2009-05-31
  • 打赏
  • 举报
回复
不知道你的波特率定时器为什么要关来关去!
设置对了就不用操作定时器了.
shuiyan 2009-05-30
  • 打赏
  • 举报
回复
第一行少了个/
Delay函数和init函数都没调用,可以去掉。
flag一直为0,所以不可能出现flag==1的情况,那么if(...)里面执行不到。
如果将flag手动设为0,那么会一直循环打印MA200000MA200000MA200000

ok,说的很明显了,自己改吧。
贝隆 2009-05-30
  • 打赏
  • 举报
回复
帮顶

27,382

社区成员

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

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