单片机新手急求各位帮忙:51串口通信,直接赋值为什么不能正常发送?
时间:10-02
整理:3721RD
点击:
这段程序可以实现51单片机串口查询法接收发送数据,需要的是芯片有数据接收。我想要的功能是直接给接收寄存器SBUF赋值,比如0x01,相当于省去数据接收的步骤,直接赋值,然后发送。各位大神们请问该怎么修改这段程序?
#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
void send_char(unsigned char txd);
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=TL1=0xFD; // 波特率9600
SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON =0x00; // 波特率不倍增
TR1 = 1; // 启动定时器1
while(1)
{
if(RI==1) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
我修改的程序如下,现象是不发送。
#include <reg52.h>
#include <intrins.h>
unsigned int i;
unsigned char adata[]={0x01,0x02};
void send_char(unsigned int txd);
void main()
{
int txd;
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=TL1=0xFD; // 波特率9600
SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON =0x00; // 波特率不倍增
TR1 = 1; // 启动定时器1
switch (0)
{
case 0:
{
for(i=0;i<1;i++)
{
txd = adata[i];
send_char(txd);
} // 回传接收到的数据
}
break;
}
}
void send_char(unsigned int txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
你好,我想问一下,我按照你你说的改了程序。但是通过串口可以看到发回来的数据是乱码,并且不断循环。我想要的是能正确发送单个的数据就行,拜托了!
你好,现在我的程序可以单纯发送想要的数据了,但是每次都会把上次的程序中数据先写一遍,才执行本次程序。这是什么原因呢?拜托!
#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
void send_char(unsigned char txd);
main()
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=TL1=0xFD; // 波特率9600
SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON =0x00; // 波特率不倍增
TR1 = 1; // 启动定时器1
while(1)
{
if(RI==1) // 是否有数据到来
{
RI = 0;
tmp = SBUF; // 暂存接收到的数据
P0 = tmp; // 数据传送到P0口
send_char(tmp); // 回传接收到的数据
}
}
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
我修改的程序如下,现象是不发送。
#include <reg52.h>
#include <intrins.h>
unsigned int i;
unsigned char adata[]={0x01,0x02};
void send_char(unsigned int txd);
void main()
{
int txd;
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1=TL1=0xFD; // 波特率9600
SCON = 0x50; // 设定串行口工作方式1 允许接收,相当于下面三句
//SM0=0;
//SM1=1;
//REN=1;
PCON =0x00; // 波特率不倍增
TR1 = 1; // 启动定时器1
switch (0)
{
case 0:
{
for(i=0;i<1;i++)
{
txd = adata[i];
send_char(txd);
} // 回传接收到的数据
}
break;
}
}
void send_char(unsigned int txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
错误就在switch(0)语句;你要用while(1)循环,这样就不会在程序运行的时候每次都配置串口和定时器,在while(1)循环里你只需要调用send_char(0x01);就可以一直发送了
你好,我想问一下,我按照你你说的改了程序。但是通过串口可以看到发回来的数据是乱码,并且不断循环。我想要的是能正确发送单个的数据就行,拜托了!
你好,现在我的程序可以单纯发送想要的数据了,但是每次都会把上次的程序中数据先写一遍,才执行本次程序。这是什么原因呢?拜托!