硬件资源的介绍
  At24c02的使用
  MSP430F1121串口通信C
  发光二极管的使用
  蜂鸣器的使用
  MSP430F1121_PWM
  MSP430F1121的选购配件
  成品发售形式
 
 
 
 
产品介绍>>MSP430F1121>>MSP430F1121串口通信C

一、实验目的:
学习RS-232软串口通信的软件编程方法和操作设计
二、实验设备:
MSP430F1121实验板一个,3V电源一个,JTAG接口一个,RS-232串口通信线一条。
三、实验电路原理图:


四、实验内容:


五、参考程序:

//**************************************************************************
//功能:测试MSP430F1121软件串口通信实验,通过PC机上的串口通信助手发数据给F1121实验板,
// F1121收到数据后,点亮数码管,同时发送收到的数据给PC机。
//波特率:2400 无校检位,8位数据,1位停止位,1位开始位
//时钟:ACLK=32768
//使用资源:RXD使用P2.2 TXD使用P1.1 发光二极管P2.4
//**************************************************************************
#define RXD 0x04 // RXD on P2.2
#define TXD 0x02 // TXD on P1.1

// Conditions for 2400 Baud SW UART, ACLK = 32768

#define Bitime_5 0x06 // ~ 0.5 bit length + small adjustment
#define Bitime 0x0E // 427us bit length ~ 2341 baud

unsigned int RXTXData;
unsigned char BitCnt;
unsigned int nRx;
void TX_Byte (void);
void RX_Ready (void);
void Delay(void);
//******************************************************************************

#include <msp430x11x1.h>
//----------------------------------------------------------------
void main (void)
{

WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
CCTL0 = OUT; // TXD Idle as Mark
TACTL = TASSEL0+MC1; // ACLK, continous mode
P1SEL = TXD; // P1.1/TA0 for TXD function
P1DIR = TXD; // TXD output on P1
P2SEL = RXD; // P2.2/TA0 as RXD input

P2DIR |=0X10; //初始化发光二极管的输出方向
nRx=0; //初始化接收数据的标致
RXTXData=0; //接收/发送数据
_EINT(); //开中断
P2OUT |=0X10; //熄灭发光二极管

for (;;) //程序一直处于循环状态
{
RX_Ready(); //串口处于准备接收数据状态

_BIS_SR(LPM3_bits+GIE); //进入LPM3模式直到接收一个字符为止

nRx=RXTXData; //把收到的数据给nRx
if(nRx!=0) //如果nRx不为空则点亮发光二极管
{
P2OUT &=~0X10; //把发光二极管点亮
RXTXData=nRx;
}
else
RXTXData=0x25; //如果为空则发数据0X25

Delay();
TX_Byte(); //把RXTXData的数据发给PC机
P2OUT |=0X10; //把发光二极管熄灭
}
}
//----------------------------------------------------------------
//时间延时
void Delay(void)
{
unsigned long i;
for(i=0x7ffff;i>0;i--);
}
//----------------------------------------------------------------
//准备从RXTXData中发送数据函数
void TX_Byte (void)
{
BitCnt = 0xA; // 输出数据位为10
CCR0 = TAR; // 把当前的计数器值放入CCR0中
CCR0 += Bitime; // 值入第一位的时间
RXTXData |= 0x100; // 增加数据的停止位
RXTXData = RXTXData << 1; // 增加开始位
CCTL0 = OUTMOD0+CCIE; // TXD处于模式1的置位状态,开中断
while ( CCTL0 & CCIE ); // 等待数据输出完成
}

//----------------------------------------------------------------
// 准备接收数据函数
void RX_Ready (void)
{
BitCnt = 0x8; // 设置接收数据位数8
CCTL0 = SCS+CCIS0+OUTMOD0+CM1+CAP+CCIE;// SCS同步捕获,CCIS0选择CCI0B为捕获事件输入,RX处于置位状态,CM1下降沿捕获
}

//----------------------------------------------------------------
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += Bitime; // 增加偏移中断时间

// RX
if (CCTL0 & CCIS0) // 如果CCIS0处于1状态则此时为接收状态
{
if( CCTL0 & CAP ) //如果此时为捕获模式,则修改模式为比较模式
{
CCTL0 &= ~ CAP; //
CCR0 += Bitime_5; //增加0.5的时间长度,使接收处于中间时段
}
else
{
RXTXData = RXTXData >> 1; //接收右移
if (CCTL0 & SCCI) //如果输入信号锁存器中的值为1则数据位值1
RXTXData |= 0x80;
BitCnt --; // 位数寄存器减1
if ( BitCnt == 0)
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
CCTL0 &= ~ CCIE; // 所有位接收完成则关中断
_BIC_SR_IRQ(LPM3_bits); // 退出低电模式
}
//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
}
// TX
else
{
if ( BitCnt == 0)
CCTL0 &= ~ CCIE; //转输完所有位后关中断
else
{
CCTL0 |= OUTMOD2; // TX工作在模式5的复位模式
if (RXTXData & 0x01) //如果要输出的数据为1则工作在模式1的置位模式
CCTL0 &= ~ OUTMOD2; // TX Mark
RXTXData = RXTXData >> 1; //输出移位
BitCnt --;
}
}
}

                          回到顶部
                     51单片机实验网   津ICP备05003923
               关于我们  | 下载说明  |  联系站长  | 本站声明