久坐警报器

Dependencies:   mbed

Committer:
limr
Date:
Sun May 08 14:36:12 2016 +0000
Revision:
0:76c6ddb1425b
Child:
1:32df8ff2011e
?????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
limr 0:76c6ddb1425b 1 #include "mbed.h"
limr 0:76c6ddb1425b 2 #include"time.h"
limr 0:76c6ddb1425b 3
limr 0:76c6ddb1425b 4 #define UPA 2000//坐时最大加速度值
limr 0:76c6ddb1425b 5
limr 0:76c6ddb1425b 6 uint16_t x_a,y_a,z_a;
limr 0:76c6ddb1425b 7 bool flag = 0;
limr 0:76c6ddb1425b 8
limr 0:76c6ddb1425b 9 SPI spi_master(P0_6,P0_5,P0_7); //mosi miso sclk
limr 0:76c6ddb1425b 10 DigitalOut cs(P0_4);
limr 0:76c6ddb1425b 11
limr 0:76c6ddb1425b 12 //Serial pc(P0_23,P0_25);
limr 0:76c6ddb1425b 13
limr 0:76c6ddb1425b 14 Serial pc(P0_9,P0_11);
limr 0:76c6ddb1425b 15
limr 0:76c6ddb1425b 16 PwmOut buzzer(p22);//buzzer
limr 0:76c6ddb1425b 17 float frequency[]={659,554,659,554,440,494,554,587,494,659,554,440};
limr 0:76c6ddb1425b 18 float beat[]={1,1,1,1,1,0.5,0.5,1,1,1,1,2}; //节拍数组
limr 0:76c6ddb1425b 19
limr 0:76c6ddb1425b 20 uint8_t LIS3DH_SPI_RD(uint8_t addr)
limr 0:76c6ddb1425b 21 {
limr 0:76c6ddb1425b 22 uint8_t temp;
limr 0:76c6ddb1425b 23 cs = 0;
limr 0:76c6ddb1425b 24 wait_us(10);
limr 0:76c6ddb1425b 25 spi_master.write(addr);
limr 0:76c6ddb1425b 26 temp=spi_master.write(0xff);
limr 0:76c6ddb1425b 27 wait_us(10);
limr 0:76c6ddb1425b 28 cs = 1;
limr 0:76c6ddb1425b 29 return temp;
limr 0:76c6ddb1425b 30 }
limr 0:76c6ddb1425b 31
limr 0:76c6ddb1425b 32 void LIS3DH_SPI_WR(uint8_t addr,uint8_t wrdata)
limr 0:76c6ddb1425b 33 {
limr 0:76c6ddb1425b 34 cs = 0;
limr 0:76c6ddb1425b 35 wait_us(10);
limr 0:76c6ddb1425b 36 spi_master.write(addr);
limr 0:76c6ddb1425b 37 spi_master.write(wrdata);
limr 0:76c6ddb1425b 38 wait_us(10);
limr 0:76c6ddb1425b 39 cs = 1;
limr 0:76c6ddb1425b 40 }
limr 0:76c6ddb1425b 41
limr 0:76c6ddb1425b 42 void SPI_LIS3DH_Init()//启动函数
limr 0:76c6ddb1425b 43 {
limr 0:76c6ddb1425b 44 spi_master.format(8,3);
limr 0:76c6ddb1425b 45 spi_master.frequency(100000);
limr 0:76c6ddb1425b 46 wait_ms(5);
limr 0:76c6ddb1425b 47 LIS3DH_SPI_WR(0x24,0x80);
limr 0:76c6ddb1425b 48 wait_ms(5);
limr 0:76c6ddb1425b 49 LIS3DH_SPI_WR(0x20,0x17);
limr 0:76c6ddb1425b 50 LIS3DH_SPI_WR(0x23,0x80);
limr 0:76c6ddb1425b 51 }
limr 0:76c6ddb1425b 52
limr 0:76c6ddb1425b 53 void get_val(void)//得到加速度函数
limr 0:76c6ddb1425b 54 {
limr 0:76c6ddb1425b 55 uint8_t Dx_L=1,Dy_L=1,Dz_L=1;
limr 0:76c6ddb1425b 56 uint8_t Dx_H=1,Dy_H=1,Dz_H=1;
limr 0:76c6ddb1425b 57 if(LIS3DH_SPI_RD(0x0f|0x80)==0x33)
limr 0:76c6ddb1425b 58 {
limr 0:76c6ddb1425b 59 printf("check device ok!\r\n");
limr 0:76c6ddb1425b 60 flag=1;
limr 0:76c6ddb1425b 61 Dx_H=LIS3DH_SPI_RD(0x29|0x80);
limr 0:76c6ddb1425b 62 Dx_L=LIS3DH_SPI_RD(0x28|0x80);
limr 0:76c6ddb1425b 63 Dy_H=LIS3DH_SPI_RD(0x2b|0x80);
limr 0:76c6ddb1425b 64 Dy_L=LIS3DH_SPI_RD(0x2A|0x80);
limr 0:76c6ddb1425b 65 Dz_H=LIS3DH_SPI_RD(0x2d|0x80);
limr 0:76c6ddb1425b 66 Dz_L=LIS3DH_SPI_RD(0x2C|0x80);
limr 0:76c6ddb1425b 67 }
limr 0:76c6ddb1425b 68 else
limr 0:76c6ddb1425b 69 {
limr 0:76c6ddb1425b 70 printf("check device err!\r\n");
limr 0:76c6ddb1425b 71 wait(1);
limr 0:76c6ddb1425b 72 }
limr 0:76c6ddb1425b 73 x_a=Dx_H<<8|Dx_L/16;
limr 0:76c6ddb1425b 74 y_a=Dy_H<<8|Dy_L/16;
limr 0:76c6ddb1425b 75 z_a=Dz_H<<8|Dz_L/16;
limr 0:76c6ddb1425b 76 }
limr 0:76c6ddb1425b 77 void buzzerini(void)
limr 0:76c6ddb1425b 78 {
limr 0:76c6ddb1425b 79 for (int i=0;i<=11;i++) {
limr 0:76c6ddb1425b 80 buzzer.period(1/(2*frequency[i])); // 设置PWM周期
limr 0:76c6ddb1425b 81 buzzer=0.5; // 设置占空比
limr 0:76c6ddb1425b 82 wait(0.4*beat[i]); // 保持节拍周期
limr 0:76c6ddb1425b 83 }
limr 0:76c6ddb1425b 84 }
limr 0:76c6ddb1425b 85 void sit_judgement()
limr 0:76c6ddb1425b 86 { int flag=0;
limr 0:76c6ddb1425b 87 clock_t start,end;
limr 0:76c6ddb1425b 88 start=clock();
limr 0:76c6ddb1425b 89 get_val();
limr 0:76c6ddb1425b 90 while(x_a<=UPA)
limr 0:76c6ddb1425b 91 { get_val();
limr 0:76c6ddb1425b 92 end=clock();
limr 0:76c6ddb1425b 93 if(((double)end-start)/CLK_TCK>30)//坐了30s
limr 0:76c6ddb1425b 94 { flag=1;
limr 0:76c6ddb1425b 95 break;
limr 0:76c6ddb1425b 96 }
limr 0:76c6ddb1425b 97 }
limr 0:76c6ddb1425b 98 while(flag)
limr 0:76c6ddb1425b 99 { buzzerini();
limr 0:76c6ddb1425b 100 get_val();
limr 0:76c6ddb1425b 101 }
limr 0:76c6ddb1425b 102 }
limr 0:76c6ddb1425b 103
limr 0:76c6ddb1425b 104
limr 0:76c6ddb1425b 105
limr 0:76c6ddb1425b 106
limr 0:76c6ddb1425b 107 int main(void)
limr 0:76c6ddb1425b 108 {
limr 0:76c6ddb1425b 109 SPI_LIS3DH_Init();
limr 0:76c6ddb1425b 110 while(1)
limr 0:76c6ddb1425b 111 {
limr 0:76c6ddb1425b 112 sit_judgement();
limr 0:76c6ddb1425b 113 if(flag)
limr 0:76c6ddb1425b 114 {
limr 0:76c6ddb1425b 115 flag=0;
limr 0:76c6ddb1425b 116 wait(1);
limr 0:76c6ddb1425b 117 }
limr 0:76c6ddb1425b 118 }
limr 0:76c6ddb1425b 119 }