找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2239|回复: 0
收起左侧

两块430单片机间的485通信

[复制链接]
ID:85021 发表于 2015-7-7 18:38 | 显示全部楼层 |阅读模式
要求:用按键将一个msp430单片机上的信息通过单片机自带的485模块将信息传送到另一块单片机上,并显示在1602液晶屏上。求发送和接收的代码。下面的时我自己参考其他代码修改的,并不能进行485通讯。本人新手,望大家指点。谢谢!
/***********************************************
程序功能:通过RS485端口不停地发送数据
------------------------------------------------
测试说明:用示波器观察RS485端口A、B信号线上的波形
          或者用RS485接收器接收发送的字符。
************************************************/
#include  <msp430x14x.h>

#define keyin (P1IN & 0xff)
#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态

void Set_UART1(void);
void delay(void);

/****************主函数****************/
void main(void)
{
    unsigned char temp;
    WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
    P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
    DRE_out;
    DE;
    Set_UART1();

    while (1)
    {
        if(keyin != 0xff)       //如果检测按键被按下
        {
            delay();      //延时消抖
            if(keyin != 0xff)         //如果再次检测到按键被按下
            {
                temp=keyin;
                switch(temp)        //0~9、A~F
                {
                case 0xee:
                    TXBUF1 = 0x31;break;
                case 0xed:
                    TXBUF1 = 0x32;break;
                case 0xeb:
                    TXBUF1 = 0x33;break;
                case 0xe7:
                    TXBUF1 = 0x34;break;
                case 0xde:
                    TXBUF1 = 0x35;break;
                case 0xdd:
                    TXBUF1 = 0x36;break;
                case 0xdb:
                    TXBUF1 = 0x37;break;
                case 0xd7:
                    TXBUF1 = 0x38;break;
                case 0xbe:
                    TXBUF1 = 0x39;break;
                case 0xbd:
                    TXBUF1 = 0x30;break;
                case 0xbb:
                    TXBUF1 = 0x41;break;
                case 0xb7:
                    TXBUF1 = 0x42;break;
                case 0x7e:
                    TXBUF1 = 0x43;break;
                case 0x7d:
                    TXBUF1 = 0x44;break;
                case 0x7b:
                    TXBUF1 = 0x45;break;
                case 0x77:
                    TXBUF1 = 0x46;break;
                default:
                    break;
                }
            }
        }
        while(!(IFG2 & UTXIFG1));               //等待发送结束
        IFG2 &= ~UTXIFG1;
    }
}

/*******************************************
函数名称:Set_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Set_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x0D;                             //波特率2400
    UBR11 = 0x00;
    UMCTL1 = 0x6B;                            //调整
    UCTL1 &= ~SWRST;                          //初始化UART状态机
}

/*******************************************
函数名称:delay
功    能:延时约15ms,完成消抖功能
参    数:无
返回值  :无
********************************************/
void delay()
{
    unsigned int tmp;   
    for(tmp = 12000;tmp > 0;tmp--);
}


/******************************
上面是接收的代码,下面是发送的代码。
******************************/


/*************************************************
程序功能:通过RS485端口接收字符并在1602液晶上显示
--------------------------------------------------
测试方法:用另一个RS485发射器,通过RS485总线向学习板
          发送数据(必须是可显示字符对应的ASCII码),
          观察液晶显示
**************************************************/
#include  <msp430x14x.h>
#include  "BoardConfig.h"
#include  "cry1602.h"


#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态


uchar pX = 0,pY = 0;


void Set_UART1(void);


/****************主函数****************/
void main(void)
{
    P6DIR = 0XFF;P6OUT = 0XFF;
  
    WDTCTL = WDTPW + WDTHOLD;            //关闭看门狗
    BoardConfig(0xbf);
   
    DRE_out;
    RE;
    Set_UART1();  
    LcdReset();             //出示化液晶
    LPM3;
}


/*******************************************
函数名称:UART0_RX
功    能:UART0的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void)
{
    Disp1Char(pX++,pY,RXBUF0);
    if(pX == 16)
    {
        pX = 0;
        pY ^= 1;
    }
}


/*******************************************
函数名称:Set_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Set_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x0D;                             //波特率2400
    UBR11 = 0x00;
    UMCTL1 = 0x6B;                            //调整
    UCTL1 &= ~SWRST;                          //初始化UART状态机
    IE2 |= URXIE1;                            //使能UART1接收中断
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表