|
要求:用按鍵將一個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接收中斷
}
|
|