- //===========================================================================//
- // 北京理工大学珠海学院 徐方鑫 //
- // 280599580@qq.com //
- // 2011.3.31 //
- //===========================================================================//
- #include <msp430x14x.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar dN[6]; //要显示的6位温度数字
- uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管七段码;0--f
- uchar cnt = 0; //数码管位选变量
- uchar Thermometer[1]; //温度全局变量
- int Thermometer_1;
- void init_clock(void); //时钟模块初始化
- void init_watchdog(void); //看门狗初始化
- void init_codeDisplay(void); //数码管初始化
- void init_sci(void); //串口初始化
- /*******************************************
- 函数名称:init_all
- 功 能:总初始化
- 参 数:无
- 返回值 :无
- ********************************************/
- void init_all(void)
- {
- WDTCTL=WDTPW+WDTHOLD; //禁止看门狗
- init_clock(); //总线时钟初始化-MSP430为锁频环
- init_watchdog(); //看门狗模块初始化
- init_sci(); //串口初始化
- init_codeDisplay(); //数码管初始化
- }
- /****************主函数****************/
- void main(void)
- {
- init_all(); //主初始化程序
- while(1);//后台等待
- }
- /*******************************************
- 函数名称:init_clock
- 功 能:系统时钟初始化
- 参 数:无
- 返回值 :无
- ********************************************/
- void init_clock(void)
- {
- uchar i;
- /*------选择系统主时钟为8MHz-------*/
- BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
- do
- {
- IFG1 &= ~OFIFG; //清除晶振失败标志
- for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
- }
- while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
- BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
- }
- /*******************************************
- 函数名称:init_watchdog
- 功 能:看门狗初始化
- 参 数:无
- 返回值 :无
- ********************************************/
- void init_watchdog(void)
- {
- //设置看门狗定时器,初始化控制数码管的IO
- WDTCTL = WDT_ADLY_1_9;
- IE1 |= WDTIE;
- //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
- TACTL |= TASSEL_2 + ID_3;
- //打开全局中断
- _EINT();
- }
- /*******************************************
- 函数名称:init_sci
- 功 能:串口初始化
- 参 数:无
- 返回值 :无
- ********************************************/
- void init_sci(void)
- {
- P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
- ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
- UCTL0 |= CHAR; // 8-bit character
- UTCTL0 |= SSEL1; // UCLK = SMCLK
- /* 8M / 9600 = 833 833 = 0x0341 0.000 * 8= 0*/
- UBR00 = 0x41;
- UBR10 = 0x03;
- UMCTL0 =0x00;
- /*UBR00 = 0x45; // 8MHz 115200
- UBR10 = 0x00; // 8MHz 115200
- UMCTL0 = 0x00;*/ // 8MHz 115200 modulation
- UCTL0 &= ~SWRST; // Initialize USART state machine
- IE1 |= URXIE0; // Enable USART0 RX interrupt
- _BIS_SR(GIE); // Enter LPM0 w/ interrupt
- }
- /*******************************************
- 函数名称:init_codeDisplay
- 功 能:数码管显示初始化
- 参 数:无
- 返回值 :无
- ********************************************/
- void init_codeDisplay(void)
- {
- P4DIR = 0xff;
- P5DIR = 0xff;
- P4OUT = 0x00;
- P5OUT = 0xff;
- }
- /*******************************************
- 函数名称:watchdog_timer
- 功 能:看门狗定时器中断服务函数,进行数码
- 管动态扫描
- 参 数:无
- 返回值 :无
- ********************************************/
- #pragma vector = WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- P5OUT = 0xff;
- Thermometer_1=Thermometer[0]*3;
- switch(cnt)
- {
- case 0 : P5OUT &=~BIT1;P4OUT=~scandata[Thermometer_1/100];break;
- case 1 : P5OUT &=~BIT2;P4OUT=~scandata[Thermometer_1%100/10];P4OUT &= ~0x80;break;
- case 2 : P5OUT &=~BIT3;P4OUT=~scandata[Thermometer_1%10];break;
- }
- cnt++;
- if(cnt == 5) cnt = 0;
- }
- #pragma vector=USART0RX_VECTOR
- __interrupt void usart0_rx (void)
- {
- while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
- Thermometer[0] = RXBUF0; // RXBUF0 to TXBUF0
- TXBUF0 = Thermometer[0];
- //TXBUF0 = Thermometer[i];
- //Send_data(Thermometer);
- //if(i==5) i=0;
- }