/* 此程序很简单,主要用到的是外部中断和电源管理 实验目的:通过按键触发外部中断,使单片机跳出休眠状态,LED闪烁5次 主讲 王加辉 */ #include #define LED1 P1_0/*定义端口*/ #define LED2 P1_1 void init_led()/*此函数初始化LED灯*/ { P1SEL&=~0X03;/*P1SEL是P1功能选择寄存器,主要用来设置P1I/O各个端口为普通I/O口或者是作为外设功能接口。 在这里我们只要P1_0和P1_1口为普通的I/O口即可*/ P1DIR|=0X03;/*P1DIR是P1放向寄存器,主要功能是设置P1各个口为输入口还是输出口, LED为输出设备,所以此处我们需要P1_0和P1_1口为输出口*/ P1INP&=~0X03;/*P1INP是P1输入模式寄存器,主要是设置P1各个口的上拉是开还是关,此处无所谓开还是关*/ /*因为P1SEL和P1INP在复位后默认为0,所以我们可以不用配置,只要配置P1DIR寄存器即可*/ LED1=LED2=1;/*关闭所有LED灯*/ } void init_interrupt()/*外部中断初始化函数*/ { P0IEN|=0X10;/*P0口中断掩码寄存器,主要是用来设置P0口各个端口中断的开关, 因为我们这里用的键盘连的是P0.4,所以我们要开P0.4的中断*/ PICTL|=0X01;/*PICTL是P口中断控制寄存器,其主要功能请各位自己查看cc2530数据手册, 这里我们主要设置P0口的中断触发方式为下降沿触发*/ P0IE=1;/*P0IE是IEN1寄存器的第6位,是用来设置P0口的中断使能,即设置P0口的中断开关*/ P0IFG=0X00;/*P0口各个端口的中断标志寄存器,中断发生是相应位会自动置一,中断发生后需要软件手动清零*/ EA=1; /*开总中断*/ } void delay_ms(int ti)/*延时函数*/ { int i,j; for(i=0;i for(j=0;j<524;j++); } void sleep_select(int temp)/*电源管理函数,我们这里比较简单,只设置了PM3*/ { if(temp<4)/*根据temp的值来改变供电模式*/ { SLEEPCMD|=temp;/*设置供电模式*/ delay_ms(10);/*延迟等待至少3ms*/ PCON=0X01;/*强行进入所选的电源模式*/ } else PCON=0x00;/*回到主动模式,即唤醒单片机*/ } void main() { int x=0; init_led();/*初始化LED*/ init_interrupt();/*初始化外部中断*/ while(1) { for(x=0;x<10;x++)/*LED灯闪烁5次*/ { LED2=LED1=~LED1; delay_ms(200); } sleep_select(3);/*进入电源管理函数,设置电源方式为PM3*/ } } #pragma vector=P0INT_VECTOR/*中断源*/ __interrupt void P0_ISR(void)/*中断子程序*/ { sleep_select(4);/*进入电源管理函数,唤醒单片机*/ P0IFG=0;/*清中断标志位*/ P0IF=0;/*清中断标志位,P0IF在P0IFG中有,在IRCON中也有,大家可以查看手册*/ } /*因为电源管理的资料我也没有word文档,字比较多,不好打出来, 详细请大家参考cc2530数据手册里的53页:电源管理简介,里面讲的很详细*/ /*祝大家学的愉快*/
|