#include<msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define ET_HW (P3OUT&=~CTL_HW)//红外发送使能
#define DT_HW (P3OUT|=CTL_HW)//红外发送禁止
//------红外握手信号--------------
#define READY 0X71 //q
#define OK 0X55
#define POW 0X64 //d
#define OVER 0XFD
#define TE_485 (P3OUT|=BIT7)//485发送使能
#define RE_485 (P3OUT&=~BIT7)//485接收使能
#define CTL_HW BIT6
long base_power=12345678;
uchar buff[10]={0};
uchar cmd_485,cmd_hw;
uchar rec_buff[10]={0};
uchar rec_cnt=0;
uchar rec_flag=0;
//-------------------------------------
void delay(uint ms)
{
uchar a;
while(ms--)
{
a=100;
while(a--);
}
}
void main()
{
uchar i;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
DCOCTL=0XE0; //初始化时钟
BCSCTL1=0X86;
BCSCTL2=0X00;
//---UART设置-----------------
P3SEL|=BIT5+BIT4; //将P3.4 P3.5配置为UART
ME1|=UTXE0+URXE0; //使能收发
UCTL0|=CHAR; //+LISTEN;//八位模式 //回发模式
UTCTL0|=SSEL0; //选择ACLK 32768
UBR00=0X1B; //波特率配置 1200 上位机软件默认波特率4800
UBR10=0X00; //波特率配置
UMCTL0=0X03; //波特率配置
UCTL0&=~SWRST; //使能USATT
IE1|=URXIE0; //使能接收中断
//IE1|=UTXIE0; //使能发送中断
P3DIR|=BIT7; //P3.7为收发控制引脚
//------红外----------------------
P3DIR|=CTL_HW;
DT_HW;//禁止红外发射
RE_485;
_EINT();
/*
while(1)
{
ET_HW;
for(i=0;i<10;i++)
{
TXBUF0=i;//从机应答OK
while(!(UTCTL0&TXEPT)); //判断发送是否完成
delay(5000);
}
}
*/
while (1)
{
//-------红外抄表--------------------------------------
if(rec_flag==1)
{
rec_flag=0;//接收完成标识清零
if(rec_buff[0]==0xaa)//起始符
{
if(rec_buff[1]=='P')
{
ET_HW;//使能红外发送
cmd_hw=0xff;
// Flash_Read(0xFA00,flash_data_buff,3);
// base_power=flash_data_buff[0]*0xffff+flash_data_buff[1]+0xff+flash_data_buff[0];
buff[0]=base_power/10000000;
buff[1]=base_power%10000000/1000000;
buff[2]=base_power%1000000/100000;
buff[3]=base_power%100000/10000;
buff[4]=base_power%10000/1000;
buff[5]=base_power%1000/100;
buff[6]=base_power%100/10;
buff[7]=base_power%10;
_DINT();
TXBUF0=0X55; //起始符
while(!(UTCTL0&TXEPT));
for(i=0;i<8;i++) //--8个字节数据
{
TXBUF0=buff[i];
while(!(UTCTL0&TXEPT));
delay(3);
}
TXBUF0=OVER; //结束符
while(!(UTCTL0&TXEPT));
DT_HW;//禁止红外发送
delay(5);
IFG1&=(~UTXIFG0);//清除发送标识
IFG1&=(~URXIFG0);//清除接收标识
_EINT();
}
}
}
}
}
/*-----------------------------------------
-----------------------------------------*/
#pragma vector=UART0RX_VECTOR //接收中断
__interrupt void usart0_rx(void) //接收中断
{
IFG1&=(~URXIFG0);//清除接收标识
rec_buff[rec_cnt++]=U0RXBUF;
if(rec_buff[rec_cnt-1]==OVER)
{
rec_flag=1;
rec_cnt=0;
}
/*
rec_cnt++;
if((cmd_485>0)&&(cmd_485<0x10))//判断是否为485的命令
{
cmd_485=cmd_485;//----是485命令
}
else //------判断是否为红外抄表命令
{
//---是红外抄表命令
cmd_hw=cmd_485;
cmd_485=0xff;
RE_485;//关闭485发送使能
}
// BG1_ON;
*/
}