您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > LDC1000与51实例
/********************************************************************************2014TI电子设计竞赛LDC1000测试范例本代码使用于常规的51MCU需要注意:LDC1000需要外部提供一个时钟信号本范例是用MCU的内部时钟输出提供给LDC1000使用其他MCU时,请自行设计一个时钟输出给LDC1000该时钟应小于8M,注意这是指MCU给LDC1000的DCLK引脚的信号频率应小于8M。******************************************************************************说明:采用软件模拟SPI已经将LDC1000的读/写命令做成了函数,直接调用即可。测试电路是否正确,采用读命令,读取0号地址,返回时0x80说明已经能读LDC1000的寄存器主范例已经将读回的RP在0801上显示出来LDC1000的DCLK引脚接到MCU的ALE引脚,输出应4MMCU型号:W78E58MCU使用外部晶振,24M******************************************************************************/*Includes------------------------------------------------------------------*/#includereg52.h//ldc1000寄存器定义#defineNULL0#defineTRUE1#defineFALSE0//配置的参数定义#defineTEST_RPMAX_MAX0x13/**maximumcalibrationvalueforRPMAX*/#defineTEST_RPMAX_MIN0x10/**minimumcalibrationvalueforRPMAX*/#defineTEST_RPMAX_INITTEST_RPMAX_MIN+1/**RPMAXinitialvalue*/#defineTEST_RPMIN_MAX0x3D/**maximumcalibrationvalueforRPMIN*/#defineTEST_RPMIN_MIN0x3A/**minimumcalibrationvalueforRPMIN*/#defineTEST_RPMIN_INITTEST_RPMIN_MIN+1/**RPMINinitialvalue*///FinalTestRange#defineTEST_RP_MSB_MAX0x12/**maximumvalueforproximitydata*/#defineTEST_RP_MSB_MIN0x0A/**minimumvalueforproximitydata*/#defineTEST_FC_MAX0x0D5D/**maximumvalueforfrequencycounter*/#defineTEST_FC_MIN0x0D39/**minimumvalueforfrequencycounter*///LDC1000寄存器定义详见芯片手册寄存器说明部分//LDCCOMMANDS#defineLDC1000_CMD_REVID0x00#defineLDC1000_CMD_RPMAX0x01#defineLDC1000_CMD_RPMIN0x02#defineLDC1000_CMD_SENSORFREQ0x03#defineLDC1000_CMD_LDCCONFIG0x04#defineLDC1000_CMD_CLKCONFIG0x05#defineLDC1000_CMD_THRESHILSB0x06#defineLDC1000_CMD_THRESHIMSB0x07#defineLDC1000_CMD_THRESLOLSB0x08#defineLDC1000_CMD_THRESLOMSB0x09#defineLDC1000_CMD_INTCONFIG0x0A#defineLDC1000_CMD_PWRCONFIG0x0B#defineLDC1000_CMD_STATUS0x20#defineLDC1000_CMD_PROXLSB0x21#defineLDC1000_CMD_PROXMSB0x22#defineLDC1000_CMD_FREQCTRLSB0x23#defineLDC1000_CMD_FREQCTRMID0x24#defineLDC1000_CMD_FREQCTRMSB0x25#defineuint8_tunsignedchar#defineuint16_tunsignedint#defineuint32_tunsignedlong//引脚定义sbitSDO=P1^0;//ldc1000的SDOsbitSDI=P1^1;//ldc1000的SDIsbitSCLK=P1^2;//ldc1000的SCLKsbitCS=P1^3;//ldc1000的CS//ldc1000的INTB未用//ldc1000的dclk接MCU的ALEsbitDI=P1^4;//0801的DIsbitCLK=P1^5;//0801的CLK//变量uint16_tRp_value;//读回的RP值uint32_tfre_value;//读回的频率值uint8_ttest_flag;//超幅标志实际使用中可读取本标志位,判断RP输出是否超限//-------------------------------------------------------------------------------//数据表名称:NUMCODETAB.//功能:将数字转换为七段码.uint8_tvalue8[8]={10,10,10,10,10,10,10,10};//显示数值缓冲区//-------------------------------------------------------------------------------//数码笔段定义:8字的最上面一笔段为A笔段,顺时针方向依次为BCDEF笔段,中间的是G笔段//数码笔段顺序:D76543210//ABCDEFGXconstcharNUMCODETAB[]={0xFC,0x60,0xDA,0xF2,//数字0,1,2,30x66,0xB6,0xBE,0xE0,//数字4,5,6,70xFE,0xF6,0x00,0x02,//数字8,9,字符空格,字符-0x9E,0x8E,0X8C};//E,字符F,r/*Privatetypedef-----------------------------------------------------------*//*Privatedefine------------------------------------------------------------*//*Privatemacro-------------------------------------------------------------*//*Privatevariables---------------------------------------------------------*//*Privatefunctionprototypes-----------------------------------------------*/staticvoidCLK_Config(void);//时钟配置voiddelay(uint16_txx);//延时uint8_tread_spi(uint8_tadd);//SPI读函数uint8_twrite_spi(uint8_tadd,uint8_tw_data);//SPI写函数voidldc1000_int(void);//LDC1000初始化函数staticuint16_tRp_Noise(void);//噪声处理staticuint8_tRp_Sample(void);//采样函数staticuint8_tevm_test(void);//测试函数voidlcd_transram(unsignedcharn_dot);//0801显示函数/*Privatefunctions---------------------------------------------------------*//***@briefMainprogram.*@paramNone*@retvalNone*/voidmain(void){uint8_tqq;SCLK=1;CS=1;SDI=1;qq=read_spi(0);ldc1000_int();//初始化LDC1000evm_test();//注意,这函数其实在做扫描while(1)//主程序主要完成循环采样LDC1000输出并显示其值,实际使用建议连续多次采样并滤波处理,可以使采样值稳定些{Rp_Sample();//读取LDC1000输出的RPvalue8[0]=Rp_value/100000%10;value8[1]=Rp_value/10000%10;value8[2]=Rp_value/1000%10;value8[3]=Rp_value/100%10;value8[4]=Rp_value/10%10;value8[5]=Rp_value%10;value8[6]=10;value8[7]=10;lcd_transram(7);//0801显示函数delay(60000);}}//LDC1000写数据uint8_twrite_spi(uint8_tadd,uint8_tw_data){uint8_tss;SCLK=0;//SCLK=0;CS=0;//CS=0for(ss=0;ss8;ss++){SCLK=0;//SCLK=0;if((add&0x80)==0x80){SDI=1;//SDI=1}else{SDI=0;//SDI=0}add=add1;SCLK=1;//sclk=1}for(ss=0;ss8;ss++){SCLK=0;//SCLK=0;if((w_data&0x80)==0x80){SDI=1;//SDI=1}else{SDI=0;//SDI=0}w_data=w_data1;SCLK=1;//sclk=1}SCLK=0;//SCLK=0;CS=1;//CS=1}//LDC1000读数据uint8_tread_spi(uint8_tadd){uint8_tss;uint8_tsss=0;SCLK=0;//SCLK=0;CS=0;//CS=0add=add|0x80;for(ss=0;ss8;ss++){SCLK=0;//SCLK=0;if((add&0x80)==0x80){SDI=1;//SDI=1}else{SDI=0;//SDI=0}add=add1;SCLK=1;//sclk=1}for(ss=0;ss8;ss++){SCLK=0;//SCLK=0;sss=sss1;if(SDO==1)//sdo{sss=sss|0x01;}else{sss=sss&0xfe;}SCLK=1;//sclk=1}SCLK=0;//SCLK=0;CS=1;//CS=1returnsss;}//LDC1000初始化函数voidldc1000_int(void){write_spi(LDC1000_CMD_RPMAX,TEST_RPMAX_INIT);//配置RP最大值write_spi(LDC1000_CMD_RPMIN,TEST_RPMIN_INIT);//配置RP最小值write_spi(LDC1000_CMD_SENSORFREQ,0x94);//配置传感器频率write_spi(LDC1000_CMD_LDCC
本文标题:LDC1000与51实例
链接地址:https://www.777doc.com/doc-4982192 .html