飲料自動售賣機設(shè)計含開題及8張CAD圖,飲料,自動,售賣,設(shè)計,開題,cad
程序單
1. 程序1(紙杯選擇控制程序):
按照逆時針B-BC-C-CA-A-AB-B-BC-C通電,每相鄰一拍延時0.2s,最后一拍完成后延時10s
電機順時針轉(zhuǎn)
延 時 10s 鐘
電機逆時針轉(zhuǎn)
靜止并鎖定
P1.2P1.1P1.0置為“010”
保持P1.2P1.1P1.0始終不變
步進電機轉(zhuǎn)回最初位置并鎖定位置
步進電機控制程序
P1.4P1.3=01
P1.4P1.3=11
P1.4P1.3=10
P1.1置為“1”
按照逆時針B-BA-A-AC-C-CB-B-BA-A通電,每相鄰一拍延時0.2s,最后一拍完成后延時10s
P1.5=1?即發(fā)現(xiàn)假幣否?
保持靜止并
鎖定
YES
NO
#include
sbit L0=P1^0; //定義端口,A相;
sbit L1=P1^1;//B相;
sbit L2=P1^2;//C相;
sbit L3=P1^3;
sbit L4=P1^4;
sbit L5= P1^5;
sbit L6=P1^6;
void delay10s(void) //延時10秒子程序
{unsigned char i,j,k;
for(i=019H;i>0;i--)
for(j=085H;j>0;j--)
for(k=0FAH;k>0;k--);
}
void delay02s(void) //延時0.2秒子程序
{unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{while(L5==0)
{if((L4==1)&(L3==1))//選擇1.5元的紙杯
{L1=1; //順時針方向轉(zhuǎn)過15°
L2=1;
L0=0;
Delay02s();}
{L1=0; // 順時針方向轉(zhuǎn)過15°
L2=1;
L0=0;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=0;
L2=0;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{L0=0; // 順時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{L0=0; // 順時針方向轉(zhuǎn)過15°
L1=1;
L2=1;
Delay02s();}
{L0=0; // 繼續(xù)順時針方向轉(zhuǎn)過15°并鎖定等待挖紙杯
L1=0;
L2=1;}
{ L6=1;
Delay02s(); //預留6ms的時間給螺線管挖紙杯
Delay02s();
Delay02s();
L6=0;}
{L1=1; //逆時針方向轉(zhuǎn)過15°
L2=1;
L0=0;
Delay02s();}
{L1=1; //逆時針方向轉(zhuǎn)過15°
L2=0;
L0=0;
Delay02s();}
{L0=1; //逆時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{ L0=1; //逆時針方向轉(zhuǎn)過15°
L1=0;
L2=0;
Delay02s();}
{ L0=1; //逆時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°
L1=1;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°并鎖定
L1=1;
L2=0;}
}
{ Else if((L4==0)&(L3=1))//選擇0.5元的紙杯
{L1=1; //逆時針方向轉(zhuǎn)過15°
L2=0;
L0=1;
Delay02s();}
{L1=0; //逆時針方向轉(zhuǎn)過15°
L2=0;
L0=1;
Delay02s();}
{L0=1; //逆時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°
L1=1;
L2=1;
Delay02s();}
{ L0=0; //逆時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{ L0=1; //逆時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{ L0=1; //逆時針方向轉(zhuǎn)過15°并鎖定等待挖紙杯
L1=0;
L2=0;}
{ L6=1;
Delay02s();//預留6ms的時間給螺線管挖紙杯
Delay02s();
Delay02s();
L6=0;}
{L1=1; //順時針方向轉(zhuǎn)過15°
L2=0;
L0=1;
Delay02s();}
{L1=1; // 順時針方向轉(zhuǎn)過15°
L2=0;
L0=0;
Delay02s();}
{L0=0; // 順時針方向轉(zhuǎn)過15°
L1=1;
L2=1;
Delay02s();}
{L0=0; // 順時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=0;
L2=1;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=0;
L2=0;
Delay02s();}
{L0=1; // 順時針方向轉(zhuǎn)過15°
L1=1;
L2=0;
Delay02s();}
{L0=0; // 繼續(xù)順時針方向轉(zhuǎn)過15°并鎖定
L1=1;
L2=0;}
}
{Else if((L4==1)&(L3=0))//選擇1.0元的紙杯并挖出紙杯
{ L6=1;
Delay02s(); //預留6ms的時間給螺線管挖紙杯
Delay02s();
Delay02s();
L6=0;}
}
{Else() //其他情況下鎖定在B相位置
{L0=0;
L1=1;
L2=0;}
}
2. 程序2(硬幣去留控制程序):
開始
發(fā)現(xiàn)假幣信號否?即P1.0=1?
發(fā)現(xiàn)退幣否?即P1.1=1?
NO
電機正轉(zhuǎn)(逆時針)收取硬幣
電機逆轉(zhuǎn)(順時針)退幣
NO
YES
YES
發(fā)現(xiàn)抽飲料按鈕信號否?即P1.3=1?
等待2分鐘,并不斷檢查抽飲料按鈕信號
NO
YES
;****************************步進電機的驅(qū)動
; DESIGN BY BENLADN911??? FOSC = 12MHz??? 2010.05.10
; ----------------------------------------------------------------
; 步進電機的驅(qū)動信號必須為脈沖信號!!! 轉(zhuǎn)動的速度和脈沖的頻率成正比!
; 本步進電機步進角為 7.5度 . 一圈 360 度 , 需要 48 個脈沖完成!
; A組線圈對應(yīng) P2.4
; B組線圈對應(yīng) P2.5
; C組線圈對應(yīng) P2.6
; D組線圈對應(yīng) P2.7
; 正轉(zhuǎn)次序: AB組--BC組--CD組--DA組 (即一個脈沖,正轉(zhuǎn) 7.5 度)
;硬幣識別裝置發(fā)現(xiàn)假幣則發(fā)出“0”信號
; -------------------------------------------------------------------
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: ORL P2,#30H ;為控制做準備
ANL P1,#03H ;為檢查控制條件做準備
MOV A,P1
JB ACC.1,LOOP4 ;如果發(fā)現(xiàn)假幣則自動退幣,否則等待抽飲料按鈕信號
SJMP LOOP3 ;如果P1.0=0則跳到LOOP3等待
JB ACC.0,LOOP4 ;如果發(fā)現(xiàn)退幣信號則退幣
;---------------------------正轉(zhuǎn)(逆時針)收取硬幣---------------------
LOOP1: MOV R3,#48?? ;正轉(zhuǎn) 1圈共48 脈沖
START:
MOV R0,#00H
START1:
MOV P2,#00H
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ START?? ;對 A 的判斷,當 A = 0 時則轉(zhuǎn)到 START
MOV P2,A
LCALL DELAY
INC R0
DJNZ R3,START1
MOV P2,#00H
LCALL DELAY1
LJMP MAIN
;--------------------------反轉(zhuǎn)(順時針)退幣------------------------
LOOP3: JB ACC.2,LOOP1 ; 2分鐘內(nèi)等到抽飲料按鈕信號則收取硬幣,否則退幣
JNB ACC.0,LOOP3 ;如果P1.0=0則跳到LOOP3繼續(xù)檢查
SJMP LOOP4
LOOP2: LCALL DELAY2 ; 等待延時2分鐘
LOOP4: MOV R3,#48??; 反轉(zhuǎn)一圈共 48個脈沖
START2:
MOV P2,#00H
MOV R0,#05
START3:
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ START2
MOV P2,A
LCALL DELAY
INC R0
DJNZ R3,START3
MOV P2,#00H
LCALL DELAY1
LJMP MAIN
DELAY: MOV R7,#40 ;步進電機的轉(zhuǎn)速
M3: MOV R6,#248
DJNZ R6,$
DJNZ R7,M3
RET
DELAY1:?MOV?? R4,#20??? ;2S 延時子程序
DEL2:?MOV?? R3,#200
DEL3:?MOV?? R2,#250
????????????DJNZ? R2,$
????????????DJNZ? R3,DEL3
????????????DJNZ? R4,DEL2
????????????RET
DELAY2: ;誤差 0us,2min延時子程序
MOV R6,#0F0H
DL0: MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,DL0
NOP
RET
TABLE:
DB 30H,60H,0C0H,90H? ;正轉(zhuǎn)表
DB 00? ;正轉(zhuǎn)結(jié)束
DB 30H,90H,0C0H,60H? ;反轉(zhuǎn)表
DB 00? ;反轉(zhuǎn)結(jié)束
END
3. 程序3(飲料抽取量控制程序):
準備開始
發(fā)現(xiàn)出飲料信號否,即P1.6=1?
發(fā)現(xiàn)假幣否?
沒發(fā)現(xiàn)抽飲料信號?即P1.7=0?
檢測硬幣投入量的多少,即檢查P1.4P1.3=??
按硬幣投入量控制電機開啟時間,并根據(jù)飲料桶中信號的反饋隨時等待使電機停轉(zhuǎn)!
開啟電機,即使P1.5=1
維持電機停轉(zhuǎn)
維持電機停轉(zhuǎn)
使電機停轉(zhuǎn)
YES
NO
YES
NO
NO
YES
開始檢測硬幣量
僅檢測到0.5元硬幣信號,即P1.4P1.3=01
僅檢測到1.5元硬幣信號,即P1.4P1.3=11
僅檢測到1.0元硬幣信號,即P1.4P1.3=10
100ml銅電極通電否,即P1.0=1?
300ml銅電極通電否,即P1.2=1?
200ml銅電極通電否,即P1.1=1?
開啟電機,即使得P1.5=1并維持狀態(tài)
使電機停轉(zhuǎn)并維持,即使得P1.5-0維持
等待下次交易
YES
YES
YES
NO
NO
NO
#include <80C31.H>
sbit L0=P1^0; //定義端口
sbit L1=P1^1;
sbit L2=P1^2;
sbit L3=P1^3;
sbit L4=P1^4;
sbit L5=P1^5;
sbit L6=P1^6;
sbit L7=P1^7;
void delay1s(void) //延時1.0秒子程序
{unsigned char i,j,k;
for(i=50;i>0;i--)
for(j=40;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{ sbit L5=1;//初始化,確保電機在停轉(zhuǎn)狀態(tài)
{while (L7==0 ) //如果L7=0維持電機停轉(zhuǎn)狀態(tài)
{L5=1;}
}
{ while (L6==0 )
{ while (L7==1 )
{ while (L0==0) //檢查容器中液位到了50ml否
{ if(L4==0&L3==1)
{ L5=0; //開啟電機并延時1.0s
Delay1s();
L5=1; }
}
}
{ while (L1==0 ) //檢查容器中液位到了100ml否
{ if (L4==1&L3==0 )
{ L5=0;//開啟電機并延時2.0s
Delay1s();
Delay1s();
L5=1; }
}
}
{ while (L2==0 ) //檢查容器中液位到了150ml否
{ if (L4==1&L3==1 )
{ L5=0; //開啟電機并延時3.0s
Delay1s();
Delay1s();
Delay1s();
L5=1; }
}
}
L5=1; //如果檢查到假幣信號或者沒有按下抽飲料按鈕的信號就保持電機停轉(zhuǎn)狀態(tài)
}
L5=1; //如果檢查到出飲料按鈕信號就馬上停止電機
}
4. 單片機組優(yōu)化后的電路、控制流程圖及其程序設(shè)計
思路分析:硬幣檢測裝置在檢測到假幣的時候發(fā)出“1”信號,檢測到0.5元硬幣的時候發(fā)出“1”信號并傳送到P1.3端口,檢測到1.0元或兩枚0.5元硬幣的時候發(fā)出“1”信號并傳送到P1.4端口。如上面電路所示,硬幣真假識別信號經(jīng)非門負變之后與抽飲料按鈕信號相與,如果硬幣識別裝置沒檢測到假幣,而消費者并不按下抽飲料按鈕,收取硬幣的電機和抽飲料的電機并不動作,而是保持原狀態(tài)并等待2分鐘,若沒等到抽飲料按鈕信號則自動退幣,否則兩電機都動作實現(xiàn)收取硬幣和抽飲料的目的。在電路中我們還看到硬幣真假識別信號與退幣按鈕信號相或,只要消費者按下退幣按鈕或者硬幣檢測裝置檢測到假幣就馬上退幣。上面電路中我們另一個至關(guān)重要的是出飲料按鈕電路。我們該怎么讓出飲料按鈕信號對單片機起控制作用呢?投機取巧的消費者可能會因為偶然機會發(fā)現(xiàn)邊抽飲料邊出飲料會得到多一點。為了防止這種投機取巧的行為,我們可以將出飲料按鈕信號電路經(jīng)非門負變之后與抽飲料按鈕信號和硬幣真假信號相與再連接到P1.0端口或者直接把出飲料按鈕信號連接到P1.2口,我們選擇的是后者,如此一來一旦消費者按下出飲料按鈕信號售貨機便停止抽飲料。上面電路中我們沒有畫出螺線管的連接電路,我們將其驅(qū)動電路連接在P0.0口。具體的程序及其流程圖如下面所示。
準備開始
發(fā)現(xiàn)假幣否
初始化各電機,使各電機都保持停轉(zhuǎn)狀態(tài)
檢測硬幣的總投入量
發(fā)現(xiàn)退幣信號否
發(fā)現(xiàn)抽飲料信號否
開啟收硬幣電機收取硬幣和抽飲料電機抽取飲料
NO
NO, 等待2分鐘
YES
開啟電機退幣
YES
YES
NO
檢查出飲料信號,按下了否?
開啟收硬幣電機收取硬幣和抽飲料電機抽取飲料
繼續(xù)抽飲料,直到結(jié)束并停止電機
中斷抽飲料電機
等待下次交易
YES
NO
開始檢測硬幣量
僅檢測到0.5元硬幣信號,即P1.4P1.3=01
僅檢測到1.5元硬幣信號,即P1.4P1.3=11
僅檢測到1.0元硬幣信號,即P1.4P1.3=10
100ml銅電極通電否,即P1.7=1?
300ml銅電極通電否,即P1.5=1?
200ml銅電極通電否,即P1.6=1?
開啟電機,即使得P3.7=1并維持狀態(tài)
使電機停轉(zhuǎn)并維持,即使得P3.7=0維持
等待下次交易
YES
YES
YES
NO
NO
NO
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: ANL P3,#23H ;初始化電機狀態(tài),使兩電機保持停轉(zhuǎn)和鎖定狀態(tài)
ANL P1,#FFH ;為檢測外部輸入的控制信號做準備
MOV A,P1
JB ACC.1,LOOP2 ;如果發(fā)現(xiàn)假幣或退幣信號則自動退幣,否則等抽飲料按鈕信號
JNB ACC.0,LOOP0 ;如果P1.0=0則跳到LOOP0等待2分鐘
JB ACC.3,AP2 ;P1.3=1 跳轉(zhuǎn)到AP2
JNB ACC.4,LOOP11 ;P1.4=1,P1.3=0則跳轉(zhuǎn)LOOP11挖1元相應(yīng)紙杯
AP2: JB ACC.4,LOOP6 ;P1.4=1則跳轉(zhuǎn)到LOOP6出售1.5元相應(yīng)紙杯
SJMP LOOP4 ;P1.4P1.3=01則跳轉(zhuǎn)LOOP4出售0.5元相應(yīng)紙杯
;-------------------------硬幣去留電機正轉(zhuǎn)(逆時針)收取硬幣---------------------
LOOP1: MOV R3,#48?? ;正轉(zhuǎn) 1圈共48 脈沖
START:
MOV R0,#00H
START1:
MOV P3#00H
MOV A,R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
JZ START?? ;對 A 的判斷,當 A = 0 時則轉(zhuǎn)到 START
MOV P3,A
LCALL DELAY
INC R0
DJNZ R3,START1
MOV P3,#00H
LCALL DELAY1
SJMP AP1
;---------------硬幣去留電機反轉(zhuǎn)(順時針)退幣------------------------
LOOP0: LCALL DELAY2 ;延時等待2分鐘
LOOP2: JB ACC.0,LOOP1 ;2分鐘內(nèi)等到抽飲料按鈕信號則收取硬幣,否則退幣
MOV R3,#48?? ;反轉(zhuǎn)一圈共 48個脈沖
START2:
MOV P3,#00H
MOV R0,#05
START3:
MOV A,R0
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
JZ START2
MOV P3,A
CALL DELAY
INC R0
DJNZ R3,START3
MOV P3,#00H
LCALL DELAY1
SJMP MAIN
;---------------紙杯電機正轉(zhuǎn)(逆時針)出售0.5元對應(yīng)的紙杯---------------------
LOOP4: MOV R3,#8 ;正轉(zhuǎn) 1/3圈共8 脈沖
START4:
MOV R0,#00H
START5:
MOV P3,#00H
MOV A,R0
MOV DPTR,#TABLE2 ,查表程序
MOVC A,@A+DPTR
JZ START4 ;對 A 的判斷,當 A = 0 時則轉(zhuǎn)到 START
MOV P3,A
LCALL DELAY
INC R0
DJNZ R3,START5
MOV P3,#20H
LCALL DELAY1
;------------------------------挖出0.5元紙杯------------------------------
Loop13: ORL P0,#80H ;使P0.0=1,其他位不變
LCALL DELAY3
ANL P0,7FH ;使P0.0=0,其他位不變
;-------------------------紙杯電機反轉(zhuǎn)復位鎖定--------------------------------
LOOP5: MOV R3,#8 ;反轉(zhuǎn)1/3圈共 8個脈沖
START6:
MOV P3,#00H
MOV R0,#07H
START7:
MOV A,R0
MOV DPTR,#TABLE2 ;查表程序
MOVC A,@A+DPTR
JZ START6
MOV P3,A
LCALL DELAY
INC R0
DJNZ R3,START7
MOV P3,#20H ;返回到原始位置鎖定電機
LCALL DELAY1
SJMP LOOP8 ;紙杯銷售完后馬上抽200ml飲料
;----------------------紙杯電機反轉(zhuǎn)銷售1.5元相應(yīng)的紙杯-----------------------
LOOP6: MOV R3,#8 ;反轉(zhuǎn)1/3圈共 8個脈沖
START8:
MOV P3,#00H
MOV R0,#07H
START9:
MOV A,R0
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
JZ START8
MOV P3,A
LCALL DELAY
INC R0
DJNZ R3,START9
MOV P3,#20H
LCALL DELAY1
;------------------------------挖出1.5元紙杯------------------------------
LOOP12: ORL P0,#80H ;使P0.0=1,其他位不變進行挖紙杯動作
LCALL DELAY3
ANL P0,7FH ;使P0.0=0,其他位不變
;---------------紙杯電機正轉(zhuǎn)(逆時針)復位鎖定------------------------------
LOOP14: MOV R3,#8 ;正轉(zhuǎn) 1/3圈共8 脈沖
START10:
MOV R0,#00H
START11:
MOV P3,#00H
MOV A,R0
MOV DPTR,#TABLE2
MOVC A,@A+DPTR
JZ START10 ;對 A 的判斷,當 A = 0 時則轉(zhuǎn)到 START10
MOV P3,A
LCALL DELAY
INC R0
DJNZ R3,START11
MOV P3,#20H
LCALL DELAY1
SJMP LOOP9 ;紙杯銷售完后馬上抽300ml飲料
;------------------------------挖出1.0元紙杯------------------------------
LOOP11: ORL P0,#80H ;使P0.0=1,其他位不變
LCALL DELAY3
ANL P0,7FH ;使P0.0=0,其他位不變
SJMP LOOP10 ;紙杯銷售完后馬上抽200ml飲料
;--------------------------------抽飲料------------------------------------
LOOP8: ORL P3,80H ;抽100ml飲料
JB ACC.2,TZ
JB ACC.6,MAIN ;檢查容器中液位達到100ml否
LCALL DELAY3 ;延時0.5S
SJMP FW ;抽完飲料就等待下次交易
LOOP9: ORL P3,80H ;抽300ml飲料
JB ACC.2,TZ
JB ACC.4,MAIN ;檢查飲料桶中液位達到300ml否
LCALL DELAY3 ;延時1.5S
LCALL DELAY3
LCALL DELAY3
SJMP FW ;抽完飲料就等待下次交易
LOOP10: ORL P3,80H ;抽200ml飲料
JB ACC.2,TZ
JB ACC.5,MAIN ;檢查飲料桶中液位達到200ml否
LCALL DELAY3 ;延時1s
LCALL DELAY3
SJMP FW ;抽完飲料就等待下次交易
TZ: ANL P3,7FH ;檢測到出飲料按鈕信號則使電機停轉(zhuǎn)
FW: ANL P3,#23H ;使兩步進電機在原始位置維持鎖定狀態(tài)
ANL P1,00H ;使控制信號口都置零,等待下次交易
SJMP MAIN ;循環(huán)檢查
;--------------------------一些延時子程序-------------------------------------
DELAY: MOV R7,#40 ;步進電機的轉(zhuǎn)速
M3: MOV R6,#248
DJNZ R6,$
DJNZ R7,M3
RET
DELAY1:? MOV?? R4,#20??? ;2S 延時子程序
DEL2: MOV?? R3,#200
DEL3:?MOV?? R2,#250
??????DJNZ? R2,$
??????DJNZ? R3,DEL3
??????DJNZ? R4,DEL2
??????RET
DELAY2: ;誤差 0us,2min延時子程序
MOV R6,#0F0H
DL0: MOV R5,#0F8H
DJNZ R5,$
DJNZ R6,DL0
NOP
RET
DELAY3: ;誤差 0us,0.5s延時子程序
MOV R6,#47H
DL1:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
RET
TABLE1:
DB 03H,06H,0CH,09H? ;硬幣控制電機正轉(zhuǎn)表
DB 00? ;正轉(zhuǎn)結(jié)束
DB 03H,09H,0CH,06H? ;硬幣控制電機反轉(zhuǎn)表
DB 00 ;反轉(zhuǎn)結(jié)束
TABLE2:
DB 20H,30H,10H,50H,40H,60H ;紙杯電機正轉(zhuǎn)表
DB 00 ;正轉(zhuǎn)結(jié)束
DB 20H,60H,40H,50H,10H,30H ;紙杯電機反轉(zhuǎn)表
DB 00 ;反轉(zhuǎn)結(jié)束
END
27