单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "beep.h"
- #include "w25qxx.h"
- #include "ff.h"
- #include "exfuns.h"
- #include "text.h"
- #include "2214.h"
- #include "myiic.h"
- #define count_t 35 //纸张上限
- u8 w=0,K;
- int main(void)
- {
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- LED_Init(); //LED初始化
- KEY_Init(); //初始化按键
- LCD_Init(); //初始化LCD
- font_init(); //汉字初始化
- LCD_Clear(WHITE); //屏幕清空
- BEEP_Init(); //蜂鸣器初始化
- IIC_Init(); //IIC通讯
- InitMultiFDC2214(); //多通道设置
- POINT_COLOR=BLUE;
- Show_Str(120,30,240,24,"2019年 电子设计大赛",24,0);
- Show_Str(140,98,200,24,"纸张计数显示装置",24,0);
- POINT_COLOR=BLACK;
- LCD_DrawRectangle(20,70,460,150); //画表格
- LCD_DrawRectangle(20,70,460,350);
- LCD_DrawRectangle(20,150,240,350);
- Show_Str(30,180,200,24,"通道1:",24,0);
- Show_Str(30,240,200,24,"通道2:",24,0);
- Show_Str(30,300,200,24,"当前模式为:",24,0);
-
- Show_Str(250,180,200,24,"极板状态:",24,0);
- Show_Str(250,240,200,24,"纸张数:",24,0);
- Show_Str(250,300,200,24,"总重:",24,0);
-
- POINT_COLOR=RED;
- LCD_ShowxNum(355,300,0,1,24,0); //默认纸重
- Show_Str(170,300,200,24,"待机",24,0);
-
- POINT_COLOR=BLACK;
- Show_Str(90,380,300,24,"学习+检测",24,0); //KEY0
- Show_Str(315,380,300,24,"纸重检测",24,0); //KEY1
- Show_Str(90,430,300,24,"进入学习",24,0); //KEY2
- Show_Str(315,430,300,24,"纸张规格",24,0); //KEY2
- POINT_COLOR=RED;
- Show_Str(30,380,300,24,"KEY0:",24,0); //学习模式
- Show_Str(250,380,300,24,"KEY1:",24,0); //重量检测模式
- Show_Str(30,430,300,24,"KEY2:",24,0);
- Show_Str(250,430,300,24,"KEY3:",24,0);
- POINT_COLOR=BLACK;
- Show_Str(30,480,300,24,"纸张规格",24,0); //纸张规格
- Show_Str(30,530,300,24,"重量",24,0);
- Show_Str(30,580,300,24,"厚度",24,0);
- while(1)
- {
- u8 key;
- FDC2214Check(); //检测系统工作状态
- just_test(); //显示通道值
- delay_ms(10);
- key = KEY_Scan(0); //获得键值
-
- if(key == KEY0_PRES) //进入学习模式
- {
- StudyMode();//学习模式
- K++;
- POINT_COLOR=BLACK;
- Show_Str(30,680,300,24,"K 按下次数:",24,0);
- POINT_COLOR=RED;
- LCD_ShowxNum(170,680,K,1,24,0);
- }
- }
- }
-
- /***********************学习模式***********************/
- u16 StudyMode()//获取数据,计算
- {
- u8 keyd,Count;
- double Ch1,Ch2;
- int i,j; //获取数据,计算
- static double ab[4][count_t] /*分别对应一通道左值右值二通道左值右值*/;
- long double sum1 = 0,sum2 = 0,a[2][count_t] = {0};
- double adf[2][(count_t-1)] /*对应临时差值*/;
- keyd=KEY_Scan(1);
- POINT_COLOR=BLACK;
- for(i = 0;i<count_t;)
- {
- keyd=KEY_Scan(0);
- if(keyd==KEY0_PRES) //按键KEY0按下录入数据
- {
- K++;
- POINT_COLOR=BLACK;
- Show_Str(30,680,300,24,"K 按下次数:",24,0);
- POINT_COLOR=RED;
- LCD_ShowxNum(170,680,K,1,24,0);
- for(j=0;j<100;j++) //取平均值
- {
- sum1= sum1+ReadRegfdc2214(0x02);//读取的通道1的值
- sum2= sum2+ReadRegfdc2214(0x04);//读取的通道2的值
- }
- a[0][i]=sum1/100;
- a[1][i]=sum2/100;
-
- POINT_COLOR=BLACK;
- Show_Str(170,300,200,24,"学习",24,0);
- Show_Str(160,500,200,24,"正在学习",24,0);
- Show_Str(30,530,200,24,"学习次数:",24,0);
- Show_Str(30,500,300,24,"学习状态:",24,0);
- POINT_COLOR=RED;
- LCD_ShowxNum(100,180,a[0][i],8,24,0); //通道一学习参数
- LCD_ShowxNum(100,240,a[1][i],8,24,0); //通道二学习参数
- LCD_ShowxNum(160,530,i+1,2,24,0); //学习次数
- sum1 = 0;
- sum2 = 0;
- i++;
- keyd = 0;
- }
- delay_ms(1);
- }
- for(i=1;i<count_t;i++)
- {
- adf[0][i-1] = (a[0][i] - a[0][i-1])/2;
- adf[1][i-1] = (a[1][i] - a[1][i-1])/2;
- }
- ab[0][0] = a[0][0] - adf[0][0];
- ab[2][0] = a[1][0] - adf[1][0];
- for(i=1;i<count_t;i++)
- {
- ab[0][i] = a[0][i] - adf[0][i-1];
- ab[1][i-1] = a[0][i-1]+adf[0][i-1];
- ab[2][i]=a[1][i]-adf[1][i-1];
- ab[3][i-1]=a[1][i-1]+adf[1][i-1];
- }
- ab[1][count_t-1] = a[0][count_t-1]+adf[0][count_t-2];
- ab[3][count_t-1] = a[1][count_t-1]+adf[1][count_t-2];
- //上下限
- /******************************************************************************************************************************
- **********************************************分割线***************************************************************************
- ******************************************************************************************************************************/
- Show_Str(150,500,300,24,"正在学习",24,0);
- while(1) //学习模式
- {
- POINT_COLOR=RED;
- Show_Str(150,500,300,24,"已完成学习",24,0);
- keyd=KEY_Scan(0);
-
-
-
- if(keyd == KEY0_PRES) // 录入数值
- {
- K++;
- POINT_COLOR=BLACK;
- Show_Str(30,680,300,24,"K 按下次数:",24,0);
- POINT_COLOR=RED;
- LCD_ShowxNum(170,680,K,1,24,0);
- Ch2 = ReadRegfdc2214(0x04); //通道二
- Ch1 = ReadRegfdc2214(0x02); //通道一
- Count=0;
- if((Ch1<1873) || (Ch2<1792))Count=0; //零张
- for(i=0;i<count_t;i++)
- {
- if(((ab[0][i]<Ch1)&&(Ch1<ab[1][i])) || ((ab[2][i]<Ch2)&&(Ch2<ab[3][i]))) //i张纸
- {
- Count = i+1;
- break;
- }
- }
- LCD_ShowxNum(350,240,Count,4,24,0); //显示被测纸张数
- delay_ms(500);
- BEEP=1; //发出蜂鸣声
- LED0=0; //伴随红灯闪烁
- delay_ms(500);
- BEEP=0;
- LED0=1;
- }
-
-
-
- if(keyd == KEY2_PRES) //按下KEY2进行纸张标准重量调节 一共分为4挡
- {
- u8 z;
- w++;
- if(w==5) w=0;
- z=Count*PaperWeight(w); //计算后的纸张重
- POINT_COLOR=BLACK;
- LCD_ShowxNum(355,300,z,5,24,0); //纸重
- LCD_ShowxNum(286,600,PaperWeight(w),3,24,0); //显示规格
- }
-
-
-
- }
- }
复制代码
所有资料51hei提供下载:
2019F纸张检测程序.7z
(1.26 MB, 下载次数: 42)
|