当前位置: 首页 > 工具软件 > 8cc > 使用案例 >

CC2530编程基础

翁翰
2023-12-01

此程序用到了CC2530的串口,定时器中断,外部中断。

此程序实现功能:

  1. ZigBee模块上电后LED1亮,LED2灯灭。
  2. 第一次按下SW1按键并放开,经过5秒后,LED1灭,再经过1秒后LED2亮,然后LED1和LED2能以流水灯的方式进行亮灭:LED1亮—>LED1灭 LED2亮—> LED2灭 LED1亮。
  3. 第二次按下SW1后LED1和LED2全亮。
  4. 再一次按下SW1时能重复(2)和(3)的要求。
  5. SW1按键采用中断的方式进行编程,上拉输入模式。
  6. 定时时间采用定时器1来控制,自由模式,8分频。。
  7. ZigBee模块上连接的人体传感器,每隔2秒把人体传感数据通过串口发送出去,格式为:“有人” 或 “无人”,串口波特率为19200。
    #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"));
          
      }
    }
    

     


 

 

 类似资料: