单片机与pc的串口发送和接收问题,求大神帮助编写个程序。或是看看我的程序的问题。 5
求大神编写一个程序:要求如下,波特率19200发送8位数据加1位停止位,能从单片机发送16进制的数据(比如0x01等),上位机可以接收(一般的计算机的串口调试助手软件能接...
求大神编写一个程序:要求如下,波特率19200 发送8位数据加1位停止位,能从单片机发送16进制的数据(比如0x01等),上位机可以接收(一般的计算机的串口调试助手软件能接收到数据),并且能够接收从上位机发送出来的数据。程序拿c语言比编写。谢谢了 ,必有重谢!!!对了是51系列的单片机。平常发送的也是16进制的数。程序如下:
#include <REG52.H>
#include <stdio.h>
void delay(unsigned int i); //函数声明
//char code MESSAGE[]= "RS232 ,请使用串口调试助手: ";
unsigned char a;
unsigned int x; //发送开关
unsigned int y; //接收开关
unsigned char BEEP;
unsigned char b;
void main (void)
{
SCON=0x50; //REN=1允许串行接受状态,串口工作模式3
TMOD=0x20; //定时器工作方式2
PCON=0x80; //波特率提高一倍
TH1=0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
// TH1=0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1=0xFD;
TR1=1; //开启定时器1
ES=1; //开串口中断
EA=1; // 开总中断
// IE = 0x0;
x=1;y=0;
if(x)
{
delay(10000);
P2=0x00;
a=P1;
a=~a;P2=a;
if(a!=0)
{
SBUF=a; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(TI==0); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
}
delay(1000);
x=0; y=1;
}
jieshou:if(y)
{
while(RI) //RI接受中断标志
{ //清除RI接受中断标志
b=SBUF; //SUBF接受/发送缓冲器
RI=0;
}
if(b)
{ BEEP=b;
// TI=1; //置SBUF空
switch(BEEP)
{
case 0x01:P0=0x01;delay(10000);TI=0;P2=0x00;break;//
case 0x02:P0=0x02;delay(10000);TI=0;P2=0x00;break;//
case 0x03:P0=0x03;delay(10000);TI=0;P2=0x00;break;//
case 0x05:P0=0x05;delay(10000);TI=0;P2=0x00;break;//
case 0x06:P0=0x06;delay(10000);TI=0;P2=0x00;break;//
case 0x07:P0=0x07;delay(10000);TI=0;P2=0x00;break;//
default:P0=0xff;delay(10000);TI=0;P2=0x00;delay(10000);break;
}
x=1;y=0; }
else goto jieshou;
}
}
void delay(unsigned int i) //延时程序
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--) ;
} 展开
#include <REG52.H>
#include <stdio.h>
void delay(unsigned int i); //函数声明
//char code MESSAGE[]= "RS232 ,请使用串口调试助手: ";
unsigned char a;
unsigned int x; //发送开关
unsigned int y; //接收开关
unsigned char BEEP;
unsigned char b;
void main (void)
{
SCON=0x50; //REN=1允许串行接受状态,串口工作模式3
TMOD=0x20; //定时器工作方式2
PCON=0x80; //波特率提高一倍
TH1=0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
// TH1=0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1=0xFD;
TR1=1; //开启定时器1
ES=1; //开串口中断
EA=1; // 开总中断
// IE = 0x0;
x=1;y=0;
if(x)
{
delay(10000);
P2=0x00;
a=P1;
a=~a;P2=a;
if(a!=0)
{
SBUF=a; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(TI==0); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
}
delay(1000);
x=0; y=1;
}
jieshou:if(y)
{
while(RI) //RI接受中断标志
{ //清除RI接受中断标志
b=SBUF; //SUBF接受/发送缓冲器
RI=0;
}
if(b)
{ BEEP=b;
// TI=1; //置SBUF空
switch(BEEP)
{
case 0x01:P0=0x01;delay(10000);TI=0;P2=0x00;break;//
case 0x02:P0=0x02;delay(10000);TI=0;P2=0x00;break;//
case 0x03:P0=0x03;delay(10000);TI=0;P2=0x00;break;//
case 0x05:P0=0x05;delay(10000);TI=0;P2=0x00;break;//
case 0x06:P0=0x06;delay(10000);TI=0;P2=0x00;break;//
case 0x07:P0=0x07;delay(10000);TI=0;P2=0x00;break;//
default:P0=0xff;delay(10000);TI=0;P2=0x00;delay(10000);break;
}
x=1;y=0; }
else goto jieshou;
}
}
void delay(unsigned int i) //延时程序
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--) ;
} 展开
3个回答
展开全部
我擦 直接下个串口调试助手 不是省事了
更多追问追答
追问
我知道,那是pc端的,我说的是单片机这端的 谢谢!
追答
哦。。飘过 现在没心情写程序。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
某例程(自发送接收),剩下的自己该吧。
#include <REG52.H>
sbit BEEP = P1^4;
bit Flag;
unsigned int ReData,SenData;
void main (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
BEEP=1;
// IE = 0x0;
while(1)
{
if (Flag==1)
{
SBUF=SenData; //SUBF接受/发送缓冲器
while(TI==0);
TI=0;
Flag=0;
}
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
Flag=1;
}
}
#include <REG52.H>
sbit BEEP = P1^4;
bit Flag;
unsigned int ReData,SenData;
void main (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
BEEP=1;
// IE = 0x0;
while(1)
{
if (Flag==1)
{
SBUF=SenData; //SUBF接受/发送缓冲器
while(TI==0);
TI=0;
Flag=0;
}
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
Flag=1;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我认为你的程序既然开了串口中断,就要加上中断处理程序,在中断处理程序中对串口进行操作,现在你的程序是轮询的模式,一旦发生发送字节或接收字节完成事件,主函数里的while根本拦不住,中断会立即触发,但是你的向量表里没有处理函数,大概程序就会复位了。建议ES=0。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询