单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

曼联2018一2019赛程: 51单片机的微波炉控制(Proteus仿真+程序)

[复制链接]
6666661 发表于 2019-3-19 20:18 | 显示全部楼层 |阅读模式
单片机微波炉仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机微波炉源程序:
  1. #include <reg51.h>
  2. #define  uint unsigned int
  3. #define  uchar unsigned char
  4. uint dis[]={0x00,0x00,0x00,0x00};
  5. uint pv=1,pv_j=6,pv_l=24; //定义 档位、加热时间、冷却时间(每个周期)
  6. uint count_s=0;    //记录定时时间
  7. uint cyc0=20,cyc1=20;    // 为了计时一秒,定时器一次中断为50ms,20*50ms=1s
  8. uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff};  //七段数码管显示码,显示0~9和全亮
  9. uchar codecho[]={0xfe,0xfd,0xfb,0xf7};                  //位选码
  10. sbit P10=P1^0;                //引脚定义
  11. sbit P11=P1^1;
  12. sbit P12=P1^2;
  13. sbit P13=P1^3;
  14. sbit P14=P1^4;
  15. sbit P15=P1^5;
  16. sbit P16=P1^6;
  17. sbit P17=P1^7;
  18. sbit duan=P2^0;
  19. sbit wei=P2^1;
  20. sbit P22=P2^2;
  21. sbit P23=P2^3;
  22. sbit P24=P2^4;
  23. /*--------------------
  24.   延时函数,大致延时一毫秒
  25. -------------------*/
  26. void delay_ms(uint t)
  27. {uchar i;
  28.         while(t--)         
  29.         {
  30.                 i=250;
  31.                 while(--i);               
  32.         }        
  33. }
  34.         /*------------------------
  35.    定时器初始化
  36. --------------------------*/
  37. void t_clr()
  38. {
  39.         EA=1;            //CPU开中断
  40.         ET0=1;
  41.         ET1=1;           //定时器 中断允许
  42.         TMOD=0X11;       //定时器T1、T0 定时   方式一
  43.         TH0=0X3c;
  44.         TL0=0Xaf;
  45.                     //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
  46.         TH1=0X3c;
  47.         TL1=0X0af;
  48. }
  49. /*------------------------
  50.     键盘扫描函数
  51. --------------------------*/
  52. void key_scan()
  53. {
  54.         if(!P10)
  55.         {
  56.          delay_ms(70);
  57.                 if(!P10)
  58.                 count_s+=30;      //时间 +30秒
  59.         if (count_s>6000)
  60.             count_s=0;
  61.         }
  62.         
  63.     if(!P11)
  64.         {
  65.          delay_ms(70);
  66.                 if(!P11)
  67.                 count_s+=60;       //时间 +1 分
  68.         if (count_s>6000)
  69.             count_s=0;
  70.         }

  71.         if(!P12)
  72.         {
  73.          delay_ms(70);
  74.                 if(!P12)
  75.                 count_s+=300;      //时间+5分
  76.         if (count_s>6000)
  77.             count_s=0;
  78.         }

  79.         if(!P13)
  80.         {
  81.          delay_ms(70);
  82.                 if(!P13)
  83.                 count_s=0;         //时间清零

  84.         }

  85.         if(!P14)
  86.         {
  87.          delay_ms(70);
  88.                 if(!P14)
  89.                 {if (pv<3)
  90.                  pv++;               //档位+1
  91.          pv_j=pv*6+6;        //加热时间
  92.          pv_l=30-pv_j;       //冷却时间
  93.                 }

  94.         }

  95.         if(!P15)
  96.         {
  97.          delay_ms(70);
  98.                 if(!P15)
  99.                 {if (pv>0)
  100.                  pv--;               //档位-1
  101.          pv_j=pv*6+6;
  102.          pv_l=30-pv_j;
  103.                 }

  104.         }

  105.         if(!P16)
  106.         {
  107.          delay_ms(70);
  108.                 if(!P16)
  109.                 {
  110.                  P22=1;
  111.          if(count_s==0)          //如果没有设定时间,不加热,定时器不工作
  112.             {TR0=0;
  113.             TR1=0;}
  114.          else                    //如果已经设定时间,则开始计时,开始加热
  115.                     {                  
  116.             pv_j=6*pv+6;
  117.             pv_l=30-pv_j;
  118.             t_clr();
  119.             TR0=1;
  120.                     TR1=1;
  121.             P22=0;}
  122.                 }

  123.         }

  124.         if(!P17)               //停止加热,终止定时器
  125.         {
  126.          delay_ms(70);
  127.                 if(!P17)
  128.                 {P22=1;
  129.                  P23=0;
  130.                  TR0=0;
  131.                  TR1=0;
  132.                 }
  133.         }
  134. }
  135. /*------------------------
  136.     时间变换为每个显示位
  137. --------------------------*/
  138. void time_converter()
  139. {
  140.         dis[0]=count_s/600;             //取分的十位
  141.         dis[1]=(count_s/60)%10;         //取分的个位
  142.                                  
  143.         dis[2]=(count_s%60)/10;         //取秒的十位
  144.         dis[3]=(count_s%60)%10;                  //取秒的个位
  145. }
  146. /*------------------------
  147.    显示函数
  148. --------------------------*/
  149. void display()
  150. {  
  151.    
  152.     uchar t;
  153.         uchar k;
  154.         for(k=0;k<4;k++)                                //LED显示
  155.         {
  156.          wei=1;
  157.          P0=codecho[k];
  158.          wei=0;               
  159.      P0=0xff;
  160.      delay_ms(1);
  161.          duan=1;
  162.      P0=codevalue[dis[k]];
  163.          duan=0;
  164.      P0=0xff;
  165.      delay_ms(1);     

  166.          }
  167.         P3=codevalue[pv];                 //显示档位 */
  168.         while(!P24)                                          //按键测试
  169.         {
  170.         for(t=0;t<4;t++)
  171.         {
  172.         wei=1;
  173.         P0=codecho[t];
  174.         wei=0;
  175.     P0=0xff;
  176.     delay_ms(1);
  177.         duan=1;
  178.     P0=codevalue[10];        
  179.         duan=0;
  180.     P0=0xff;
  181.     delay_ms(1);
  182.         P3=codevalue[10];
  183.         }     
  184.   }
  185. }
  186. /*------------------------
  187.      主函数
  188. --------------------------*/
  189. void main()
  190. {            
  191.     uchar n=200;
  192.     P23=0;
  193.         t_clr();        //初始化        
  194.         while(1)
  195.         {
  196.                 key_scan();   //键盘扫描
  197.                 time_converter();//数值转换
  198.                 display();     //显示
  199.         }
  200. }
  201. /*------------------------
  202.    定时器T0中断
  203. --------------------------*/
  204. void t0() interrupt 1
  205. {        
  206.     TR0=0;
  207.     TH0=0X3c;
  208.         TL0=0Xaf;
  209.     cyc0--;
  210.         if (cyc0==0)
  211.                 {cyc0=20;
  212.                 count_s--;  //时间-1S
  213.         if (count_s==0)  //如果定时已到
  214.             {
  215.                          P22=1;      //停止加热,定时器终止
  216.              TR0=0;
  217.              TR1=0;
  218.              P23=1;
  219.             }
  220.         else
  221.             TR0=1;        //继续定时
  222.                 }
  223.     else
  224.         TR0=1;
  225.            
  226. }
  227. /*------------------------
  228.     定时器T1中断
  229. --------------------------*/
  230. void t1() interrupt 3
  231. {
  232.     TR1=0;
  233.     TH1=0X3c;
  234.         TL1=0X0af;
  235.     TR1=1;
  236.     if (pv_j!=0)          //需要加热
  237.         {cyc1--;
  238.         if (cyc1==0)
  239.             {cyc1=20;
  240.             pv_j--;
  241.             if (pv_j==0)   //加热时间到
  242.                 {
  243.                     P22=1;      //否则,停止加热,进入冷却阶段
  244.                 }
  245.             }
  246.         }
  247.     else if (pv_l!=0)           //是否需要冷却
  248.         {cyc1--;
  249.         if (cyc1==0)
  250.             {cyc1=20;
  251.             pv_l--;
  252.             if (pv_l==0)         //冷却时间到
  253.                 {
  254.                                 P22=0;          //进行加热
  255.                 pv_j=pv*6+6;}    //再次设定加热时间
  256.             }
  257.         }

  258. }
复制代码
0.png

基于单片机的微波炉控制全部资料51hei下载地址:
仿真 程序.zip (82.38 KB, 下载次数: 59)

评分

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

曼联vs曼城 www.lybugk.com.cn 查看全部评分

weibolu 发表于 2019-6-22 08:09 来自手机 | 显示全部楼层
楼主你设定的时间是多少呢
szzxl10 发表于 2019-7-12 18:35 | 显示全部楼层
下载学习学习
tyut知勉 发表于 2019-9-4 12:01 | 显示全部楼层
下载学习学习!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 曼联vs曼城

快速回复 曼联vs曼城 返回列表