本文主要是介绍传感器实验报告(第二次),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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; //熄灭LEDP0IEN = 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; //熄灭LEDCLKCONCMD &= ~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; //波特率设为57600UTX0IF = 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_SOCTR0 = 1;ATEST = 1;}else{TR0 = 0;ATEST = 0;} ADCCON3 = (SREF<<6)|(SDIV<<4)|Channel; ADCCON1 &= 0x30; //停止A/DADCL &= 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; //熄灭LEDuart_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; //波特率设为57600UTX0IF = 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"); }elsePCON = 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; //熄灭LEDP0IEN = 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; //熄灭LEDcounter = 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()
四.实验现象
烧写程序后,复位。此时两个灯均不亮,过一秒后两个灯亮起,且为长亮。此时复位,两个灯熄灭,过一秒再次常亮。
这篇关于传感器实验报告(第二次)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!