找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2332|回复: 0
收起左侧

原创分享-第六届蓝桥杯单片机决赛试题:智能物料传送系统(试题+源程序)

[复制链接]
ID:331814 发表于 2019-5-19 16:16 | 显示全部楼层 |阅读模式
这次分享的是蓝桥杯单片机第六届国赛考题的程序源码 第6届:智能物料传送系统试题题目_Page1.jpg 第6届:智能物料传送系统试题题目_Page2.jpg 第6届:智能物料传送系统试题题目_Page3.jpg 单片机程序带有完整注释(一些简单的地方我就没注释)
  1. #include "main.h"
  2. #include "display.h"
  3. #include "iic.h"
  4. #include "key.h"
  5. #include "time.h"
  6. #include "sonic.h"
  7. #include "delay.h"

  8. u8 dis_buf[]={"        "};
  9. u8 con_temp = 0X00;
  10. u16 dis_mode=1;//当前显示模式
  11. u16 hw_flag = 1;//货物类型标志,1:一类货物;2:二类货物
  12. u16 y_time=2,e_time=4;//一类货物和二类货物传送时间标志
  13. bit ssbz=0;//LED闪烁标志
  14. bit job1_flag=0;
  15. bit job2_flag=0;
  16. bit job3_flag=0;
  17. bit job4_flag=0;
  18. bit job5_flag=0;
  19. u16 time=0;//传送时间标志
  20. u16 yz_flag = 1;//当前运载类型标志,0:空载;1:非空载;2:过载;
  21. bit qdcs_flag=0;//启动传送标志
  22. bit ztcs_flag=0;//暂停传送标志
  23. u8 led_temp=0xff;
  24. bit relay_flag = 0;//继电器开关标志
  25. bit buzz_flag = 0;//蜂鸣器开关标志
  26. bit ts_flag = 0;//是否进入调节时间模式标志
  27. u16 ts_temp = 0;//1:调节1类货物传送时间;2:调节2类货物传送时间

  28. void System_init();
  29. void job1();
  30. void job2();
  31. void job3();
  32. void job4();
  33. void job5();
  34. void cc_sj();
  35. void dq_sj();

  36. void main()
  37. {
  38.         System_init();
  39.         pcf_init();
  40.         t0_init();
  41.         t1_init();
  42.         t2_init();
  43.         //cc_sj();
  44.         dq_sj();
  45.         while(1)
  46.         {
  47.                 if(job1_flag)//数码管显示
  48.                 {
  49.                         job1();
  50.                         job1_flag=0;
  51.                 }
  52.                 if(job2_flag)//按键扫描与处理
  53.                 {
  54.                         job2();
  55.                         job2_flag=0;
  56.                 }
  57.                 if(job3_flag)//数码管显示模式与LED显示模式处理
  58.                 {
  59.                         job3();
  60.                         job3_flag=0;
  61.                 }
  62.                 if(job4_flag)//电压测量与超声波测距
  63.                 {
  64.                         if(!qdcs_flag & !ts_flag)//启动传送之后不再测量电压与距离
  65.                         job4();
  66.                         job4_flag=0;
  67.                 }
  68.                 if(job5_flag)//传送时间计算
  69.                 {
  70.                         job5();
  71.                         job5_flag=0;
  72.                 }         
  73.         }
  74. }

  75. void System_init()
  76. {
  77.         all_off;
  78.         led_set=0xff;
  79. }

  80. void job1()//数码管显示
  81. {
  82.         display_seg(dis_buf);
  83. }

  84. void job2()//按键处理
  85. {
  86.         u8 key_num;
  87.         key_num = read_key();
  88.         if(s4_flag)
  89.         {
  90.                 if(yz_flag!=0&&!qdcs_flag)//非空载,传送标志为0能进入判断
  91.                 {
  92.                         dis_mode = 2;
  93.                         qdcs_flag = 1;
  94.                         relay_flag = 1;
  95.                         if(hw_flag==1)
  96.                         {
  97.                                 time = y_time;
  98.                         }
  99.                         else
  100.                         {
  101.                                 time = e_time;
  102.                         }        
  103.                 }
  104.                 s4_flag=0;
  105.         }
  106.         if(s5_flag)
  107.         {
  108.                 if(qdcs_flag)
  109.                 {
  110.                         ztcs_flag = ~ztcs_flag;
  111.                         if(ztcs_flag)
  112.                         {
  113.                                 relay_flag = 0;        
  114.                         }
  115.                         if(!ztcs_flag)
  116.                         {
  117.                                 relay_flag = 1;
  118.                         }
  119.                 }
  120.                 s5_flag=0;
  121.         }
  122.         if(s6_flag)
  123.         {
  124.                 ts_flag = 1;
  125.                 ts_temp++;
  126.                 dis_mode = 3;
  127.                 if(ts_temp == 3)
  128.                 {
  129.                         cc_sj();
  130.                         dq_sj();
  131.                         ts_temp = 0;
  132.                         ts_flag = 0;
  133.                         dis_mode = 4;        
  134.                 }
  135.                 s6_flag = 0;        
  136.         }
  137.         if(s7_flag)
  138.         {
  139.                 if(ts_flag)
  140.                 {
  141.                         switch(ts_temp)
  142.                         {
  143.                                 case 1:y_time++;if(y_time== 11)y_time = 1;break;
  144.                                 case 2:e_time++;if(e_time== 11)e_time = 1;break;
  145.                         }
  146.                 }
  147.                 s7_flag = 0;
  148.         }
  149. }
  150. void job3()//显示模式处理(数码管显示与LED显示)
  151. {
  152.         //数码管显示处理
  153.         switch(dis_mode)
  154.         {
  155.                 case 1:
  156.                 {
  157.                         sprintf(dis_buf,"%1d  %02d  %1d",dis_mode,juli,hw_flag);
  158.                 }break;

  159.                 case 2:
  160.                 {
  161.                         sprintf(dis_buf,"%1d     %02d",dis_mode,time);               
  162.                 }break;

  163.                 case 3:
  164.                 {
  165.                         if(!ssbz)
  166.                         {
  167.                                 sprintf(dis_buf,"%1d  %02d %02d",dis_mode,y_time,e_time);        
  168.                         }
  169.                         else
  170.                         {
  171.                                 switch(ts_temp)
  172.                                 {
  173.                                         case 1:sprintf(dis_buf,"%1d     %02d",dis_mode,e_time);break;
  174.                                         case 2:sprintf(dis_buf,"%1d  %02d   ",dis_mode,y_time);break;        
  175.                                 }
  176.                         }
  177.                                        
  178.                 }break;

  179.                 case 4:
  180.                 {
  181.                         sprintf(dis_buf,"        ");
  182.                 }break;
  183.         }
  184.         //LED显示处理
  185.         if(yz_flag == 2)//过载,蜂鸣器响
  186.         {
  187.                 led_temp = 0x04;
  188.                 buzz_flag = 1;//打开蜂鸣器响标志
  189.         }
  190.         else
  191.         {
  192.                 led_temp = 0x00;
  193.                 buzz_flag = 0;//关闭蜂鸣器响标志
  194.         }
  195.         if(ztcs_flag)led_temp = led_temp|0x08;
  196.         if(ssbz)led_set = ~led_temp;
  197.         else led_set = 0xff;
  198.         //继电器与蜂鸣器处理
  199.         con_temp = 0x00;
  200.         if(relay_flag)con_temp |= 0x10;
  201.         else con_temp &= 0XEF;
  202.         if(buzz_flag)con_temp |= 0x40;
  203.         else con_temp &= 0xbf;
  204.         con_set = con_temp;        
  205. }
  206. void job4()//电压测量与测距处理
  207. {
  208.         u16 adc=0;//模数转换返回值
  209.         f32 dy=0;//电压值
  210.         adc = pcf_adc();//调用模数转换函数
  211.         dy = (f32)adc/255.0*5.0;//计算当前电压为多少
  212.         if(dy>0.0&&dy<1.0)//空载数码管熄灭
  213.         {
  214.                 yz_flag=0;//空载
  215.                 if(!ts_flag)
  216.                 dis_mode = 4;//显示模式4:数码管全灭
  217.         }
  218.         else if(dy>=1.0&&dy<4.0)//非空载
  219.         {
  220.                 yz_flag=1;//非空载
  221.                 if(!ts_flag)
  222.                 dis_mode = 1;//显示模式1:数码管显示
  223.         }
  224.         else if(dy>=4.0)//过载
  225.         {
  226.                 yz_flag=2;//过载
  227.                 if(!ts_flag)
  228.                 dis_mode = 1;        
  229.         }
  230.         //测量距离
  231.         if(yz_flag!=0)//如果非空载
  232.         {
  233.                 ceju();//测量距离
  234. //                juli =31;//测试
  235.                 if(juli<=30)//判断货物类型
  236.                 {
  237.                         hw_flag=1;//一类货物
  238.                 }
  239.                 else
  240.                 {
  241.                         hw_flag=2;//二类货物
  242.                 }        
  243.         }
  244. }

  245. void job5()//时间计算函数
  246. {
  247.         if(!ztcs_flag)time--;//如果没有暂停
  248.         if(time == 0)//时间等于零
  249.         {
  250.                 qdcs_flag = 0;
  251.                 ztcs_flag = 0;
  252.                 relay_flag = 0;
  253.         }
  254. }

  255. void cc_sj()
  256. {
  257.         write_eeprom(0,y_time);
  258.         write_eeprom(1,e_time);
  259. }

  260. void dq_sj()
  261. {
  262.         y_time = read_eeprom(0);
  263.         e_time = read_eeprom(1);
  264. }
复制代码
工程文件请到51hei附件里面下载

第6届:智能物料传送系统.rar

82.82 KB, 下载次数: 28, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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