久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

這個(gè)單片機(jī)程序不知道什么原因,風(fēng)扇不能在溫度上限值切換高檔風(fēng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:900636 發(fā)表于 2022-5-23 20:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535
  4. #include <intrins.h>

  5. sbit dq   = P3^7;        //18b20 IO口的定義
  6. sbit IN1   = P1^0;          //電機(jī)使用到邏輯IN口
  7. uint temperature ;  //
  8. bit flag_200ms ;

  9. bit flag_lj_en;                 //按鍵連加使能
  10. bit flag_lj_3_en;         //按鍵連3次連加后使能  加的數(shù)就越大了
  11. uchar key_time,key_value;      //用做連加的中間變量
  12. bit key_500ms  ;
  13. sbit hw = P3^6;                   //人體紅外感應(yīng)引腳
  14. uchar miao = 0;
  15. uchar flag_en;
  16. sbit beep=P2^4;                        //蜂鳴器
  17. uchar code table_num[]="0123456789abcdefg";

  18. sbit RS=P2^6;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  19. sbit RW=P2^5;         //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器          L:指令寄存器
  20. sbit E =P2^7;         //片選信號(hào)   下降沿觸發(fā)

  21. sbit pwm = P1^2;            //電機(jī)轉(zhuǎn)速引腳
  22. uchar f_pwm_l ;          //

  23. uchar menu_1;        //菜單設(shè)計(jì)的變量
  24. uint t_high = 300,t_low = 200;                   //初始化最高溫度設(shè)置值為30度,最低溫度設(shè)置值為20度

  25. /***********************1ms延時(shí)函數(shù)*****************************/
  26. void delay_1ms(uint q)
  27. {
  28.         uint i,j;
  29.         for(i=0;i<q;i++)
  30.                 for(j=0;j<110;j++);
  31. }

  32. /********************************************************************
  33. * 名稱 : delay_uint()
  34. * 功能 : 小延時(shí)。
  35. * 輸入 : 無(wú)
  36. * 輸出 : 無(wú)
  37. ***********************************************************************/
  38. void delay_uint(uint q)
  39. {
  40.         while(q--);
  41. }

  42. /********************************************************************
  43. * 名稱 : write_com(uchar com)
  44. * 功能 : 1602命令函數(shù)
  45. * 輸入 : 輸入的命令值
  46. * 輸出 : 無(wú)
  47. ***********************************************************************/
  48. void write_com(uchar com)
  49. {
  50.         E=0;
  51.         RS=0;
  52.         RW=0;
  53.         P0=com;
  54.         delay_uint(25);
  55.         E=1;
  56.         delay_uint(100);
  57.         E=0;
  58. }

  59. /********************************************************************
  60. * 名稱 : write_data(uchar dat)
  61. * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
  62. * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
  63. * 輸出 : 無(wú)
  64. ***********************************************************************/
  65. void write_data(uchar dat)
  66. {
  67.         E=0;
  68.         RS=1;
  69.         RW=0;
  70.         P0=dat;
  71.         delay_uint(25);
  72.         E=1;
  73.         delay_uint(100);
  74.         E=0;      
  75. }

  76. /********************************************************************
  77. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  78. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  79.                   write_string(1,5,"ab cd ef;")
  80. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  81. * 輸出 : 無(wú)
  82. ***********************************************************************/
  83. void write_string(uchar hang,uchar add,uchar *p)
  84. {
  85.         if(hang==1)   
  86.                 write_com(0x80+add);
  87.         else
  88.                 write_com(0x80+0x40+add);
  89.         while(1)
  90.         {
  91.                 if(*p == '\0')  break;
  92.                 write_data(*p);
  93.                 p++;
  94.         }      
  95. }

  96. /***********************lcd1602上顯示特定的字符************************/
  97. void write_zifu(uchar hang,uchar add,uchar date)
  98. {
  99.         if(hang==1)   
  100.                 write_com(0x80+add);
  101.         else
  102.                 write_com(0x80+0x40+add);
  103.         write_data(date);      
  104. }

  105. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  106. void write_sfm3_18B20(uchar hang,uchar add,uint date)
  107. {
  108.         if(hang==1)   
  109.                 write_com(0x80+add);
  110.         else
  111.                 write_com(0x80+0x40+add);
  112.         write_data(0x30+date/100%10);
  113.          
  114.         write_data(0x30+date/10%10);
  115.           write_data('.');
  116.         write_data(0x30+date%10);      
  117. }

  118. /***********************lcd1602初始化設(shè)置************************/
  119. void init_1602()
  120. {
  121.         write_com(0x38);        //
  122.         write_com(0x0c);
  123.         write_com(0x06);
  124.         delay_uint(1000);
  125.         write_string(1,0,"temp:           ");      
  126.         write_string(2,0,"H:      L:       ");
  127.         write_sfm3_18B20(2,2,t_high);      
  128.         write_sfm3_18B20(2,10,t_low);                              
  129.         write_zifu(1,9,0xdf);  //顯示度      
  130. }

  131. /***********************18b20初始化函數(shù)*****************************/
  132. void init_18b20()
  133. {         
  134.         bit q;
  135.         EA=0;
  136.         dq = 1;                                //把總線拿高
  137.         delay_uint(1);            //15us
  138.         dq = 0;                                //給復(fù)位脈沖
  139.         delay_uint(80);                //750us
  140.         dq = 1;                                //把總線拿高 等待
  141.         delay_uint(10);                //110us
  142.         q = dq;                                //讀取18b20初始化信號(hào)
  143.         delay_uint(20);                //200us
  144.         dq = 1;                                //把總線拿高 釋放總線
  145.         EA=1 ;
  146. }

  147. /*************寫(xiě)18b20內(nèi)的數(shù)據(jù)***************/
  148. void write_18b20(uchar dat)
  149. {         
  150.         uchar i;
  151.         EA=0;
  152.         for(i=0;i<8;i++)
  153.         {                                         //寫(xiě)數(shù)據(jù)是低位開(kāi)始
  154.                 dq = 0;                         //把總線拿低寫(xiě)時(shí)間隙開(kāi)始
  155.                 dq = dat & 0x01; //向18b20總線寫(xiě)數(shù)據(jù)了
  156.                 delay_uint(5);         // 60us
  157.                 dq = 1;                         //釋放總線
  158.                 dat >>= 1;
  159.         }
  160.         EA=1;      
  161. }

  162. /*************讀取18b20內(nèi)的數(shù)據(jù)***************/
  163. uchar read_18b20()
  164. {         
  165.         uchar i,value;
  166.         EA=0 ;
  167.         for(i=0;i<8;i++)
  168.         {
  169.                 dq = 0;                         //把總線拿低讀時(shí)間隙開(kāi)始
  170.                 value >>= 1;         //讀數(shù)據(jù)是低位開(kāi)始
  171.                 dq = 1;                         //釋放總線
  172.                 if(dq == 1)                 //開(kāi)始讀寫(xiě)數(shù)據(jù)
  173.                         value |= 0x80;
  174.                 delay_uint(7);         //60us        讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
  175.         }
  176.         EA=1  ;
  177.         return value;                 //返回?cái)?shù)據(jù)
  178. }


  179. /*************讀取溫度的值 讀出來(lái)的是小數(shù)***************/
  180. uint read_temp()
  181. {         
  182.         uint value;
  183.         uchar low;                           //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
  184.         EA=0;
  185.         init_18b20();                   //初始化18b20

  186.         write_18b20(0xcc);           //跳過(guò)64位ROM
  187.         write_18b20(0x44);           //啟動(dòng)一次溫度轉(zhuǎn)換命令
  188.          delay_uint(50);                   //500us

  189.         init_18b20();                   //初始化18b20

  190.         write_18b20(0xcc);           //跳過(guò)64位ROM
  191.         write_18b20(0xbe);           //發(fā)出讀取暫存器命令

  192.         low = read_18b20();           //讀溫度低字節(jié)
  193.         value = read_18b20();  //讀溫度高字節(jié)

  194.         value <<= 8;                   //把溫度的高位左移8位
  195.         value |= low;                   //把讀出的溫度低位放到value的低八位中
  196.         value *=0.625 ;               //轉(zhuǎn)換到溫度值 小數(shù)
  197.         EA=1;
  198.         return value;                   //返回讀出的溫度 帶小數(shù)
  199. }

  200. /*************定時(shí)器0初始化程序***************/
  201. void time_init()         
  202. {
  203.         EA   = 1;                   //開(kāi)總中斷
  204.         TMOD = 0X21;          //定時(shí)器0、定時(shí)器1工作方式1
  205.         ET0  = 1;                  //開(kāi)定時(shí)器0中斷
  206.         TR0  = 1;                  //允許定時(shí)器0定時(shí)
  207.         ET1  = 1;                  //開(kāi)定時(shí)器0中斷
  208.         TR1  = 1;                  //允許定時(shí)器0定時(shí)
  209. }

  210. /********************獨(dú)立按鍵程序*****************/
  211. uchar key_can;         //按鍵值

  212. void key()             //獨(dú)立按鍵程序
  213. {         
  214.         static uchar key_new;
  215.          
  216.         key_can = 20;               //按鍵值還原
  217.          P1 |= 0xf0;
  218.         if(key_500ms == 1)        //連加
  219.         {
  220.                 key_500ms = 0;
  221.                 key_new = 1;
  222.         }
  223.         if((P1 & 0xf0) != 0xf0)                //按鍵按下
  224.         {
  225.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  226.                 if(((P1 & 0xf0) != 0xf0) && (key_new == 1))
  227.                 {                                                //確認(rèn)是按鍵按下
  228.                         key_new = 0;
  229.                         switch(P1 & 0xf0)
  230.                         {
  231.                                 case 0xe0: key_can = 1; break;           //得到k1鍵值
  232.                                 case 0xd0: key_can = 2; break;           //得到K2鍵值
  233.                                 case 0xb0: key_can = 3; break;           //得到k3鍵值
  234.                         }
  235.                         flag_lj_en = 1;         //連加使能
  236.                 }                       
  237.         }
  238.         else
  239.         {
  240.                         if(key_new == 0)
  241.                 {
  242.                         key_new = 1;
  243.                         flag_lj_en = 0;                //關(guān)閉連加使能
  244.                         flag_lj_3_en = 0;        //關(guān)閉3秒后使能
  245.                         key_value = 0;                //清零
  246.                         key_time = 0;
  247.                         key_500ms = 0;
  248.                 }
  249.         }

  250. }


  251. /****************按鍵顯示函數(shù)***************/
  252. void key_with()
  253. {         
  254.       
  255.         if(key_can == 1)           //K1設(shè)置鍵
  256.         {         
  257.                 menu_1 ++;
  258.                 if(menu_1 >= 3)
  259.                 {
  260.                         menu_1 = 0;
  261.                 }
  262.                 if(menu_1 == 0)
  263.                 {
  264.                         write_com(0x0c);                //關(guān)閉光標(biāo)
  265.                 }
  266.         }
  267.         if(menu_1 == 1)                        //設(shè)置高溫報(bào)警
  268.         {
  269.                 if(key_can == 2)
  270.                 {
  271.                         if(flag_lj_3_en == 0)
  272.                                 t_high ++ ;                //按鍵按下未松開(kāi)自動(dòng)加三次      
  273.                         else
  274.                                 t_high += 10;        //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
  275.                         if(t_high > 990)
  276.                                 t_high = 990;
  277.                 }
  278.                 if(key_can == 3)                   //K3
  279.                 {
  280.                         if(flag_lj_3_en == 0)
  281.                                 t_high -- ;                //按鍵按下未松開(kāi)自動(dòng)減三次      
  282.                         else
  283.                                 t_high -= 10;        //按鍵按下未松開(kāi)自動(dòng)減三次之后每次自動(dòng)減10
  284.                         if(t_high <= t_low)
  285.                                 t_high = t_low + 1;
  286.                 }               
  287.                 write_sfm3_18B20(2,2,t_high);
  288.                 write_com(0x80+0x40+2);             //將光標(biāo)移動(dòng)到秒個(gè)位
  289.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍      
  290.         }      
  291.         if(menu_1 == 2)                        //設(shè)置低溫報(bào)警
  292.         {
  293.                 if(key_can == 2)                          //K2
  294.                 {
  295.                         if(flag_lj_3_en == 0)
  296.                                 t_low ++ ;                        //按鍵按下未松開(kāi)自動(dòng)加三次      
  297.                         else
  298.                                 t_low += 10;                //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
  299.                         if(t_low >= t_high)
  300.                                 t_low = t_high - 1;
  301.                 }
  302.                 if(key_can == 3)
  303.                 {
  304.                         if(flag_lj_3_en == 0)
  305.                                 t_low -- ;                        //按鍵按下未松開(kāi)自動(dòng)減三次      
  306.                         else
  307.                                 t_low -= 10;                //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
  308.                         if(t_low <= 10)
  309.                                 t_low = 10;
  310.                 }
  311.                 write_sfm3_18B20(2,10,t_low);
  312.                 write_com(0x80+0x40+10);            //將光標(biāo)移動(dòng)到秒個(gè)位
  313.                 write_com(0x0f);                    //顯示光標(biāo)并且閃爍      
  314.         }
  315.       
  316. }

  317. /****************風(fēng)扇控制函數(shù)***************/
  318. void fengshan_kz()
  319. {        if(flag_en == 1)
  320.         {
  321.            IN1=0;

  322.            if(temperature >= t_high)          //風(fēng)扇全開(kāi)
  323.            {         
  324.                  
  325.                   f_pwm_l = 60;
  326.                   pwm = 1;
  327.                   TR1 = 1;
  328.                   write_string(1,10," high ");
  329.            }
  330.            else if((temperature < t_high)        && (temperature >= t_low))                   //風(fēng)扇緩慢
  331.            {         
  332.                   
  333.                   f_pwm_l =61;
  334.                   pwm = 0;
  335.                   TR1 = 1;
  336.                   write_string(1,10," slow ");               
  337.            }
  338.           else if(temperature < t_low)         //關(guān)閉風(fēng)扇
  339.           {
  340.                 TR1 = 0;
  341.                 pwm = 1;
  342.                 write_string(1,10,"close");
  343.           }
  344.         }
  345.         else
  346.         {
  347.             TR1 = 0;
  348.                 pwm = 1;
  349.                 IN1=1;
  350.                 write_string(1,10,"noman");
  351.         }                       
  352. }               

  353. /****************主函數(shù)***************/
  354. void main()
  355. {         static uchar value;
  356.           IN1=0;
  357.         time_init();                    //初始化定時(shí)器
  358.         init_1602();                    //1602初始化
  359.           temperature = read_temp();        //先讀出溫度的值
  360.                         write_sfm3_18B20(1,5,temperature);      
  361.                                        
  362.         while(1)
  363.         {
  364.            if(flag_200ms == 1)            //200ms 處理一次溫度程序
  365.                 {      
  366.                   TR1=0;
  367.                   key();                                        //按鍵程序
  368.                           
  369.                   if(key_can < 10)
  370.                    {
  371.                         key_with();                             //設(shè)置報(bào)警溫度      
  372.                    }                  
  373.                   temperature = read_temp();        //先讀出溫度的值
  374.                        
  375.                   write_sfm3_18B20(1,5,temperature);
  376.                
  377.                               
  378.                   fengshan_kz();        //風(fēng)扇控制函數(shù)
  379.                   value ++;
  380.                         if(value >= 4)
  381.                         {
  382.                                 value = 0;
  383.                                 if(miao != 0)
  384.                                 {
  385.                                         miao --;    //時(shí)間減1
  386.                                 }
  387.                                 if(miao == 0)
  388.                                           
  389.                                                          
  390.                                         flag_en = 0;
  391.                         }
  392.                         if(hw == 1)  //感應(yīng)到人
  393.                         {         
  394.                            if(miao==0)
  395.                         {
  396.                                    beep=0;
  397.                                delay_1ms(500);
  398.                                beep=1;
  399.                                 }
  400.                                 miao = 60;
  401.                                 flag_en = 1;
  402.                         }
  403.                  }
  404.         }
  405. }

  406. /*************定時(shí)器0中斷服務(wù)程序***************/
  407. void time0_int() interrupt 1
  408. {      
  409.         static uchar value;

  410.         TH0 = 0x0c;
  411.         TL0 = 0xb0;     // 50ms
  412.         value ++;         
  413.         if(value % 4 == 0)
  414.         {
  415.                 flag_200ms = 1;           //300ms
  416.                 value = 0;
  417.         }

  418.         if(flag_lj_en == 1)           //按下按鍵使能
  419.         {
  420.                 key_time ++;
  421.                 if(key_time >= 10) //500ms
  422.                 {
  423.                         key_time = 0;
  424.                         key_500ms = 1; //500ms
  425.                         key_value ++;
  426.                         if(key_value > 3)
  427.                         {
  428.                                 key_value = 10;
  429.                                 flag_lj_3_en = 1; //3次后1.5秒連加大些
  430.                         }                                               
  431.                 }
  432.         }
  433. }

  434. /*******************定時(shí)器1用做單片機(jī)模擬PWM 調(diào)節(jié)***********************/
  435. void Timer1() interrupt 3  //調(diào)用定時(shí)器1
  436. {
  437.         static uchar value_l;
  438.         TH1=0x3c;    //  
  439.         TL1=0xb0;         //
  440.         if(pwm==1)
  441.         {
  442.                 value_l+=1;
  443.                 if(value_l > f_pwm_l)   //高電平
  444.              {
  445.                         value_l=0;
  446.                         pwm=0;         
  447.                  }
  448.         }
  449.         else                              
  450.         {
  451.                 value_l+=1;
  452.                 if(value_l  > 100-f_pwm_l)                  //低電平
  453.                  {         
  454.                     value_l=0;
  455.                         pwm=1;
  456.                  }
  457.     }
  458. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:390416 發(fā)表于 2022-5-23 22:57 | 只看該作者
溫馨提醒,風(fēng)扇變速 建議通過(guò)調(diào)整串聯(lián)電容容量大小 來(lái)調(diào)速,這樣無(wú)噪聲。任何晶閘管調(diào)速方式 都會(huì)有噪聲
回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 2022-5-24 15:03 | 只看該作者
356行 f_pwm_l = 60;//風(fēng)扇全開(kāi)
364行 f_pwm_l =61;//風(fēng)扇緩慢
這相差1是差多少?

你的模擬PWM寫(xiě)法也太累贅了吧?

  1. void Timer1() interrupt 3  //調(diào)用定時(shí)器1
  2. {
  3.         static uchar value_l;
  4.         TH1=0x3c;    //
  5.         TL1=0xb0;         //
  6.         value_l += 1;
  7.         if(value_l >=100)
  8.         {
  9.                 value_l=0;
  10.         }
  11.         if(value_l > f_pwm_l)
  12.         {
  13.                 pwm=0;
  14.         }
  15.         else
  16.         {
  17.                 pwm=1;
  18.         }
  19. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

地板
ID:900636 發(fā)表于 2022-5-24 18:03 | 只看該作者
lkc8210 發(fā)表于 2022-5-24 15:03
356行 f_pwm_l = 60;//風(fēng)扇全開(kāi)
364行 f_pwm_l =61;//風(fēng)扇緩慢
這相差1是差多少?

我網(wǎng)上找的代碼,這部分我也沒(méi)看懂
回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2022-5-24 21:36 | 只看該作者
晨曦未了 發(fā)表于 2022-5-24 18:03
我網(wǎng)上找的代碼,這部分我也沒(méi)看懂

你沒(méi)看懂但不會(huì)改一下數(shù)值試一下嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:900636 發(fā)表于 2022-5-26 13:52 | 只看該作者
lkc8210 發(fā)表于 2022-5-24 21:36
你沒(méi)看懂但不會(huì)改一下數(shù)值試一下嗎?

都試過(guò)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产一区二区三区 | 久久成人人人人精品欧 | 国产精品亚洲综合 | 天天拍天天射 | 亚洲一区国产精品 | 欧美九九| 夜夜操操操 | 不卡在线一区 | 成人免费视频在线观看 | 999久久久| 六月色婷| 三级黄色大片网站 | 亚洲精品中文在线观看 | 一久久久| 久久久久久中文字幕 | 久草视频在线播放 | 99伊人 | 国产精品伦理一区二区三区 | 亚洲最新网址 | 日韩成人在线一区 | 久久精品视频一区二区 | 美日韩中文字幕 | 求个av网址 | 午夜免费观看 | 色吧久久 | 亚洲黄色av| 中文无吗| 国产欧美一区二区在线观看 | 亚洲一区高清 | 欧美国产日韩成人 | 色视频网站免费 | 久久久www成人免费无遮挡大片 | av在线亚洲天堂 | 三级在线视频 | 午夜网| 一本岛道一二三不卡区 | 欧美日韩视频网站 | 国产成人一区二区 | 美女在线视频一区二区三区 | 午夜精品久久久久久久星辰影院 | 美女一级黄|