msp430串口数据收发的讨论

发布者:平和宁静最新更新时间:2016-08-21 来源: eefocus关键字:msp430  串口  数据收发 手机看文章 扫描二维码
随时随地手机看文章
在做串口通信看 沈建华编著 一书中感到书中有些控制字没有列出,编写程序时容易忘记写.出现不必要的错误. ME2 IE2 IFG2 (或ME1   IE1 IFG1)下面的本程序用的是USART1.要从.H的头文件里找上面三个特殊功能寄存器的用法.

#define IE2_                (0x0001) /* Interrupt Enable 2 */

DEFC(   IE2               , IE2_)

#define U1IE                IE2       /* UART1 Interrupt Enable Register */

#define URXIE1              (0x10)

#define UTXIE1              (0x20)

#define IFG2_               (0x0003) /* Interrupt Flag 2 */

DEFC(   IFG2              , IFG2_)

#define U1IFG               IFG2      /* UART1 Interrupt Flag Register */

#define URXIFG1             (0x10)

#define UTXIFG1             (0x20)

#define ME2_                (0x0005) /* Module Enable 2 */

DEFC(   ME2               , ME2_)

#define U1ME                ME2       /* UART1 Module Enable Register */

#define URXE1               (0x10)

#define UTXE1               (0x20)

#define USPIE1              (0x10)

430的波特率的使用很有特点.: 时钟源可通过UTCTL<0 1>中的SSEL1 SSEL0 选择外部时钟 UCLK1 ACLK SMCLK   SMCLK   对于波特率的计算: 比如时钟750KHz,波特率115200,750000/115200=6.51 小数0.51*8=4.08 那么UxMCTL就可以为0xAA或者0x55(4个1均匀分布)关波特率=BRCLK/(UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8) 是反过来的运算. 本程序中用ACLK :32768HZ      32768/9600=3.4133...   那么UBR就是3 再用 0.4133*8=3.3064 取整数 3 在波特率调整控制器中UMCTL中的M7~M0 任意修改3个位并且不能紧靠在一起.同时UMCTL的值要求不能少于0x03

#include "msp430x16x.h"

void Delay(unsigned char m);

void ComInit(void);

unsigned char Usart_Tx_Data[30]={"You are the best ! cheer on! "};

void InitSystemClock(void) // 初始化系统时钟

{

unsigned char i;

WDTCTL=WDTPW+WDTHOLD; //关闭看门狗

BCSCTL1=0x00;          //Set 430 clk 开启XT2,DOC的标称频率为最低 且不分频;XT1为低速晶体(32.768K)

BCSCTL2=SELM_2+SELS;   //选择MCLK SCLK的时钟源为高速时钟 不分频,均为8M

do

{

    IFG1&=~OFIFG;

    for(i=0xff;i>0;i--);

}

while ((IFG1&OFIFG)!=0);

//P5DIR=0XFF;

//P5OUT|=BIT7;

//P5IN=0X80;

//P5SEL|=BIT4+BIT5+BIT6;//将MCLK SCLK ACLK分别输出至P5.4 5 6口

}

void main(void)

{

int i;

InitSystemClock(); // 初始化系统时钟

ComInit();

//InitLCD();

//P1DIR=0x00;   

//P1IE=0xff;

   _EINT();

while(1)

{

    Delay(100);

}

/*

while(1)

{

         for(i=0;i<30;i++)

        {

         TXBUF1=Usart_Tx_Data[i];

         while((UTCTL1&0X01)==0);

         Delay(100);

        }

} */

     

}

void Delay(unsigned char m)

{

unsigned char i;

while(m--)

{

for(i=0;i<0xff;i++);

}

}

void ComInit(void) //串口初始化

{

UCTL1|=SWRST;

UCTL1 = CHAR;                         // 8-bit 字符 无校验 1位停止位 UART模式 无反馈 线路空闲多机模式

/*******************波特率为1200*******************/

/* UTCTL1=SSEL0;                        //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同

UBR01 = 0x1B;                         // 波特率设置寄存器    波特率为1200

UBR11 = 0x00;                         // // 波特率设置寄存器

UMCTL1 = 0x11;                           //波特率 调整寄存器

*/

/**************************************/

/*******************波特率为2400*******************/

/* UTCTL1=SSEL0;                        //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同

UBR01 = 0x0D;                         // 波特率设置寄存器    波特率为2400

UBR11 = 0x00;                         // // 波特率设置寄存器

UMCTL1 = 0x6D;                           //波特率 调整寄存器

*/

/**************************************/

/*******************波特率为9600*******************/

UTCTL1=SSEL0;                        //选择ACLK为波特率发生器时钟源(32.768K), UCLKI与UCLK极性相同

UBR01 = 0x03;                         // 波特率设置寄存器

UBR11 = 0x00;                         // // 波特率设置寄存器

UMCTL1 = 0x4A;                           //波特率 调整寄存器

/**************************************/

/*******************波特率为19200*******************

UTCTL1=SSEL0+SSEL1;                        //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同

UBR01 = 0xA0;                         // 波特率设置寄存器    8M 下波特率为19200

UBR11 = 0x01;                         // // 波特率设置寄存器

UMCTL1 = 0x6d;                           //波特率 调整寄存器

**************************************/

/*******************波特率为115200*******************

UTCTL1=SSEL0+SSEL1;                        //选择SMCLK为波特率发生器时钟源(8M), UCLKI与UCLK极性相同

UBR01 = 0x45;                         // 波特率设置寄存器   SMCLK为8M下波特率为115200

UBR11 = 0x00;                         // // 波特率设置寄存器

UMCTL1 = 0x55;                           //波特率 调整寄存器

/**************************************/

                   

ME2|= UTXE1 + URXE1;                  // 使能 USART1 TXD/RXD

IE2|= URXIE1+UTXIE1;                         // 使能 USART1 接收和发送 中断

UCTL1&=~SWRST;

P3SEL |= BIT6+BIT7;                        // P3.6,7 = USART1 TXD/RXD 选择第二功能

}

#pragma vector=UART1RX_VECTOR

__interrupt void OnRecieve(void)   //将接收到的字符显示到串口输出

{

while((IFG2&URXIFG1)==0);        //选择的是USART1

TXBUF1=RXBUF1;

while((UTCTL1&0X01)==0);

Delay(1);

}

      //本程序包括自动发送数组里的数据或将接收到的数据再从新发回.多添加一条语句实现功能.

      while((UTCTL1&0X01)==0); 将接收到的数据发送完才能退出中断. 少这一句 在串口调试助手中能看到TX加1 RX也加1 接收数据区却没有显示. 原因就是数据没有发送完就退出了中断.

     //此程序只要修改头文件就可运行. 其实还有很多的更为复杂的应用.欢迎交流! ^_^

其实在任何一种单片机先看懂官方或者网上的一些程序,再在这些程序基础上添加自己想要实现的功能,这是实现编程的最好也是最快方式,但是,不要认为这就可以了,不但要看懂理写程序人的意思,将程序变成适应自己修改的程序,并完全正确.要一个学习的过程和时间.

关键字:msp430  串口  数据收发 引用地址:msp430串口数据收发的讨论

上一篇:MSP430的中断优先级及中断嵌套
下一篇:MSP430控制AD9851产生扫频波

推荐阅读最新更新时间:2024-03-16 15:06

STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
1.从 GPIO 到 UART 前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断。接下来我们介绍的也是最常用的一个模块,串口(UART)。 串口可以说是最古老,而且生命力最强的一种通信接口了。RS485总线更是久经考验。虽然串口早已经从大多数PC的标配中去掉了,但是嵌入式系统跟上位PC机通信用的最多的应该还是通过串口转USB吧。 我们用 Keil 打开下面这个工程: STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComPollingMDK-ARMProject.uvprojx 这个代码配置串口为 96
[单片机]
MSP430G2253 产生占空比可调的PWM
最近刚刚做了一个用430驱动白光LED的代码 其中用到了以前用到的ADC和PWA这些常用的外设 发现对片子掌握的还是太基础 现在复习一下 以后用到的时候也算有个参考 今天就只学习一点最基本的功能 用430产生一个占空比可调的PWM 先说一下步骤: 1:首先我们要知道那个引脚可以作为定时PWM的输出引脚 如果不太熟悉引脚 就去查阅册 2:配置这个IO 这种情况下 无论那个系列的片子 基本作为PWM输出的时候 IO配置为输 出 选择其端口复用功能 详细配置 看手册 3:设置PWM的周期 TACCR0 或者CCR0 貌似是一个冬冬吧 这里面的数值决定了你PWM的 周期 举个简单的例子 比如你使用1MHZ的时钟频率 CCR0
[单片机]
IAR环境定义位变量标志位 STM8 MSP430通用
首先建立一个公共点H文件,加入通用代码如下 typedef union { struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; } bits; } UINT8_VAL; 通用定义联合体写好以后,要定义一个只占用个Byte的标志位的话,只要定义一下uchar型字节,然后
[单片机]
最近遇到的单片机串口设置问题
最近测试涉及到底层串口代码的修改。经过这次修改,突然发现其实自己对于串口的一些特性以前并不是十分清楚。 首先遇到的一些问题: 1)在使用IO的数据位的时候,没有考虑校验位所占的位数。 2)在设置串口输入的时候,使用悬空输入。 关于1),在一次使用 STM32 串口参数9600,N,8,1与另一个 8051MCU通信的时候发现偶校验没有问题,但是无校验通信就出现异常。但是,当将 STM32 与电脑通信的时候,偶校验与无校验通信又完全都是正确的。8051MCU单独与电脑通信也都是完全正确的。查看代码,还真不知道有什么不对劲的。因为这段代码,用了很长时间了。后来一个同事看代码后,提醒说对于数据位的设置,偶校验和无校验是一
[单片机]
MSP430之学习札记
1. MSP430支持的进制类型 在MSP430的C语言中,支持3种形式的进制类型,即十进制(无前缀或后缀)、八进制(添加前缀 0 )和十六进制(添加前缀 0x )。 令匠人郁闷的是,编译器居然不支持二进制的写法!?这让习惯于与二进制打交道的匠人抓狂不已!呜呼!吐血! 补充:后来和行家聊及此事,被告知C51里也不支持二进制的写法。看来是怪匠人自己平时用汇编多,而用C太少,少见多怪了。 在这一点上,还是飞思卡尔的编译器做的更好,他们支持BIN格式 2. 如何修改tab键对应的空格 IAR软件自带的编辑器,其默认值为按一次TAB键对应2个空格,这不符合匠人自己的习惯。特寻找出修改方法如下:  先选择 T
[单片机]
单片机模拟串口发送和波特率问题
传统的8051系列单片机一般都配备一个串口,而STC 89C52RC增强型单片机也不例外,只有一个串口可供使用,这样就出问题了,假如当前单片机系统要求二个串口或多个串口进行同时通信,8051系列单片机只有一个串口可供通信就显得十分尴尬,但是在实际的应用中,有两种方法可以选择。 方法1:使用能够支持多串口通信的单片机,不过通过更换其他单片机来代替8051系列单片机,这样就会直接导致成本的增加,优点就是编程简单,而且通信稳定可靠。 方法2:在IO资源比较充足的情况下,可以通过IO来模拟串口的通信,虽然这样会增加编程的难度,模拟串口的波特率会比真正的串口通信低一个层次,但是唯一优点就是成本上得到控制,而且通过不同的IO组合可以实现更加之多
[单片机]
51单片机串口通信 采用中断方式
/*----------------------------------------------- 功能: 连接串口到电脑,下载该程序,打开电源 打开串口调试助手,将波特率设置为2400,无奇偶校验 晶振12MHz,发送和接收使用的格式相同,如都使用 字符型格式,设置正确后接受框可以显示出: The UART test, 请在发送区输入信息 ------------------------------------------------*/ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
[单片机]
基于Virtools 和串口通信的界面交互性的设计与实现
      摘 要:本文介绍了一种采用Virtools 和串口通信实现人机界面交互的设计方法。下位机通过 串口通信的方式将采集的数据传给上位机,上位机通过Virtools 的行为模组对这些数据进行处理, 并根据处理结果做出响应,从而实现人机界面的交互。       1 引言       用户界面设计是屏幕产品的重要组成部分,它为人机交互构建了一个沟通环境。其中交互性设 计是用户界面设计中的重要内容之一。交互设计的目的是让用户能够简单方便地使用产品,任何产 品功能的实现都是通过人机交互完成的。现以单片机为核心的嵌入式应用中界面交互性设计为例具 体介绍其实现方法。       2 总体设计方案       总体设计方案
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved