传感器实验报告(第二次)

6.5外部中断实验

一.实验目的

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()
四.实验现象

烧写程序后,复位。可看到两个小灯常亮;按下开关键,两个小灯均熄灭;松开按键,小灯恢复常亮。


6.6UART串口通信实验

一.实验目的

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()
四.实验现象

这里写图片描述


6.7AD转换实验3

一.实验目的

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()

四.实验现象

这里写图片描述


6.10睡眠定时器唤醒实验

一.实验目的

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()


四.实验现象

烧写程序后,复位。按键一次后,一个小灯周期的闪烁。


6.11看门狗定时器实验

一.实验目的

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()
四.实验现象

烧写程序后,复位。此时两个灯均不亮,过一秒后两个灯亮起,且为长亮。此时复位,两个灯熄灭,过一秒再次常亮。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值