使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR)
使用MSP430低功耗微处理器制作的斜度计(开发平台是IAR).zip
(36.26 KB, 下载次数: 5)
2015-3-10 17:12 上传
点击文件名下载附件
- /*****************************************************************************
- *
- * 程序说明:
- * 斜度测试程序
- * 程序对应的硬件设置为:利而达MSP430-Test44x实验板,斜度计使用的
- * 是ADXL202E,数字y连接TA1/P1.2,数据x连接P1.0/TA0,P4.6对应斜度计电源
- * 每个方向的斜度显示时都占用三个字符,
- * 斜度范围为0~90,高于90的,斜度为(180-斜度)
- ******************************************************************************/
- #include "msp430x44x.h"
- #include "lcd.c"
- #include "math.h"
- #define RLEN 6
- unsigned int rbuf[RLEN];
- unsigned int sdata[RLEN];
- unsigned char status1,status2,rd1,flag,cnt,tmpv;
- float odata;
- void main()
- {
- WDTCTL = 0x5a80; // stop watch dog
- BTCTL = 0x07; // Basic Timer 1 中断频率设置
- IE2 |= 0x80; // 使能 basic timer 中断
- P4DIR &= 0x00; //
- P4DIR |= 0x40; //
- P4OUT |= 0x40; // 打开Tilt电源
- P1DIR = 0x00; //
- P1SEL = 0xff; //
- FLL_CTL1|=SELS+XT2OFF+SELM_XT2; //开启第二个振荡器
- do
- {
- IFG1 &= ~OFIFG; // 清除OSCFault标志
- for(tmpv = 0xff;tmpv > 0;tmpv--); //
- }while ((FLL_CTL0&XT2OF) == XT2OF ); // 第二个振荡器是否正常工作
-
- TACTL = 0x0104; // 工作在辅助时钟,不分频
- TAR = 0;
- TACCTL0 = 0x4110;// IE=1,CAP=1,SCS=1,CCI0A选择,起始时只是上升沿捕获
- init_LCD();
- rd1 = 0;
- tmpv = 0;
- status1 = 0; // 状态为起始
- status2 = 0;
- for(tmpv=0;tmpv<6;tmpv++)
- {
- rbuf[tmpv] = 0x00;
- }
- TACTL |= 0x20; // 连续计数模式
- _EINT();
- while(1);
-
- }
- #pragma vector = TIMERA1_VECTOR
- __interrupt void B_ISR(void)
- {
- if(status2==0)
- {
- rbuf[5] = CCR1;
- status2 = 1;
- TACCTL1 = 0x8110; // 下降沿允许
- }else if(status2==1)
- {
- status2 = 2;
- rbuf[3] = rbuf[3] + CCR1 - rbuf[5];
-
- TACCTL1 = 0x0110;
- TACCTL1 = 0x8110; // 上升沿允许
- }else if(status2==2)
- {
- rbuf[4]= CCR1 - rbuf[5] + rbuf[4];
- rd1 +=1;
-
- TACCTL1 = 0x0110; // B停止捕获模式
- if(rd1== 100)
- {
- TACCTL1 = 0x0100;
- status1 = 3;
- TACTL &= 0xFFCF;
-
- }else
- {
- status1 = 0;
- TACCTL0 = 0x4110; // A上升沿允许
- }
- }
- }
- #pragma vector = TIMERA0_VECTOR
- __interrupt void A_ISR(void)
- {
-
- if(status1==0)
- {
- rbuf[2] = CCR0;
- status1 = 1;
- TACCTL0 = 0x8110; // 下降沿允许
- }else if(status1==1)
- {
- status1 = 2;
- rbuf[0] = rbuf[0] + CCR0 - rbuf[2];
-
- TACCTL0 = 0x0110;
- TACCTL0 = 0x4110; // 上升沿允许
- }else if(status1==2)
- {
- rbuf[1]= CCR0 - rbuf[2] + rbuf[1];
- rd1 +=1;
-
- TACCTL0 = 0x0110; // A停止捕获模式
- status2 = 0;
- TACCTL1 = 0x4110; // B的上升沿允许
- }
- }
- #pragma vector = BASICTIMER_VECTOR
- __interrupt void BT_Interrupt(void)
- {
- int tmpi;
-
- if(rd1==100)
- {
- odata = rbuf[0]*1.0; // 转成float型
- odata = odata/rbuf[1];
- odata = (odata - 0.5)/0.116;
- if(odata<0)
- {
- odata = -odata;
- }
- if(odata >=1) odata = 1;
- odata = asin(odata);
- odata = odata/3.14159*180;
- tmpi = 0;
- while(odata>=1)//获取斜度
- {
- if(odata>=100)
- {
- odata=odata-100;
- tmpi+=100;
- }else if(odata>=10)
- {
- odata -= 10;
- tmpi +=10;
- }else if(odata >=1){
- odata -=1;
- tmpi += 1;
- }
- }
- for(tmpv=0;tmpv<3;tmpv++)
- {
-
- lcd_Buf[tmpv]= (char)(tmpi%10);
- tmpi =(tmpi/10);
- }
-
- odata = rbuf[3]*1.0;
- odata = odata/rbuf[4];
- odata = (odata - 0.327)/0.0505; //系数的计算应该根据实际的电路测量后确定
- if(odata<0)
- {
- odata = -odata;
- }
- if(odata >=1) odata = 1;
- odata = asin(odata);
- odata = odata/3.14159*180;
- tmpi = 0;
- while(odata>=1)//获取斜度
- {
- if(odata>=100)
- {
- odata=odata-100;
- tmpi+=100;
- }else if(odata>=10)
- {
- odata -= 10;
- tmpi +=10;
- }else if(odata >=1)
- {
- odata -=1;
- tmpi += 1;
- }
- }
-
- for(tmpv=3;tmpv<6;tmpv++)
- {
- lcd_Buf[tmpv]= (char)(tmpi%10); //填充数据到LCD缓冲区
- tmpi =(tmpi/10);
- }
- status1 = 0; // 参数、状态重置,以避免TAR溢出
- rd1 = 0;
- cnt = 0;
- rbuf[0] = 0;
- rbuf[3] = 0;
- rbuf[4] = 0;
- rbuf[1] = 0;
- TAR = 0x00;
- TACCTL0 = 0x4110; // 上升沿允许
- TACTL |= 0x20;
- status1 = 0;
- lcd_Display(); // 使用LcD键盘数据
- }
-
- }
复制代码
一周热门 更多>