找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2483|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)風(fēng)扇風(fēng)速控制電路 求指導(dǎo)一下我的代碼!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:484259 發(fā)表于 2019-3-4 15:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
設(shè)計(jì)一個(gè)風(fēng)扇風(fēng)速控制電路,用三個(gè)按鍵控制風(fēng)速、風(fēng)種、啟動(dòng)/停止;運(yùn)轉(zhuǎn)狀態(tài)用指示燈顯示。
風(fēng)速:強(qiáng)、中、弱對應(yīng)電扇的不同轉(zhuǎn)速。 風(fēng)種:睡眠、自然、正常。睡眠時(shí),電扇運(yùn)轉(zhuǎn)10秒,間斷10秒;自然時(shí),自然風(fēng)運(yùn)轉(zhuǎn)5秒,間斷5秒;正常時(shí)電扇連續(xù)運(yùn)轉(zhuǎn)。

現(xiàn)在代碼出現(xiàn)的問題是:選擇風(fēng)種那里,停轉(zhuǎn)5秒那里沒問題,但是一旦進(jìn)入停轉(zhuǎn)10秒那里就變成轉(zhuǎn)10秒,只停止3秒左右,模式3直接進(jìn)入不了,一直在模式1和2之間變換。

代碼如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #include<uart.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. uchar zkb,aa;
  8. uchar t=0,snum=0,s1num=0,tt=0;  //t記錄中斷次數(shù),確定PWM的周期
  9. sbit IN1=P2^1;
  10. sbit IN2=P2^2;
  11. sbit ENA=P2^5;     //產(chǎn)生PWM波?
  12. sbit dula=P2^6;
  13. sbit wela=P2^7;
  14. sbit zs=P3^7;       //轉(zhuǎn)速
  15. sbit ms=P3^6;     //模式
  16. sbit d1=P1^0;
  17. sbit d2=P1^1;
  18. sbit d3=P1^2;
  19. sbit d4=P1^3;
  20. sbit d5=P1^4;
  21. sbit lcden=P3^4;
  22. sbit rs=P3^5;


  23. void delayms(uint xms)                //延時(shí)子程序
  24. {
  25.    uint i,j;
  26.    for(i=xms;i>0;i--)
  27.     for(j=110;j>0;j--);
  28. }
  29. //液晶顯示模塊的讀寫以及控制
  30. void write_com(uchar com)                   //寫命令函數(shù)
  31. {
  32.         rs=0;
  33.         lcden=0;
  34.         P0=com;
  35.         delayms(5);
  36.         lcden=1;
  37.         delayms(5);
  38.         lcden=0;      
  39. }


  40. void write_data(uchar date)                   //寫數(shù)據(jù)函數(shù)
  41. {
  42.         rs=1;
  43.         lcden=0;
  44.         P0=date;
  45.         delayms(5);
  46.         lcden=1;
  47.         delayms(5);
  48.         lcden=0;      
  49. }






  50.    //函數(shù)功能:顯示檔數(shù)和模式
  51. void display_sym()
  52. {
  53.         write_com(0x80);
  54.         write_data('v');
  55.         write_data(':');
  56.         write_com(0x80+0x40);
  57.         write_data('m');
  58.         write_data(':');


  59. }


  60. void keyscan()
  61. {
  62.   if(zs==0)                //控制電機(jī)的四個(gè)轉(zhuǎn)速
  63.    {
  64.                    delayms(5);//消抖
  65.                 if(zs==0)        //zs鍵確實(shí)按下
  66.                 {
  67.                        
  68.                         snum++;                 //每按一次加1
  69.                         while(!zs); //等待松開
  70.                         if(snum==3)           //當(dāng)snum=5時(shí),回到第一檔
  71.                         {
  72.                            snum=0;                //0檔,速度最大               
  73.                          }                  
  74.                     switch(snum)
  75.                         {
  76.                                 case 0:zkb=40;break;          //snum為0時(shí),1檔
  77.                                 case 1:zkb=60;break;                 //snum為1時(shí),2檔                 
  78.                                 case 2:zkb=90;break;                //snum為2時(shí),3檔                        
  79.                                 default: break;
  80.                         }
  81.                        
  82.                 }
  83.    }


  84. if(ms==0)                //控制電機(jī)的四個(gè)轉(zhuǎn)速
  85.    {
  86.                    delayms(5);//消抖
  87.                 if(ms==0)        //zs鍵確實(shí)按下
  88.                 {
  89.                         while(!ms); //等待松開
  90.                         s1num++;                 //每按一次加1                  
  91.                         if(s1num==1)           //
  92.                         {
  93.                        tt=0;
  94.                                 aa=100;
  95.                                 IN1=1;           //
  96.                                 IN2=0;
  97.                         }
  98.                         if(s1num==2)            //
  99.                         {
  100.                        
  101.                                 tt=0;
  102.                                 aa=200;
  103.                                 IN1=1;                //
  104.                                 IN2=0;
  105.                         }
  106.                          if(s1num==3)           //
  107.                         {
  108.                                 s1num=0;     //清零下次計(jì)算
  109.                                 IN1=1;               
  110.                                 IN2=0;
  111.                         }
  112.                        
  113.                 }
  114.    }              
  115.             
  116. }


  117. void init()
  118. {      
  119.         dula=0;
  120.         wela=0;
  121.         lcden=1;      
  122.         IN1=1;
  123.         IN2=0;
  124.         write_com(0x38);   //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  125.         write_com(0x0c);   //設(shè)置開顯示,不顯示光標(biāo)
  126.         write_com(0x06);   // 寫一個(gè)字符后地址指針加1
  127.         write_com(0x01);   //顯示清0,數(shù)據(jù)指針清0
  128.         write_com(0x80);   //通電時(shí),指針知道顯示屏第一行首位處
  129.         TMOD=0x21;                   //
  130.         TH1=(65536-917)/256;         //定時(shí)器1賦初值100us
  131.         TL1=(65536-917)%256;
  132.         TH0=(65536-45872)/256;         //定時(shí)器0賦初值50ms
  133.         TL0=(65536-45872)%256;
  134.         ET1=1;          //         定時(shí)器1打開
  135.         ET0=1;          //         定時(shí)器0打開
  136.         TR0=1;          //         啟動(dòng)定時(shí)器0
  137.         TR1=1;           //           啟動(dòng)定時(shí)器1
  138.         EA=1;          //         打開總中斷
  139. }


  140. void main()
  141. {
  142.         init();                  //初始化
  143.         display_sym();        //上電時(shí),顯示v:    m:                          
  144.         while(1)
  145.         {
  146.                 keyscan();                   //按鍵掃描,實(shí)現(xiàn)轉(zhuǎn)速轉(zhuǎn)向調(diào)節(jié)的功能                                         
  147.         }         
  148. }


  149. void timer0()interrupt 1                  //
  150. {
  151.         TH0=(65536-45872)/256;        //每次中斷為50ms
  152.         TL0=(65536-45872)%256;
  153.          tt++;
  154.          
  155.         if(tt<aa)           
  156.                 IN1=1;
  157.         else
  158.         IN1=0;


  159.         if(tt==2*aa)
  160.                 tt=0;      
  161. }




  162. void timer1()interrupt 3                //該定時(shí)器1用于占空比調(diào)速
  163. {


  164.          
  165.            TH1=(65536-917)/256;                //重新裝入初值 100us
  166.                TL1=(65536-917)%256;
  167.                  t++;                //每產(chǎn)生一次中斷+1
  168.                 if(t<zkb)                //當(dāng)占空比大于t時(shí),輸出高電平,否則輸出低電平
  169.                 ENA=1;                       //在t<zkb時(shí),使能端開啟,否則使能端關(guān)閉
  170.                 else
  171.                 ENA=0;
  172.                 if(t>=100)
  173.                 t=0;
  174.                   
  175. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:484259 發(fā)表于 2019-3-4 15:38 | 只看該作者
漏說了,注釋沒寫好,是第二個(gè)if那里出問題,對應(yīng)的是定時(shí)器0那里。
回復(fù)

使用道具 舉報(bào)

板凳
ID:484259 發(fā)表于 2019-3-4 18:34 | 只看該作者
現(xiàn)在發(fā)現(xiàn)好像是定時(shí)器0溢出標(biāo)志位tt溢出次數(shù)太多會出錯(cuò),達(dá)到某個(gè)溢出數(shù)后,tt就會自動(dòng)清零
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表