|
要求:用按键将一个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接收中断
}
|
|