基于MSP430单片机实现的无线传输模块

发布者:柔情细语最新更新时间:2020-03-06 来源: eefocus关键字:MSP430  单片机  无线传输模块 手机看文章 扫描二维码
随时随地手机看文章

#include "Msp430X14X.h"


#define CE          BIT0

#define CS          BIT1

#define PWR_UP      BIT3

#define ADDR_INDEX  8

#define ADDR_COUNT  4

void CE_HI(void);

void CE_LO(void);

void CS_HI(void);

void CS_LO(void);

void PWR_UP_HI(void);

void PWR_UP_LO(void);

void Init_CLK(void);

void Port_Init(void);

void Init_SPI (void);

void Delay_us(unsigned long nValue);

void Delay_ms(unsigned long nValue);

void Init_RF2401(void);

char ReceivePacket(void);

void TransmitPacket(unsigned char nVal);


//定义串口操作变量

unsigned char UART0_TX_BUF[25];     // 串口 0 的发送缓冲区

int nTX0_Len;

char nTX0_Flag;

int nSend_TX0;

int nDR;



unsigned char rxConfig[15] = {

    0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05

};

unsigned char txConfig[15] = {

    0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

    0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x04

};

void main(void)

{

char n;

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



    _DINT();            // 关闭中断


    Init_CLK();

    Port_Init();

    Init_SPI();


    _EINT();            // 打开中断


    Init_RF2401();

    while(1)

    {

        TransmitPacket(3);

        Delay_ms(3);

        n = ReceivePacket();

    }

}

void Port_Init(void)

{

    P1DIR = 0;

    //设置CE为输出管脚

    P1DIR |= BIT0;   

    //设置CS为输出管脚

    P1DIR |= BIT1;

    //设置PWR_UP为输出管脚

    P1DIR |= BIT3;

    //将中断寄存器清零

    P1IE = 0;

    P1IES = 0;

    P1IFG = 0;

    //管脚 P1.2 使能中断

    P1IE |= BIT2;

    //对应的管脚由低到高电平跳变使相应的标志置位

    P1IES &= ~(BIT2);


    //将P3口所有的管脚设置为一般I/O口

    P3SEL = 0;

    //P3.1 P3.2 P3.3被分配为SPI口

    P3SEL = BIT3 + BIT2 + BIT1;

    //P3.3作为输出管脚

    P3DIR |= BIT3;

    //P3.1作为输出管脚

    P3DIR |= BIT1;

    return;

}


void Init_SPI (void)

{

    //SPI0模块允许     

    ME1 |= USPIE0; 

    //将寄存器的内容清零

    U0CTL = 0X00;   

    //数据为8比特,选择SPI模式,单片机为主机模式

    U0CTL |= CHAR + SYNC + MM;


    //将寄存器的内容清零

    U0TCTL = 0X00;  

    // 时钟源为SMCLK,选择3线模式

    U0TCTL = CKPH + SSEL1 + SSEL0 + STC; 


    //传输时钟为SMCLK / 800

    UBR0_0 = 0X20;  

    UBR1_0 = 0X03;

    //调整寄存器,没有调整

    UMCTL_0 = 0X00;     //The modulation control register is not used for SPI mode and should be set to 000h.


    //发送中断允许

    IE1 |= UTXIE0; 

}

void CE_HI(void)   //CE高电平

{

    P1OUT |= BIT0;

    return;

}

void CE_LO(void)  //ce低

{

    P1OUT &= ~(BIT0);

    return;

}

void CS_HI(void)

{

    P1OUT |= BIT1;

    return;

}

void CS_LO(void)

{

    P1OUT &= ~(BIT1);

    return;

}

void PWR_UP_HI(void)

{

    P1OUT |= BIT3;

    return;

}

void PWR_UP_LO(void)

{

    P1OUT &= ~(BIT3);

    return;

}

void Init_CLK(void)

{

    unsigned int i;

    BCSCTL1 = 0X00;         //将Basic Clock System Control Register 1寄存器的内容清零

                    //XT2震荡器开启

                    //LFTX1工作在低频模式

                    //ACLK的分频因子为1


    do 

    {

    IFG1 &= ~OFIFG;                       // 清除OSCFault标志

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

    }

    while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   


    BCSCTL2 = 0X00;         //将寄存器的内容清零

    BCSCTL2 += SELM1;       //MCLK的时钟源为TX2CLK,分频因子为1

    BCSCTL2 += SELS;        //SMCLK的时钟源为TX2CLK,分频因子为1

}


interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void)

{

    if(nTX0_Len != 0)

    {

        // 表示缓冲区里的数据没有发送完

        nTX0_Flag = 0;              


        TXBUF0 = UART0_TX_BUF[nSend_TX0];

        nSend_TX0 += 1;


        if(nSend_TX0 >= nTX0_Len)

        {

            nSend_TX0 = 0;

            nTX0_Len = 0;

            nTX0_Flag = 1;

        }

    }

}

interrupt [PORT1_VECTOR] void DR_ISR(void)

{

    if(P1IFG & BIT2)

    {

        nDR = 1;

        // 清除中断标志位

        P1IFG &= ~(BIT2);  

    }

}

void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟

{

    unsigned long nCount;

    int i;

    unsigned long j;

    nCount = 2667;

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

    {

        for(j = nCount;j > 0;j--);

    }

    return;

}

void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟

{

    int nCount;

    int i;

    int j;

    nCount = 3;

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

    {

        for(j = nCount;j > 0;j--);

    }

    return;

}

void Init_RF2401(void)

{

    int i;

    nDR = 0;

    //激活nRF2401

    PWR_UP_HI();

    //延迟

    Delay_ms(4);

    CS_HI();

    Delay_us(100);

    CE_LO();

    Delay_us(100);   //进入配置模式

    //发送配置信息

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

    {

        UART0_TX_BUF[i] = rxConfig[i];

    }

    nTX0_Len = 15;

    // 设置中断标志,进入发送中断程序

    IFG1 |= UTXIFG0;        

}

void TransmitPacket(unsigned char nVal)

{

    unsigned char i;


    CS_HI();

    Delay_us(10);

    TXBUF0 = 0x05;

    CS_LO();

    Delay_us(300);


    CE_HI();

    Delay_us(10);

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

    {

        UART0_TX_BUF[i] = rxConfig[ADDR_INDEX + i];

    }

    UART0_TX_BUF[i] = nVal;

    nTX0_Len = ADDR_COUNT + 1;

    // 设置中断标志,进入发送中断程序

    IFG1 |= UTXIFG0;

    CE_LO();

    //延迟

    Delay_us(300);

}

char ReceivePacket(void)

{

    char nVal;


    CS_HI();

    Delay_us(10);

    TXBUF0 = 0x04;

    CS_LO();

    Delay_us(300);


    CE_HI();

    while(1)

    {

        if(nDR == 1)

        {

            break;

        }


    }

    TXBUF0 = 0x0;

    while ((IFG1 & UTXIFG0) == 0) ;

    nVal = RXBUF0;

    CE_LO();

    //延迟

    Delay_us(300);

    return nVal;

}

关键字:MSP430  单片机  无线传输模块 引用地址:基于MSP430单片机实现的无线传输模块

上一篇:MSP430的485通信程序(接收字符串指令)
下一篇:使用MSP430 Launchpad和PIR传感器制作运动检测器

推荐阅读最新更新时间:2024-10-30 13:36

怎么样学好AVR单片机
首先介绍一下为什么要学习AVR单片机!!随着各IC厂商推出各种高性能的单片机,51单片机已经远远不能满足大家对高性能单片机的需求。ATMEL作为一个51系列单片机的大生产厂商,90年代中后期推出一款高性价比的RISC(精简指令集)单片机系列,就是当今很流行也很著名的AVR单片机,在各种高性能单片机的竞争中,脱颖而出,很受各界电子人士热爱。很多想学单片机的人都不敢学习AVR,觉得不好入门,其实不然,如果你使用C语言编程,入门都是一样的,而且当你学好后,不用像学习51的人,还要在学习一个高性能的单片机,这样很浪费时间。目前很多公司和学校已经开始转向AVR单片机了,相信在未来几年,AVR将会非常兴旺,所以学习AVR单片机将会很有前途。 先
[单片机]
恩智浦微控制器事业部延长重点LPC产品的持续供应计划
2016年8月18日,恩智浦半导体公司(NXP Semiconductors N.V.)(NASDAQ:NXPI)宣布,将LPC1700和LPC2000微控制器(MCU)产品的持续供应计划额外延长五年,以顺应市场对这些产品的持续需求和广泛应用。 十多年前,恩智浦推出了基于ARM 技术的业界首款真正集成闪存(Flash)的MCU LPC2106,为当今的MCU市场奠定了基础。LPC2106将ARM7TDMI-S处理器和片上闪存、SRAM以及通用外设集成在一个低引脚数封装中,随后不久,LPC2138和LPC2148几款MCU也相继问世,这为恩智浦后续数百款突破性MCU器件的推出做好了准备。 恩智浦资深副总裁、微控制器业务总经理
[嵌入式]
浅谈单片机软件复位方法
有的单片机(如8098)有专门的复位指令,某些增强型MCS-51系统单片机虽然没有复位指令,但片内集成了WATCHDOG电路,故抗干扰也不成问题。而普及型MCS-51系列单片机(如8031和8032)既然无复位指令,又不带硬件WATCHDOS,如果没有外接硬件WATCHDOG电路,就必须采用软件抗干扰技术。常用的软件抗干扰技术有:软件陷阱、指令冗余、软件WATCHDOG等,它们的作用是在系统受干扰时能及时发现,再用软件的方法使系统复位。所谓软件复位就是用一系列指令来模仿复位操作,这就是MCS-51系列单片机所特有的软件复位技术。 现用一简单的实验说明,实验电路如附图所示。接于仿真插座P1.0的发光二极管LED0用来表示主程
[单片机]
浅谈<font color='red'>单片机</font>软件复位方法
为什么要选择AVR单片机
什么是AVR单片机?AVR单片机有什么优点?为什么要选择AVR单片机? AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点: 1:在相同的系统时钟下AVR运行速度最快; 2: 芯片内部的Flsah、EEPROM、SRAM容量较大; 3:所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP); 4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作; 5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强; 6:内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中
[单片机]
MSP430普通I/0口模拟IIC总线
#include main.h #define SLAVE_ADDRESS 0x04 #define SLAVE_WRITE_ADDRESS (SLAVE_ADDRESS 1)|0x00 #define SLAVE_READ_ADDRESS (SLAVE_ADDRESS 1)|0x01 #define I2C_SDA BIT3 #define I2C_SCL BIT4 #define I2C_PORT_IN P6IN #define I2C_PORT_OUT P6OUT #define I2C_PORT_DIR P6DIR #define SDA_IN (I2C_PORT_IN & I2C_
[单片机]
基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计
***************************************************/ #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #include 1602LCD_drive.h //包含LCD驱动程序软件包 #include DS18B20_drive.h //DS18B20驱动程序软件包 #define beep_0 (PORTD=PORTD&0xbf) //PD6上的蜂鸣器发声 #define beep_1 (PORTD=PORTD|0x40) //PD6上的蜂鸣器
[单片机]
AT89C2051单片机倒车防撞系统设计方案
  本方案所设计的倒车防撞报警系统采用软、硬件结合的方法,具有模块化和多用化的特点。设计中介绍了超声波检测的发展及基本原理,阐述了超声波传感器的原理及特性。对于系统的一些主要参数进行了讨论,并且在介绍超声波测距系统功能的基础上,提出了系统设计的总体构成,本方案的提出将对汽车主动防撞乃至自动驾驶产生,给驾驶者提供一个倒车的操作指令。   1.引言   众所周知,要检测两头之间是否有障碍物,一般的做法是一头发射一个信号,在接收处判断是否有信号接收到,若有信号接收到,说明中间没有障碍物;若接收不到,则说明有障碍物。然而在汽车倒车防撞报警系统的设计中,由于汽车是一个移动的物体,不可能在某一具体的位置上安装接收或发射装置,这就决定了系统的发
[单片机]
AT89C2051<font color='red'>单片机</font>倒车防撞系统设计方案
车用MCU是从1到N的长期主义过程
汽车产业正在经历着巨大的变革,并体现出高速的增长势头。在这场变革中,背后对应着两个底层逻辑,第一是全球化从1到N的需求;第二,平台化才是性价的保证。兆易创新科技集团股份有限公司汽车产品部负责人何芳指出,一款芯片能否满足客户的需求,取决于这几个阶梯,第一阶梯是可靠性,这是从1到N的关键;第二阶梯是OTA,产品设计时需要定义如何支持未来10-15年汽车性能的OTA功能;第三阶梯是可拓展性,帮助客户更好地实现功能增加;第四阶梯是平台化,这是保证性价比、出口体系的关键一环。 然而,国内企业由于发展历程积累相较国外企业还比较短,同样规格的产品在性价比上优势不高,那要如何找到适合自己的0到1?何芳指出:“首先要了解客户未来在电子电气
[汽车电子]
车用<font color='red'>MCU</font>是从1到N的长期主义过程
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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