|
//两块电路板,单片机都是MSP430F427,一块通过串口发送,另一块通过串口接收,现在问题是
//发送板一直没有发出信号,测量输出端口(TX),一直保持高电平,通过硬件仿真跟踪发现只要
//将该串口引脚设置为串口功能该引脚(TX)就一直处于高电平。不明白为什么,希望高手指点是
//不是程序有问题,首先可以确定硬件电路没发现问题下面是两个程序,一个是发射控制程序,
//另一个是接收程序
//发射程序
void IO_init (void)
{
//定义液晶显示器控制端口为输出
P1DIR|=((1<<5)|(1<<6)|(1<<7));
//定义液晶显示器背光控制端口为输出
// P2DIR|=(1<<P2DIR_0);
P2DIR|=(1<<0); // P2DIR_0 宏定义有问题不能正常使用,要改为数字
//定义DA转换器的控制端口为输出
P1DIR|=((1<<0)|(1<<1)|(1<<2)); //定义DA转换器的控制端口为输出
// P1DIR|=((1<<0)|(1<<1)|(1<<2));
//定义电源状态监测口p1.4为输入
P1DIR&=~(1<<4);
//定义电源控制端口p1.3为输出
P2DIR|=(1<<3);
P2OUT&=~(1<<3);
//定义指示灯控制端口P2.1为输出
P2DIR|=(1<<1);
P2OUT|=(1<<1);
//定义P2.4和P2.5为外设功能
P2SEL|=((1<<4)|(1<<5));
//定义P2.5为输入(串口的输入)
P2DIR&=~(1<<5);
//定义P2.4为输出(串口的输出)
P2DIR|=(1<<4);
// P2OUT&=~(1<<4);
}
/********************************************************************
函 数 名:Usart0init ()
功 能:UART0初始化函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-21
修 改: 日 期:
********************************************************************/
void Usart0init(void)
{
ME1 |=( (1<<6)|(1<<7)); //UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0= (1<<4); // 8-bit character
UTCTL0= (1<<4); // UCLK = ACLK 8MHZ
UBR00 = 0x45; // 8MHz 115200
UBR10 = 0x00; // 8MHz 115200
UMCTL0 = 0x6F; // modulation
UCTL0 &= ~(1<<0);//SWRST; // Initialize USART state machine
IE1 |= 0xc0; //URXIE0 + UTXIE0; // Ena××e USART0 RX/TX interrupt
/*
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××ed USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character, SWRST = 1
UTCTL0 |= SSEL1 + SSEL0 + URXSE; // UCLK = ××CLK, start edge detect
UBR00 = 0x36; // 19200 from 1Mhz
UBR10 = 0x00;
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
*/
}
/********************************************************************
函 数 名:Usart0_rx (void)
功 能:UART0接收中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
}
/********************************************************************
函 数 名:Usart0_tx (void)
功 能:UART0发送中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
}
void main( void )
{
Sysclk_init();
// a××("mov.w #WDTPW+WDTHOLD,&WDTCTL");
WDTCTL = WDTPW |0x0080; //WDTHOLD; // Stop watchdog timer
// WDTCTL|=(1<<7); //关闭看门狗
// _BIS_SR( GIE); //允许中断
IO_init();
SD16_init();
// Timer_init();
Usart0init();
_EINT();
while(1) //开始检测
{
P2OUT|=(1<<1);
Delay_ms(50000);
P2OUT&=~(1<<1);
Delay_ms(50000);
timer_1++;
TXBUF0=8; //timer_1;
SD16CCTL0|=(1<<1); //开始AD转换
}
}
//接收程序
void IO_init (void)
{
//定义液晶显示器控制端口为输出
P1DIR|=((1<<5)|(1<<6)|(1<<7));
//定义液晶显示器背光控制端口为输出
// P2DIR|=(1<<P2DIR_0);
P2DIR|=(1<<0); // P2DIR_0 宏定义有问题不能正常使用,要改为数字
//定义DA转换器的控制端口为输出
P1DIR|=((1<<0)|(1<<1)|(1<<2)); //定义DA转换器的控制端口为输出
// P1DIR|=((1<<0)|(1<<1)|(1<<2));
//定义电源状态监测口p1.4为输入
P1DIR&=~(1<<4);
//定义电源控制端口p1.3为输出
P2DIR|=(1<<3);
P2OUT&=~(1<<3);
//定义指示灯控制端口P2.1为输出
P2DIR|=(1<<1);
P2OUT|=(1<<1);
//定义P2.4和P2.5为外设功能
P2SEL|=((1<<4)|(1<<5));
//定义P2.5为输入(串口的输入)
P2DIR&=~(1<<5);
//定义P2.4为输出(串口的输出)
P2DIR|=(1<<4);
// P2OUT&=~(1<<4);
}
/********************************************************************
函 数 名:Usart0init ()
功 能:UART0初始化函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-21
修 改: 日 期:
********************************************************************/
void Usart0init(void)
{
ME1 |=( (1<<6)|(1<<7)); //UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0 = (1<<4); // 8-bit character
UTCTL0 = (1<<4); // UCLK = ACLK 8MHZ
UBR00 = 0x45; // 8MHz 115200
UBR10 = 0x00; // 8MHz 115200
UMCTL0 = 0x6F; // modulation
UCTL0 &= ~0x01; //SWRST; // Initialize USART state machine
IE1 |=0xc0; // URXIE0 + UTXIE0; // Ena××e USART0 RX/TX interrupt
/*
P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××ed USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character, SWRST = 1
UTCTL0 |= SSEL1 + SSEL0 + URXSE; // UCLK = ××CLK, start edge detect
UBR00 = 0x36; // 19200 from 1Mhz
UBR10 = 0x00;
UMCTL0 = 0x6B; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt
*/
}
/********************************************************************
函 数 名:Usart0_rx (void)
功 能:UART0接收中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
xyz=RXBUF0;
}
/********************************************************************
函 数 名:Usart0_tx (void)
功 能:UART0发送中断函数
说 明:
入口参数:设定值
返 回 值:
设 计:HX 日 期:2006-7-22
修 改: 日 期:
********************************************************************/
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
}
void main( void )
{
Sysclk_init();
// a××("mov.w #WDTPW+WDTHOLD,&WDTCTL");
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
// WDTCTL|=(1<<7); //关闭看门狗
// _BIS_SR( GIE); //允许中断
IO_init();
P2OUT|=(1<<0);
LCD_INI();
SD16_init();
Usart0init();
_EINT();
// Timer_init();
// Usart0init();
while(1) //开始检测
{
P2OUT|=(1<<1);
Delay_ms(50000);
P2OUT&=~(1<<1);
float_to_LED(disp_buffer,xyz1,TA××E_0,7);
display();
Delay_ms(50000);
timer_1++;
write_to_da(timer_1);
// test_value= timer_1/1000.0;
float_to_LED(disp_buffer,xyz,TA××E_0,7);
display();
SD16CCTL0|=(1<<1); //开始AD转换
}
}
|
|