“智能物料传送系统”设计任务书
选用材料为蓝桥杯官方提供的开发板。
因为此板选用了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.giffile:////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.1当0<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类货物。 图2:数码管显示界面1-货物类型显示 说明:1:货物类型显示格式:I类货物-数字1、II类货物-数字; 2:A3草稿纸短边接近30cm,可用于验证测距结果。 2. 货物传送 在非空载、非过载的前提下,通过按键控制继电器吸合,启动货物传送过程,并通过数码管实时显示剩余的传送时间,倒计时结束后,继电器自动断开,完成本次传送过程,数码管显示格式如图3所示: 图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所示: 图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(); }
|