單片機論壇

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 548|回復: 2
收起左側

曼联为什么签c罗: 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, 下載次數: 18)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

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

weibolu 發表于 2019-6-22 08:09 來自手機 | 顯示全部樓層
樓主你設定的時間是多少呢
szzxl10 發表于 2019-7-12 18:35 | 顯示全部樓層
下載學習學習
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

QQ|手機版|小黑屋|單片機論壇 |51黑電子論壇單片機 聯系QQ:125739409;技術交流QQ群582644647

Powered by 曼联vs曼城

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