|
剛好有個壞的電壓力鍋電腦板正常,記下它各個功能還有電路圖,確定拆下它20腳的單片機,自己用51單片機寫程序實現它各種功能,包括它預約時間調節,各種功能時間的不同,工作中花樣動態畫"00",壓力到后開始倒計時并保溫在60-70度左右,開始操作時各個對應LED燈對應閃耀,溫度超高熱敏電阻開路短路報警顯示E4并全LED燈閃耀。今天實測了一下保溫功能,并對應新小霸王電壓力鍋保溫的溫度(各個測保溫水溫如下圖65度-75度范圍)
2021-05-06 155649.jpg (1.55 MB, 下載次數: 66)
下載附件
2021-5-6 18:24 上傳
2021-05-06 173754.jpg (286.65 KB, 下載次數: 67)
下載附件
2021-5-6 18:24 上傳
加熱穩定后溫控器各顯示72度如圖
自己用實際電阻調節到一定溫度的實測
2021-05-05 223912.jpg (2.72 MB, 下載次數: 62)
下載附件
2021-5-6 18:24 上傳
仿真實驗也成功,只是它檢測按鍵有兩三個數值不同,實物測試很靈敏的,可能我只用三句無延時檢測12個按鍵檢測方式不一樣吧。它電路確實復用很多IO口,按鍵LED燈數碼管等等都復用了。如下圖,有模擬的壓力開關,熱敏電阻。都一一測試
51hei圖片20210505214155.png (83.24 KB, 下載次數: 64)
下載附件
2021-5-6 18:25 上傳
51hei圖片20210505220431.png (83.24 KB, 下載次數: 56)
下載附件
2021-5-6 18:25 上傳
51hei圖片20210505213827.png (83.11 KB, 下載次數: 70)
下載附件
2021-5-6 18:25 上傳
51hei圖片20210505213859.png (83.06 KB, 下載次數: 63)
下載附件
2021-5-6 18:25 上傳
還有預約時間,預約時間倒計時,時間到就開始對應的工作
51hei圖片20210505214056.png (83.14 KB, 下載次數: 68)
下載附件
2021-5-6 18:25 上傳
如果有問題顯示錯誤E4并閃耀所有LED燈,這時候所有按鍵無效。
51hei圖片20210505221901.png (82.92 KB, 下載次數: 76)
下載附件
2021-5-6 18:25 上傳
好了,以下是實物程序,仿真程序下面下載,就改兩個數值,一個保溫按鍵0xcf,一個數碼管串聯著兩個二極管(仿真可以直接點亮,實物不行)
單片機源程序如下:
- #include<reg52.h>
- sfr T2MOD=0XC9; //定義定時器2
- #define u8 unsigned char
- #define u16 unsigned int
- u16 wen;
- sbit Rwen=P0^0;sbit yali=P3^4;sbit zhufan=P3^5;sbit P36=P3^6;sbit P37=P3^7;
- bit F_20s,F_10s,F_100ms,F_4ms,F_1ms ,F_err,F_led,F_bao,F_time,F_time1,
- F_timeok,F_shan,F_yaliok,F_ok,F_key,F_flag,F_keyok;
- sbit a=P2^4;sbit b=P2^5;sbit c=P2^6;sbit d=P2^7; //4個數碼管
- u8 code tab[26]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- 0xfb,0xf9,0xf8,0xd8,0xc8,0xc0,0xef,0xcf,0xce,0xcc,0xc8,0xc0,0x8c,
- //數字0-9與動態畫雙"00"保溫"b"熱敏電阻開路短路報警“E4"
- 0xff,0x83,0x86};
- u8 time,time1,us,s,M,keyok,keybuf,ds1,shu,s1=0,shan,LED=8,j,keyjs,dw[4];
- void disp()
- { u8 s0,dp=0;static u8 i=0,a=8;if(s1==0)s0=0;else s0=23;
- if(F_bao){dw[0]=24;dw[1]=24;dw[2]=24;dw[3]=24;}//保溫顯示bbbb優先
- else if((F_time)||(F_timeok)){dw[0]=ds1%100/10;dw[1]=ds1%10;dw[2]=shu%100/10;
- dw[3]=shu%10;if(i==1)dp=0x80;else dp=0;zhufan=0;}//定時預約時間顯示
- else if(!F_ok){dw[0]=s0;dw[1]=s1;dw[2]=shu%100/10;dw[3]=shu%10;
- if(F_err){M=0;dw[0]=23;dw[1]=25;dw[2]=4;dw[3]=23;
- }F_timeok=0;zhufan=0;ds1=0;}//上電顯示0000出錯顯示E4
- else{dw[0]=10+j;dw[1]=16+j;if(F_yaliok){dw[0]=23;dw[1]=22;}
- dw[2]=shu%100/10;dw[3]=shu%10;}//工作顯示動態00并顯示對應時間
- if(i>=4){i=0;a=8;}P36=1;P37=1;a<<=1;P2=a;
- P1=tab[dw[i]]+dp;i++;
- }
- //一旦工作中,除取消按鍵外所有按鍵無效,出錯顯示E4并全LED閃所有按鍵無效
- void ScanKey() //按鍵掃描
- { P2=0;P1=0xdd;if(P1!=keybuf){keybuf=P1;keyjs=6;F_key=1;}
- if(F_key){keyjs--;if(keyjs==0){P1=0x22;F_key=0;if(keybuf!=0xdd){
- keyok=keybuf|P1; F_keyok=1;shan=0;s=0;F_20s=0;}}}//12個按鍵處理
- if(!F_shan){static bit F_x;F_x=~F_x;//避免2個LED同時亮時干擾
- P1=0x80;P1>>=LED;//10個LED處理程序,對應各個功能亮,如果預約煮,加上預約LED亮
- if(F_x){if(F_led){P36=0;P37=1;}else{P36=1;P37=0;}}
- if(((F_time)||(F_timeok))&&(!F_x)){if(!F_led)P1|=1;else P1=1;P36=1;P37=0;}
- if(F_err){P1=0xa7;if(F_x){P36=0;P37=1;}else{P36=1;P37=0;}}}
- //處理RICE,WARM,CHICKEN,CONJEE,LEGU,FISH,CAKE,MEAT,SOUP,TIME燈及閃耀程序
- }
- void main(void)
- { bit F_jia,F_jian;u8 s10,ds,ms,ms1,yanshi;yanshi=0;F_yaliok=0;Rwen=0;
- T2MOD=0;T2CON=0; //定時器2初始化,向上計數,16位自動重裝模式
- TL2=(65536-1000)%256;TH2=(65536-1000)/256; //設置定時初值,完成一次中斷為65536us=65ms
- RCAP2L=(65536-1000)%256;RCAP2H=(65536-1000)/256; //設置定時重載值
- TR2=1;IE=0xa0; //EA=1,ET2=1;
- TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;//定時0自動重裝模式2
- while(1)
- {if(F_1ms){if(time1==2)P1|=0xdd;//仿真撤除實物不能撤
- //因為數碼af段串聯有in4148二極管
- F_1ms=0;if(F_err){time=0;ms++;if(ms>=254){ms=0;F_shan=~F_shan;}}
- P36=1;P37=1;if(time1==3)ScanKey();
- if((!F_shan)&&(F_4ms)){F_4ms=0;disp();}}
- //0ms-2ms掃數碼管,2ms-3ms掃數碼管af段,3ms-4ms掃按鍵后返回0ms循環掃
- if(F_100ms){u8 shubuf;F_100ms=0;s10++;if(s10>=100){s10=0;F_10s=1;}
- if((F_keyok)&&(!F_bao)&&(!F_ok)){ ms1=0;shan=0;//100ms處理按鍵結果
- switch(keyok)//一旦工作或者保溫下面按鍵就無效
- {case 0x7d: s1=22;shu=12;F_flag=1;LED=0;F_led=1;break;//RICE 煮飯
- case 0x5f: s1=22;shu=15;F_flag=1;LED=6;F_led=1;break;//CONJEE粥
- case 0xbd: s1=22;shu=13;F_flag=1;LED=5;F_led=0;break;//MEAT肉類
- case 0x9f: F_jia=1;F_keyok=0;break;//JIA
- case 0xed: s1=22;shu=40;F_flag=1;LED=7;F_led=1;break;//LEGU 蹄筋
- case 0xf5: s1=22;shu=25;F_flag=1;LED=6;F_led=0;break;//SOUP煲湯
- case 0xd7: F_jian=1;F_keyok=0;break;//JIAN
- case 0xf9: s1=22;shu=05;F_flag=1;LED=0;F_led=0;break;//FISH 蒸魚
- case 0xdb: s1=22;shu=12;F_flag=1;LED=5;F_led=1;break;//CHICKEN 雞
- case 0xde: s1=22;shu=18;F_flag=1;LED=2;F_led=0;break;//CAKE 蛋糕
- case 0xfc:if(!F_time)ds=25;F_time=1;F_time1=1;F_led=0;break;//TIME預約
- default: break;}yanshi=0;shubuf=shu;}
- //功能時間存入shubuf緩存,預約時間完后用到。
- if((F_flag)||(F_time)){if(F_time){if(F_time1)ds+=5;F_time1=0;
- shu=ds;if(shu>=60){ds=0;ds1++;if(ds1==24)ds1=0;}}
- F_keyok=0;ms1++;if(ms1>=5){F_shan=~F_shan;ms1=0;shan++;
- if(shan>=10){if(F_flag==F_time){F_ok=1;F_flag=0;j=0;F_time=0;F_timeok=1;
- }else if(F_flag){F_ok=1;F_flag=0;j=0;}else {
- F_time=0;shu=0;}F_shan=0;}}}
- //各功能初始調節并500ms閃耀(顯示跟對應LED燈)還有預約調節并完成,
- if(F_ok){ms++;if(ms>=5){ms=0;j++;if(yali){F_yaliok=1;zhufan=0;}
- else if(wen>50)zhufan=1;if((F_timeok)||(F_yaliok)){if(F_20s){M++;
- F_20s=0;}if(M==3){shu--;if((!shu)&&(ds1)){shu=59;ds1--;}
- else if(!shu){if(F_timeok){F_timeok=0;shu=shubuf;}
- else{F_ok=0;F_yaliok=0;keyok=0xcf;}}M=0;}//仿真為0xff實物為0xcf
- }}}
- //工作中"0"500ms加1畫,如果壓力到,顯示P,并每分鐘開始降1,如果為0,跳到保溫
- if((F_10s)&&((F_ok)||(F_bao))){Rwen=1;TR0=1;while(!Rwen){
- if(F_err)break;}TR0=0;wen=us*256+TL0;TL0=0;us=0;Rwen=0;
- //550k(-10度)=17200/18202(us>70條件);35.2k(50度)=1067/1183;
- //30k(54度)=927/1011;20k(66度)667;4.4k(114度)=131/147;
- //1.85k(147度)=55/63;1.5k(156度)=43/51;1.1k(170度)=31/35;
- //0.5k(208度)=15/23無意發現兩個wen數(如上208度中15/23)的結果
- //雖然兩個測溫電容都為104,但是后來我實測一個為93容量一個為100容量
- if((F_err)||(wen<15)){F_err=0;yanshi++;if(yanshi>=10){F_bao=0;
- F_err=1;F_time=0;F_ok=0;F_timeok=0;zhufan=0;yanshi=0;}}
- if(F_bao){if(wen<667)zhufan=0;else zhufan=1;}else if(F_ok){
- if(wen<=50){zhufan=0;yanshi++;if(yanshi>=10){yanshi=0;F_ok=0;
- keyok=0xcf;}}else zhufan=1;}F_10s=0;} //仿真為0xff實物為0xcf
- //10秒檢測一下溫度,如果保溫中,達到66度后停止加熱,如果煮飯中,并且壓力失靈,
- //溫度達到156度停止加熱,如果熱敏電阻開路或短路,容錯10次后顯示E4并全閃LED燈
- if(F_jia){shu++;if(shu>99)shu=0;F_jia=0;}
- if((F_jian)&&(shu>0)){shu--;F_jian=0;}//加減鍵
- if(keyok==0xcf){keyok=0;F_flag=0;shu=0;s1=0;ds1=0;ds=0;//仿真為0xff實物為0xcf
- F_timeok=0;F_shan=0;if((F_ok)||(F_time)){F_time=0;F_ok=0;}
- else F_bao=~F_bao;if(F_bao){zhufan=1;LED=2;F_led=1;}
- else{zhufan=0;LED=8;}}//WARM 保溫取消
- }//保溫按鍵單獨處理,隨時可用
- if(j>=6)j=0;}
- }
- void time0()interrupt 1
- {us++;if(us>70)F_err=1;}
- void t2() interrupt 5
- { TF2=0;F_1ms=1; //1ms標志
- time++;time1++;if(time1==4){time1=0;F_4ms=1;}
- if(time==100)//100ms標志位置1
- { s++;if(s==200){F_20s=1;s=0;}F_100ms=1; time=0; }
- }
復制代碼
以上的.c文件:
keil打開生成并直接仿真用.rar
(3.07 KB, 下載次數: 18)
2021-5-6 18:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
Proteus7.5版本仿真:
proteus仿真電路圖.rar
(21.31 KB, 下載次數: 19)
2021-5-6 18:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|