“智能物料傳送系統(tǒng)”設(shè)計(jì)任務(wù)書
選用材料為藍(lán)橋杯官方提供的開發(fā)板。
因?yàn)榇税暹x用了4塊74LS573芯片用于鎖存P0口信號(hào),這種設(shè)計(jì)可節(jié)約很多的i/0口,與市面上很多的開發(fā)板不一樣,所以如果要換到其他開發(fā)板上使用,需要改一下顯示代碼 和LED亮滅代碼,但是大致思路不變,只要改變一下那幾個(gè)比較特殊的使用到了573鎖存來編程的函數(shù)即可。
我也是一名菜雞 如果有那個(gè)大神有更好的編程思路的話 那就拜托大神賜教了。
功能簡(jiǎn)述 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 智能物料傳送系統(tǒng)能夠?qū)崿F(xiàn)貨物類型判斷、過載監(jiān)測(cè)、緊急停止和系統(tǒng)參數(shù)存儲(chǔ)記錄等功能。系統(tǒng)硬件部分主要由按鍵電路,顯示電路,數(shù)據(jù)存儲(chǔ)電路、傳感器檢測(cè)電路及單片機(jī)系統(tǒng)組成,系統(tǒng)框圖如圖一所示:
圖一:系統(tǒng)框圖 I2C總線驅(qū)動(dòng)程序、CT107D單片機(jī)考試平臺(tái)電路原理圖以及本題所涉及到的芯片數(shù)據(jù)手冊(cè),可參考計(jì)算機(jī)上的電子文檔。原理圖文件、程序流程圖及相關(guān)工程文件請(qǐng)以考生號(hào)命名,并保存在計(jì)算機(jī)上的考生文件夾中(文件夾名為考生準(zhǔn)考證號(hào),文件夾位于Windows桌面上)。 設(shè)計(jì)任務(wù)及要求 1. 過載檢測(cè)與貨物類型識(shí)別 1.1空載、過載檢測(cè) 使用電位器RB2輸出電壓V0模擬壓力變送器輸出,設(shè)備實(shí)時(shí)采集電位器輸出電壓,完成貨物空載,過載檢測(cè)功能。 1.1.1當(dāng)0<V0<1V時(shí),判斷為空載,L1點(diǎn)亮; 1.1.2當(dāng)1<=V0<4V時(shí),判斷為非空載,貨物被填裝到傳送起始位,L2點(diǎn)亮; 1.1.3當(dāng)V0>=4V時(shí),判斷為過載狀態(tài),L3以0.5秒為間隔閃爍提醒,蜂鳴器報(bào)警提示。 說明:空載狀態(tài)下,所有數(shù)碼管熄滅。 1.2 貨物類型判斷 貨物被填裝到傳送起始位置后,系統(tǒng)啟動(dòng)超聲波被測(cè)距功能,完成貨物類型判斷,數(shù)碼管顯示界面如圖2所示: 1.2.1 當(dāng)超聲探頭與貨物之間的距離小于等于30cm時(shí)判斷為I類貨物; 1.2.2 當(dāng)超聲探頭與貨物之間的距離大于30cm時(shí)判斷為II類貨物。 圖2:數(shù)碼管顯示界面1-貨物類型顯示 說明:1:貨物類型顯示格式:I類貨物-數(shù)字1、II類貨物-數(shù)字; 2:A3草稿紙短邊接近30cm,可用于驗(yàn)證測(cè)距結(jié)果。 2. 貨物傳送 在非空載、非過載的前提下,通過按鍵控制繼電器吸合,啟動(dòng)貨物傳送過程,并通過數(shù)碼管實(shí)時(shí)顯示剩余的傳送時(shí)間,倒計(jì)時(shí)結(jié)束后,繼電器自動(dòng)斷開,完成本次傳送過程,數(shù)碼管顯示格式如圖3所示: 圖3:數(shù)碼管顯示界面2-剩余傳送時(shí)間顯示 說明:繼電器吸合時(shí),指示燈L10點(diǎn)亮,斷開時(shí)L10熄滅。 3.按鍵功能描述 3.1 按鍵S4定義為“啟動(dòng)傳送”按鍵,按鍵按下后,啟動(dòng)貨物傳送過程。 說明:按鍵S4在空載、過載、傳送過程中無效。 3.2 按鍵S5定義為“緊急停止”按鍵,按鍵按下后,繼電器立即斷開,指示燈L4以0.5秒為間隔閃爍,剩余傳送時(shí)間計(jì)時(shí)停止。再次按下S5,傳送過程恢復(fù),L4熄滅,恢復(fù)倒計(jì)時(shí)功能,繼電器吸合。知道本次傳送完成。 說明:按鍵S5僅在傳送過程中有效。 3.3 按鍵S6定義為“設(shè)置”按鍵,按下S6按鍵,調(diào)整I類貨物傳送時(shí)間,再次按下S6按鍵,調(diào)整II類貨物傳送時(shí)間,第三次按下S6,保存調(diào)整后的傳送時(shí)間到E2PROM,并關(guān)閉數(shù)碼管顯示。設(shè)置過程中數(shù)碼管顯示界面如圖4所示: 圖4:數(shù)碼管顯示界面3-傳送時(shí)間設(shè)置界面 說明:1:貨物傳送時(shí)間可設(shè)定范圍為1-10秒,通過按鍵S7調(diào)整; 2:“設(shè)置”按鍵S6、“調(diào)整”按鍵S7僅在空載狀態(tài)下有效; 3:通過按鍵S6切換選擇到不同貨物類型的傳送時(shí)間時(shí),顯示該類貨物傳送時(shí)間的數(shù)碼管閃爍。 4.數(shù)據(jù)存儲(chǔ) I、II類型貨物的傳送時(shí)間在設(shè)置完成后需要保存到E2PROM中,設(shè)備重新上電后,能夠恢復(fù)最近一次的傳送時(shí)間配置信息。 5.上電初始化狀態(tài)與工作流程說明 5.1 I類設(shè)備默認(rèn)傳送時(shí)間為2秒,II類設(shè)備為4秒; 5.2 最終作品提交前,將RB2輸出電壓調(diào)整到最小值,確保設(shè)備處于空載狀態(tài);
代碼如下: #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; //定時(shí)刷新超聲波數(shù)據(jù)標(biāo)志位 bit hc_add_flag;
uint led3_add; //定時(shí)刷新led3標(biāo)志位 bit led3_add_flag;
uint sec_add; //秒標(biāo)志位 bit sec_flag;
bit s6_flag;
bit open_sec; //倒計(jì)時(shí)開始標(biāo)志位 uchar sz_flag; //設(shè)置標(biāo)志位
uchar vv; //電壓值 uint ss; //超聲波距離 uchar hw; //貨物類型
char time1,time2; //貨物1貨物2送貨時(shí)間倒計(jì)時(shí) char time11,time22; //送貨時(shí)間
uchar ms_flag; //送貨前顯示模式標(biāo)志位 bit sh_flag; //送貨標(biāo)志位
void display(); //顯示函數(shù) void int_t(); //初始化定時(shí)器
void vv_dat(); //判斷電壓狀態(tài)
void moshi(); //顯示模式1 送貨狀態(tài) 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; //初始化傳送時(shí)間 time22=4;
int_t(); //初始化定時(shí)器 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; //初始化送貨時(shí)間 time2=time22; cls_jdq(); //關(guān)閉繼電器 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(); }
|