因为ldc1314与fdc2214的部分相似性,所以在ldc1314上面的魔改程序
单片机源程序如下:
- #include "delay.h"
- #include "sys.h"
- #include "usart.h"
- #include "main.h"
- #include "timer.h"
- #include "LDC1314.h"
- #include "xunji.h"
- #define Coin_Data 60 //检测硬币的差值
- #define Wire_Data 3 //检测铁丝的差值
- #define Speed_PWM 50
- #define flag_beep 4
- #define flag_ch0 0
- #define flag_ch1 1
- #define flag_ch2 2
- #define flag_ch3 3
- #define flag_ch4 5
- static int dif_val1,dif_val2;
- int dif_val1=0,dif_val2=0;
- uint32_t CH_Dif[4]={0,0,0,0};
- u8 step_flag = 0;
- u8 key_flag;
- uint32_t CH[4]={0};
- int val_init,val_10,val_15,val_20,val_30; //初始值
- float Step1to10_val,Step10to15_val,Step15to20_val,Step20to30_val;//每张纸的步进值
- u8 flag_Last[50]={0};
- unsigned long CH0_Data=0,CH1_Data=0,CH2_Data=0,CH3_Data=0;//传感器初始值
- int Paper_Num(int *CH_Dif,u8 flag);//测量纸张数量
- void Auto_cheak(void); //自检测函数
- u8 Key_cheak(void); //触摸按键检测函数,有触摸按键,返回1
- void Cal_Step_val(void);//计算各个步进值
- u8 Cal_Paper(int *CH_Dif);//粗略计算纸张数量,返回纸张所在步进区间标志位
- int function1(uint32_t CH_Dif1,int dif_val1);//根据采集的数据,计算纸张数量,纸张要求为1~15张
- int function2(uint32_t CH_Dif1,int dif_val2);//根据采集的数据,计算纸张数量,纸张要求为16~35张
- int main(void)
- {
- uint8_t retVal=0;//传感器自初始化返回值
- int i=0;
- int num=0;
- char *str;
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- OLED_Init();
- OLED_Display_On();
- OLED_Clear();
-
- uart_init(115200); //串口初始化为115200
- printf("uart Init_OK\r\n");
- //TIM2_Int_Init();
- //TIM3_Int_Init(799,0); //10KHz PWM
- //EXTIX_Init();
- I2C_INIT(); //IIC初始化,模拟IIC,用于ldc1314通信,使用PA11,PA12
- printf("IIC Init_OK\r\n");
- do //LDC1314初始化
- {
- printf("LCD Init_ing\r\n");
- retVal=2;
- retVal = InitLDC1314();//ldc1314初始化,若不成功则一直执行
- }while (retVal!= 1) ;
- delay_ms(100);
- //Auto_cheak();//自检
- OLED_Clear();
- while(1)
- {
- OLED_ShowString(0,0," Work Mode",16);
- OLED_ShowString(0,2,"Place Paper...",16);
- OLED_ShowString(0,4,"Place... ",16);
- // while(!Key_cheak())
- // {
- // delay_ms(10);
- // }//等待按键确认
- OLED_ShowString(0,4,"Place : OK ",16);//手动确认纸张放好
- for(i=0;i<50;i++)
- {
- LDC_read(CH);
- CH_Dif[1] += CH[1];
- delay_ms(10);
- }
- CH_Dif[1]=CH_Dif[1]/50;
- if(CH_Dif[1]<=7638)
- num=function1(CH_Dif[1],0);
- else
- num=function2(CH_Dif[1],0);
- printf("CH_Dif[1]=%d Paper : %d\r\n",CH_Dif[1],num);
- // while(!Key_cheak())
- // {
- // delay_ms(10);
- // }//等待按键确认
- CH_Dif[0]=0;
- CH_Dif[1]=0;
- CH_Dif[2]=0;
- }
- }
- int Paper_Num(int *CH_Dif,u8 flag)
- {
- int Num=0;
- switch(flag)
- {
- case 1://1~10张
- Num=(CH_Dif[1]-val_init)/Step1to10_val;
- break;
- case 2://11~15张
- Num=(CH_Dif[1]-val_10)/Step10to15_val;
- break;
- case 3://16~20张
- Num=(CH_Dif[1]-val_15)/Step15to20_val;
- break;
- case 4://21~30张
- Num=(CH_Dif[1]-val_20)/Step20to30_val;
- break;
- case 5://>30张
- Num=(CH_Dif[1]-val_30)/Step20to30_val;//待确定
- break;
- case 0://短路或错误标识
- OLED_Clear();
- OLED_ShowString(0,0,"ERROR Mode",16);
- break;
-
- }
- return Num;
- }
- u8 Key_cheak(void)
- {
- int i;
- LDC_read(CH);
- for(i=0;i<10;i++)
- {
- LDC_read(CH);
- CH_Dif[0] += CH[0];
- }
- CH_Dif[0]=CH_Dif[0]/10;
- printf("Key_cheak CH_Dif[0]=:%d\r\n",CH_Dif[0]);
- if(CH_Dif[0]<31000)
- return 1;
- else
- return 0;
- }
- void Auto_cheak(void)
- {
- int i,sum=0;
- printf("Auto_Cheak!\r\n");
- OLED_ShowString(0,0,"Auto_Cheak Mode",16);
- OLED_ShowString(0,2,"Paper_Num:5",16);//自检测5张纸
- OLED_ShowString(0,4,"Cheaking...",16);
- while(!Key_cheak())
- {
- delay_ms(10);
- }//等待按键确认
-
- delay_ms(1000);//等待测量值稳定
- for(i=0;i<30;i++)
- {
- LDC_read(CH);
- sum+=CH[1];
- delay_ms(10);
- }
- val_init=sum/30;
- if(5!=function1(val_init,0))
- {
- dif_val1=val_init-(6915+7055)/2;
- }
- sum=0;
- OLED_ShowString(0,4,"Cheak:OK! ",16);
- //beep
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
-
-
-
- OLED_ShowString(0,2,"Paper_Num:20",16);//自检测20张纸
- OLED_ShowString(0,4,"Cheaking...!",16);
- while(!Key_cheak())//等待按键确认
- {delay_ms(10);}
- delay_ms(1000);
- for(i=0;i<30;i++)
- {
- LDC_read(CH);
- sum+=CH[1];
- delay_ms(10);
- }
- val_20=sum/30;
- if(20!=function1(val_init,0))
- {
- dif_val2=val_init-(7786+7816)/2;
- }
- sum=0;
- OLED_ShowString(0,4,"Cheak:OK! ",16);
- //beep
- delay_ms(1000);
- delay_ms(1000);
-
-
- }
- void Cal_Step_val(void)
- {
- Step1to10_val=(val_10-val_init)/9;//算出各个区间的步进值
- Step10to15_val=(val_15-val_10)/5;
- Step15to20_val=(val_20-val_15)/5;
- Step20to30_val=(val_30-val_20)/10;
- }
- u8 Cal_Paper(int *CH_Dif)
- {
- if(CH_Dif[1]>(val_init-3) && CH_Dif[1]<(val_10))
- return 1;
- if(CH_Dif[1]>(val_10) && CH_Dif[1]<(val_15))
- return 2;
- if(CH_Dif[1]>(val_15) && CH_Dif[1]<(val_20))
- return 3;
- if(CH_Dif[1]>(val_20) && CH_Dif[1]<(val_30))
- return 4;
- if(CH_Dif[1]>(val_30))
- return 5;
- else
- return 0;//error
-
- }
- /*此函数用于判断1~15张纸的数量*/
- /*输入参数:通道采样值*/
- /*数出参数:纸张数量 */
- /* f(x) = p1*x^4 + p2*x^3 + p3*x^2 + p4*x + p5 */
- /* p1 = 0.02382 (-0.0076, 0.05524)*/
- /* p2 = -0.08983 (-1.102, 0.9222)*/
- /* p3 = -15.9 (-26.84, -4.963)*/
- /* p4 = 293.3 (248.3, 338.3)*/
- /* p5 = 5916 (5860, 5972)*/
- /* 根据上述公式求得的参数区间*/
- int function1(uint32_t CH_Dif1, int dif_val1)
- {
- int dif_val=0;
- uint32_t CH_Dif[2]=0;
- CH_Dif[1]=CH_Dif1;
- if(CH_Dif[1]>=6059+dif_val && CH_Dif[1]<=6320+dif_val)
- return 1;
- else if(CH_Dif[1]>6320+dif_val && CH_Dif[1]<=6549+dif_val)
- return 2;
- else if(CH_Dif[1]>6549+dif_val && CH_Dif[1]<=6747+dif_val)
- return 3;
- else if(CH_Dif[1]>6747+dif_val && CH_Dif[1]<=6915+dif_val)
- return 4;
- else if(CH_Dif[1]>6915+dif_val && CH_Dif[1]<=7055+dif_val)
- return 5;
- else if(CH_Dif[1]>7055+dif_val && CH_Dif[1]<=7169+dif_val)
- return 6;
- else if((CH_Dif[1]>(7169+dif_val)) && (CH_Dif[1]<=(7259+dif_val)))
- return 7;
- else if(CH_Dif[1]>(7260+dif_val) && CH_Dif[1]<=(7329+dif_val))
- return 8;
- else if(CH_Dif[1]>(7329+dif_val) && CH_Dif[1]<=(7384+dif_val))
- return 9;
- else if(CH_Dif[1]>7384+dif_val && CH_Dif[1]<=7428+dif_val)
- return 10;
- else if(CH_Dif[1]>7428+dif_val && CH_Dif[1]<=7466+dif_val)
- return 11;
- else if(CH_Dif[1]>7466+dif_val && CH_Dif[1]<=7494+dif_val)
- return 12;
- else if(CH_Dif[1]>7494+dif_val && CH_Dif[1]<=7558+dif_val)//改区间
- return 13;
- else if(CH_Dif[1]>7558+dif_val && CH_Dif[1]<=7605+dif_val)
- return 14;
- else if(CH_Dif[1]>7605+dif_val && CH_Dif[1]<=7638+dif_val)
- return 15;
- else return 999;
-
-
-
- }
- int function2(uint32_t CH_Dif1, int dif_val2)
- {
- int dif_val=0;
- uint32_t CH_Dif[2]=0;
- CH_Dif[1]=CH_Dif1;
- if(CH_Dif[1]>7638+dif_val && CH_Dif[1]<=7678+dif_val)
- return 16;
- else if(CH_Dif[1]>7678+dif_val && CH_Dif[1]<=7717+dif_val)
- return 17;
- else if(CH_Dif[1]>7717+dif_val && CH_Dif[1]<=7753+dif_val)
- return 18;
- else if(CH_Dif[1]>7753+dif_val && CH_Dif[1]<=7786+dif_val)
- return 19;
- else if(CH_Dif[1]>7786+dif_val && CH_Dif[1]<=7816+dif_val)
- return 20;
- else if(CH_Dif[1]>7816+dif_val && CH_Dif[1]<=7844+dif_val)
- return 21;
- else if(CH_Dif[1]>7844+dif_val && CH_Dif[1]<=7869+dif_val)
- return 22;
- else if(CH_Dif[1]>7869+dif_val && CH_Dif[1]<=7891+dif_val)
- return 23;
- else if(CH_Dif[1]>7891+dif_val && CH_Dif[1]<=7911+dif_val)
- return 24;
- else if(CH_Dif[1]>7911+dif_val && CH_Dif[1]<=7929+dif_val)
- return 25;
- else if(CH_Dif[1]>7929+dif_val && CH_Dif[1]<=7943+dif_val)
- return 26;
- else if(CH_Dif[1]>7943+dif_val && CH_Dif[1]<=7959+dif_val)
- return 27;
- else if(CH_Dif[1]>7959+dif_val && CH_Dif[1]<=7970+dif_val)
- return 28;
- else if(CH_Dif[1]>7970+dif_val && CH_Dif[1]<=7984+dif_val)
- return 29;
- else if(CH_Dif[1]>7984+dif_val && CH_Dif[1]<=7995+dif_val)
- return 30;
- else if(CH_Dif[1]>7995+dif_val && CH_Dif[1]<=8005+dif_val)
- return 31;
- else if(CH_Dif[1]>8005+dif_val && CH_Dif[1]<=8015+dif_val)
- return 32;
- else if(CH_Dif[1]>8015+dif_val && CH_Dif[1]<=8026+dif_val)
- return 33;
- else if(CH_Dif[1]>8026+dif_val && CH_Dif[1]<=8038+dif_val)
- return 34;
- else if(CH_Dif[1]>8038+dif_val && CH_Dif[1]<=8052+dif_val)
- return 35;
- else return 999;
- }
复制代码
所有资料51hei提供下载:
LDC1314_F1.7z
(218.01 KB, 下载次数: 34)
|