您的位置 首页 培训

msp430单片机之串口通讯模块

串口通信单片机的串口通信模块在单片机中起到重要作用,通过串口它可以与PC机或者其他模块进行通信,传输数据或者控制命令,当然在传输数…

串口通讯

单片机串口通讯模块在单片机中起到重要效果,经过串口它能够与PC机或许其他模块进行通讯,传输数据或许操控指令,当然在传输数据的时分咱们有必要有必定的协议,让通讯两边能够知道得到的数据是什么,所以咱们有必要设置一种格局,让通讯两边能够得到正确的数据信息,首要咱们从全体上来看看这个模块的结构,下图是msp430单片机中的串口模块:

从上图中咱们能够看出串口模块能够分为4部分:操控模块,接纳模块,发送模块,波特率操控模块

这些模块有相应的寄存器,咱们的主要任务便是对这些寄存器进行相关的装备,接下来就具体介绍这些寄存器的效果

1.操控寄存器UXCTL (X为数字,不同类型的产品包括的串口模块也不同,有些只要一个,有些或许包括多个)

咱们来看看每一位的效果吧

PENA:校验答应位(0制止,1答应)

PEV :奇偶校验位,该位在校验答应时有用(0奇校验,1偶校验)

SPB :中止位挑选,决议发送的中止位,但接纳时接纳器只检测1位中止位(0 1位中止位,1 2位中止位)

CHAR:发送数据长度(0 7位,1 8位)

LISTEN:反应信号

SYNC:模块的形式挑选(0UART形式(异步),1 SPI形式(同步)

MM :多机形式挑选(0线路闲暇多机协议,1 地址为多机协议)

SWRST:操控位,上电时改方位位,一次正确的模块初始化进程应该是:先在SWRST = 1时设置,设置完串口后再设置SWRST = 0,最终如需中止,再设置中止使能。

2.发送和接纳操控寄存器

发送操控寄存器主要是操控时钟源的挑选等其他操控,而承受操控寄存器主要是一些标志位,判别时分犯错,溢出,中止标志等,具体内容见相关数据手册

3.波特率发生器操控模块

这个模块有3个寄存器,两个寄存器用作波特率挑选,一个用于调整(UxBR0和UxBR1用于挑选波特率,UxMCTL用于调整)

4接纳和发送数据缓存

URXBUF和UTXBUF这两个寄存器用于寄存接纳和发送的数据。

整个模块大约便是这些内容了,那么怎样编写发送和接纳的程序呢?

一般地,接纳进程运用中止方法(由于不知道什么时分会接纳到数据,这样效率高),发送选用查询方法。

串口通讯模块的设置进程如下:

1.设置体系时钟源

2.设置串口模块

3.处理接纳发送进程

下面是一个简略的程序,该程序完成的功用是从PC机接纳数据,然后单片机又将接纳的数据原封不动的发送给PC机。

#include

#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

/*当BRCLK=CPU_F时用下面的公式能够核算,不然要根据设置参加分频系数*/
#define baud 9600 //设置波特率的巨细
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率核算公式
#define baud_h (uchar)(baud_setting>>8) //提取高位
#define baud_l (uchar)(baud_setting) //低位

//*
// 体系时钟初始化
//*
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //翻开XT振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //铲除震动标志
for(i=0;i<100;i++)
_NOP(); //延时等候
}
while((IFG1&OFIFG)!=0); //假如标志为1,则持续循环等候
IFG1&=~OFIFG;
}
//*
// MSP430内部看门狗初始化
//*
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //封闭看门狗
}

//*
// MSP430串口初始化
//*
void UART_Init()
{
U0CTL|=SWRST; //复位SWRST
U0CTL|=CHAR; //8位数据形式
U0TCTL|=SSEL1; //SMCLK为串口时钟
U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
U0BR0=baud_l; //N=UBR+(UxMCTL)/8
U0MCTL=0x00; //微调寄存器为0,波特率9600bps
ME1|=UTXE0; //UART1发送使能
ME1|=URXE0; //UART1接纳使能
U0CTL&=~SWRST;
IE1|=URXIE0; //接纳中止使能位

P3SEL|= BIT4; //设置IO口为一般I/O形式
P3DIR|= BIT4; //设置IO口方向为输出
P3SEL|= BIT5;
}

//*
// 串口0发送数据函数
//*

void Send_Byte(uchar data)
{
while((IFG1&UTXIFG0)==0); //发送寄存器空的时分发送数据
U0TXBUF=data;
}

//*
// 处理来自串口 0 的接纳中止
//*

#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
uchar data=0;
data=U0RXBUF; //接纳到的数据存起来
Send_Byte(data); //将接纳到的数据再发送出去
}

//*
// 处理来自串口 0 的发送中止,预留
//*

#pragma vector=UART0TX_VECTOR
__interrupt void UART0_TX_ISR(void)
{

}

//*
// 主函数
//*
void main(void)
{
WDT_Init(); //看门狗设置
Clock_Init(); //体系时钟设置
UART_Init(); //串口设置初始化
_EINT(); //开中止
while(1) //无限循环
{
}
}

得到的成果如下:

串口部分到此为止,这仅仅简略的设置,在后续的学习中必然会用到串口传输杂乱的数据进行处理,这儿先打个根底。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/265337.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部