MS-51 串口通讯
字体: 小 中 大 | 打印 发表于: 2008-9-29 21:28 作者: wumingfulin 来源: proteus仿真社区
大家帮我看看这个程序有什么问题吗?
什么没有接收到四个字节啊?
#include <reg52.h>
#define Write 0x57
#define Read 0x52
#define len 4 //BUFF1缓冲区长度
#define len2 5 //BUFF2缓冲区长度
// --------------------------------------------------------------------------------------------------------------------
bit ture = 1;
bit felse = 0;
bit inbufsign; //BUFF1缓冲区非空标志 有=1,空=0
bit inbuffer; //BUFF1缓冲区满标志 满=1,非满=0
bit read_flag=0; //取数标志位
// --------------------------------------------------------------------------------------------------------------------
static int k=0;
unsigned int strlen;
unsigned char idata inbuf[len];
unsigned char idata *inlast=inbuf;
unsigned char idata *getlast=inbuf;
unsigned char *str;
unsigned char idata inbuf2[len2];
unsigned char idata c,c1;
// --------------------------------------------------------------------------------------------------------------------
void UART_init()
{
SCON =0x50; //选择串口工作方式,打开接收允许
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
// --------------------------------------------------------------------------------------------------------------------
void one_char(unsigned char ch)
{
SBUF = ch;
// while (TI == 0);
TI = 0;
}
// --------------------------------------------------------------------------------------------------------------------
void char_string(unsigned char *ch, unsigned char size)
{
unsigned char i;
for(i = 0; i < size; i++)
{
//if(ch == '\0') break;
one_char(*(ch+i));
}
}
// --------------------------------------------------------------------------------------------------------------------
void com_interrupt() interrupt 4 using 3
{
if(RI)
{
RI=0;
inbuf[k] = SBUF; //放入数据
k++;
if(k == 4)
{
char_string(inbuf,k);
k = 0;
}
SBUF = inbuf[k]; //放入位置加1
}
}
// --------------------------------------------------------------------------------------------------------------------
void main(void)
{
UART_init();
char_string(inbuf,9);
}

最新回复
budhy (2008-9-29 21:55:46)
QUOTE:
试一试:CODE:
#include
#define len 4 //BUFF1缓冲区长度
unsigned char idata inbuf[len];
// --------------------------------------------------------------
void UART_init()
{
SCON =0x50; //选择串口工作方式,打开接收允许
TMOD =0x21; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfd; //实现波特率9600(系统时钟11.0592MHZ)
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
// --------------------------------------------------------------
void one_char(unsigned char ch)
{
SBUF = ch;
while (!TI);
TI = 0;
}
// --------------------------------------------------------------
void char_string(unsigned char *ch, unsigned char size)
{
unsigned char i;
for(i = 0; i < size; i++) one_char(*(ch+i));
}
// --------------------------------------------------------------
void com_interrupt() interrupt 4 using 3
{
static int k=0;
if (RI)
{
RI=0;
inbuf[k++] = SBUF; //放入数据
if(k == 4)
{
char_string(inbuf,k);
k = 0;
}
}
}
// --------------------------------------------------------------
void main(void)
{
UART_init();
while (1);
}
sddp001 (2008-9-30 12:29:37)