|
本帖最后由 51黑mcu 于 2016-6-3 19:56 編輯
51單片機(jī)制作的全自動(dòng)洗衣機(jī)全部資料。
0.png (22.77 KB, 下載次數(shù): 120)
下載附件
2016-6-3 19:53 上傳
單片機(jī)全自動(dòng)洗衣機(jī)仿真圖
單片機(jī)全自動(dòng)洗衣機(jī)程序:
- #include<reg51.h> //定義頭文件
- #define uint unsigned int //定義字符uint
- #define uchar unsigned char //定義字符uchar
- #define TIME0H 0xff //定時(shí)器0計(jì)數(shù)器高位
- #define TIME0L 0x9c //定時(shí)器0計(jì)數(shù)器低位
- #define TIME1H 0x3c //定時(shí)器1計(jì)數(shù)器高位
- #define TIME1L 0xb0 //定時(shí)器1計(jì)數(shù)器低位
- #define MOTOR_COUNT 100 //PWM波輸出周期計(jì)數(shù)
-
- #define sol 0x6c //將"so"宏定義為低音"5"的頻率 784Hz
- #define Dol 0x44 //將"Do"宏定義為中音"1"的頻率 523Hz
- #define Rel 0xac //將"Re"宏定義為中音"2"的頻率 587Hz
- #define Mil 0x09 //將"Mi"宏定義為中音"3"的頻率 659Hz
- #define Fal 0x34 //將"Fa"宏定義為中音"4"的頻率 698Hz
- #define Sol 0x82 //將"So"宏定義為中音"5"的頻率 784Hz
- #define Lal 0xc8 //將"La"宏定義為中音"6"的頻率 880Hz
- #define Sil 0x05 //將"Si"宏定義為中音"7"的頻率 523H
- #define soh 0xfc //將"so"宏定義為低音"5"的頻率 784Hz
- #define Doh 0xfc //將"Do"宏定義為中音"1"的頻率 523Hz
- #define Reh 0xfc //將"Re"宏定義為中音"2"的頻率 587Hz
- #define Mih 0xfd //將"Mi"宏定義為中音"3"的頻率 659Hz
- #define Fah 0xfd //將"Fa"宏定義為中音"4"的頻率 698Hz
- #define Soh 0xfd //將"So"宏定義為中音"5"的頻率 784Hz
- #define Lah 0xfd //將"La"宏定義為中音"6"的頻率 880Hz
- #define Sih 0xfe //將"Si"宏定義為中音"7"的頻率 523H
- //定義宏變量
- sbit speaker =P2^6; //蜂鳴器控制引腳
- sbit RS=P1^5; //LCD RS引腳
- sbit R_W=P1^6; //LCD 讀寫信號(hào)
- sbit EN=P1^7; //LCD 使能引腳
- sbit motor_high=P1^0; //PWM輸出高電平引腳
- sbit motor_low=P1^1; //PWM輸出低電平引腳
- sbit motor_1_en=P1^2; //進(jìn)水閥門引腳
- sbit motor_2_en=P1^3; //出水閥門引腳
- sbit motor_3_en=P1^4; //洗衣機(jī)電動(dòng)使能引腳
- sbit EOC=P2^4; //AD EOC
- sbit START=P2^5; //AD START
- sbit con=P3^5; //AD CON
- sbit add_A=P3^0; //位選信號(hào)A
- sbit lock_OE=P3^1; //74ls373鎖存控制引腳
- //定義全局變量
- uchar process; //當(dāng)前洗衣機(jī)運(yùn)行狀態(tài)全局變量
- uchar method; //當(dāng)前洗衣機(jī)運(yùn)行方式全局變量
- uchar speed; //當(dāng)前電動(dòng)機(jī)速度全局變量
- uchar flag; //標(biāo)志位
- uchar state; //洗衣機(jī)運(yùn)行狀態(tài)選擇
- uint ad_level; //水位采樣全局變量
- uint ad_voltage; //電壓采樣全局變量
- uint time_count; //定時(shí)器0中斷次數(shù)全局變量
- uint time_count1; //定時(shí)器1中斷次數(shù)全局變量
- uint MOTOR_ON,MOTOR_NOW; //電動(dòng)機(jī)pwm控制計(jì)數(shù),高電平脈沖數(shù)和當(dāng)前脈沖數(shù)
- uchar st_pau; //當(dāng)前洗衣機(jī)運(yùn)行全局變量
- uchar step; //當(dāng)前洗衣機(jī)運(yùn)行步驟全局變量
- uint Cl=0; //
- uint Ch=0; //
- uchar close=0;
- //聲明子函數(shù)
- void init_LCM(); //lcd初始化函數(shù)
- void clearLCD(); //lcd清屏函數(shù)
- void write_data(char date); //lcd寫數(shù)據(jù)函數(shù)
- void write_com(char command); //lcd寫指令函數(shù)
- void display()reentrant; //lcd顯示函數(shù)
- void check_BF(); //lcd檢查忙碌函數(shù)
- void fangshi1(); //洗衣機(jī)運(yùn)行方式1
- void fangshi2(); //洗衣機(jī)運(yùn)行方式2
- void fangshi3(); //洗衣機(jī)運(yùn)行方式3
- void fangshi4(); //洗衣機(jī)運(yùn)行方式4
- void translate(int keycode); //按鍵值釋放函數(shù)
- void clrpara(); //復(fù)位所有參數(shù)
- void speaker_on(); //蜂鳴器
- void delay(); //80ms延時(shí)程序
-
- unsigned char f_TAB[][2]={ /**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},//, //音調(diào)
- /**/{Sol,Soh},{Lal,Lah},{Sol,Soh},{Fal,Fah},{Mil,Mih},{Dol,Doh},/**/{Dol,Doh},{sol,soh},{Dol,Doh},
- /**/{Dol,Doh},{sol,soh},{Dol,Doh},/**/{0xff,0xff}};
- uchar time_TAB[]={3,1,3,1,4,4,/**/3,1,3,1,4,4,/**/4,4,4,8,/**/4,4,4,8}; //節(jié)拍
-
- /*****************************80ms延時(shí)*****************************/
- void delay()
- {
- uchar i,j; //定義變量i,j
- for(i=0;i<100;i++) //外循環(huán)
- for(j=0;j<250;j++); //內(nèi)循環(huán)
- }
- /***************************按鍵信息翻譯***************************/
- void translate(int keycode)
- {
- int key; //定義臨時(shí)變量key,用來判斷(開始/暫停)按鍵次數(shù)
- switch(keycode) //根據(jù)不同傳入的keycode值,進(jìn)行全局變量賦值
- {
- case 0: //方式一
- method = '1'; //將方式全局變量賦值為‘1’
- //return '0'; //返回‘0’結(jié)果
- break; //跳出分支判斷
- case 1: //方式三
- method = '3'; //將方式全局變量賦值為‘3’
- //return '1'; //返回‘1’結(jié)果
- break; //跳出分支判斷
- case 2: //速度1/4
- speed = '1'; //賦值速度全局變量為1
- MOTOR_ON = 25; //設(shè)置PWM占空比為25/100
- //return '2'; //返回‘2’結(jié)果
- break; //跳出分支判斷
- case 3: //速度3/4
- speed = '3'; //賦值速度全局變量為3
- MOTOR_ON = 75; //設(shè)置PWM占空比為75/100
- //return '3'; //返回‘3’結(jié)果
- break; //跳出分支判斷
- case 4: //方式二
- method = '2'; //將方式全局變量賦值為‘2’
- //return '4'; //返回‘4’結(jié)果
- break; //跳出分支判斷
- case 5: //方式四
- method = '4'; //將方式全局變量賦值為‘4’
- //return '5'; //返回‘5’結(jié)果
- break; //跳出分支判斷
- case 6: //速度2/4
- speed = '2'; //賦值速度全局變量為2
- MOTOR_ON = 50; //設(shè)置PWM占空比為50/100
- //return '6'; //返回‘6’結(jié)果
- break; //跳出分支判斷
- case 7: //速度4/4
- speed = '4'; //賦值速度全局變量為4
- MOTOR_ON = 100; //設(shè)置PWM占空比為100/100
- //return '7'; //返回‘7’結(jié)果
- break; //跳出分支判斷
- case 8: //ON
- state =1; //賦值洗衣機(jī)運(yùn)行狀態(tài)選擇1
- //return '8'; //返回‘8’結(jié)果
- break; //跳出分支判斷
- case 9: //OFF
- state = 0; //賦值洗衣機(jī)運(yùn)行狀態(tài)選擇0
- //return '9'; //返回‘9’結(jié)果
- break; //跳出分支判斷
- case 10: //START/PAUSE
- {
- if(key==0) //判斷開始/暫停鍵是否按下,是繼續(xù)
- {
- st_pau=1; //賦值洗衣機(jī)運(yùn)行全局變量為1
- key++; //key自加1
- }
- else
- {
- st_pau=2; //當(dāng)前洗衣機(jī)運(yùn)行全局變量為2
- key--; //key自減1
- }
- //return 'A'; //返回‘A’結(jié)果
- break; //跳出分支判斷
- }
- }
- }
- /*****************************LCD顯示******************************/
- void display()reentrant
- {
- int level_1,level_2,level_3,voltage_1,voltage_2,voltage_3;
- //定義水位、電壓顯示百位、十位、各位。由于顯示直接采用返回AD轉(zhuǎn)換值,所以需要按照百、十、個(gè)位進(jìn)行顯示
- clearLCD(); //LCD清屏
- //process: 1浸泡,2脫水,3洗滌,4進(jìn)水,5漂洗,
- //method:1方式一,2方式二,3方式三,4方式四
- //speed:1速度1/4,2速度2/4,3速度3/4,4速度4/4
- level_1 = ad_level / 100 + 48; //獲得水位檢測(cè)百位,同時(shí)轉(zhuǎn)化為ASCII碼
- level_2 = (ad_level %100 ) /10 + 48; //獲得水位檢測(cè)值十位,同時(shí)轉(zhuǎn)化為ASCII碼
- level_3 = (ad_level %10 ) + 48; //獲得水位檢測(cè)值個(gè)位,同時(shí)轉(zhuǎn)化為ASCII碼
- voltage_1 = ad_voltage / 100 + 48; //獲得電壓轉(zhuǎn)換值百位,轉(zhuǎn)化為ASCII碼
- voltage_2 = (ad_voltage %100 ) /10 + 48; //獲得電壓轉(zhuǎn)換值十位,轉(zhuǎn)化為ASCII碼
- voltage_3 = (ad_voltage %10 ) + 48; //獲得電壓轉(zhuǎn)換值個(gè)位,轉(zhuǎn)化為ASCII碼
- if (state == 1) //如果洗衣機(jī)當(dāng)前運(yùn)行狀態(tài)為on開啟狀態(tài)
- {
- switch(process) //根據(jù)不同的運(yùn)行狀態(tài),在LCD第一行顯示運(yùn)行狀態(tài)信息
- {
- case '1': //進(jìn)水
- write_data('J'); //顯示字符‘J’
- write_data('I'); //顯示字符‘I’
- write_data('N'); //顯示字符‘N’
- write_data('S'); //顯示字符‘S’
- write_data('H'); //顯示字符‘H’
- write_data('U'); //顯示字符‘U’
- write_data('I'); //顯示字符‘I’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('L'); //顯示字符‘L’
- write_data(level_1); //顯示水位檢測(cè)百位值
- write_data(level_2); //顯示水位檢測(cè)十位值
- write_data(level_3); //顯示水位檢測(cè)個(gè)位值
- write_data(' '); //顯示空字符
- write_data('V'); //顯示字符‘V’
- write_data(voltage_1); //顯示電壓檢測(cè)百位值
- write_data(voltage_2); //顯示電壓檢測(cè)十位值
- write_data(voltage_3); //顯示電壓檢測(cè)個(gè)位值
- motor_1_en = 1; //進(jìn)水閥電動(dòng)機(jī)驅(qū)動(dòng)打開
- motor_2_en = 0; //排水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_3_en = 0; //洗衣機(jī)電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- break; //跳出分支判斷
- case '2': //浸泡
- write_data('J'); //顯示字符‘J’
- write_data('I'); //顯示字符‘I’
- write_data('N'); //顯示字符‘N’
- write_data('P'); //顯示字符‘P’
- write_data('A'); //顯示字符‘A’
- write_data('O'); //顯示字符‘O’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('L'); //顯示字符‘L’
- write_data(level_1); //顯示水位檢測(cè)百位值
- write_data(level_2); //顯示水位檢測(cè)十位值
- write_data(level_3); //顯示水位檢測(cè)個(gè)位值
- write_data(' '); //顯示空字符
- write_data('V'); //顯示字符‘V’
- write_data(voltage_1); //顯示電壓檢測(cè)百位值
- write_data(voltage_2); //顯示電壓檢測(cè)十位值
- write_data(voltage_3); //顯示電壓檢測(cè)個(gè)位值
- motor_1_en = 0; //進(jìn)水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_2_en = 0; //排水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_3_en = 0; //洗衣機(jī)電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- break; //跳出分支判斷
- case '3': //洗滌
- write_data('X'); //顯示字符‘X’
- write_data('I'); //顯示字符‘I’
- write_data('D'); //顯示字符‘D’
- write_data('I'); //顯示字符‘I’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('L'); //顯示字符‘’
- write_data(level_1); //顯示水位檢測(cè)百位值
- write_data(level_2); //顯示水位檢測(cè)十位值
- write_data(level_3); //顯示水位檢測(cè)個(gè)位值
- write_data(' '); //顯示空字符
- write_data('V'); //顯示字符‘V’
- write_data(voltage_1); //顯示電壓檢測(cè)百位值
- write_data(voltage_2); //顯示電壓檢測(cè)十位值
- write_data(voltage_3); //顯示電壓檢測(cè)個(gè)位值
- motor_3_en = 1; //洗衣機(jī)電動(dòng)機(jī)驅(qū)動(dòng)打開
- motor_1_en = 0; //進(jìn)水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_2_en = 0; //排水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- break; //跳出分支判斷
- case '4': //漂洗
- write_data('P'); //顯示字符‘P’
- write_data('I'); //顯示字符‘I’
- write_data('A'); //顯示字符‘A’
- write_data('O'); //顯示字符‘O’
- write_data('X'); //顯示字符‘X’
- write_data('I'); //顯示字符‘I’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('L'); //顯示字符‘L’
- write_data(level_1); //顯示水位檢測(cè)百位值
- write_data(level_2); //顯示水位檢測(cè)十位值
- write_data(level_3); //顯示水位檢測(cè)個(gè)位值
- write_data(' '); //顯示空字符
- write_data('V'); //顯示字符‘V’
- write_data(voltage_1); //顯示電壓檢測(cè)百位值
- write_data(voltage_2); //顯示電壓檢測(cè)十位值
- write_data(voltage_3); //顯示電壓檢測(cè)個(gè)位值
- motor_3_en = 1; //洗衣機(jī)電動(dòng)機(jī)驅(qū)動(dòng)打開
- motor_1_en = 0; //進(jìn)水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_2_en = 0; //排水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- break; //跳出分支判斷
- case '5': //脫水
- write_data('T'); //顯示字符‘T’
- write_data('U'); //顯示字符‘U’
- write_data('O'); //顯示字符‘O’
- write_data('S'); //顯示字符‘S’
- write_data('H'); //顯示字符‘H’
- write_data('U'); //顯示字符‘U’
- write_data('I'); //顯示字符‘I’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('L'); //顯示字符‘L’
- write_data(level_1); //顯示水位檢測(cè)百位值
- write_data(level_2); //顯示水位檢測(cè)十位值
- write_data(level_3); //顯示水位檢測(cè)個(gè)位值
- write_data(' '); //顯示空字符
- write_data('V'); //顯示字符‘V’
- write_data(voltage_1); //顯示電壓檢測(cè)百位值
- write_data(voltage_2); //顯示電壓檢測(cè)十位值
- write_data(voltage_3); //顯示電壓檢測(cè)個(gè)位值
- motor_1_en = 0; //進(jìn)水閥電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- motor_2_en = 1; //排水閥電動(dòng)機(jī)驅(qū)動(dòng)打開
- motor_3_en = 0; //洗衣機(jī)電動(dòng)機(jī)驅(qū)動(dòng)關(guān)閉
- break; //跳出分支判斷
- }
- if(st_pau==2) //當(dāng)前洗衣機(jī)運(yùn)行全局變量為2
- {
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- write_data('P'); //顯示字符‘P’
- write_data('A'); //顯示字符‘A’
- write_data('U'); //顯示字符‘U’
- write_data('S'); //顯示字符‘S’
- write_data('E'); //顯示字符‘E’
- }
- else
- {
- switch(method) //判斷方式全局變量
- {
- case '1': //方式一
- write_data('M'); //顯示字符‘M’
- write_data('E'); //顯示字符‘E’
- write_data('T'); //顯示字符‘T’
- write_data('H'); //顯示字符‘H’
- write_data('O'); //顯示字符‘O’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('1'); //顯示字符‘1’
- write_data(' '); //顯示空字符
- break; //跳出分支判斷
- case '2': //方式二
- write_data('M'); //顯示字符‘M’
- write_data('E'); //顯示字符‘E’
- write_data('T'); //顯示字符‘T’
- write_data('H'); //顯示字符‘H’
- write_data('O'); //顯示字符‘O’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('2'); //顯示字符‘2’
- write_data(' '); //顯示空字符
- break; //跳出分支判斷
- case '3': //方式三
- write_data('M'); //顯示字符‘M’
- write_data('E'); //顯示字符‘E’
- write_data('T'); //顯示字符‘T’
- write_data('H'); //顯示字符‘H’
- write_data('O'); //顯示字符‘O’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('3'); //顯示字符‘3’
- write_data(' '); //顯示空字符
- break; //跳出分支判斷
- case '4': //方式四
- write_data('M'); //顯示字符‘M’
- write_data('E'); //顯示字符‘E’
- write_data('T'); //顯示字符‘T’
- write_data('H'); //顯示字符‘H’
- write_data('O'); //顯示字符‘O’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('4'); //顯示字符‘4’
- write_data(' '); //顯示空字符
- break; //跳出分支判斷
- }
- switch(speed) //判斷速度全局變量
- {
- case '1': //速度一
- write_data('S'); //顯示字符‘S’
- write_data('P'); //顯示字符‘P’
- write_data('E'); //顯示字符‘E’
- write_data('E'); //顯示字符‘E’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('1'); //顯示字符‘1’
- break; //跳出分支判斷
- case '2': //速度二
- write_data('S'); //顯示字符‘S’
- write_data('P'); //顯示字符‘P’
- write_data('E'); //顯示字符‘E’
- write_data('E'); //顯示字符‘E’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('2'); //顯示字符‘2’
- break; //跳出分支判斷
- case '3': //速度三
- write_data('S'); //顯示字符‘S’
- write_data('P'); //顯示字符‘P’
- write_data('E'); //顯示字符‘E’
- write_data('E'); //顯示字符‘E’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('3'); //顯示字符‘3’
- break; //跳出分支判斷
- case '4': //速度四
- write_data('S'); //顯示字符‘S’
- write_data('P'); //顯示字符‘P’
- write_data('E'); //顯示字符‘E’
- write_data('E'); //顯示字符‘E’
- write_data('D'); //顯示字符‘D’
- write_data(':'); //顯示字符‘:’
- write_data('4'); //顯示字符‘4’
- break; //跳出分支判斷
- }
- }
- }
- else
- {
- write_data('N'); //顯示字符‘N’
- write_data('O'); //顯示字符‘O’
- write_data('W'); //顯示字符‘W’
- write_data(' '); //顯示空字符
- write_data('M'); //顯示字符‘M’
- write_data('A'); //顯示字符‘A’
- write_data('C'); //顯示字符‘C’
- write_data('H'); //顯示字符‘H’
- write_data('I'); //顯示字符‘I’
- write_data('N'); //顯示字符‘N’
- write_data('E'); //顯示字符‘E’
- write_data(' '); //顯示空字符
- write_data('I'); //顯示字符‘I’
- write_data('S'); //顯示字符‘S’
- write_data(' '); //顯示空字符
- write_data('O'); //顯示字符‘O’
- write_data('F'); //顯示字符‘F’
- write_data('F'); //顯示字符‘F’
- write_data(' '); //顯示空字符
- write_data(' '); //顯示空字符
- }
- //P0 = 0XFF;
- }
- /****************************LCD初始化*****************************/
- void init_LCM()
- {
- write_com(0x30); //發(fā)送控制命令0x30
- write_com(0x30); //發(fā)送控制命令0x30
- write_com(0x30); //發(fā)送控制命令0x30,做一個(gè)延時(shí)
- write_com(0x38); //發(fā)送控制命令0x38
- write_com(0x08); //發(fā)送控制命令0x08
- write_com(0x01); //發(fā)送控制命令0x01
- write_com(0x06); //發(fā)送控制命令0x06
- write_com(0x0e); //發(fā)送控制命令0x0e
- }
- /***************************LCD寫數(shù)據(jù)函數(shù)**************************/
- void write_data(char date)
- {
- RS=1; //寫指令電平置為高,進(jìn)入寫數(shù)據(jù)狀態(tài)
- R_W=0; //讀指令電平置為低,無效
- EN=1; //使能信號(hào)開
- P0=date; //將數(shù)據(jù)送入p0口
- EN=0; //使能信號(hào)關(guān)
- check_BF(); //等待LCD繁忙狀態(tài)結(jié)束
- }
- /***************************LCD寫指令函數(shù)**************************/
- void write_com(char command)
- {
-
- RS=0; //寫指令電平置為低,進(jìn)入寫指令狀態(tài)
- R_W=0; //讀寫指令命令置為低電平
- EN=1; //使能信號(hào)開
- P0=command; //將數(shù)據(jù)送入p0口
- EN=0; //使能信號(hào)關(guān)
- check_BF(); //等待LCD繁忙狀態(tài)結(jié)束
- }
- /**************************LCD檢查忙碌函數(shù)*************************/
- void check_BF()
- {
- char i,x=0x80; //定義字符變量i,x
- P0=0xff; //P0口輸出高電平,使得P0口電平輸入允許
- while(x&0x80) //當(dāng)LCD還是處于繁忙狀態(tài)時(shí),進(jìn)入循環(huán)
- {
- RS=0; //寫指令置為1,讀取指令狀態(tài)
- R_W=1; //讀引腳電平置為高,為讀取信息狀態(tài)
- EN=1; //LCD使能信號(hào)開
- P0=0XFF; //P0口輸出高電平,使得P0口電平輸入允許
- x=P0; //將P0口電平信息賦給x
- EN=0; //LCD使能信號(hào)關(guān)閉
- for (i=0;i<10;i++); //循環(huán)等待
- }
- EN=0; //關(guān)閉使能信號(hào)
- }
- /****************************LCD清屏函數(shù)***************************/
- void clearLCD()
- {
- write_com(0x01); //寫入LCD清屏指令
- }
- /******************************方式一******************************/
- void fangshi1()
- {
- switch(step) //判斷洗衣機(jī)當(dāng)前運(yùn)行步驟
- {
- case 0: //步驟0
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 1: //步驟1
- process = '2'; //浸泡
- break; //跳出分支判斷
- case 2: //步驟2
- process = '3'; //洗滌
- break; //跳出分支判斷
- case 3: //步驟3
- process = '5'; //脫水
- break; //跳出分支判斷
- case 4: //步驟4
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 5: //步驟5
- process = '4'; //漂洗
- break; //跳出分支判斷
- case 6: //步驟6
- process = '5'; //脫水
- break; //跳出分支判斷
- case 7: //步驟7
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 8: //步驟8
- process = '4'; //漂洗
- break; //跳出分支判斷
- case 9: //步驟9
- process = '5'; //脫水
- break; //跳出分支判斷
- case 10: //步驟10
- clrpara(); //復(fù)位所有參數(shù)
- break; //跳出分支判斷
- }
- }
- /******************************方式二******************************/
- void fangshi2()
- {
- switch(step) //判斷洗衣機(jī)當(dāng)前運(yùn)行步驟
- {
- case 0: //步驟0
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 1: //步驟1
- process = '3'; //洗滌
- break; //跳出分支判斷
- case 2: //步驟2
- process = '5'; //脫水
- break; //跳出分支判斷
- case 3: //步驟3
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 4: //步驟4
- process = '4'; //漂洗
- break; //跳出分支判斷
- case 5: //步驟5
- process = '5'; //脫水
- break; //跳出分支判斷
- case 6: //步驟6
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 7: //步驟7
- process = '4'; //漂洗
- break; //跳出分支判斷
- case 8: //步驟8
- process = '5'; //脫水
- break; //跳出分支判斷
- case 9: //步驟9
- clrpara(); //復(fù)位所有參數(shù)
- break; //跳出分支判斷
-
- }
- }
- /******************************方式三******************************/
- void fangshi3()
- {
- switch(step) //判斷洗衣機(jī)當(dāng)前運(yùn)行步驟
- {
- case 0: //步驟0
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 1: //步驟1
- process = '3'; //洗滌
- break; //跳出分支判斷
- case 2: //步驟2
- process = '5'; //脫水
- break; //跳出分支判斷
- case 3: //步驟3
- process = '1'; //進(jìn)水
- break; //跳出分支判斷
- case 4: //步驟4
- process = '4'; //漂洗
- break; //跳出分支判斷
- case 5: //步驟5
- process = '5'; //脫水
- break; //跳出分支判斷
- case 6: //步驟6
- clrpara(); //復(fù)位所有參數(shù)
- break; //跳出分支判斷
- }
- }
- /******************************方式四******************************/
- void fangshi4()
- {
- switch(step) //判斷洗衣機(jī)當(dāng)前運(yùn)行步驟
- {
- case 0: //步驟0
- process = '5'; //脫水
- break; //跳出分支判斷
- case 1: //步驟1
- clrpara(); //復(fù)位所有參數(shù)
- break; //跳出分支判斷
- }
- }
- /*******************************復(fù)位*******************************/
- void clrpara()
- {
- EX0=0;
- TR0=0;
- st_pau=2; //洗衣機(jī)是否運(yùn)行全局變量為2
- step=0; //洗衣機(jī)運(yùn)行步驟全局變量為0
- //P2=0xff; //P0輸出0xff信息
- state=0; //洗衣機(jī)運(yùn)行狀態(tài)設(shè)置為OFF狀態(tài)
- process='1'; //洗衣機(jī)過程全局變量為1
- method='1'; //洗衣機(jī)方式全局變量為1
- speed='1'; //電動(dòng)機(jī)速度全局變量為1
- ad_level=0; //水位AD監(jiān)測(cè)值為0
- ad_voltage=0; //電壓AD檢測(cè)值為0
- motor_1_en = 0; //進(jìn)水閥驅(qū)動(dòng)機(jī)關(guān)閉
- motor_2_en = 0; //排水閥驅(qū)動(dòng)機(jī)關(guān)閉
- motor_3_en = 0; //洗衣機(jī)電動(dòng)機(jī)關(guān)閉
- TR1=0;
- flag=1; //標(biāo)志位為1,開始播放音樂
- //TR1=1; //啟動(dòng)定時(shí)器0
- init_LCM(); //LCD初始化程序
- display(); //LCD刷新顯示
- //speaker_on(); //音樂播放程序
- }
- /***************************音樂播放程序***************************/
- void speaker_on()
- {
- uchar i,j; //定義變量i,j
- i=0; //變量i賦值為0
- while(f_TAB[i][0]!=0xff)//判斷
- {
- Ch=f_TAB[i][1]; //TH0賦值
- Cl=f_TAB[i][0]; //TL0賦值
- TH1=Ch; //TH0賦值
- TL1=Cl; //TL0賦值
- TR1=1;
- for(j=0;j<time_TAB[i];j++) //控制節(jié)拍數(shù)
- delay(); //延時(shí) 1 個(gè)節(jié)拍單位
- TR1=0; //關(guān)閉定時(shí)器 T0
- i++; //播放下一個(gè)音符
- }
- }
- /****************************主程序入口****************************/
- void main()
- {
- //中斷0按鍵
- IT0 = 1; //中斷方式為下降沿
- EX0 = 1; //開啟外部中斷
-
- //定時(shí)器0、1,定時(shí)器0、1中斷,用于狀態(tài)改變計(jì)數(shù),pwm調(diào)制計(jì)數(shù)
- TMOD = 0x11; //定時(shí)器為定時(shí)中斷模式1
- TH0 = TIME0H; //定時(shí)器0計(jì)數(shù)高位加載
- TL0 = TIME0L; //定時(shí)器0計(jì)數(shù)低位加載
- TH1 = TIME1H; //定時(shí)器1計(jì)數(shù)高位加載
- TL1 = TIME1L; //定時(shí)器1計(jì)數(shù)低位加載
- ET0 = 1; //定時(shí)器0中斷允許
- ET1 = 1; //定時(shí)器1中斷允許
- TR0 = 1; //定時(shí)器0計(jì)數(shù)器啟動(dòng)
- TR1 = 1; //定時(shí)器1計(jì)數(shù)器啟動(dòng)
- P2 = 0xff; //P0輸出0xff信息
- state = 0; //洗衣機(jī)運(yùn)行狀態(tài)設(shè)置為OFF狀態(tài)
- process = '1'; //洗衣機(jī)過程全局變量為‘1’
- method = '1'; //洗衣機(jī)方式全局變量為‘1’
- speed = '1'; //電動(dòng)機(jī)速度全局變量為‘1’
- st_pau = '0'; //洗衣機(jī)是否運(yùn)行全局變量為‘0’
- step = 0 ; //洗衣機(jī)運(yùn)行步驟全局變量為‘0’
- MOTOR_ON = 25; //電動(dòng)機(jī)PWM控制計(jì)數(shù)為25
- ad_level = 0; //水位AD監(jiān)測(cè)值為0
- ad_voltage = 0; //電壓AD檢車值為0
- time_count = 0; //定時(shí)0中斷計(jì)數(shù)器全局變量為0
- time_count1 = 0; //定時(shí)1中斷計(jì)數(shù)器全局變量為0
- flag=0; //標(biāo)志位為0
- speaker = 0; //蜂鳴器關(guān)閉
- init_LCM(); //初始化LCD
- display(); //刷新顯示
- EA = 1; //開啟單片機(jī)中斷允許位,允許中斷開始
- P0 = 0xff; //P0輸出高電平,使得可以進(jìn)行外部電壓信號(hào)輸入
- while(1)
- {
- //測(cè)試水位
- while(flag==0)
- {
- con = 0; //AD轉(zhuǎn)換輸出關(guān)閉
- add_A = 0; //選擇水位模擬信號(hào)進(jìn)行AD轉(zhuǎn)換
- START = 1; //設(shè)置START引腳為高電平
- START = 0; //設(shè)置START引腳為低電平,得到下降沿,啟動(dòng)AD檢測(cè)
-
- while(!EOC); //等待AD轉(zhuǎn)換結(jié)束
- lock_OE = 0; //74ls373鎖存信號(hào)為低,通道開啟
- P0 = 0xff; //P0引腳輸出高電平,允許引腳電平的讀入
- con = 1; //AD轉(zhuǎn)換芯片輸出使能
- ad_level = P0; //將AD轉(zhuǎn)換賦值為AD_LEVEL全局變量
- con = 0; //AD轉(zhuǎn)換芯片輸出禁止
- lock_OE = 1; //74ls373鎖存信號(hào)開啟,進(jìn)行電平鎖存
- add_A = 1; //選擇AD模塊為1號(hào)通道信號(hào)進(jìn)行模數(shù)轉(zhuǎn)換,即電壓信號(hào)
- START = 1; //START引腳輸出高電平
- START = 0; //START引腳輸出低電平,開始AD轉(zhuǎn)換
- while(!EOC); //等待AD轉(zhuǎn)換結(jié)束
- lock_OE = 0; //74ls373鎖存信號(hào)關(guān)閉,AD轉(zhuǎn)換信號(hào)可以輸出
- P0 = 0xff; //P0輸出高電平,使得外部電壓可以進(jìn)行輸入
- con = 1; //AD轉(zhuǎn)換結(jié)果使能
- ad_voltage = P0; //將P0引腳的AD轉(zhuǎn)換結(jié)果賦值給電壓檢測(cè)全局變量
- con = 0; //AD轉(zhuǎn)化結(jié)果輸出關(guān)閉
- lock_OE = 1; //74ls373鎖存信號(hào)開啟,使得P0口與AD轉(zhuǎn)換引腳隔離
- }
- if(flag==1)
- {
- speaker_on();
- flag=0;
- }
-
- }
- }
- /**************************外部中斷0子程序*************************/
- void int_0() interrupt 0
- {
- uint temp; //定義變量temp,用來讀取P2信息
- temp = P2; //temp讀取P2信息
- translate(temp&0x0f); //與0x0f相與,得到低四位電平信號(hào),并傳入translate()函數(shù)
- display(); //LCD顯示刷新
- }
- /***************************定時(shí)0中斷入口**************************/
- void time_0() interrupt 1
- {
- time_count1 ++; //全局定時(shí)中斷計(jì)數(shù)自加1
- if (time_count1 > 6) //如果全局定時(shí)中斷次數(shù)大于6,則
- {
- time_count1 = 0; //全局定時(shí)中斷次數(shù)置零
- }
- //只考慮正轉(zhuǎn)
- if(st_pau==1) //如果洗衣機(jī)處于運(yùn)行狀態(tài),則
- {
- MOTOR_NOW++; //PWM計(jì)數(shù)次數(shù)自加1
- if (MOTOR_NOW > MOTOR_ON) //如果PWM計(jì)數(shù)次數(shù)大于高電平計(jì)數(shù)值
- {
- motor_high = 0; //PWM高電平引腳輸出低電平
- }
- else
- {
- motor_high = 1; //PWM高電平輸出高電壓
- }
- if (MOTOR_NOW > MOTOR_COUNT) //如果PWM計(jì)數(shù)值大于PWM計(jì)數(shù)周期
- {
- MOTOR_NOW = 0; //PWM計(jì)數(shù)值置零
- }
- motor_low = 0; //PWM低電平輸出低電平
- }
- TH0=TIME0H; //定時(shí)器0高位計(jì)數(shù)載入
- TL0=TIME0L; //定時(shí)器低位計(jì)數(shù)載入
-
- }
- /***************************定時(shí)1中斷入口**************************/
- void vTimer0() interrupt 3
- {
- if(flag==0)
- {
- TR1=0;
- if(st_pau==1)
- {
- time_count++;
- if(time_count> 5)
- {
- time_count=0;
- step++;
- display();
- }
- }
- switch(method)
- {
- case '1': //方式一
- fangshi1();
- break;
- case '2': //方式二
- fangshi2();
- break;
- case '3': //方式三
- fangshi3();
- break;
- case '4': //方式四
- fangshi4();
- break;
- }
- TH1=TIME1H;
- TL1=TIME1L;
- TR1=1;
- }
- else
- {
- speaker=~speaker; //取反
- TH1=Ch; //TH1賦值
- TL1=Cl; //TL1賦值
- }
-
- }
復(fù)制代碼
0.png (44.72 KB, 下載次數(shù): 73)
下載附件
2016-6-3 19:55 上傳
全部資料下載:
全自動(dòng)洗衣機(jī).rar
(71.56 KB, 下載次數(shù): 226)
2016-6-3 19:55 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|