微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机新手急求各位帮忙:51串口通信,直接赋值为什么不能正常发送?

单片机新手急求各位帮忙: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;                                        // 清除数据传送标志
}


错误就在switch(0)语句;你要用while(1)循环,这样就不会在程序运行的时候每次都配置串口和定时器,在while(1)循环里你只需要调用send_char(0x01);就可以一直发送了


你好,我想问一下,我按照你你说的改了程序。但是通过串口可以看到发回来的数据是乱码,并且不断循环。我想要的是能正确发送单个的数据就行,拜托了!


你好,现在我的程序可以单纯发送想要的数据了,但是每次都会把上次的程序中数据先写一遍,才执行本次程序。这是什么原因呢?拜托!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top