首先,别乱试MAX232周围的那四个电容,根据MAX232的数据说明书里规定这四个电容必须是1uF的,并且最好是带极性的电解电容(耐压至少16V以上)。
既然能进行ISP在线编程烧写程序进去,那说明硬件是没有问题。你的程序在开发板上实现过,但能确认开发板的串口电路和你现在用的ISP电路是一样的么?
还有,计算机上的串口接收软件也没设置好也收不到数据的!
如果怀疑是串口硬件电路的问题,可以做这样的实验,就是让把单片机拔出来,MAX232留着,PC上的串口发送数据,然后把原本接单片机TXD和RXD的两个数据引脚短路,看看PC上的接收软件是否能接收到直接发送并返回的数据,如果能成功,则证明串口硬件电路没问题。
串口通讯有的时候要求很多,你先实验一下能不能单片机只给PC发送数据。然后再试把数据从PC发下去,让单片机返回数据。
还有问题可以发百度HI的信息给我。
我的程序的一部分,供参考
//主流程
void
main(void)
{
//系统初始化
SCON
=
0x50;
//串口方式为1,SM2=
0,TB8=
1
PCON
=
0x80;
//
SMOD=1
TMOD
=
0x22;
//设定定时器0/1的工作模式为方式2
//设置T0中断的定时时间为1/7200毫秒
TH0
=
0x00;
TL0
=
0x00;
//设置异步串口的波特率
//TH1
=
0x0f4;
//OSC
=
110592MHz
bps
=
4800
SMOD=1
//TL1
=
0x0f4;
TH1
=
0x0fd;
//OSC
=
110592MHz
bps
=
19200
SMOD=1
TL1
=
0x0fd;
//设置中断优先级,T0中断为高优先级中断,其他为低优先级中断
IP
=
0x02;
//
设置中断优先级--T0为高优先级,其他低
ET0
=
1;
//定时器0中断
ES
=
1;
//串行接口中断
EA
=
1;
//系统中断允许
TR0
=
1;
//启动定时器0
TR1
=
1;
//串口接收中断处理程序
//发送采用查询处理
void
SerialComm(void)
interrupt
4
{
_pReceive[_cReceive]
=
SBUF;
_cReceive
++;
if(_cReceive
>=
RecBuffSize)
_cReceive
=
0;
RI
=
0;
}
//串口发送一个字节
//senddata:需要发送的数据
void
SendOneByte(unsigned
char
senddata)
{
ES
=
0;
TI
=
0;
SBUF
=
senddata;
while(TI
==
0);
TI
=
0;
ES
=
1;
}
1、用串口调试助手
2、用PC机通过串口控制8952让端口上的LED亮灭很简单,如只需发送0XFE内容,再让P0=SUBF就可让P0口上的一个LED灭。
3、若要实现双工方式,设置SCON=0X50,也就是让REN=1即可,
4、若要有语音提示,在主程序相应位置加一发音程序即可。
以上希望能帮到你。
同学你好,我来帮你,你可以使用串口啊,比如:1:给你一个从PC发给单片机数据后,单片机再原样发给PC的参考代码:2:将51某一个(引脚)按键0,1状态,发给PC;
1::::::::::::::
#include <REG52H>
bit Flag;
unsigned int R_D,S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void main (void) {
usart_init(void); ///串口初始化
while(1)
{
if (Flag==1)
{
SBUF = S_D; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
Flag=0;
}
}
}
}
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
R_D = SBUF; //SUBF接受/发送缓冲器
S_D=R_D;///////返回PC发送
Flag=1;
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
2:::::::::::::
#include <REG52H>
sbit p34=P3^4;////////定义一个按键
bit Flag=1;
unsigned int S_D;
unsigned char i;
void usart_init(void); ///串口初始化
void delay (unsigned int Z) ; //延时程序 Z倍 MS
void key_p34(void) ; /////按键检
void main (void) {
usart_init(void); ///串口初始化
key_p34(void) ; ////上电后检测一次按键的状态
if (Flag==1)//上电后发送一次按键的状态
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
while(1)
{
key_p34(void) ;
if (Flag==1)
{
SBUF =1; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
else
{
SBUF =0; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI);// 等特数据传送(TI发送中断标志)
TI = 0;// 清除数据传送标志
}
}
}
void usart_init(void)///串口初始化
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xF3;// //baud2 / 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void delay (unsigned int Z)//延时程序 Z倍 MS
{
unsigned int x,y;
for(x=Z;x>0;x--)
for(y=110;y>0;y--) ;
}
void key_p34(void) /////按键检测
{
if(p34==0)
{ delay(10);
if(p34==0)
{
while(!p34) ;/////等待按键松手
Flag=0;
}
}
}
不懂得欢迎交流
以上就是关于51单片机与电脑通信中电脑接收不到信息全部的内容,包括:51单片机与电脑通信中电脑接收不到信息、C51单片机如何从PC机串口接收字符串、51单片机与PC机的串口通讯设计的一个问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)