“智能物料傳送系統”設計任務書
選用材料為藍橋杯官方提供的開發板。
因為此板選用了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(); }
|