|
刚好有个坏的电压力锅电脑板正常,记下它各个功能还有电路图,确定拆下它20脚的单片机,自己用51单片机写程序实现它各种功能,包括它预约时间调节,各种功能时间的不同,工作中花样动态画"00",压力到后开始倒计时并保温在60-70度左右,开始操作时各个对应LED灯对应闪耀,温度超高热敏电阻开路短路报警显示E4并全LED灯闪耀。今天实测了一下保温功能,并对应新小霸王电压力锅保温的温度(各个测保温水温如下图65度-75度范围)
加热稳定后温控器各显示72度如图
自己用实际电阻调节到一定温度的实测
仿真实验也成功,只是它检测按键有两三个数值不同,实物测试很灵敏的,可能我只用三句无延时检测12个按键检测方式不一样吧。它电路确实复用很多IO口,按键LED灯数码管等等都复用了。如下图,有模拟的压力开关,热敏电阻。都一一测试
还有预约时间,预约时间倒计时,时间到就开始对应的工作
如果有问题显示错误E4并闪耀所有LED灯,这时候所有按键无效。
好了,以下是实物程序,仿真程序下面下载,就改两个数值,一个保温按键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)
Proteus7.5版本仿真:
proteus仿真电路图.rar
(21.31 KB, 下载次数: 19)
|
评分
-
查看全部评分
|