找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3064|回复: 3
收起左侧

继无AD单片机不用延时函数写电压力锅程序并初次仿真实物实验成功 附源程序

[复制链接]
ID:151846 发表于 2021-5-6 18:58 | 显示全部楼层 |阅读模式
刚好有个坏的电压力锅电脑板正常,记下它各个功能还有电路图,确定拆下它20脚的单片机,自己用51单片机写程序实现它各种功能,包括它预约时间调节,各种功能时间的不同,工作中花样动态画"00",压力到后开始倒计时并保温在60-70度左右,开始操作时各个对应LED灯对应闪耀,温度超高热敏电阻开路短路报警显示E4并全LED灯闪耀。今天实测了一下保温功能,并对应新小霸王电压力锅保温的温度(各个测保温水温如下图65度-75度范围) 2021-05-06 155649.jpg 2021-05-06 173754.jpg
加热稳定后温控器各显示72度如图


自己用实际电阻调节到一定温度的实测

2021-05-05 223912.jpg


仿真实验也成功,只是它检测按键有两三个数值不同,实物测试很灵敏的,可能我只用三句无延时检测12个按键检测方式不一样吧。它电路确实复用很多IO口,按键LED灯数码管等等都复用了。如下图,有模拟的压力开关,热敏电阻。都一一测试

51hei图片20210505214155.png 51hei图片20210505220431.png 51hei图片20210505213827.png 51hei图片20210505213859.png


还有预约时间,预约时间倒计时,时间到就开始对应的工作

51hei图片20210505214056.png


如果有问题显示错误E4并闪耀所有LED灯,这时候所有按键无效。

51hei图片20210505221901.png


好了,以下是实物程序,仿真程序下面下载,就改两个数值,一个保温按键0xcf,一个数码管串联着两个二极管(仿真可以直接点亮,实物不行)
单片机源程序如下:
  1. #include<reg52.h>
  2. sfr T2MOD=0XC9; //定义定时器2
  3. #define u8  unsigned char
  4. #define u16 unsigned int
  5. u16 wen;
  6. sbit Rwen=P0^0;sbit yali=P3^4;sbit zhufan=P3^5;sbit P36=P3^6;sbit P37=P3^7;
  7. bit F_20s,F_10s,F_100ms,F_4ms,F_1ms ,F_err,F_led,F_bao,F_time,F_time1,
  8. F_timeok,F_shan,F_yaliok,F_ok,F_key,F_flag,F_keyok;
  9. sbit a=P2^4;sbit b=P2^5;sbit c=P2^6;sbit d=P2^7; //4个数码管
  10. u8 code tab[26]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
  11. 0xfb,0xf9,0xf8,0xd8,0xc8,0xc0,0xef,0xcf,0xce,0xcc,0xc8,0xc0,0x8c,
  12. //数字0-9与动态画双"00"保温"b"热敏电阻开路短路报警“E4"
  13. 0xff,0x83,0x86};
  14. u8 time,time1,us,s,M,keyok,keybuf,ds1,shu,s1=0,shan,LED=8,j,keyjs,dw[4];

  15. void disp()
  16. { u8 s0,dp=0;static u8 i=0,a=8;if(s1==0)s0=0;else s0=23;
  17.   if(F_bao){dw[0]=24;dw[1]=24;dw[2]=24;dw[3]=24;}//保温显示bbbb优先
  18.   else if((F_time)||(F_timeok)){dw[0]=ds1%100/10;dw[1]=ds1%10;dw[2]=shu%100/10;
  19.      dw[3]=shu%10;if(i==1)dp=0x80;else dp=0;zhufan=0;}//定时预约时间显示
  20.   else if(!F_ok){dw[0]=s0;dw[1]=s1;dw[2]=shu%100/10;dw[3]=shu%10;
  21.           if(F_err){M=0;dw[0]=23;dw[1]=25;dw[2]=4;dw[3]=23;
  22.                   }F_timeok=0;zhufan=0;ds1=0;}//上电显示0000出错显示E4
  23.    else{dw[0]=10+j;dw[1]=16+j;if(F_yaliok){dw[0]=23;dw[1]=22;}
  24.         dw[2]=shu%100/10;dw[3]=shu%10;}//工作显示动态00并显示对应时间
  25.    if(i>=4){i=0;a=8;}P36=1;P37=1;a<<=1;P2=a;
  26.    P1=tab[dw[i]]+dp;i++;
  27.    }
  28. //一旦工作中,除取消按键外所有按键无效,出错显示E4并全LED闪所有按键无效
  29. void ScanKey()        //按键扫描
  30. {  P2=0;P1=0xdd;if(P1!=keybuf){keybuf=P1;keyjs=6;F_key=1;}
  31.    if(F_key){keyjs--;if(keyjs==0){P1=0x22;F_key=0;if(keybuf!=0xdd){
  32.    keyok=keybuf|P1; F_keyok=1;shan=0;s=0;F_20s=0;}}}//12个按键处理
  33.    if(!F_shan){static bit F_x;F_x=~F_x;//避免2个LED同时亮时干扰
  34.       P1=0x80;P1>>=LED;//10个LED处理程序,对应各个功能亮,如果预约煮,加上预约LED亮
  35.          if(F_x){if(F_led){P36=0;P37=1;}else{P36=1;P37=0;}}
  36.      if(((F_time)||(F_timeok))&&(!F_x)){if(!F_led)P1|=1;else P1=1;P36=1;P37=0;}
  37.          if(F_err){P1=0xa7;if(F_x){P36=0;P37=1;}else{P36=1;P37=0;}}}
  38. //处理RICE,WARM,CHICKEN,CONJEE,LEGU,FISH,CAKE,MEAT,SOUP,TIME灯及闪耀程序
  39. }

  40. void main(void)
  41. { bit F_jia,F_jian;u8 s10,ds,ms,ms1,yanshi;yanshi=0;F_yaliok=0;Rwen=0;
  42.   T2MOD=0;T2CON=0;    //定时器2初始化,向上计数,16位自动重装模式
  43.   TL2=(65536-1000)%256;TH2=(65536-1000)/256; //设置定时初值,完成一次中断为65536us=65ms
  44.   RCAP2L=(65536-1000)%256;RCAP2H=(65536-1000)/256; //设置定时重载值
  45.   TR2=1;IE=0xa0;        //EA=1,ET2=1;
  46.   TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;//定时0自动重装模式2

  47. while(1)
  48. {if(F_1ms){if(time1==2)P1|=0xdd;//仿真撤除实物不能撤
  49.                 //因为数码af段串联有in4148二极管
  50.      F_1ms=0;if(F_err){time=0;ms++;if(ms>=254){ms=0;F_shan=~F_shan;}}
  51.          P36=1;P37=1;if(time1==3)ScanKey();
  52.      if((!F_shan)&&(F_4ms)){F_4ms=0;disp();}}
  53.    //0ms-2ms扫数码管,2ms-3ms扫数码管af段,3ms-4ms扫按键后返回0ms循环扫
  54. if(F_100ms){u8 shubuf;F_100ms=0;s10++;if(s10>=100){s10=0;F_10s=1;}
  55.     if((F_keyok)&&(!F_bao)&&(!F_ok)){ ms1=0;shan=0;//100ms处理按键结果
  56.           switch(keyok)//一旦工作或者保温下面按键就无效
  57.      {case 0x7d: s1=22;shu=12;F_flag=1;LED=0;F_led=1;break;//RICE 煮饭
  58.       case 0x5f: s1=22;shu=15;F_flag=1;LED=6;F_led=1;break;//CONJEE粥
  59.       case 0xbd: s1=22;shu=13;F_flag=1;LED=5;F_led=0;break;//MEAT肉类
  60.       case 0x9f:       F_jia=1;F_keyok=0;break;//JIA
  61.       case 0xed: s1=22;shu=40;F_flag=1;LED=7;F_led=1;break;//LEGU 蹄筋
  62.       case 0xf5: s1=22;shu=25;F_flag=1;LED=6;F_led=0;break;//SOUP煲汤
  63.           case 0xd7:      F_jian=1;F_keyok=0;break;//JIAN
  64.       case 0xf9: s1=22;shu=05;F_flag=1;LED=0;F_led=0;break;//FISH 蒸鱼
  65.       case 0xdb: s1=22;shu=12;F_flag=1;LED=5;F_led=1;break;//CHICKEN 鸡
  66.       case 0xde: s1=22;shu=18;F_flag=1;LED=2;F_led=0;break;//CAKE  蛋糕
  67. case 0xfc:if(!F_time)ds=25;F_time=1;F_time1=1;F_led=0;break;//TIME预约
  68.       default:  break;}yanshi=0;shubuf=shu;}
  69.           //功能时间存入shubuf缓存,预约时间完后用到。
  70.         if((F_flag)||(F_time)){if(F_time){if(F_time1)ds+=5;F_time1=0;
  71.            shu=ds;if(shu>=60){ds=0;ds1++;if(ds1==24)ds1=0;}}
  72.         F_keyok=0;ms1++;if(ms1>=5){F_shan=~F_shan;ms1=0;shan++;
  73.            if(shan>=10){if(F_flag==F_time){F_ok=1;F_flag=0;j=0;F_time=0;F_timeok=1;
  74.            }else if(F_flag){F_ok=1;F_flag=0;j=0;}else {
  75.                   F_time=0;shu=0;}F_shan=0;}}}
  76.          //各功能初始调节并500ms闪耀(显示跟对应LED灯)还有预约调节并完成,
  77.         if(F_ok){ms++;if(ms>=5){ms=0;j++;if(yali){F_yaliok=1;zhufan=0;}
  78.               else if(wen>50)zhufan=1;if((F_timeok)||(F_yaliok)){if(F_20s){M++;
  79.             F_20s=0;}if(M==3){shu--;if((!shu)&&(ds1)){shu=59;ds1--;}
  80.              else if(!shu){if(F_timeok){F_timeok=0;shu=shubuf;}
  81.                  else{F_ok=0;F_yaliok=0;keyok=0xcf;}}M=0;}//仿真为0xff实物为0xcf        
  82.               }}}
  83. //工作中"0"500ms加1画,如果压力到,显示P,并每分钟开始降1,如果为0,跳到保温
  84.         if((F_10s)&&((F_ok)||(F_bao))){Rwen=1;TR0=1;while(!Rwen){
  85.              if(F_err)break;}TR0=0;wen=us*256+TL0;TL0=0;us=0;Rwen=0;
  86. //550k(-10度)=17200/18202(us>70条件);35.2k(50度)=1067/1183;
  87. //30k(54度)=927/1011;20k(66度)667;4.4k(114度)=131/147;
  88. //1.85k(147度)=55/63;1.5k(156度)=43/51;1.1k(170度)=31/35;
  89. //0.5k(208度)=15/23无意发现两个wen数(如上208度中15/23)的结果
  90. //虽然两个测温电容都为104,但是后来我实测一个为93容量一个为100容量
  91.              if((F_err)||(wen<15)){F_err=0;yanshi++;if(yanshi>=10){F_bao=0;
  92.              F_err=1;F_time=0;F_ok=0;F_timeok=0;zhufan=0;yanshi=0;}}
  93.              if(F_bao){if(wen<667)zhufan=0;else zhufan=1;}else if(F_ok){
  94.                  if(wen<=50){zhufan=0;yanshi++;if(yanshi>=10){yanshi=0;F_ok=0;
  95.                  keyok=0xcf;}}else zhufan=1;}F_10s=0;} //仿真为0xff实物为0xcf
  96. //10秒检测一下温度,如果保温中,达到66度后停止加热,如果煮饭中,并且压力失灵,
  97. //温度达到156度停止加热,如果热敏电阻开路或短路,容错10次后显示E4并全闪LED灯
  98.         if(F_jia){shu++;if(shu>99)shu=0;F_jia=0;}
  99.         if((F_jian)&&(shu>0)){shu--;F_jian=0;}//加减键
  100.         if(keyok==0xcf){keyok=0;F_flag=0;shu=0;s1=0;ds1=0;ds=0;//仿真为0xff实物为0xcf
  101.              F_timeok=0;F_shan=0;if((F_ok)||(F_time)){F_time=0;F_ok=0;}
  102.                  else F_bao=~F_bao;if(F_bao){zhufan=1;LED=2;F_led=1;}
  103.                  else{zhufan=0;LED=8;}}//WARM 保温取消
  104.       }//保温按键单独处理,随时可用
  105.         if(j>=6)j=0;}
  106. }

  107. void time0()interrupt 1
  108. {us++;if(us>70)F_err=1;}
  109. void t2() interrupt 5
  110. {   TF2=0;F_1ms=1;         //1ms标志
  111.     time++;time1++;if(time1==4){time1=0;F_4ms=1;}
  112.     if(time==100)//100ms标志位置1
  113.     { s++;if(s==200){F_20s=1;s=0;}F_100ms=1; time=0; }
  114. }            
复制代码

以上的.c文件: keil打开生成并直接仿真用.rar (3.07 KB, 下载次数: 18)
51hei图片20210412134928.png
51hei图片20210505210736.png
51hei图片20210505211034.png
51hei图片20210505220840.png
51hei图片20210505221036.png

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:712493 发表于 2021-5-6 21:26 | 显示全部楼层
这么逆天,我以前看见电话机坏了到厂里画个板装上。你这个连程序都写上了
回复

使用道具 举报

ID:992856 发表于 2021-12-15 20:30 | 显示全部楼层
你好呀,想请教你一些问题
回复

使用道具 举报

ID:992856 发表于 2021-12-15 20:30 | 显示全部楼层
你好啊,我的出了点问题,可以请教一下嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表