MSP430F5438无线温度发送
来源:互联网 发布:f35知乎 编辑:程序博客网 时间:2024/05/01 11:40
- //===========================================================================//
- // 北京理工大学珠海学院 徐方鑫 //
- // 280599580@qq.com //
- // 2011.3.31 //
- //===========================================================================//
- #include "msp430x54x.h"
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include "LED.H"
- #include "DS18B20.H"
- #include "PIN_DEF.H"
- #define uchar unsigned char
- #define uint unsigned int
- #define FLL_FACTOR 749 // FLL_FACTOR: DCO倍频系数
- unsigned int Do1Convert(void);
- void Delay(unsigned int cnt);
- void Init_CLK(void);
- void Init_Port(void);
- void Init_RSUART(void);
- void Send232(char *tx_buf);
- char event, RXBuffer[2];
- int TEMP;
- float temp;
- LED_STRUCT LED[8];
- char Thermometer[5];
- char Thermometer_send[4];
- uchar Thermometer_sendData;
- unsigned char SMG[10]=
- {
- ~(SEGA+SEGB+SEGC+SEGD+SEGE+SEGF) ,
- ~(SEGB+SEGC) ,
- ~(SEGA+SEGB+SEGD+SEGE+SEGG) ,
- ~(SEGA+SEGB+SEGC+SEGD+SEGG) ,
- ~(SEGB+SEGC+SEGF+SEGG) ,
- ~(SEGA+SEGC+SEGD+SEGF+SEGG) ,
- ~(SEGA+SEGC+SEGD+SEGE+SEGF+SEGG) ,
- ~(SEGA+SEGB+SEGC) ,
- ~(SEGA+SEGB+SEGC+SEGD+SEGE+SEGF+SEGG) ,
- ~(SEGA+SEGB+SEGC+SEGD+SEGF+SEGG) ,
- };
- //***************************************************************************//
- // //
- // 主程序模块 //
- // //
- //***************************************************************************//
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; //禁止看门狗
- Ini_LED(10);
- Init_CLK(); //时钟初始化
- Init_Port(); //IO端口初始化
- Init_RSUART(); //串口初始化
- OW_DIO_PULLUP;
- SFRIE1|=WDTIE; // 使能WDT中断
- WDTCTL=WDT_ADLY_1000; // 设置WDT为INTERVAL模式,中断间隔100ms
- MAIN_POWER_ON;
- TBCTL = TBSSEL_1 + MC_1 + TBCLR + TBIE; // 时钟源 = ACLK
- TBCCR0 = 64; // 刷新频率 = 32768/64/8=64Hz
- _EINT(); //开启总中断
- TEMP=Do1Convert(); //读取温度转换数据
- __delay_cycles(10000);
- for(;;) //后台任务
- {
- LPM3;
- _NOP();
- if(event)
- {
- event = 0x00;
- Send232(RXBuffer);
- }
- }
- }
- //***************************************************************************//
- // //
- // 延时程序 //
- // //
- //***************************************************************************//
- void Delay(unsigned int cnt)
- {
- unsigned int i=0;
- for(i=0;i<cnt;i++)
- {
- _NOP();
- }
- }
- //***************************************************************************//
- // //
- // 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1) //
- // //
- //***************************************************************************//
- void Init_CLK(void)
- {
- WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
- P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
- UCSCTL6 &=~XT1OFF ; // 使能外部晶振
- UCSCTL6 |= XCAP_3 ; // 设置内部负载电容
- UCSCTL3 |= SELREF_2 ; // DCOref = REFO
- UCSCTL4 |= SELA_0 ; // ACLK = XT1
- __bis_SR_register(SCG0) ; // 关闭FLL控制回路
- UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
- UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
- UCSCTL2 = FLLD__1 + FLL_FACTOR ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
- __bic_SR_register(SCG0) ; // 打开FLL控制回路
- __delay_cycles(1024000) ;
- do
- {
- UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
- SFRIFG1 &= ~OFIFG ;
- }while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
- }
- //***************************************************************************//
- // //
- // Init_Port(void): 设置IO端口 //
- // //
- //***************************************************************************//
- void Init_Port(void)
- {
- P5DIR |= POWER ; // 主电源
- MAIN_POWER_ON ;
- P7DIR |= LED_PWR ; // 发光二极管电源
- P7OUT &=~LED_PWR ;
- INTERNAL_PULL_UP ; // 使能键盘端口内部上拉电阻
- ROW_IN_COL_OUT ; // 设置行输入,列输出0
- }
- //***************************************************************************//
- // //
- // Init_RSUART(void): 初始化RS232/485端口 //
- // //
- //***************************************************************************//
- void Init_RSUART(void)
- {
- RS_PORT_SEL |= TXD + RXD ; // 选择引脚功能
- RS_PORT_DIR |= TXD ; // 选择引脚功能
- UCA3CTL1 = UCSWRST ; // 状态机复位
- UCA3CTL1 |= UCSSEL_1 ; // CLK = ACLK
- UCA3BR0 = 0x03 ; // 32kHz/9600=3.41
- UCA3BR1 = 0x00 ;
- UCA3MCTL = UCBRS_3 + UCBRF_0 ; // UCBRSx=3, UCBRFx=0
- UCA3CTL1 &= ~UCSWRST ; // 启动状态机
- UCA3IE |= UCRXIE ; // 允许接收中断
- RS485_IN ;
- }
- //***************************************************************************//
- // //
- // Send232(char *tx_buf): RS232端口发送程序 //
- // //
- //***************************************************************************//
- void Send232(char *tx_buf)
- {
- unsigned char i,length ;
- length = strlen(tx_buf) ;
- for(i=0;i<length;i++)
- {
- UCA3TXBUF = *tx_buf++ ;
- while (!(UCA3IFG&UCTXIFG)) ;
- }
- }
- //***************************************************************************//
- // //
- // Send232_char(char *tx_buf): RS232端口发送程序 //
- // //
- //***************************************************************************//
- void Send232_char(uchar x)
- {
- UCA3TXBUF = x ;
- while (!(UCA3IFG&UCTXIFG)) ;
- }
- //***************************************************************************//
- // //
- // RS232接收中断服务程序 //
- // //
- //***************************************************************************//
- #pragma vector=USCI_A3_VECTOR
- __interrupt void USCI_A3_ISR(void)
- {
- switch(__even_in_range(UCA3IV,4))
- {
- case 0:break ; // Vector 0 - no interrupt
- case 2: // Vector 2 - RXIFG
- RXBuffer[0] = UCA3RXBUF ;
- event |= 0x01 ;
- break ;
- case 4:break ; // Vector 4 - TXIFG
- default: break ;
- }
- }
- //***************************************************************************//
- // //
- //看门狗中断服务程序,刷新显示数据 //
- // //
- //***************************************************************************//
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer (void)
- {
- TEMP=Do1Convert(); //读取温度转换数据
- temp = TEMP>>4;
- temp += (float)(TEMP&0x000F)/16;
- LED_Disp_Float(temp,1,NO_ZERO);
- sprintf(Thermometer,"%2.1f",temp);
- //Send232(&Thermometer[3]);
- Thermometer_send[0]=Thermometer[0];
- Thermometer_send[1]=Thermometer[1];
- Thermometer_send[2]=Thermometer[3];
- Thermometer_sendData=(uchar)(atoi(Thermometer_send)/3); //这里中继需要注意,必须int,否则会有问题
- Send232_char(Thermometer_sendData);
- __delay_cycles(5000000); //串口延时
- LPM3_EXIT;
- }
- //***************************************************************************//
- // //
- // TIMERB1中断服务程序,数码管显示 //
- // //
- //***************************************************************************//
- #pragma vector=TIMERB1_VECTOR
- __interrupt void TIMERB1_ISR(void)
- {
- static unsigned char on_off = 1 ;
- static unsigned char digit = 1 ;
- static unsigned int flicker_timer = 0 ;
- P8OUT = LED[digit-1].data ;
- switch(digit)
- {
- case 1: case 2: case 3: case 4:
- MASK_DIGITS ;
- if(LED[digit-1].mode&DIGIT_FLICKER)
- if(flicker_timer>256)
- break ;
- if(LED[digit-1].mode&DIGIT_OFF)
- break ;
- if(on_off)
- {
- LOW_DIGITS_OUT(~(0x01<<(digit-1))) ;
- P8OUT = LED[digit-1].data ;
- }
- break ;
- case 5: case 6: case 7: case 8:
- MASK_DIGITS ;
- if(LED[digit-1].mode&DIGIT_FLICKER)
- if(flicker_timer>256)
- break ;
- if(LED[digit-1].mode&DIGIT_OFF)
- break ;
- if(on_off)
- {
- HIGH_DIGITS_OUT(~(0x10<<(digit-5))) ;
- P8OUT = LED[digit-1].data ;
- }
- break ;
- }
- if(on_off)
- if(++flicker_timer>=512)
- flicker_timer = 0 ;
- if(on_off)
- TBCCR0 = LED[digit-1].lightness ; // 亮度调节
- else
- TBCCR0 = 64 - LED[digit-1].lightness ;
- if(on_off)
- if(++digit>8)
- digit = 1 ;
- on_off ^= 0x01 ;
- TBCTL &= ~TBIFG ;
- }
- MSP430F5438无线温度发送
- MSP430F147无线温度接收
- nRF24L01无线温度检测
- 无线温度监测后台软件
- NRF24l01无线温度传感 收发程序
- NRF24l01无线温度传感 收发程序
- NRF24l01无线温度传感 收发程序
- 基于NRF905的无线温度采集系统
- nrf24l01+无线发送
- 【cc3200】向服务器发送温度数据
- 基于PSoC的飞艇智能无线温度采集系统设计
- 一种蓝牙在无线温度传感中的应用领域综述
- 1-6 实验5 无线温度检测实验
- 【C】通过红外实现温度的无线测量与传输
- 基于stm32的无线多点温度采集系统设计
- 温度
- 温度
- 温度
- JSON入门详解-转载
- matlab编写的进退法,黄金分割法,抛物线法(二次插值法),wolfe不精确一维搜索
- 原来还有D语言。。。
- 新手C++
- MSP430F147无线温度接收
- MSP430F5438无线温度发送
- 53个小技巧提高PHP编程效率
- [原创+源码]绝对强悍:jQuery实现可编辑表格的用户管理系统 (二)
- 微软算法
- 我写的
- 与愚人节有关的无聊事——QQ伪装
- Android的概括介绍
- 链表
- 各种数据库的JDBC驱动下载及连接字符串URL写法