找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2761|回复: 0
打印 上一主题 下一主题
收起左侧

2019电赛f题获奖代码,stm32战舰开发板编写

[复制链接]
跳转到指定楼层
楼主
ID:588307 发表于 2020-3-24 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"                           
  5. #include "lcd.h"  
  6. #include "key.h"  
  7. #include "beep.h"
  8. #include "w25qxx.h"   
  9. #include "ff.h"  
  10. #include "exfuns.h"   
  11. #include "text.h"
  12. #include "2214.h"
  13. #include "myiic.h"
  14. #define count_t 35                       //纸张上限

  15. u8 w=0,K;
  16. int main(void)
  17. {        
  18.         delay_init();                     //延时函数初始化         
  19.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  20.         uart_init(115200);                 //串口初始化为115200        
  21.          LED_Init();                                          //LED初始化
  22.         KEY_Init();                                        //初始化按键
  23.         LCD_Init();                                           //初始化LCD   
  24.         font_init();        //汉字初始化
  25.         LCD_Clear(WHITE);           //屏幕清空
  26.         BEEP_Init();         //蜂鸣器初始化
  27.         IIC_Init();          //IIC通讯
  28.         InitMultiFDC2214(); //多通道设置
  29.         POINT_COLOR=BLUE;
  30.         Show_Str(120,30,240,24,"2019年 电子设计大赛",24,0);
  31.         Show_Str(140,98,200,24,"纸张计数显示装置",24,0);
  32.         POINT_COLOR=BLACK;
  33.         LCD_DrawRectangle(20,70,460,150);     //画表格
  34.         LCD_DrawRectangle(20,70,460,350);         
  35.         LCD_DrawRectangle(20,150,240,350);        
  36.         Show_Str(30,180,200,24,"通道1:",24,0);
  37.         Show_Str(30,240,200,24,"通道2:",24,0);
  38.         Show_Str(30,300,200,24,"当前模式为:",24,0);        
  39.         
  40.         Show_Str(250,180,200,24,"极板状态:",24,0);
  41.         Show_Str(250,240,200,24,"纸张数:",24,0);
  42.         Show_Str(250,300,200,24,"总重:",24,0);
  43.         
  44.         POINT_COLOR=RED;
  45.         LCD_ShowxNum(355,300,0,1,24,0);          //默认纸重
  46.         Show_Str(170,300,200,24,"待机",24,0);
  47.         
  48.         POINT_COLOR=BLACK;
  49.         Show_Str(90,380,300,24,"学习+检测",24,0);     //KEY0
  50.         Show_Str(315,380,300,24,"纸重检测",24,0); //KEY1
  51.         Show_Str(90,430,300,24,"进入学习",24,0);     //KEY2
  52.         Show_Str(315,430,300,24,"纸张规格",24,0); //KEY2
  53.         POINT_COLOR=RED;  
  54.         Show_Str(30,380,300,24,"KEY0:",24,0);            //学习模式
  55.         Show_Str(250,380,300,24,"KEY1:",24,0);            //重量检测模式
  56.         Show_Str(30,430,300,24,"KEY2:",24,0);           
  57.         Show_Str(250,430,300,24,"KEY3:",24,0);
  58.         POINT_COLOR=BLACK;
  59.         Show_Str(30,480,300,24,"纸张规格",24,0);        //纸张规格
  60.         Show_Str(30,530,300,24,"重量",24,0);
  61.         Show_Str(30,580,300,24,"厚度",24,0);
  62.         while(1)
  63.         {
  64.                 u8 key;
  65.                 FDC2214Check();                  //检测系统工作状态
  66.                 just_test();        //显示通道值                                       
  67.                 delay_ms(10);               
  68.                 key = KEY_Scan(0);     //获得键值
  69.                
  70.                 if(key == KEY0_PRES)                //进入学习模式
  71.                 {
  72.                         StudyMode();//学习模式
  73.                         K++;
  74.                 POINT_COLOR=BLACK;
  75.                 Show_Str(30,680,300,24,"K 按下次数:",24,0);
  76.                 POINT_COLOR=RED;
  77.                 LCD_ShowxNum(170,680,K,1,24,0);
  78.                 }
  79.          }
  80. }

  81. /***********************学习模式***********************/

  82. u16 StudyMode()//获取数据,计算
  83. {
  84.                 u8 keyd,Count;
  85.                 double Ch1,Ch2;
  86.                 int i,j;                                                           //获取数据,计算
  87.                 static        double ab[4][count_t]                                         /*分别对应一通道左值右值二通道左值右值*/;
  88.                 long double sum1 = 0,sum2 = 0,a[2][count_t] = {0};
  89.                 double adf[2][(count_t-1)]                                            /*对应临时差值*/;
  90.                 keyd=KEY_Scan(1);
  91.                 POINT_COLOR=BLACK;
  92.                 for(i = 0;i<count_t;)
  93.                 {
  94.                         keyd=KEY_Scan(0);
  95.                         if(keyd==KEY0_PRES)                  //按键KEY0按下录入数据
  96.                         {  
  97.                                 K++;        
  98.                                 POINT_COLOR=BLACK;
  99.                                 Show_Str(30,680,300,24,"K 按下次数:",24,0);
  100.                                 POINT_COLOR=RED;
  101.                                 LCD_ShowxNum(170,680,K,1,24,0);                                
  102.                                 for(j=0;j<100;j++)                 //取平均值
  103.                                 {
  104.                                         sum1= sum1+ReadRegfdc2214(0x02);//读取的通道1的值
  105.                                         sum2= sum2+ReadRegfdc2214(0x04);//读取的通道2的值
  106.                                 }
  107.                                 a[0][i]=sum1/100;
  108.                                 a[1][i]=sum2/100;
  109.                                 
  110.                                 POINT_COLOR=BLACK;  
  111.                                 Show_Str(170,300,200,24,"学习",24,0);
  112.                                 Show_Str(160,500,200,24,"正在学习",24,0);
  113.                                 Show_Str(30,530,200,24,"学习次数:",24,0);
  114.                                 Show_Str(30,500,300,24,"学习状态:",24,0);
  115.                                 POINT_COLOR=RED;
  116.                                 LCD_ShowxNum(100,180,a[0][i],8,24,0);               //通道一学习参数               
  117.                                 LCD_ShowxNum(100,240,a[1][i],8,24,0);               //通道二学习参数
  118.                                 LCD_ShowxNum(160,530,i+1,2,24,0);                     //学习次数
  119.                                 sum1 = 0;
  120.                                 sum2 = 0;
  121.                                 i++;
  122.                                 keyd = 0;                        
  123.                         }               
  124.                         delay_ms(1);
  125.                 }
  126.                 for(i=1;i<count_t;i++)
  127.                 {
  128.                         adf[0][i-1] = (a[0][i] - a[0][i-1])/2;
  129.                         adf[1][i-1] = (a[1][i] - a[1][i-1])/2;
  130.                 }
  131.                 ab[0][0] = a[0][0] - adf[0][0];
  132.                 ab[2][0] = a[1][0] - adf[1][0];
  133.                 for(i=1;i<count_t;i++)
  134.                 {
  135.                         ab[0][i] = a[0][i] - adf[0][i-1];
  136.                         ab[1][i-1] = a[0][i-1]+adf[0][i-1];
  137.                         ab[2][i]=a[1][i]-adf[1][i-1];
  138.                         ab[3][i-1]=a[1][i-1]+adf[1][i-1];
  139.                 }
  140.                 ab[1][count_t-1] = a[0][count_t-1]+adf[0][count_t-2];
  141.                 ab[3][count_t-1] = a[1][count_t-1]+adf[1][count_t-2];
  142.                 //上下限
  143. /******************************************************************************************************************************
  144. **********************************************分割线***************************************************************************
  145. ******************************************************************************************************************************/
  146.         Show_Str(150,500,300,24,"正在学习",24,0);
  147.                 while(1)                             //学习模式
  148.                         {
  149.                                 POINT_COLOR=RED;
  150.                                 Show_Str(150,500,300,24,"已完成学习",24,0);
  151.                                 keyd=KEY_Scan(0);
  152.                                 
  153.                                 
  154.                                 
  155.                                 if(keyd == KEY0_PRES)          // 录入数值
  156.                                 {
  157.                                         K++;
  158.                                         POINT_COLOR=BLACK;
  159.                                         Show_Str(30,680,300,24,"K 按下次数:",24,0);
  160.                                         POINT_COLOR=RED;
  161.                                         LCD_ShowxNum(170,680,K,1,24,0);
  162.                                         Ch2 = ReadRegfdc2214(0x04);  //通道二
  163.                                         Ch1 = ReadRegfdc2214(0x02);  //通道一        
  164.                                         Count=0;
  165.                                         if((Ch1<1873) || (Ch2<1792))Count=0;                  //零张
  166.                                         for(i=0;i<count_t;i++)
  167.                                         {
  168.                                                 if(((ab[0][i]<Ch1)&&(Ch1<ab[1][i])) ||        ((ab[2][i]<Ch2)&&(Ch2<ab[3][i])))          //i张纸
  169.                                                 {
  170.                                                         Count = i+1;
  171.                                                         break;
  172.                                                 }
  173.                                         }
  174.                                         LCD_ShowxNum(350,240,Count,4,24,0);                          //显示被测纸张数
  175.                                         delay_ms(500);
  176.                                         BEEP=1;                                         //发出蜂鸣声
  177.                                         LED0=0;                                         //伴随红灯闪烁
  178.                                         delay_ms(500);
  179.                                         BEEP=0;
  180.                                         LED0=1;
  181.                                 }
  182.                                 
  183.                                 
  184.                                 
  185.                                 if(keyd == KEY2_PRES) //按下KEY2进行纸张标准重量调节 一共分为4挡
  186.                                 {        
  187.                                         u8 z;
  188.                                                 w++;                                       
  189.                                                 if(w==5)  w=0;
  190.                                         z=Count*PaperWeight(w); //计算后的纸张重
  191.                                         POINT_COLOR=BLACK;
  192.                                         LCD_ShowxNum(355,300,z,5,24,0);                     //纸重
  193.                                         LCD_ShowxNum(286,600,PaperWeight(w),3,24,0);        //显示规格
  194.                                 }        
  195.                                 
  196.                                 
  197.                                 
  198.                 }
  199. }
复制代码

所有资料51hei提供下载:
2019F纸张检测程序.7z (1.26 MB, 下载次数: 42)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表