- //===========================================================================//
- //北京理工大学珠海学院徐方鑫//
- //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"
- #defineucharunsignedchar
- #defineuintunsignedint
- #defineFLL_FACTOR749//FLL_FACTOR:DCO倍频系数
- unsignedintDo1Convert(void);
- voidDelay(unsignedintcnt);
- voidInit_CLK(void);
- voidInit_Port(void);
- voidInit_RSUART(void);
- voidSend232(char*tx_buf);
- charevent,RXBuffer[2];
- intTEMP;
- floattemp;
- LED_STRUCTLED[8];
- charThermometer[5];
- charThermometer_send[4];
- ucharThermometer_sendData;
- unsignedcharSMG[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),
- };
- //***************************************************************************//
- //主程序模块//
- //***************************************************************************//
- voidmain(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);
- }
- }
- }
- //***************************************************************************//
- //延时程序//
- //***************************************************************************//
- voidDelay(unsignedintcnt)
- {
- unsignedinti=0;
- for(i=0;i<cnt;i++)
- {
- _NOP();
- }
- }
- //***************************************************************************//
- //初始化主时钟:MCLK=XT1×(FLL_FACTOR+1)//
- //***************************************************************************//
- voidInit_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端口//
- //***************************************************************************//
- voidInit_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端口//
- //***************************************************************************//
- voidInit_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端口发送程序//
- //***************************************************************************//
- voidSend232(char*tx_buf)
- {
- unsignedchari,length;
- length=strlen(tx_buf);
- for(i=0;i<length;i++)
- {
- UCA3TXBUF=*tx_buf++;
- while(!(UCA3IFG&UCTXIFG));
- }
- }
- //***************************************************************************//
- //Send232_char(char*tx_buf):RS232端口发送程序//
- //***************************************************************************//
- voidSend232_char(ucharx)
- {
- UCA3TXBUF=x;
- while(!(UCA3IFG&UCTXIFG));
- }
- //***************************************************************************//
- //RS232接收中断服务程序//
- //***************************************************************************//
- #pragmavector=USCI_A3_VECTOR
- __interruptvoidUSCI_A3_ISR(void)
- {
- switch(__even_in_range(UCA3IV,4))
- {
- case0:break;//Vector0-nointerrupt
- case2://Vector2-RXIFG
- RXBuffer[0]=UCA3RXBUF;
- event|=0x01;
- break;
- case4:break;//Vector4-TXIFG
- default:break;
- }
- }
- //***************************************************************************//
- //看门狗中断服务程序,刷新显示数据//
- //***************************************************************************//
- #pragmavector=WDT_VECTOR
- __interruptvoidwatchdog_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中断服务程序,数码管显示//
- //***************************************************************************//
- #pragmavector=TIMERB1_VECTOR
- __interruptvoidTIMERB1_ISR(void)
- {
- staticunsignedcharon_off=1;
- staticunsignedchardigit=1;
- staticunsignedintflicker_timer=0;
- P8OUT=LED[digit-1].data;
- switch(digit)
- {
- case1:case2:case3:case4:
- 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;
- case5:case6:case7:case8:
- 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无线温度发送
最新推荐文章于 2017-08-27 18:36:17 发布