微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > AVR和51单片机的通信问题

AVR和51单片机的通信问题

时间:10-02 整理:3721RD 点击:
AVR和51之间的通信,我想实现AVR通过发送1、2来控制51单片机端的亮灭。但是51端接收端的字符是01、02。一直调不同,还请大神帮我看看。谢谢了。51单片机的程序已经完全能通过电脑的PC端实现发送1和2控制灯的亮灭。//这个是AVR的程序。
#include <iom2560v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#define fosc 12000000
#define baud 9600
/********USART1初始化:发送使能,波特率设定为9600bit/s,异步方式,8位数据,1位停止位********/
void uart1Init(void)
{
         UBRR1L = (fosc/(16*baud)-1)%256;       
         UBRR1H = (fosc/(16*baud)-1)/256;
         UCSR1B|= (1<<UCSZ12)|(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
         UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);
}
/********USART1初始化:等待UDR1寄存器中的数据发送完毕后,接发送本次数据********/
void uart1SendChar(unsigned char data)
{
        while(!(UCSR1A&(1<<UDRE1)));
        UDR1 = data;
}
//延时函数
void delay(uint ms)
{
        uint i,j;
        for(i=0;i<ms;i++)
           {
           for(j=0;j<1141;j++);
       }
}
//主函数
void main (void)
{
         uart1Init();
         while(1)
         {
                  //发送字符串
                uart1SendChar(1);
                delay(1000);
                uart1SendChar(2);
                delay(1000);
         }
}


程序看着没啥毛病呀,看看AVR和51的TXD和RXD是否接错了!?

若我说对了请采纳,谢谢。

不是的,接的对着呢。T接R,R接T~然后共地。我把两个板子连上之后,然后51连上串口助手,发现接收到的数是01、02,不知道为什么会这样。我51里的对应条件是 SBUF==1或者SBUF==2。

程序全部贴出来,接受的数据是16进制01.02还是字符显示01.02

void uart1SendChar(unsigned char data) <---- 改为 int 试试,应该没错呀。就怕是中文状态下的字符。

//这是52端的程序:
#include "reg52.h"
sbit relay1=P3^3;
sbit relay2=P3^2;
/*串口初始化:主要涉及寄存器配置*/
void UartInit(void) //初始化uart
{
    TMOD = 0X20;
    SCON = 0X50;
    PCON = 0X00;
    TH1 = 0XFD;
    TL1 = 0XFD;
    TR1 = 1;
    /*对串口中断相关的寄存器进行配置*/
    ES = 1;//串口中断
    EA = 1;//CPU总中断
}
//写串口中断响应的服务程序:
void UartISR(void) interrupt 4
{
    unsigned char TempDat;
    if (RI)/*查询串口是否接收到一个完整的数据*/
    {
        RI = 0;/*清除标志,准备下一次判断*/
        TempDat = SBUF;/*读取串口数据*/
        if (1 == TempDat)/*判断串口接收到的数据*/
        {
            relay1 = 0;
            relay2 = 0;
        }
        else if (2 == TempDat)
        {
            relay1 = 0xff;
            relay2 = 0xff;
        }
        else
        {
        }
    }
}
void main(void)
{
   
    UartInit();/*调用串口初始化函数*/
        while(1)
        {        
        }
}                          

我改过,不管用。

实在不行就去淘宝买一个下图这样的


或者是下面可以换晶振的

51用的晶振是11.0592
avr用的是12

接收的数据写的是SBUF==1,SBUF==2。
//51的程序是:
#include "reg52.h"
sbit relay1=P3^3;
sbit relay2=P3^4;
/*串口初始化:主要涉及寄存器配置*/
void UartInit(void) //初始化uart
{
    TMOD = 0X20;
    SCON = 0X50;
        PCON = 0X00;
    TH1 = 0XFD;
    TL1 = 0XFD;
    TR1 = 1;
    /*对串口中断相关的寄存器进行配置*/
    ES = 1;//串口中断
    EA = 1;//CPU总中断
}
//写串口中断响应的服务程序:
void UartISR(void) interrupt 4
{
    unsigned char TempDat;
    if (RI)/*查询串口是否接收到一个完整的数据*/
    {
        RI = 0;/*清除标志,准备下一次判断*/
        TempDat = SBUF;/*读取串口数据*/
        if (1 == TempDat)/*判断串口接收到的数据*/
        {
            relay1 = 0;
                        relay2 = 0;
        }
        else if (2 == TempDat)
        {
            relay1 = 0xff;
                        relay2 = 0xff;
        }
        else
        {
        }
    }
}
void main(void)
{
   
    UartInit();/*调用串口初始化函数*/
        while(1)
        {      
        }
}                          

我忘了,我发你的适合51系列单片机。要用于AVR还需要一个转换板才行。

接收的数据是在16进制下显示的01.02,在字符状态下显示的是乱码。

什么转换板,按理说不应该需要的,他们的通信协议一样啊。

31脚啊,你查一下就晓得了。

但是他们说直接点对点就可以进行通信了。中间不用加东西~

是呀,道理的却如此。不行的话,你再换其他的单片机试一试?

好帖,必须支持一下!

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

网站地图

Top