#include <ioCC2530.h>
#include <string.h>
#include <stdio.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define ENABLE 1
#define DISABLE 0
#define LED1 P1_0
#define LED2 P1_1
#define S1 (P0_1 == 0 ? 1 : 0)
#define S2 (P2_0 == 0 ? 1 : 0)
u8 SysSleep = 0;
u8 USARTFlag = 0;
u8 USARTCount = 0;
char UsartBuff[50];
float ADC_ConvTem(void);
void Delay_MS(u16 time)
{
u16 i,j;
for(i=0;i<time;i++)
for(j=0;j<1070;j++);
}
__near_func int putchar(int c)
{
UTX0IF = 0;
U0DBUF = (char)c;
while(UTX0IF == 0);
return(c);
}
void LED_Init(void)
{
P1SEL &= ~0x03;
P1DIR |= 0x03;
}
void KEY_Init(void)
{
P0SEL &= ~0X02;
P0DIR &= ~0X02;
P0INP &= ~0X02;
P0IFG &= 0;
P0IF = 0;
PICTL |= 0x01;
P0IEN |= 0x02;
P0IE = 1;
EA = 1;
P2SEL &= ~0x01;
P2DIR &= ~0x01;
P2INP &= ~0xa1;
}
void TIM3_Init(void)
{
T3CTL |= 0x08;
T3CTL |= 0xe0;
T3CTL &= ~0x03;
T3IE = 1;
EA = 1;
T3CTL |= 0x10;
}
void USART_Init(void)
{
PERCFG &= ~0x01;
P0SEL |= 0x0c;
P0DIR |= 0x0c;
P0INP &= ~0x0c;
P2INP &= ~0x20;
U0CSR |= 0x80;
U0CSR |= 0x40;
U0UCR &= ~0x10;
U0UCR &= ~0x08;
U0UCR &= ~0x04;
U0GCR |= 11;
U0BAUD |= 216;
URX0IE = 1;
EA = 1;
}
void ADC_Init(void)
{
ADCIE = 0;
ADCIF = 0;
ADCCON1 &= ~0x30;
ADCCON1 |= 0x30;
ADC_ConvTem();
Delay_MS(10);
ADC_ConvTem();
}
void SysPowerMode(u8 mode)
{
if(mode < 4 && mode > 0)
{
SLEEPCMD |= mode;
PCON = 0X01;
}
else PCON = 0;
}
void USART_Send(u8 dat)
{
U0DBUF = dat;
URX0IF = 0;
while(UTX0IF==0);
UTX0IF = 0;
}
void USART_LED(void)
{
if(USARTFlag)
{
if(!strcmp(UsartBuff,"LED_ON@"))
LED1 = 0;
if(!strcmp(UsartBuff,"LED_OFF@"))
LED1 = 1;
for(u8 i=0;i<USARTCount;i++)
{
printf("%c",UsartBuff[i]);
UsartBuff[i] = 0;
}
printf("rn");
USARTFlag = DISABLE;
USARTCount = 0;
}
}
float ADC_ConvTem(void)
{
float temp;
P0IE = 0;
P0IEN &= ~0x02;
TR0 =1;
ATEST = 1;
ADCCON2 = 0X3E;
ADCCON1 |= 0x30;
for(char i =0;i<2;i++)
{
ADCCON1 |= 0x40;
while(ADCCON1&0x80 == 0);
temp = ADCH<<4 | ADCL>>4;
temp = (temp - 1367.5)/4.5;
}
TR0 =0;
ATEST = 0;
P0IFG = 0;
P0IE = 1;
P0IEN |= 0x02;
return temp;
}
void SetCLK32M(void)
{
CLKCONCMD &= ~0x40;
while(CLKCONSTA&0x40);
CLKCONCMD &= ~0x47;
}
int main(void)
{
LED_Init();
TIM3_Init();
USART_Init();
ADC_Init();
SetCLK32M();
KEY_Init();
while(1)
{
if(SysSleep)
{
printf("进入睡眠模式rn");
Delay_MS(1);
SysPowerMode(3);
Delay_MS(1);
printf("进入正常模式rn");
}
if(S2)
{
while(S2);
printf("芯片温度为:%2.2f度rn",ADC_ConvTem());
}
USART_LED();
Delay_MS(100);
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
SysSleep = !SysSleep;
if(!SysSleep)
{
SysPowerMode(4);
}
P0IFG = 0;
P0IF = 0;
}
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
static unsigned int i = 0;
i++;
if(i>244)
{
LED2 = ~LED2;
i=0;
}
}
#pragma vector = URX0_VECTOR
__interrupt void U0Rx_ISR(void)
{
unsigned char RxBuff;
RxBuff = U0DBUF;
if(USARTCount<50 && USARTFlag == DISABLE)
{
UsartBuff[USARTCount] = RxBuff;
USARTCount++;
if(RxBuff == '@')
{
USARTFlag = ENABLE;
}
}
else
{
USARTFlag = ENABLE;
}
}
以上程序在开发板上正常运行: