📄 data_check.c
字号:
#include <msp430x13x.h> // Standard Equations
#include "in430.h"
#include "stdlib.h"
#include "stdio.h"
#define GAS BIT1
#define WATER BIT2
#define OIL BIT0
#define BELL BIT7
#define BELL1 BIT3
#define POWER BIT4
#define CS BIT0
#define PWR BIT2
#define TXEN BIT3
#define num 30
typedef unsigned char INT8U;
typedef unsigned short INT16U;
typedef unsigned long INT32U;
typedef char INT8;
typedef short INT16;
typedef long INT32;
void OILBell(void);
void GASBell(void);
void WATERBell(void);
void Delay(INT32 n);
void SetTxMode(void);
void SetRxMode(void);
unsigned int CheckSum(unsigned char* buf, unsigned char len);
unsigned long ulCount = 0,TBCounter = 0;
unsigned char ucCountFlg = 0,ucLEDFlg = GAS ,ucPowerFlg = 0;
unsigned char buffer[num];
INT8U BridgeBuf[6];
typedef struct ISRRUNNINGFLAG
{
INT8U usartTxISR:1;
INT8U recPacketTimerOut:1;
INT8U noUsed:6;
}ISRRUNNINGFLAG;
#define RINGBUFLEN 63
#define RINGHALFBUFLEN 32
#define RINGSENDBUFLEN 63
typedef struct USATR0BUFFPTR
{
INT8U headPtr;
INT8U endPtr;
INT8U count;
}USATRBUFFPTR;
ISRRUNNINGFLAG ISRRunningFlag0,ISRRunningFlag1;
INT8U RecvRingBufForUsart0[RINGBUFLEN+1];
INT8U SendRingBufForUsart0[RINGSENDBUFLEN+1];
USATRBUFFPTR SendQueuePtr0, RecvQueuePtr0;
void Delay(INT32 n)
{
INT8 i;
while(n--)
for(i=0;i<80;i++);
}
static void ManagePtr0Init()
{
SendQueuePtr0.headPtr = 0;
SendQueuePtr0.endPtr = 0;
SendQueuePtr0.count = 0;
RecvQueuePtr0.headPtr = 0;
RecvQueuePtr0.endPtr = 0;
RecvQueuePtr0.count = 0;
ISRRunningFlag0.usartTxISR = 0;
ISRRunningFlag0.recPacketTimerOut = 0;
ISRRunningFlag0.noUsed = 0;
}
static void Uart0Init(void)
{
//UCTL0 = SWRST;
UCTL0 = CHAR;
UTCTL0 = SSEL1;//USART0选择smclk
UBR00 = 0x41; // 8MHz 9600
UBR10 = 0x03; // 8MHz 9600
UMCTL0 = 0x81; // 8MHz 9600 modulation
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0;
// IE1 |= URXIE0; // Enable USART0 RX interrupt
//UCTL0 &= ~SWRST;
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 output direction
//_EINT(); // Enable interrupts
ISRRunningFlag0.usartTxISR = 0;
ManagePtr0Init();
}
static INT8 Usart0SendQueueNoFull(void)
{
if(SendQueuePtr0.count < RINGSENDBUFLEN)
return 1;
return 0;
}
static INT8 Usart0RecvQueueNoEmpty(void)
{
if(RecvQueuePtr0.count)
return 1;
return 0;
}
static void startupUSART0Send()
{
IE1 |= UTXIE0;
}
static INT8U USART0SendData(INT8U* buf, INT8U len)
{
INT8U count=0;
if((buf == (void*)0) || (len == 0))
return count;
do
{
if(Usart0SendQueueNoFull() == 1)
{
SendRingBufForUsart0[SendQueuePtr0.headPtr] = buf[count];
count++;
_DINT();
SendQueuePtr0.headPtr++;
SendQueuePtr0.headPtr &= RINGSENDBUFLEN;
SendQueuePtr0.count++;
_EINT();
}
else
break;
}while(count != len);
if(!ISRRunningFlag0.usartTxISR)
startupUSART0Send();
return count;
}
static INT8U USART0RecvData(unsigned char* buf, unsigned char len)
{
unsigned char count=0;
if((buf == (void*)0) || (len == 0))
return count;
while(Usart0RecvQueueNoEmpty() == 1)
{
buf[count] = RecvRingBufForUsart0[RecvQueuePtr0.endPtr];
count++;
_DINT();
RecvQueuePtr0.endPtr++;
RecvQueuePtr0.endPtr &= RINGBUFLEN;
RecvQueuePtr0.count--;
_EINT();
if(count == len)
break;
}
return count;
}
/*#pragma vector=USART0RX_VECTOR
__interrupt void Usart0RxISR(void)
{
if(URCTL0&0x80)
return;
RecvRingBufForUsart0[RecvQueuePtr0.headPtr] = RXBUF0;
//SendDataTo595(RecvRingBufForUsart0[RecvQueuePtr0.headPtr]);//
if(RecvQueuePtr0.count < RINGBUFLEN)
{
RecvRingBufForUsart0[RecvQueuePtr0.headPtr] = RXBUF0;
RecvQueuePtr0.headPtr++;
RecvQueuePtr0.headPtr &= RINGBUFLEN;
RecvQueuePtr0.count++;
}
}
*/
#pragma vector=USART0RX_VECTOR
__interrupt void Usart0RxISR(void)
{
if(RXBUF0=='A')
{BridgeBuf[0]=RXBUF0;
Delay(15);
BridgeBuf[1]=RXBUF0;
Delay(15);
BridgeBuf[2]=RXBUF0;
Delay(15);
BridgeBuf[3]=RXBUF0;
Delay(15);
BridgeBuf[4]=RXBUF0;
Delay(15);
BridgeBuf[5]=RXBUF0;
Delay(15);
}
}
#pragma vector=USART0TX_VECTOR
__interrupt void Usart0TxISR(void)
{
ISRRunningFlag0.usartTxISR = 1;
if(SendQueuePtr0.headPtr != SendQueuePtr0.endPtr)
{
TXBUF0 = SendRingBufForUsart0[SendQueuePtr0.endPtr];
SendQueuePtr0.endPtr++;
SendQueuePtr0.endPtr &= RINGSENDBUFLEN;
SendQueuePtr0.count--;
}
if(SendQueuePtr0.headPtr == SendQueuePtr0.endPtr)
{
ISRRunningFlag0.usartTxISR = 0;
IE1 &= ~UTXIE0;
}
}
INT8U * itoa(INT16U value, INT8U * buf, INT8U radix)
{
INT16U i;
INT8U * ptr, * temphold;
temphold = buf;
ptr = buf + 12;
*--ptr = 0; // Insert NULL char
do
{
// First create string in reverse order
i = (value % radix) + 0x30;
if(i > 0x39) i += 7;
*--ptr = i;
value = value / radix;
} while(value != 0);
// Next, move the string 6 places to the left Include NULL character
for( ; (*buf++ = *ptr++); );
return(temphold);
}
//itoa(air_temperature/1000, text, 10);
//ad
typedef struct
{
unsigned char Power[2];
}ADCPROCESSPARAM;
ADCPROCESSPARAM ADCProcessParm;
void StartADC12(void)
{
P6SEL = 0x07;
P6DIR = 0x00;
ADC12CTL0 &= ~ENC;
ADC12MCTL0 = SREF_0 + INCH_0;/*供电测量*/
ADC12CTL1 = CSTARTADD_0 + SHS_0 + SHP + ADC12DIV_0 + ADC12SSEL_0 + CONSEQ_0;
ADC12CTL0 |= SHT0_8 + SHT0_2 + SHT0_1 + ADC12ON;
ADC12IE = 1;
ADC12CTL0 |= ENC + ADC12SC;
}
#pragma vector=ADC_VECTOR
__interrupt void AdcISR(void)
{
unsigned int IntVector=0;
_DINT();
IntVector = ADC12IV;
switch(IntVector)
{
case 6:
*((unsigned int*)ADCProcessParm.Power) = ADC12MEM0;
//ADC12CTL0 = 0x0000;
//ADC12CTL1 = 0x0000;
break;
default:
break;
}
}
//无线传输模块函数
void SetTxMode(void)
{
P4OUT=CS+PWR+TXEN;
Delay(1); // delay for mode change(>=650us)
}
void SetRxMode(void)
{
P4OUT=CS+PWR;
Delay(1); // delay for mode change(>=650us)
}
//
unsigned int CheckSum(unsigned char* buf, unsigned char len)
{
unsigned char i;
unsigned int checkdata;
checkdata=0;
for(i=0;i<len;i++)
{
checkdata+=buf[i];
}
return checkdata;
}
INT8U suc[]="D101E",can[15],string[5],rcfrpcbuf[]="A12345D101E",receive[]="DE";
INT8U head=0,tail=0,lenth,k;
void main(void)
{
unsigned int uiCounterm = 0,uiFlg = 0,check=0;
INT32 i,j;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1=0x0; // ACLK = LFXT1 = HF XTAL
BCSCTL2 |= SELM_2+SELS;
/********************等待时钟源转换结束**************************/
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
/**************************I/O口初始化**************************/
P5DIR |= GAS + WATER + OIL + POWER;//
P5OUT |= GAS;
P5OUT &= ~POWER;
P4SEL = BIT7;//TB COUNT INIT
P4DIR &= ~BIT7;
//比较器 由CA1输入,接于正端,参考源接于负端,开比较器,下降沿中断,中断允许
P2SEL |= BIT4;
P2DIR &= ~BIT4;
CACTL2 = P2CA1 ;
CACTL1 = 0;
//CACTL1= CAREF_2 + CAON + CAIE;// + CAIES;Comp. A Int. Ref. Select 2 : 0.5*Vcc */
CACTL1= CAREF_2 + CAON;
// CACTL1 |= /*CAIE +*/ ;
// 外部引脚连接到比较器,比较信号经过RC滤波
CCR0 = 60000;//10ms
CCR2 = 60000;//15MS
TBCCR0 = 0X0FFFF;
CCTL2 |= OUTMOD_7 + CCIE;//INTERRUPT ENABLE
TACTL |= TASSEL_2 + ID_3 + MC_1 + TACLR ;// smclk,60ms //can 1/8分频增计数模式,计数到ccro,再清零计数;
TBCTL |= TBSSEL_0 + TBCLR + MC_1;//STAR TB选择外部引脚信号作为输入源,增计数模式
P2DIR =0xff;
P2OUT =0x00;
P1DIR =0xff;
P1OUT =0x00;
P5OUT &= ~(WATER + OIL);
P4DIR=0x0f;
//P4OUT=0x0;
Uart0Init();
_EINT();
SetTxMode();
while(1)
{
itoa(TBCounter,string,10);
/*if(strlen(string)==3)
{can[0]='A';
can[1]='0';
can[2]='0';
}*/
// strcat(can,string);
//strcat(can,suc);
lenth=strlen(string);
can[0]='A';
for(j=0;j<5-lenth;j++)
{can[j+1]='0';}
for(i=0;i<lenth;i++)
{can[6-lenth+i]=string[i];}
can[6]='P';
if ((CAOUT & CACTL2) == CAOUT)
{can[7]='1';}
else can[7]='0';
can[8]='E';
Delay(2);
USART0SendData(can,9);
for(j=0; j<0x2fff; j++)_NOP();
//can[]='A';
Delay(100);
/* SetRxMode();
Delay(2);
// USART0RecvData(BridgeBuf, 6);
//for(i=0; i<0x2fff; i++) _NOP();
Delay(90);
//check=CheckSum(BridgeBuf,4);
if((BridgeBuf[0]=='A')&&(BridgeBuf[5]=='E'))
{//USART0SendData(BridgeBuf, 5);
for(i=1; i<5; i++)
{receive[i]=BridgeBuf[i];
}
if (receive[1] == '1')
{
P5OUT = GAS;
}
else if (receive[1] == '2')
{
P5OUT = OIL;
}
else if (receive[1] == '3')
{
P5OUT = WATER;
}
BridgeBuf[0]='C';
}*/
//IE1 |= URXIE0;
//USART0SendData(string,12);
// USART0SendData(suc,8);
// if((BridgeBuf[0]=='S')&&(BridgeBuf[4]=='E'))
// {USART0SendData(BridgeBuf,5);
// for(i=0; i<0xffff; i++)_NOP();
// USART1SendData(suc,8);
// for(i=0; i<0xffff; i++)_NOP();
//TXBUF1 = 'a';
//Delay(200);
//TXBUF1 = 'b';
//Delay(200);
//TXBUF1 = 'c';
// Delay(200);
//USART1SendData(receive,2);
//for(i=0; i<0xffff; i++)_NOP();
//_BIS_SR(CPUOFF); // Enter LPM0
// _NOP(); // Required only for C-spy
}
}
void OILBell(void)
{
P1SEL |= BELL ;
P1DIR |= BELL ;
P2SEL |= BELL1;
P2DIR |= BELL1;
CCR1 = 20000;//CCR0/2;
CCTL1 |= OUTMOD_7 ;//INTERRUPT ENABLE
}
void WATERBell(void)
{
P1SEL |= BELL ;
P1DIR |= BELL ;
P2SEL |= BELL1;
P2DIR |= BELL1;
CCR1 = CCR0;
CCTL1 |= OUTMOD_7 ;//INTERRUPT ENABLE
}
void GASBell(void)
{
P1SEL &= ~BELL ;
P1DIR |= BELL ;
P1OUT &= ~BELL ;
P2SEL &= ~BELL1;
P2DIR |= BELL1;
P2OUT &= ~BELL1;
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_CCR1(void)
{
// if((ulCount++) == 2)
// { //P5OUT ^= 0x04;
TBCTL &= ~(BIT4 + BIT5);//STOP TB
TBCounter = TBR;
TBCTL |= TBCLR + MC_1;//STAR T
// ulCount = 0;
//itoa(TBCounter,string,10);
// USART0SendData(string,4);
// }
// if(ulCount>2){ulCount=0;}
/* if(TBCounter < 100)
{
ucLEDFlg = WATER;
//WATERBell();
P5OUT &= ~(OIL + GAS);
}
else if(TBCounter < 5000)//19000
{
ucLEDFlg = OIL;
// OILBell();
P5OUT &= ~(WATER + GAS);
}
else
{
ucLEDFlg = GAS;
// GASBell();
P5OUT &= ~(WATER + OIL);
}
if (ucLEDFlg == GAS)
{
P5OUT ^= GAS;
}
else if (ucLEDFlg == OIL)
{
P5OUT ^= OIL;
}
else
{
P5OUT ^= WATER;
}*/
//if(ucPowerFlg == POWER)
// Delay(1);
if ((CAOUT & CACTL2) == CAOUT)
{
P5OUT ^= POWER;
}
ucCountFlg = 0x5A;
CCTL2 &= ~CCIFG;//软件清除中断标志
// _DINT();
}
/*#pragma vector=COMPARATORA_VECTOR
__interrupt void Comparatora_A (void)
{
ucPowerFlg = POWER;
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -