找回密码
 立即注册

QQ登录

只需一步,快速开始

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

“智能物料传送系统”设计任务书——蓝桥15年决赛

[复制链接]
跳转到指定楼层
楼主
ID:272080 发表于 2018-1-23 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
“智能物料传送系统”设计任务书


选用材料为蓝桥杯官方提供的开发板。

因为此板选用了4块74LS573芯片用于锁存P0口信号,这种设计可节约很多的i/0口,与市面上很多的开发板不一样,所以如果要换到其他开发板上使用,需要改一下显示代码 和LED亮灭代码,但是大致思路不变,只要改变一下那几个比较特殊的使用到了573锁存来编程的函数即可。

我也是一名菜鸡  如果有那个大神有更好的编程思路的话 那就拜托大神赐教了。


功能简述
  
        
单片机
   
   
   
  
        
数据存储
   
   
   
  
        
传送控制
   
   
   
  
        
货物类型监测
   
   
   
  
        
数码管显示
   
   
   
  
        
按键输入
   
   
   
file:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image001.giffile:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image002.gif
  
        
过载空载监测
   
   
   
file:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image003.giffile:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image004.giffile:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image005.giffile:////Users/yefeng/Library/Group%20Containers/UBF8T346G9.Office/msoclip1/01/clip_image006.gif    智能物料传送系统能够实现货物类型判断、过载监测、紧急停止和系统参数存储记录等功能。系统硬件部分主要由按键电路,显示电路,数据存储电路、传感器检测电路及单片机系统组成,系统框图如图一所示:
                                                                                    
图一:系统框图
I2C总线驱动程序、CT107D单片机考试平台电路原理图以及本题所涉及到的芯片数据手册,可参考计算机上的电子文档。原理图文件、程序流程图及相关工程文件请以考生号命名,并保存在计算机上的考生文件夹中(文件夹名为考生准考证号,文件夹位于Windows桌面上)。
设计任务及要求
1. 过载检测与货物类型识别
  1.1空载、过载检测
     使用电位器RB2输出电压V0模拟压力变送器输出,设备实时采集电位器输出电压,完成货物空载,过载检测功能。
  1.1.10<V0<1V时,判断为空载,L1点亮;
  1.1.2当1<=V0<4V时,判断为非空载,货物被填装到传送起始位,L2点亮;
  1.1.3当V0>=4V时,判断为过载状态,L3以0.5秒为间隔闪烁提醒,蜂鸣器报警提示。
  说明:空载状态下,所有数码管熄灭。
  1.2 货物类型判断
货物被填装到传送起始位置后,系统启动超声波被测距功能,完成货物类型判断,数码管显示界面如图2所示:
  1.2.1 当超声探头与货物之间的距离小于等于30cm时判断为I类货物;
  1.2.2 当超声探头与货物之间的距离大于30cm时判断为II类货物。
  
1
  
8
8
3
2
8
8
2
界面编号
熄灭
距离:32cm
熄灭
II类货物
图2:数码管显示界面1-货物类型显示
说明:1:货物类型显示格式:I类货物-数字1、II类货物-数字;
      2:A3草稿纸短边接近30cm,可用于验证测距结果。
2. 货物传送
在非空载、非过载的前提下,通过按键控制继电器吸合,启动货物传送过程,并通过数码管实时显示剩余的传送时间,倒计时结束后,继电器自动断开,完成本次传送过程,数码管显示格式如图3所示:
  
2
  
8
8
8
8
8
0
1
界面编号
熄灭
剩余传送时间:1
图3:数码管显示界面2-剩余传送时间显示
说明:继电器吸合时,指示灯L10点亮,断开时L10熄灭。
3.按键功能描述
  3.1 按键S4定义为“启动传送”按键,按键按下后,启动货物传送过程。
      说明:按键S4在空载、过载、传送过程中无效。
  3.2 按键S5定义为“紧急停止”按键,按键按下后,继电器立即断开,指示灯L4以0.5秒为间隔闪烁,剩余传送时间计时停止。再次按下S5,传送过程恢复,L4熄灭,恢复倒计时功能,继电器吸合。知道本次传送完成。
      说明:按键S5仅在传送过程中有效。
  3.3 按键S6定义为“设置”按键,按下S6按键,调整I类货物传送时间,再次按下S6按键,调整II类货物传送时间,第三次按下S6,保存调整后的传送时间到E2PROM,并关闭数码管显示。设置过程中数码管显示界面如图4所示:
  
3
  
8
8
0
2
8
0
4
界面编号
熄灭
I类:传送时间2秒
熄灭
II类:传送时间为4秒
图4:数码管显示界面3-传送时间设置界面
说明:1:货物传送时间可设定范围为1-10秒,通过按键S7调整;
      2:“设置”按键S6、“调整”按键S7仅在空载状态下有效;
      3:通过按键S6切换选择到不同货物类型的传送时间时,显示该类货物传送时间的数码管闪烁。
4.数据存储
I、II类型货物的传送时间在设置完成后需要保存到E2PROM中,设备重新上电后,能够恢复最近一次的传送时间配置信息。
5.上电初始化状态与工作流程说明
5.1  I类设备默认传送时间为2秒,II类设备为4秒;
5.2  最终作品提交前,将RB2输出电压调整到最小值,确保设备处于空载状态;


代码如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#include"led_jdq.h"
#include"iic.h"
#include"hc.h"

sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;

uchar tab[]={   0xC0,/*0*/
                        0xF9,/*1*/
                        0xA4,/*2*/
                        0xB0,/*3*/
                        0x99,/*4*/
                        0x92,/*5*/
                        0x82,/*6*/
                        0xF8,/*7*/
                        0x80,/*8*/
                        0x90,/*9*/
                        0xBF,/*-*/
                                0xff
};
uchar dspbuf[]={11,11,11,11,11,11,11,11};
uchar DSP;

uchar hc_add;                   //定时刷新超声波数据标志位  
bit hc_add_flag;

uint led3_add;                   //定时刷新led3标志位  
bit led3_add_flag;

uint sec_add;                   //秒标志位
bit sec_flag;

bit s6_flag;

bit open_sec;                   //倒计时开始标志位
uchar sz_flag;                   //设置标志位

uchar vv;                      //电压值
uint ss;                                //超声波距离
uchar hw;                                   //货物类型

char time1,time2;     //货物1货物2送货时间倒计时
char time11,time22;   //送货时间

uchar ms_flag;          //送货前显示模式标志位
bit sh_flag;                         //送货标志位

void display();                         //显示函数
void int_t();                         //初始化定时器

void vv_dat();                 //判断电压状态

void moshi();                //显示模式1  送货状态
void sh_moshi();
void sz_moshi();

void hwlx();                 //判断货物类型
void key4();                //s4按键功能
void key5();                //s5按键功能
void key6();
void key7();

void delay(uint time);

void main()
{
        time11=2;                                        //初始化传送时间
        time22=4;
       


        int_t();                                          //初始化定时器       
        int_8591();                                        //初始化pcf8591

//        iic_w(0,time11);
//        delay(100);
//        iic_w(1,time22);
        delay(10);
        time11=iic_r(0);                                    //读出24c02
        delay(10);
        time22=iic_r(1);                                    //读出24c02

        time1=time11;                                //初始化送货时间
        time2=time22;
        cls_jdq();                                        //关闭继电器
        while(1)
        {
       

                if(hc_add_flag)                         //读出距离
                {
                        ss=hc_red();

                        vv=red_8591();                     //读出电压
                        hc_add_flag=0;
                }

               

                vv_dat();                                  //判断电压值
                hwlx();                                          //货物类型判断

                if(sh_flag==0)
                {
                        if(sz_flag==0)
                        moshi();
                        else
                        sz_moshi();
                        cls_led10();
                }
                else
                {
                        sh_moshi();
                }

                key4();
                if(vv<10)
                {
                        key6();
                }

//                dspbuf[0]=ss/100;
//                dspbuf[1]=ss%100/10;
//                dspbuf[2]=ss%10;
//                dspbuf[3]=x%10;
//                dspbuf[4]=vv/10;
//                dspbuf[5]=vv%10;
        }
}

void t0 () interrupt 1
{
        TH0=(65535-1000)/256;
        TL0=(65535-1000)%256;
        hc_add++;
        led3_add++;
        if(hc_add==200)
        {
                hc_add=0;
                hc_add_flag=1;
        }

        if(led3_add==500)
        {
                led3_add_flag=~led3_add_flag;
                led3_add=0;
        }

        if(open_sec)
        {
                sec_add++;
                if(sec_add==1000)
                {       
                        sec_add=0;
                        if(hw==1)
                        {
                                time1--;
                                if(time1<0)
                                {
                                        time1=time11;
                                        sh_flag=0;
                                        open_sec=0;
                                }
                        }  else
                        {
                                time2--;
                                if(time2<0)
                                {
                                        time2=time22;
                                        sh_flag=0;
                                        open_sec=0;
                                }
                        }
                }
        }
        display();
}

void int_t()
{
        TMOD=0X11;
        ET0=1;
        TH0=(65535-1000)/256;
        TL0=(65535-1000)%256;

        TH1=0;
        TL1=0;
        TR0=1;
        EA=1;
}

void display()
{
        P2=(P2&0x1f)|0xe0;
        P0=0xff;
        P2&=0x1f;

        P2=(P2&0x1f)|0xc0;
        P0=1<<DSP;
        P2&=0x1f;

        P2=(P2&0x1f)|0xe0;
        P0=tab[dspbuf[DSP]];
        P2&=0x1f;

        DSP++;
        if(DSP==8)
        DSP=0;
}

void vv_dat()                                          //判断电压
{
       
                if(vv<10)
                {
                   open_led1();
//                   key6();
                   ms_flag=0;
                }               
                else
                {
                        if(vv<40)
                        {
                                open_led2();
                                ms_flag=1;
                        }
                        else
                        {
                                cls_led2();
                                if(led3_add_flag)
                                open_led3();
                                else
                                cls_led3();

                                ms_flag=0;
                        }

                        cls_led1();
                }
}

void delay(uint time)
{
        uint i;
        while(time--)
        {for(i=0;i<800;i++);}
}


void hwlx()
{
        if(ss<=30)
        hw=1;
        else
        hw=2;
}

void key4()
{
        if(ms_flag)
        {
                if(s4==0)
                {
                         delay(10);
                         if(s4==0)
                         {
                                 sh_flag=1;
                                open_sec=1;
                                open_jdq();
                                while(!s4);
                         }
                }
        }
}

void key5()
{
        if(s5==0)
        {
                delay(10);
                if(s5==0)
                {
                        open_sec=~open_sec;
                        while(!s5);       
                }
        }

}

void key6()
{
       
        if(s6==0)
        {
                delay(10);
                if(s6==0)
                {
                         sz_flag++;
                         if(sz_flag==3)
                         {
                                 sz_flag=0;
                                time1=time11;
                                time2=time22;
                                iic_w(0,time11);                                           //写入24c02
                                delay(100);
                                iic_w(1,time22);                                           //写入24c02
                         }
                         while(!s6);
                }
        }
}

void key7()
{
        if(s7==0)
        {
                delay(10);
                {
                        if(s7==0)
                        {
                                if(sz_flag==1)
                                {
                                        time11++;
                                        if(time11>10)
                                        {
                                                time11=1;
                                        }
                                }  else
                                {
                                        time22++;
                                        if(time22>10)
                                        {
                                                time22=1;
                                        }
                                }
                                while(!s7);
                        }
                }
        }
}

void moshi()
{
        switch(ms_flag)
        {
                case 0: dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=11;
                                break;

                case 1: dspbuf[0]=1;
                                dspbuf[1]=11;
                                dspbuf[2]=11;
                                dspbuf[3]=ss%100/10;
                                dspbuf[4]=ss%10;;
                                dspbuf[5]=11;
                                dspbuf[6]=11;
                                dspbuf[7]=hw;
                                break;
        }
        cls_led10();
        cls_jdq();
}

void sh_moshi()
{
        open_jdq();
        open_led10();
        dspbuf[0]=2;
        dspbuf[1]=11;
        dspbuf[2]=11;
        dspbuf[3]=11;
        dspbuf[4]=11;
        dspbuf[5]=11;
        if(hw==1)
        {
                dspbuf[6]=time1/10;
                dspbuf[7]=time1%10;
        }else
        {
                dspbuf[6]=time2/10;
                dspbuf[7]=time2%10;
        }
        key5();
        if(open_sec==0&&sh_flag==1)
        {
                 if(led3_add_flag)
                 open_led4();
                 else
                 cls_led4();
        }        else  cls_led4();
}

void sz_moshi()
{
        dspbuf[0]=3;
        dspbuf[1]=11;
        dspbuf[2]=11;
        dspbuf[3]=time11/10;
        dspbuf[4]=time11%10;
        dspbuf[5]=11;
        dspbuf[6]=time22/10;
        dspbuf[7]=time22%10;
        key7();
}





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

使用道具 举报

沙发
ID:272080 发表于 2018-1-23 16:53 | 只看该作者
忘记上传文件了  怎么上传文件啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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