传感器实验报告(第二次)
来源:互联网 发布:随州广电网络 编辑:程序博客网 时间: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
- 传感器实验报告(第二次)
- 传感器实验报告(第三次)
- 第二次实验(实验报告博客)
- c++第二次实验2(实验报告)
- c++第二次实验(实验报告1)
- C++第二次实验-实验报告(2)
- 高级软件工程实验报告(第二次实验)
- 第二次实验 实验报告
- C++第二次实验-作业报告(2)
- 第二次实验报告
- 第二次上机实验报告
- 第二次上机实验报告
- 第二次上机实验报告
- 第二次实验报告
- 第二次上机实验报告
- c++第二次实验报告
- C++第二次实验报告
- 第二次实验报告
- 【boundfield】GridView中BoundField与TemplateField的区别_boundfield
- 事务一致性简述
- Android 知识点小结
- 【SSH项目实战】国税协同平台-22.逆向工程
- 数据结构例程——拓扑排序
- 传感器实验报告(第二次)
- 大白话解析“模拟退火算法”
- gridview的buttonfield获取该行的索引值(实例讲解)
- C#简单的Aforge调用摄像头
- Android之将字符串转换为MD5码
- 给GridView中的buttonField添加一个删除确认功能
- 管道命令
- ACM-超级楼梯
- SDWebImage 第三方库(web 图像异步下载)