什么是压电MEMS扬声器?压电MEMS扬声器UT-P 2016的指标规格有哪些?压电MEMS扬声器UT-P 2016的应用有哪些?
2021-06-16 08:50
作为物理世界和数字世界之间的接口,传感器和换能器已经从技术上的波澜不惊转变成为汽车安全、安防、医疗保健、物联网(IoT)和人工智能(AI)等应用赋能的前沿技术。因此,它们在尺寸、功耗和灵敏度等基本物理和电气性能方面经历了革命性改变,同时引发了传感器集成方面的新思想——范围从传感器融合到应用在类似雾计算的架构中的基于AI的传感器处理算法的生成。
2020-05-19 08:12
/***************************************************** 端口定义 液晶接线如下图所示 * LCD1602显示之高四位相连的方法** 描述:4线数据宽度,操作Lcd1602* 在LCD1602屏幕上第一行显示 Hello!LCD1602* 第二行显示 MSP430G2553* 硬件电路:MSP430g2553* 硬件连接:* MSP430与LCD连接信息* LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU* PIN1 --> 地* PIN2 --> VCC(一定要接+5V)* PIN3 -->仿真时悬空,实际电路 2K电阻-->地 (一定要接好,否则没有任何显示)* PIN4 --> RS --> P2.4* PIN5 --> R/W --> GND* PIN6 --> EN --> P2.5* PIN7 --> D0不接* PIN8 --> D1不接* PIN9 --> D2不接* PIN10 --> D3不接* PIN11 --> D4 --> P1.4* PIN12 --> D5 --> P1.5* PIN13 --> D6 --> P1.6* PIN14 --> D7 --> P1.7* PIN15 --> VCC* PIN16 --> 地 ****************************************************/#include#define LCD_EN_PORT P2OUT //以下2个要设为同一个口#define LCD_EN_DDR P2DIR#define LCD_RS_PORT P2OUT //以下2个要设为同一个口#define LCD_RS_DDR P2DIR#define LCD_DATA_PORT P1OUT//以下3个要设为同一个口#define LCD_DATA_DDR P1DIR//一定要用高4位#define LCD_RS BIT4#define LCD_EN BIT5#define LCD_DATA BIT7|BIT6|BIT5|BIT4//4位数据线连接模式/*************************************************** 预定义函数 **************************************************/void LCD_init(void);void LCD_init_first(void);void LCD_en_write1(void);//上升沿使能void LCD_en_write2(void);//下降沿使能void LCD_write_command(unsigned char command);void LCD_write_data(unsigned char data);void LCD_set_xy (unsigned char x, unsigned char y);void LCD_write_string(unsigned char X,unsigned char Y, unsigned char *s);void LCD_write_char(unsigned char X,unsigned char Y, unsigned char data);void delay_1ms(void);void delay_nus(unsigned int n);void delay_nms(unsigned int n);unsigned char LCDBuf1[]={"Hello!LCD1602"};//第一行要显示的内容unsigned char LCDBuf2[]={"MSP430G2553"};//第二行要显示的内容unsigned chartable[]="0123456789";unsigned intresult1_start,result1_end;unsigned char index=0;unsigned inttemp;doubledistance;unsigned char name[]="the juli";unsigned char juli_cm[]="000.0cm";/*==================================TA的初始化设置=========================================函数名称: void CAP_Init()函数功能:定时器A捕获设置,用于捕获上升下降沿函数参数:=========================================================================================*/void CloseWDTCTL(){ WDTCTL=WDTPW+WDTHOLD;}void ClockInit(){ BCSCTL1=CALBC1_1MHZ; DCOCTL=CALDCO_1MHZ;}void PortInit(){ // P1DIR &=~BIT2; //P1.2,为输入引脚// P1SEL |= BIT2;// P1.2 = (InputDirection + TA0.1) = CCIxA.1 --> CCR1,P1.2作为输入,CCI1A,指定输入,在这里我用P1.2作为输入去测距 是可以显示结果的但是配置为P2.6 输入就无法显示距离了,我觉得是定时器或者引脚配置的不对。但是又找不到问题P2DIR|=BIT6;P2SEL |=BIT6;P2SEL &=~BIT6;P2DIR|=BIT0;}void Timer1Init(){TACCTL1 = CAP + CCIS_0 + CM_3 + CCIE+SCS;// Capture CCIxA, both edge, interrupt enable.CCI1A->p1.2TACTL |=TASSEL_2 + ID_0 + MC_2+ TAIE+TACLR ;//选择1M-SMCLK时钟,continuous modeTACCR1=0;//TACTL&=~CCIFG;}void send_15us()//超声波发送15us的高电平{P2OUT&=~BIT0;delay_nus(15);P2OUT|=BIT0;delay_nus(15);P2OUT&=~BIT0;}void main(void){CloseWDTCTL();ClockInit();LCD_init_first();LCD_init();delay_nms(100);PortInit(); Timer1Init();_EINT();// LPM0;//也可进入睡眠,下面的发送高电平,就先在睡眠前发一次,以后就在中断里面下降沿结束,以及数据处理完后再给它发,或者你干脆把TX接高电平好得很,一直发送,省事 while(1) {send_15us();delay_nms(100);; }}/*==================================TA的中断服务程序=========================================函数名称: Timer_AISR函数功能: 定时器A中断服务子函数,捕获待测信号上升沿,下降沿函数参数:这里注释下吧,CCR0单独的占用了个中断,好像是TIMER0_A0_VECTOR,其他的合着用,所以进入中断后要判断是CCR1,还是CCR2产生的中断,也就是TAOIV或者TA1IV对应case:2 和4,另外如果你不访问TAIV这个寄存器,那你产生的一些标志位就要你手动的软件复位了,反之是硬件自己复位。由于捕获是硬件捕获的,测距比较准。=========================================================================================*/#pragma vector=TIMER0_A1_VECTOR__interrupt void TAIV_ISR(void){switch(TA0IV) {case 2://ccr1中断向量 if (TACCTL1&CCI) //上升沿触发{ result1_start=CCR1;//记录初始值 index=0; break;} else{unsigned juli;result1_end=CCR1; //记录结束值if(result1_end>result1_start)//结果比开始数值肖,表示溢出了一次或者几次,但是一般从0开始计数的话是不溢出的,这超声波实际测不了那么远,最多有个4米,5米的样子已经很好了 //TACTL|=TACLR;//这句貌似不需要temp=result1_end-result1_start;else temp=result1_end+index*65535-result1_start;distance=temp*0.0172;juli=distance*10+0.5;//取一位小数,四舍五入juli_cm[0]=table[juli/1000];juli_cm[1]=table[juli%1000/100];juli_cm[2]=table[juli%100/10];juli_cm[3]=table[juli%10];delay_nms(100);LCD_write_string(0,0,juli_cm);delay_nms(10);LCD_write_string(0,1,LCDBuf2);//显示index=0;//溢出清零break;}case 4: break;case 10: index++;break;//溢出中断向量,其实就2,4,10号向量有用那些手册里也没说,用不到default :break; }// TACCTL1&=~COV;//有时候要这句,但是没用好像也行}/********************************************以下全为液晶显示部分LCD液晶操作函数 *******************************************/void LCD_init_first(void)//LCD1602液晶初始化函数(热启动){delay_nms(500);LCD_DATA_DDR|=LCD_DATA;//数据口方向为输出LCD_EN_DDR|=LCD_EN; //设置EN方向为输出LCD_RS_DDR|=LCD_RS; //设置RS方向为输出delay_nms(50);LCD_write_command(0x30);delay_nms(50);LCD_write_command(0x30);delay_nms(5);LCD_write_command(0x30);delay_nms(500);}/***************************************** * * LCD1602液晶初始化函数 * ****************************************/void LCD_init(void){ delay_nms(500); LCD_DATA_DDR|=LCD_DATA;//数据口方向为输出 LCD_EN_DDR|=LCD_EN; //设置EN方向为输出 LCD_RS_DDR|=LCD_RS; //设置RS方向为输出 delay_nms(500); LCD_write_command(0x28);//4位数据接口 delay_nms(50); LCD_write_command(0x28);//4位数据接口 delay_nms(50); LCD_write_command(0x28);//4位数据接口 delay_nms(50); LCD_en_write2(); delay_nms(50); LCD_write_command(0x28); //4位数据接口 delay_nms(500); LCD_write_command(0x01); //清屏 LCD_write_command(0x0c); //显示开,关光标,不闪烁 LCD_write_command(0x06); //设定输入方式,增量不移位 delay_nms(50);}/***************************************** * * 液晶使能上升沿 * ****************************************/void LCD_en_write1(void){ LCD_EN_PORT&=~LCD_EN; delay_nus(10); LCD_EN_PORT|=LCD_EN;}/***************************************** * * 液晶使能下降沿 * ****************************************/void LCD_en_write2(void){LCD_EN_PORT|=LCD_EN;delay_nus(10);LCD_EN_PORT&=~LCD_EN;}/***************************************** * *写指令函数 * ****************************************/void LCD_write_command(unsigned char command){delay_nus(16);P2SEL=0x00;LCD_RS_PORT&=~LCD_RS; //RS=0LCD_en_write1();LCD_DATA_PORT&=0X0f; //清高四位LCD_DATA_PORT|=command&0xf0; //写高四位delay_nus(16);LCD_en_write2();command=command
2015-07-12 12:05