1.掌握CC2530的外部中断寄存器设置;
2.掌握外部中断函数程序的编程方法。
当按键未按下时,P0.4的电平为3.3V;当按键按下时,P0.4的电平为0V。
#include "ioCC2530.h"
void delay(void) //延迟函数
{
unsigned int i;
unsigned char j;
for(i=0;i<1500;i++)
{
for(j=0;j<200;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
#pragma vector=P0INT_VECTOR //定时器3中断函数
__interrupt void P0_INT(void){
if(P0IFG > 0){
P0IFG = 0; //清中断标志
P0_0=~P0_0;
P2_0=~P2_0;
}
P0IFG = 0;
}
void main( void )
{
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
P0IEN = 0x10; //P0.4开中断
PICTL = 0x11; //P0口下降沿触发中断
P0IFG = 0; //清中断标志
P0IE = 1; //P0口开中断
EA = 1; //开总中断
while(1);
} // end of main()
烧写程序后,复位。可看到两个小灯常亮;按下开关键,两个小灯均熄灭;松开按键,小灯恢复常亮。
1.掌握CC2530的UART串口寄存器设置;
2.掌握UART串口中断函数程序的编程方法。
UART,即通用异步串行通信方式。数据一位接着一位地传送。数据的各不同位可使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
#include "ioCC2530.h"
char uart_buffer;
void delay(void)
{
unsigned int i;
unsigned char j;
for(i=0;i<1500;i++)
{
for(j=0;j<200;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
void UartTX_Send_String(unsigned char *Data,int len) //串口发送函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void UartTX_Send_Data(unsigned char Data,int len) //串口发送函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = Data;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
#pragma vector=URX0_VECTOR //uart0中断函数
__interrupt void uart0(void){
URX0IF = 0; //清中断标志
P0_0=~P0_0;
uart_buffer = U0DBUF;
//UartTX_Send_String("welcome",10);
UartTX_Send_Data(uart_buffer,1);
}
void main( void )
{
unsigned char buf[8];
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
CLKCONCMD &= ~0x40; //选择32M晶振
while(!(SLEEPSTA & 0x40)); //等待XSOC稳定
CLKCONCMD = 0xb8; //TICHSPD 128分频,CLKSPD 不分频
SLEEPCMD |= 0x04; //关闭不用的RC 振荡器
PERCFG = 0x00; //位置1 P0 口
P0SEL = 0x3c; //P0 用作串口
U0CSR |= 0x80; //UART 方式
U0GCR |= 10; //baud_e = 10;
U0BAUD |= 216; //波特率设为57600
UTX0IF = 1;
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
buf[0] = '\t';
while(1){
P2_0=~P2_0;
delay();
if(uart_buffer == 0x01){
UartTX_Send_String("welcome",7);
UartTX_Send_String(&buf[0],1);
}
}
} // end of main()
1.掌握CC2530的AD转换寄存器设置;
2.掌握AD转换函数程序的编程方法。
CC2530内部有一个温度传感器,用来作AD输入。数字量通过串行接口输出到电脑显示器。
#include "ioCC2530.h"
#define uint8 unsigned char
#define uint16 unsigned int
char uart_buffer;
void delay(void)
{
unsigned int i;
unsigned char j;
for(i=0;i<1500;i++)
{
for(j=0;j<200;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
uint16 ReadAdValue(uint8 SREF,uint8 SDIV,uint8 Channel)
{
uint16 AdcValue;
if(Channel == 0xe){//片内温度到ADC_SOC
TR0 = 1;
ATEST = 1;
}
else{
TR0 = 0;
ATEST = 0;
}
ADCCON3 = (SREF<<6)|(SDIV<<4)|Channel;
ADCCON1 &= 0x30; //停止A/D
ADCL &= 0x00; //EOC清零
ADCH &= 0x00; //EOC清零
ADCCON1 |= 0x40; //启动A/D;
while(!(ADCCON1 & 0x80)); //等待AD转换结束
AdcValue = ADCH;
AdcValue = ((AdcValue<<6)+(ADCL >> 2));
return AdcValue;
}
void UartTX_Send_String(unsigned char *Data,int len) //串口发送函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void UartTX_Send_Data(char Data,int len) //串口发送函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = Data;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
#pragma vector=URX0_VECTOR //uart0中断函数
__interrupt void uart0(void){
URX0IF = 0; //清中断标志
P0_0=~P0_0;
uart_buffer = U0DBUF;
//UartTX_Send_String("welcome",10);
//UartTX_Send_Data(uart_buffer,1);
}
void main( void )
{
unsigned int temp;
unsigned char buf[8];
temp = 0;
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
uart_buffer = 0;
CLKCONCMD &= ~0x40; //选择32M晶振
while(!(SLEEPSTA & 0x40)); //等待XSOC稳定
CLKCONCMD = 0xb8; //TICHSPD 128分频,CLKSPD 不分频
SLEEPCMD |= 0x04; //关闭不用的RC 振荡器
PERCFG = 0x00; //位置1 P0 口
P0SEL = 0x3c; //P0 用作串口
U0CSR |= 0x80; //UART 方式
U0GCR |= 10; //baud_e = 10;
U0BAUD |= 216; //波特率设为57600
UTX0IF = 1;
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; //开总中断,接收中断
while(1){
P2_0=~P2_0;
if(uart_buffer == 0x01)
{
uart_buffer = 0;
temp = ReadAdValue(0,3,0xe);
temp = ((temp) >> 4) - 315; //计算转换结果
buf[0] = (((unsigned char)temp)/10)+'0';
buf[1] = (((unsigned char)temp)%10)+'0';
buf[2] = 0xa1;
buf[3] = 0xe6;
buf[4] = '\t';
UartTX_Send_String(&buf[0],5);
}
}
} // end of main()
1.掌握CC2530的睡眠定时器寄存器设置;
2.掌握睡眠定时器唤醒程序的编程方法。
CC2530的睡眠定时器是一个24位的计数器,用作唤醒中断。
#include "ioCC2530.h"
void delay(void)
{
unsigned int i;
unsigned char j;
for(i=0;i<1500;i++)
{
for(j=0;j<200;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
void SET_POWER_MODE(unsigned char mode) //设置省电模式,mode:0-3
{
if(mode < 4)
{
SLEEPCMD &= 0xfc;
SLEEPCMD |= mode;
PCON |= 0x01;
asm("NOP");
}
else
PCON = 0;
}
#pragma vector=P0INT_VECTOR //外部中断函数
__interrupt void P0_INT(void){
if(P0IFG > 0){
P0IFG = 0;
unsigned i;
for(i=0;i<5;i++)
{
P0_0 = ~P0_0;
delay();
}
}
P0IFG = 0;
}
void Init_SLEEPCMD_TIMER(void)
{
STIE = 1;
STIF = 0;
}
#pragma vector=ST_VECTOR //睡眠中断函数
__interrupt void ST_INT(void){
STIF = 0;
unsigned i;
for(i=0;i<5;i++)
{
P2_0 = ~P2_0;
delay();
}
}
void addToSLEEPCMDTimer(unsigned int sec)
{
long int SLEEPCMDTimer = 0;
SLEEPCMDTimer |= ST0;
SLEEPCMDTimer |= (long int)ST1 << 8;
SLEEPCMDTimer |= (long int)ST2 << 16;
SLEEPCMDTimer += ((long int)sec * (long int)32768);
ST2 = (char)(SLEEPCMDTimer >> 16);
ST1 = (char)(SLEEPCMDTimer >> 8);
ST0 = (char) SLEEPCMDTimer;
}
void UartTX_Send_Data(char Data,int len) //串口发送函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = Data;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void main( void )
{
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
P0IEN = 0x10;
PICTL = 0x11;
P0IFG = 0;
P0IE = 1;
CLKCONCMD &= ~0x40; //选择32M晶振
while(!(SLEEPSTA & 0x40)); //等待XSOC稳定
CLKCONCMD = 0xb8; //TICHSPD 128分频,CLKSPD 不分频
SLEEPCMD |= 0x04; //关闭不用的RC 振荡器
P0IEN = 0x10;
PICTL = 0x11;
P0IFG = 0;
P0IE = 1;
EA = 1;
Init_SLEEPCMD_TIMER();
//SET_POWER_MODE(2); //进入PM2省电模式
while(1) //等待睡眠定时器中断唤醒
{
addToSLEEPCMDTimer(5); //5秒唤醒一次
SET_POWER_MODE(2); //进入PM2省电模式
}
} // end of main()
烧写程序后,复位。按键一次后,一个小灯周期的闪烁。
1.掌握CC2530的看门狗定时器寄存器设置;
2.掌握看门狗定时器程序的编程方法。
看门狗是在CPU在软件中跑飞情况下的一种恢复方式,当软件在选择时间间隔内未清楚看门狗,看门狗就会复位系统。
#include "ioCC2530.h"
unsigned int counter;
void delay(void)
{
unsigned int i;
unsigned char j;
for(i=0;i<1500;i++)
{
for(j=0;j<200;j++)
{
asm("NOP");
asm("NOP");
asm("NOP");
}
}
}
void Init_Watchdog(void)
{
WDCTL = 0x00; //时间间隔一秒,看门狗模式
WDCTL |= 0x08; //启动看门狗
}
void WatchDog(void) //喂狗函数
{
WDCTL = 0xa0;
WDCTL = 0x50;
}
void main( void )
{
P0DIR |= 0x01; //设置P0.0为输出方式;P0.4和P0.5为输入方式
P2DIR |= 0x01; //设置P2.0为输出方式
P0_0 = 1;
P2_0 = 1; //熄灭LED
counter = 0;
CLKCONCMD &= ~0x40; //选择32M晶振
while(!(SLEEPSTA & 0x40)); //等待XSOC稳定
CLKCONCMD = 0xb8; //TICHSPD 128分频,CLKSPD 不分频
SLEEPCMD |= 0x04; //关闭不用的RC 振荡器
Init_Watchdog();
EA = 1; //开总中断
delay();
delay();
delay();
while(1){
WatchDog(); //喂狗
P0_0=~P0_0;
}
} // end of main()
烧写程序后,复位。此时两个灯均不亮,过一秒后两个灯亮起,且为长亮。此时复位,两个灯熄灭,过一秒再次常亮。