⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 MC9S08AW60的3轴加速度传感器实验 本实验利用MCU内部ADC不停的采集3轴加速度传感器的X,Y,Z方向的输出
💻 C
字号:
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
//本实验利用MCU内部ADC不停的采集3轴加速度传感器的X,Y,Z方向的输出;
//当X方向有振动时,D5点亮或熄灭
//当Y方向有振动时,D7点亮或熄灭
//当Z方向有振动时,D6点亮或熄灭
//注意:因初始的X,Y,Z输出值未定,故应依据X,Y,Z的上次和本次采集差值进行判断
//沿X,Y,Z向敲动学习板,那么相应的LED会点亮熄灭
#define x_led PTAD_PTAD0
#define y_led PTAD_PTAD1
#define z_led PTAD_PTAD2
byte x_h_last=0;//x向上次采集值的高位
byte x_l_last=0;//x向上次采集值的低位
byte x_h_new=0x03;//x向本次采集值的高位
byte x_l_new=0xff;//x向本次采集值的低位
//==============
byte y_h_last=0;//y向上次采集值的高位
byte y_l_last=0;//y向上次采集值的低位
byte y_h_new=0x03;//y向本次采集值的高位
byte y_l_new=0xff;//y向本次采集值的低位
//==============
byte z_h_last=0;//z向上次采集值的高位
byte z_l_last=0;//z向上次采集值的低位
byte z_h_new=0x03;//z向本次采集值的高位
byte z_l_new=0xff;//z向上次采集值的低位
//==============
byte ch_s=0;
byte first=1;
//==============
byte xyz_h;
byte xyz_l;
//===================================
//函数名:初始化ADC
//===================================
void Init_ADC(void)
{
	ch_s=0;
	ADC1CFG=0x98;//低功耗模式,10位精度,总线频率=ADCK
	ADC1SC2=0x00;//0x00:软件触发,比较功能禁止;0x40:RTI触发,比较功能禁止
	APCTL1=0x1c;//AD2--X;AD3--Y;AD4--Z
	ADC1SC1=0x42; //0x42:中断使能,单次转换,选择AD2,并启动了转换;
	             //0x43:中断使能,单次转换,选择AD3,并启动了转换;
	             //0x44:中断使能,单次转换,选择AD3,并启动了转换;
}
//===========================
//函数名:Init_io
//作用:初始化IO
//============================
void Init_io(void)
{
	PTAD = 0X00;//端口A数据寄存器初始化为0
	PTADD_PTADD0=1;//引脚PTA0作为输出引脚
	PTADD_PTADD1=1;//引脚PTA1作为输出引脚
	PTADD_PTADD2=1;//引脚PTA2作为输出引脚
	PTADD_PTADD3=1;//引脚PTA3作为输出引脚
	               //其他引脚方向控制位默认为输入引脚
	               //由于PTA0~PTA3引脚设置为输出引脚,故它的内部上拉使能控制寄存器不再起作用
	PTASE_PTASE0=1;//引脚PTA0的压摆率控制位使能,提供其EMC性能
	PTASE_PTASE1=1;//引脚PTA1的压摆率控制位使能,提供其EMC性能
	PTASE_PTASE2=1;//引脚PTA2的压摆率控制位使能,提供其EMC性能
	PTASE_PTASE3=1;//引脚PTA3的压摆率控制位使能,提供其EMC性能
	PTADS_PTADS0=1;//引脚PTA0高输出能力使能
	PTADS_PTADS1=1;//引脚PTA1高输出能力使能
	PTADS_PTADS2=1;//引脚PTA2高输出能力使能
	PTADS_PTADS3=1;//引脚PTA3高输出能力使能
}
void main(void) {
	Init_io();
  Init_ADC();
  EnableInterrupts; /* enable interrupts */
  /* include your code here */
	

  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}
//==========================================
//==========================================
interrupt VectorNumber_Vadc1 ADC_ISR(void)
{

	if(first) //第一次采集3轴的电压值
		{
	  
		   switch(ch_s)
		  {
		  	case 0:
		  x_h_new=ADC1RH;
	    x_l_new=ADC1RL;
	    ch_s=1;
	    ADC1SC1=0x43;
	    break;
	    case 1:
		  y_h_new=ADC1RH;
	    y_l_new=ADC1RL;
	    ch_s=2;
	    ADC1SC1=0x44;
	    break;
	    case 2:
	    first=0;
		  z_h_new=ADC1RH;
	    z_l_new=ADC1RL;
	    ch_s=0;
	    ADC1SC1=0x42;
	    break;
	    default:
	    	break;
		  }
	}
	else//非第一次采集xyz电压值
  {
	 switch(ch_s)
	 {
		case 0://x
			x_h_last=x_h_new;
			x_l_last=x_l_new;
		  x_h_new=ADC1RH;
	    x_l_new=ADC1RL;
	    
	    if((x_h_new>=x_h_last)&&(x_l_new>x_l_last))
	    {
	    xyz_h=x_h_new - x_h_last;
	    xyz_l=x_l_new - x_l_last;
	    if( (xyz_h>=0)&&(xyz_l>=90))
	    	{
	    		x_led=~x_led;//如果x正向有振动,D5有变化
	    	}
	    }
	   
	   if((x_h_new<=x_h_last)&&(x_l_new<x_l_last))
	    {
	    xyz_h=x_h_last - x_h_new;
	    xyz_l=x_l_last - x_l_new;
	    if( (xyz_h>=0)&&(xyz_l>=90))//如果x负向有振动,D5有变化
	    	{
	    		x_led=~x_led;
	    	}
	    }
	    
	    ch_s=1;
	    ADC1SC1=0x43;
	    break;
	  case 1://y
	  	y_h_last=y_h_new;
	  	y_l_last=y_l_new;
	  	y_h_new=ADC1RH;
	    y_l_new=ADC1RL;
	    
	    if((y_h_new>=y_h_last)&&(y_l_new>y_l_last))
	    {
	    xyz_h=y_h_new - y_h_last;
	    xyz_l=y_l_new - y_l_last;
	    if( (xyz_h>=0)&&(xyz_l>=90))//如果y正向有振动,D7有变化
	    	{
	    		y_led=~y_led;
	    	}
	    }
	   
	   if((y_h_new<=y_h_last)&&(y_l_new<y_l_last))
	    {
	    xyz_h=y_h_last - y_h_new;//如果y负向有振动,D7有变化
	    xyz_l=y_l_last - y_l_new;
	    if( (xyz_h>=0)&&(xyz_l>=90))
	    	{
	    		y_led=~y_led;
	    	}
	    }
	    ch_s=2;
	    ADC1SC1=0x44;
	    break;
	  case 2://z
	  	z_h_last=z_h_new;
	  	z_l_last=z_l_new;
	    z_h_new=ADC1RH;
	    z_l_new=ADC1RL;
	    
	  if((z_h_new>=z_h_last)&&(z_l_new>z_l_last))
	    {
	    xyz_h=z_h_new - z_h_last;
	    xyz_l=z_l_new - z_l_last;
	    if( (xyz_h>=0)&&(xyz_l>=90))//如果z正向有振动,D6有变化
	    	{
	    		z_led=~z_led;
	    	}
	    }
	   
	   if((z_h_new<=z_h_last)&&(z_l_new<z_l_last))
	    {
	    xyz_h=z_h_last - z_h_new;
	    xyz_l=z_l_last - z_l_new;
	    if( (xyz_h>=0)&&(xyz_l>=90))//如果z负向有振动,D6有变化
	    	{
	    		z_led=~z_led;
	    	}
	    }
	    ch_s=0;
	    ADC1SC1=0x42;
	    break;
	   default:
	   	break;
    }
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -