//===========================================================================//
// 北京理工大学珠海学院 徐方鑫 //
// 280599580@qq.com //
// 2011.3.31 //
//===========================================================================//
#include
#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;
}