4228|5

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急求149USART1串口485通讯程序 [复制链接]

哪位高手帮忙指点一下。

要求接收。发送用中断。

把接收到的数直接发回去就行。

不胜感激!谢谢!!

最新回复

供参考 #include "msp430x26x.h" #define  TXD0  BIT4 #define  RXD0  BIT5    //485 发送接收 void delay(unsigned int yy); void main( void ) {   WDTCTL   =  WDTPW + WDTHOLD;    //关看门狗   BCSCTL1  =  CALBC1_1MHZ;                  DCOCTL   =  CALDCO_1MHZ;      P4DIR  |= BIT0+BIT1;   P4OUT  &= ~BIT1;      UCA0CTL1 =  UCSWRST;   UCA0CTL1 |= UCSSEL0;             //UCLK=ACLK;   UCA0BR0  = 13;   UCA0BR1  = 0;   UCA0MCTL = UCBRS0+UCBRS2;                  P3DIR |= TXD0;   P3SEL |= TXD0 + RXD0;            //设置拨特率 2400   UCA0CTL1 &= ~UCSWRST;   IE2 |= UCA0RXIE;                 //485传输速率是2400         _EINT();      while(1)   {     P4OUT  &= ~BIT0;             //BIT0->485接收状态     LPM0;        while(UCA0STAT & UCBUSY);   //USCI还在忙就等待   }    } #pragma vector = USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) {   P4OUT  |=  BIT0;             //BIT0->485发送状态   while (!(IFG2 & UCA1TXIFG));   UCA0TXBUF=UCA0RXBUF;                //把接收到的数据返回给串口调试助手   P4OUT  |=  BIT0;   LPM0_EXIT; }  详情 回复 发表于 2008-12-22 17:00
 
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
现在高手的隐居了吗?

有人帮帮忙吗?
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
#include <msp430x14x.h>


void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
CCTL1 = OUT; // TXD Idle as Mark
TACTL = TASSEL_1 + MC_2; // ACLK, continuous mode
P2SEL = TXD + RXD; // *******

P2DIR = TXD; //

// Mainloop
for (;;)
{
RX_Ready(); // UART ready to RX one Byte
_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interr until char RXed
TX_Byte(); // TX Back RXed Byte Received
}
}


// Function Transmits Character from RXTXData Buffer
void TX_Byte (void)
{
BitCnt = 0xA; // Load Bit counter, 8data + ST/SP
while (CCR1 != TAR) // Prevent async capture
CCR1 = TAR; // Current state of TA counter
CCR1 += Bitime; // Some time till first bit
RXTXData |= 0x100; // Add mark stop bit to RXTXData
RXTXData = RXTXData << 1; // Add space start bit
CCTL1 = CCIS0 + OUTMOD0 + CCIE; // TXD = mark = idle
while ( CCTL1 & CCIE ); // Wait for TX completion
}


// Function Readies UART to Receive Character into RXTXData Buffer
void RX_Ready (void)
{
BitCnt = 0x8; // Load Bit counter
CCTL0 = SCS + OUTMOD0 + CM1 + CAP + CCIE + CCIS_1; // Sync, Neg Edge, Cap
}

// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += Bitime; // Add Offset to CCR0

{
if( CCTL0 & CAP ) // Capture mode = start bit edge
{
CCTL0 &= ~ CAP; // Switch from capture to compare mode
CCR0 += Bitime_5;
}
else
{
RXTXData = RXTXData >> 1;
if (CCTL0 & SCCI) // Get bit waiting in receive latch
RXTXData |= 0x80;
BitCnt --; // All bits RXed?
if ( BitCnt == 0)
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &= ~ CCIE; // All bits RXed, disa××e interrupt
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
switch( TAIV )
{
case 2:
_NOP();
CCR1 += Bitime; // Add Offset to CCR0

// TX
if (CCTL1 & CCIS0) // TX on CCI0B?
{
if ( BitCnt == 0){
CCTL1 &= ~ CCIE; // All bits TXed, disa××e interrupt
}
else
{
CCTL1 |= OUTMOD2; // TX Space
if (RXTXData & 0x01)
CCTL1 &= ~ OUTMOD2; // TX Mark
RXTXData = RXTXData >> 1;
BitCnt --;
}
}
break; // CCR1 not used
case 4: break; // CCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

4
 
硬件的和UART没有什么区别就是多一个接收发送使能
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

5
 
就是串口程序
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
供参考
#include "msp430x26x.h"

#define TXD0 BIT4
#define RXD0 BIT5 //485 发送接收


void delay(unsigned int yy);
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; //关看门狗
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

P4DIR |= BIT0+BIT1;
P4OUT &= ~BIT1;

UCA0CTL1 = UCSWRST;
UCA0CTL1 |= UCSSEL0; //UCLK=ACLK;
UCA0BR0 = 13;
UCA0BR1 = 0;
UCA0MCTL = UCBRS0+UCBRS2;
P3DIR |= TXD0;
P3SEL |= TXD0 + RXD0; //设置拨特率 2400
UCA0CTL1 &= ~UCSWRST;
IE2 |= UCA0RXIE; //485传输速率是2400


_EINT();

while(1)
{
P4OUT &= ~BIT0; //BIT0->485接收状态
LPM0;
while(UCA0STAT & UCBUSY); //USCI还在忙就等待
}

}


#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
P4OUT |= BIT0; //BIT0->485发送状态
while (!(IFG2 & UCA1TXIFG));
UCA0TXBUF=UCA0RXBUF; //把接收到的数据返回给串口调试助手

P4OUT |= BIT0;
LPM0_EXIT;
}
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表