此程序用到了CC2530的串口,定时器中断,外部中断。
此程序实现功能:
#include <ioCC2530.h>
#define LED1 P1_0
#define LED2 P1_1
#define SW1 P1_2
unsigned char Key_Count;//按键次数
unsigned char LED_Mode;
unsigned int Timer1_Count1;//定时器计时1
unsigned int Timer1_Count2;//定时器计时2
void initial_gpio()//初始化GPIO
{
P1SEL&=~0x07;//设置P1_0,P1_1,P1_2通用I/O功能
P1DIR|=0x03;//设置P1_0,P1_1输出
P1DIR&=~0x04;//设置P1_2输入
P1=0x00;//关闭LED灯
P1INP&=~0x04;//设置P1_2"上拉/下拉"模式
P2INP&=~0x40;//设置P1"上拉"输入
}
void initial_interrupt()//初始化外部中断
{
IEN2|=0x10;//使能P1中断源
P1IEN|=0x04;//使能P1_2中断
PICTL|=0x02;//P1_2中断下降沿触发
EA=1;//使能总中断
}
#pragma vector=P1INT_VECTOR//P1外部中断入口地址
__interrupt void P1_ISR(void)//P1外部中断服务函数
{
if(P1IFG&0x04)//判断来自P1_2的外部中断
{
Key_Count++;//按键次数自加
if(Key_Count>2)
Key_Count=1;
if(Key_Count==1)//按键第一次按下
LED_Mode=1;
if(Key_Count==2)//按键第二次按下
{
LED_Mode=0;//LED灯流水灯模式
Timer1_Count1=0;//定时器计时1清零
Timer1_Count2=0;//定时器计时2清零
LED1=1;
LED2=1;
}
}
P1IFG=0x00;//清除P1_2中断标志
P1IF=0x00;//清除P1外部中断标志
}
void initial_t1()//初始化定时器1
{
CLKCONCMD&=~0x7F;//设置晶振32MHz
while(CLKCONSTA&0x40);//等待晶振稳定
T1CTL=0x05;//启动定时器1,自由运行模式,8分频;0.016s中断一次
TIMIF|=0x40;//使能T1溢出中断
T1IE=1;//使能T1中断
EA=1;//使能总中断
}
#pragma vector=T1_VECTOR//定时器1中断入口地址
__interrupt void T1_ISR(void)//T1中断服务函数
{
//IRCON=0x00;//清中断标志位,硬件自动清零,可省略
if(LED_Mode==1)
{
Timer1_Count1++;
if(Timer1_Count1>312)//计时5s到
{
Timer1_Count1=0;//定时器计时1清零
LED1=0;
LED_Mode=2;
}
}
if(LED_Mode==2)
{
Timer1_Count2++;
if(Timer1_Count2==62)//计时1s到
{
LED1=1;
LED2=0;
}
if(Timer1_Count2==124)//计时2s到
{
Timer1_Count2=0;//定时器计时2清零
LED1=0;
LED2=1;
}
}
}
void initial_usart_tx()//初始化UART0
{
CLKCONCMD&=~0x7F;//设置晶振32MHz
while(CLKCONSTA&0x40);//等待晶振稳定
CLKCONCMD&=~0x47;//设置系统主时钟频率32MHz
PERCFG=0x00;//USART0 使用备用位置1 TX-P0_3 RX-P0_2
P0SEL|=0x3c;//设置P0_2,P0_3;P0_4,P0_5用于外设功能
P2DIR&=~0xC0;//P0优先作为UART方式
U0CSR=0x80;//设置UART模式
U0GCR=9;
U0BAUD=59;//波特率19200
UTX0IF=0;//清除UART0 TXz中断标志
}
void uart_tx_string(char *data_tx,int len)//串口发送字符串函数
{
unsigned int j;
for(j=0;j<len;j++)
{
U0DBUF=*data_tx++;
while(UTX0IF==0);//等待发送完成
UTX0IF=0;
}
}
void delay(unsigned int time)//MS级延时函数
{
unsigned int i,j;
for(i=0;i<time*2;i++)
{
for(j=0;j<480;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
int main()
{
CLKCONCMD&=~0x7F;
while(CLKCONSTA&=0x40);
initial_gpio();
initial_interrupt();
initial_t1();
initial_usart_tx();
LED1=1;
LED2=0;
while(1)
{
delay(2000);
if(!P0_1)//人体传感器检测到人会输出低电平
uart_tx_string("有人!\n",sizeof("有人!\n"));
else
uart_tx_string("没有人!\n",sizeof("没有人!\n"));
}
}