标题: 51单片机温度+pwm控制风扇转速,且温度在LCD1602上显示 [打印本页]

作者: hs812277147    时间: 2020-7-1 11:17
标题: 51单片机温度+pwm控制风扇转速,且温度在LCD1602上显示
原理图如下:

源代码如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"define.h"
  4. #include"delay.h"
  5. #include"LCD1602.h"
  6. #include"DS18B20.h"
  7. #include"HL_alarm.h"
  8. sbit KEY3 = P3^5;                //定义开始/停止
  9.   void zhuan();
  10.   unsigned char timer1;
  11. //***********************************************************************/

  12. void main()
  13. {  if(KEY3==0)            //第一次检测是否有键按下
  14.     {   
  15.     PWM=0;MA=~MA;MB=~MB;
  16.     delay(1);
  17.     return;   
  18. }
  19. else
  20.     {LCD_init();
  21.     set_alarm_HL();
  22.     DS_read_temperature();
  23.     TMOD=0x01;
  24.     TH0=-50000/256;
  25.     TL0=-50000%256;
  26.     EA=1;
  27.     ET0=1;
  28.     TR0=1;
  29.     while(1)
  30.     {}
  31. }
  32. }
  33. void timer0() interrupt 1
  34. { if(KEY3==0)            //第一次检测是否有键按下
  35.     {     TH0=-50000/256;
  36.     TL0=-50000%256;
  37.     DS_read_temperature();//读取温度
  38.     if((HI_alarm==1)||(LO_alarm==1))
  39.         alarm();
  40.     if(DS_OK==0)
  41.         return;//如果读取错误,返回从新再读
  42.     display_temperature();
  43.     buffer_line1[10]='S';//*********修改成STOP
  44.     buffer_line1[11]='T';
  45.     buffer_line1[12]='O';
  46.     buffer_line1[13]='P';
  47. PWM=0;MA=~MA;MB=~MB;
  48.     delay(1);
  49.     return;
  50. }
  51. else
  52. {
  53.     TH0=-50000/256;
  54.     TL0=-50000%256;
  55.     DS_read_temperature();//读取温度
  56.     if((HI_alarm==1)||(LO_alarm==1))
  57.         alarm();
  58.     if(DS_OK==0)
  59.         return;//如果读取失败,返回重新再读
  60.     display_temperature();
  61.     if(sign_temp<=50&&sign_temp>=15)
  62.     {
  63.         MA=1;
  64.         MB=0;
  65.         if(sign_temp<25) //等于45或65时停止转动,占空比0
  66.         {    buffer_line1[10]='S';//*********修改成STOP
  67.             buffer_line1[11]='T';
  68.             buffer_line1[12]='O';
  69.             buffer_line1[13]='P';
  70.             PWM=0;
  71.             delay(1);
  72.             return;
  73.         }
  74.           buffer_line1[10]='R';//*********修改成RUN
  75.         buffer_line1[11]='U';
  76.         buffer_line1[12]='N';
  77.         buffer_line1[13]=' ';
  78.          zhuan();
  79.     }
  80.         else
  81.         {
  82.             MA=0;
  83.             MB=0;
  84.         }
  85.     }
  86. }
  87.   void zhuan()
  88.   {
  89.     TMOD|= 0x10;   //设置定时计数器工作方式1为定时器
  90.     TH1 = 0xFE;
  91.     TL1 = 0x0C;             //--定时器赋初始值,12MHZ下定时0.5ms--//
  92.     ET1 = 1;      //开启定时器1中断
  93.     EA = 1;
  94.     TR1 = 1;     //开启定时器
  95.    
  96.         if(timer1>50)  //PWM周期为50*0.5ms
  97.         {
  98.             timer1=0;
  99.         }
  100.         if(timer1 < sign_temp)    //改变sign_temp这个值可以改变直流电机的速度
  101.         {
  102.             PWM=1;
  103.         }
  104.         else
  105.         {
  106.             PWM=0;
  107.         }
  108.     }

  109. void Time1(void) interrupt 3    //3为定时器1的中断号 1 定时器0的中断器 0外部中断 1 2外部中断 2 4串口中断
  110.     {
  111.     TH1 = 0xFE;  //重新赋初值
  112.     TL1 = 0x0C;
  113.     timer1++;   
  114.     }
复制代码
全部资料51hei下载地址:
温控风扇改进PWM.7z (91.23 KB, 下载次数: 106)




作者: jemery1030    时间: 2020-9-2 13:35
剛剛看到另一個資料,兩個資料似乎是相近的,下載來研究。
作者: #include51.h    时间: 2020-9-2 15:08
这是个好东西啊!非常值得研究一下!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1