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

来源:互联网 发布:随州广电网络 编辑:程序博客网 时间:2024/06/05 16:23

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 intchar 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 0
原创粉丝点击