找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 38837|回复: 53
收起左侧

智能温控风扇单片机源程序+实物图+原理图

  [复制链接]
ID:170114 发表于 2017-4-5 21:26 | 显示全部楼层 |阅读模式
51单片机做的温控风扇实物图:

温控风扇

温控风扇


智能温控风扇原理图:
温控风扇原理图.png

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  4. #include <intrins.h>
  5. #define RdCommand 0x01 //定义ISP的操作命令
  6. #define PrgCommand 0x02
  7. #define EraseCommand 0x03  
  8. #define Error 1
  9. #define Ok 0
  10. #define WaitTime 0x01 //定义CPU的等待时间
  11. sfr ISP_DATA=0xe2;        //Flash数据寄存器地址(E2h)
  12. sfr ISP_ADDRH=0xe3;         //Flash高字节寄存器地址(E3h)
  13. sfr ISP_ADDRL=0xe4;        //Flash低字节寄存器地址(E4h)
  14. sfr ISP_CMD=0xe5;  //Flash命令模式寄存器地址(E5h)
  15. sfr ISP_TRIG=0xe6;        //Flash命令触发寄存器地址(E6h)
  16. sfr ISP_CONTR=0xe7;        //ISP/IAP控制寄存器地址(E2h)
  17. sbit dula=P2^6;//U1锁存器的锁存端                   000001111111     显示函数   11111100000
  18. sbit wela=P2^7;//申明U2锁存器的锁存
  19. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
  20. 0x39,0x5e,0x79,0x71};                                          
  21. uchar num;//定时器要用到
  22. void ISP_IAP_enable(void);        /* ================ 打开 ISP,IAP 功能 ================= */
  23. void ISP_IAP_disable(void);        /* =============== 关闭 ISP,IAP 功能 ================== */
  24. void ISPgoon(void);                        /* ================ 公用的触发代码 ==================== */
  25. uchar byte_read(unsigned int byte_addr);   /* ========= 字节读 ============= */
  26. void SectorErase(unsigned int sector_addr);        /* =========== 扇区擦除 ============ */
  27. void byte_write(unsigned int byte_addr, unsigned char original_data);  /* ==== 字节写 ==== */
  28. void display(); //000033333    显示函数  3333300000//

  29. //数码管段选定义      0     1    2    3    4    5        6         7          8           9        
  30. uchar code smg_du[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,
  31.                                            0x60,0x25,0x39,0x26,0x31,0x71,0xff};         //断码
  32. //数码管位选定义
  33. uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
  34. uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};        
  35. uchar smg_i = 3;    //显示数码管的个位数
  36. sbit dq   = P2^4;        //18b20 IO口的定义
  37. sbit pwm = P2^3;   //蜂鸣器IO口定义

  38. bit flag_lj_en;                 //按键连加使能
  39. bit flag_lj_3_en;         //按键连3次连加后使能  加的数就越大了
  40. uchar key_time,key_value;      //用做连加的中间变量
  41. bit key_500ms  ;

  42. uchar f_pwm_l ;          //越小越暗
  43. uint temperature ;  //
  44. bit flag_300ms ;
  45. uchar menu_1,a_a ;       //菜单设计的变量
  46. uint t_high ,t_low;           //温度上下限报警值

  47. /***********************1ms延时函数*****************************/
  48. void delay_1ms(uint q)
  49. {
  50.         uint i,j;
  51.         for(i=0;i<q;i++)
  52.                 for(j=0;j<120;j++);
  53. }

  54. /***********************小延时函数*****************************/
  55. void delay_uint(uint q)
  56. {
  57.         while(q--);
  58. }  


  59. /***********************数码显示函数*****************************/
  60. void display()
  61. {
  62.         static uchar i;   
  63.         i++;
  64.         if(i >= smg_i)
  65.                 i = 0;        
  66.         P1 = 0xff;                         //消隐
  67.         P3 = smg_we[i];                          //位选
  68.         P1 = dis_smg[i];                 //段选               

  69. }


  70. /***********************18b20初始化函数*****************************/
  71. void init_18b20()
  72. {
  73.         bit q;
  74.         dq = 1;                                //把总线拿高
  75.         delay_uint(1);            //15us
  76.         dq = 0;                                //给复位脉冲
  77.         delay_uint(80);                //750us
  78.         dq = 1;                                //把总线拿高 等待
  79.         delay_uint(10);                //110us
  80.         q = dq;                                //读取18b20初始化信号
  81.         delay_uint(20);                //200us
  82.         dq = 1;                                //把总线拿高 释放总线
  83. }

  84. /*************写18b20内的数据***************/
  85. void write_18b20(uchar dat)
  86. {
  87.         uchar i;
  88.         for(i=0;i<8;i++)
  89.         {                                         //写数据是低位开始
  90.                 dq = 0;                         //把总线拿低写时间隙开始
  91.                 dq = dat & 0x01; //向18b20总线写数据了
  92.                 delay_uint(5);         // 60us
  93.                 dq = 1;                         //释放总线
  94.                 dat >>= 1;
  95.         }        
  96. }

  97. /*************读取18b20内的数据***************/
  98. uchar read_18b20()
  99. {
  100.         uchar i,value;
  101.         for(i=0;i<8;i++)
  102.         {
  103.                 dq = 0;                         //把总线拿低读时间隙开始
  104.                 value >>= 1;         //读数据是低位开始
  105.                 dq = 1;                         //释放总线
  106.                 if(dq == 1)                 //开始读写数据
  107.                         value |= 0x80;
  108.                 delay_uint(5);         //60us        读一个时间隙最少要保持60us的时间
  109.         }
  110.         return value;                 //返回数据
  111. }

  112. /*************读取温度的值 读出来的是小数***************/
  113. uint read_temp()
  114. {
  115.         uint value;
  116.         uchar low;                           //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序

  117.         TR1=0;                                   //关掉中断
  118.         init_18b20();                   //初始化18b20
  119.         write_18b20(0xcc);           //跳过64位ROM
  120.         write_18b20(0x44);           //启动一次温度转换命令
  121.         delay_uint(50);                   //500us

  122.         init_18b20();                   //初始化18b20
  123.         
  124.         write_18b20(0xcc);           //跳过64位ROM
  125.         write_18b20(0xbe);           //发出读取暂存器命令
  126.         
  127.         EA = 0;
  128.         low = read_18b20();           //读温度低字节
  129.         value = read_18b20();  //读温度高字节
  130.         EA = 1;
  131.         value <<= 8;                   //把温度的高位左移8位
  132.         value |= low;                   //把读出的温度低位放到value的低八位中
  133.         value *= 0.625;               //转换到温度值 小数
  134.         return value;                   //返回读出的温度 带小数
  135. }

  136. /*************定时器0初始化程序***************/
  137. void time_init()         
  138. {
  139.         EA   = 1;                   //开总中断
  140.         TMOD = 0X01;          //定时器0、定时器1工作方式1
  141.         ET0  = 1;                  //开定时器0中断
  142.         TR0  = 1;                  //允许定时器0定时
  143.         menu_1 = 0 ;
  144.         ET1  = 1;                  //开定时器0中断
  145.         TR1  = 1;                  //允许定时器0定时
  146. }

  147. /********************独立按键程序*****************/
  148. uchar key_can;         //按键值

  149. void key()         //独立按键程序
  150. {
  151.         static uchar key_new;
  152.         key_can = 20;                   //按键值还原
  153.         P2 |= 0x07;
  154.         if((P2 & 0x07) != 0x07)                //按键按下
  155.         {
  156.                 if(key_500ms == 1)        //连加
  157.                 {
  158.                         key_500ms = 0;
  159.                         key_new = 1;
  160.                 }
  161.                 delay_1ms(1);                     //按键消抖动
  162.                 if(((P2 & 0x07) != 0x07) && (key_new == 1))
  163.                 {                                                //确认是按键按下
  164.                         key_new = 0;
  165.                         switch(P2 & 0x07)
  166.                         {
  167.                                 case 0x06: key_can = 3; break;           //得到k2键值
  168.                                 case 0x05: key_can = 2; break;           //得到k3键值
  169.                                 case 0x03: key_can = 1; break;           //得到k4键值
  170.                         }
  171.                         flag_lj_en = 1;         //连加使能
  172.                 }                        
  173.         }
  174.         else
  175.         {
  176.                 if(key_new == 0)
  177.                 {
  178.                         key_new = 1;
  179.                          SectorErase(0x2e00);//擦除扇区命令                  擦2
  180.                            byte_write(0x2e00,t_high%256);//重新写入数据命令  把t_high(温度上限)写入扇区
  181.                      byte_write(0x2e01,t_high/256);
  182.                
  183.                         byte_write(0x2e20,t_low%256);  //                                 把t_low(温度下限)写入扇区
  184.                         byte_write(0x2e21,t_low/256);
  185.                         
  186.                          byte_write(0x2e55,a_a);  //                                 把a-a的值写入扇区
  187.                         flag_lj_en = 0;                //关闭连加使能
  188.                         flag_lj_3_en = 0;        //关闭3秒后使能
  189.                         key_value = 0;                //清零
  190.                         key_time = 0;
  191.                         key_500ms = 0;
  192.                 }
  193.         }        
  194. }

  195. /****************按键处理数码管显示函数***************/
  196. void key_with()
  197. {
  198.         if(key_can == 1)          //设置键
  199.         {
  200.                 menu_1 ++;
  201.                 if(menu_1 >= 3)
  202.                 {
  203.                         menu_1 = 0;
  204.                         smg_i = 3;                  //数码管显示3位
  205.                 }
  206.         }
  207.         if(menu_1 == 1)                        //设置高温标志位
  208.         {
  209.                 smg_i = 4;                  //数码管显示4位
  210.                 if(key_can == 2)
  211.                 {
  212.                         if(flag_lj_3_en == 0)
  213.                                 t_high ++ ;                //按键按下未松开自动加三次        
  214.                         else
  215.                                 t_high += 10;        //按键按下未松开自动加三次之后每次自动加10
  216.                         if(t_high > 990)
  217.                                 t_high = 990;
  218.                 }
  219.                 if(key_can == 3)
  220.                 {
  221.                         if(flag_lj_3_en == 0)
  222.                                 t_high -- ;                //按键按下未松开自动减三次        
  223.                         else
  224.                                 t_high -= 10;        //按键按下未松开自动减三次之后每次自动减10
  225.                         if(t_high <= t_low)
  226.                                 t_high = t_low + 1;
  227.                 }
  228.                 dis_smg[0] = smg_du[t_high % 10];                   //取小数显示
  229.                 dis_smg[1] = smg_du[t_high/ 10 % 10] & 0xdf;  //取个位显示
  230.                 dis_smg[2] = smg_du[t_high / 100 % 10] ;           //取十位显示
  231.                 dis_smg[3] = 0x64;         //H
  232.         }        
  233.         if(menu_1 == 2)                        //设置低温标志位
  234.         {
  235.                 smg_i = 4;                  //数码管显示4位
  236.                 if(key_can == 2)
  237.                 {
  238.                         if(flag_lj_3_en == 0)
  239.                                 t_low ++ ;                        //按键按下未松开自动加三次        
  240.                         else
  241.                                 t_low += 10;                //按键按下未松开自动加三次之后每次自动加10
  242.                         if(t_low >= t_high)
  243.                                 t_low = t_high - 1;
  244.                 }
  245.                 if(key_can == 3)
  246.                 {
  247.                         if(flag_lj_3_en == 0)
  248.                                 t_low -- ;                        //按键按下未松开自动减三次        
  249.                         else
  250.                                 t_low -= 10;                //按键按下未松开自动加三次之后每次自动加10
  251.                         if(t_low <= 10)
  252.                                 t_low = 10;
  253.                 }
  254.                 dis_smg[0] = smg_du[t_low% 10];                   //取小数显示
  255.                 dis_smg[1] = smg_du[t_low/ 10 % 10] & 0xdf;   //取个位显示
  256.                 dis_smg[2] = smg_du[t_low/ 100 % 10] ;               //取十位显示
  257.                 dis_smg[3] = 0x3D;          //L
  258.         }        
  259. }  

  260. //****************风扇控制函数***************/
  261. void fengshan_kz()
  262. {
  263.         if(temperature >= t_high)          //风扇全开
  264.         {        
  265.                 TR1 = 0;
  266.                 pwm = 0;
  267.         }
  268.         else if((temperature < t_high)        && (temperature >= t_low))                   //风扇缓慢
  269.         {
  270.                 f_pwm_l = 60;         
  271.                 TR1 = 1;
  272.         }
  273.         else if(temperature < t_low)         //关闭风扇
  274.         {
  275.                 TR1 = 0;
  276.                 pwm = 1;
  277.         }                        
  278. }

  279. /****************主函数***************/
  280. void main()
  281. {

  282.         t_high=byte_read(0x2e01);//程序开始时读取EEPROM中的数据(读取上限)
  283.         t_high <<= 8;
  284.         t_high  |= byte_read(0x2e00);
  285.         t_low=byte_read(0x2e21);//        程序开始时读取EEPROM中的数据(读取下限)        
  286.         t_low <<= 8;
  287.         t_low   |= byte_read(0x2e20);
  288.         a_a=byte_read(0x2e55);//        程序开始时读取EEPROM中的数据(读取下限)
  289.         if(a_a!=22) //防止首次上电时读取出错
  290.           {
  291.            
  292.           t_high=150;            //第一次上电温度上限为15.C
  293.            
  294.           t_low=120;         ////第一次上电温度下限为12.C
  295.           a_a=22;

  296.           }         

  297.         delay_1ms(150);
  298.         P0 = P1 = P2 = P3 = 0xff;
  299.         temperature = read_temp();                //先读出温度的值        
  300.         delay_1ms(650);                                
  301.         temperature = read_temp();                         //先读出温度的值
  302.         dis_smg[0] = smg_du[temperature % 10];         //取温度的小数显示
  303.         dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示
  304.         dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取温度的十位显示
  305.         time_init();                    //初始化定时器
  306.         while(1)
  307.         {               
  308.                 key();                                        //按键程序
  309.                 if(key_can < 10)
  310.                 {
  311.                         key_with();                        //设置温度上下限        
  312.                           
  313.                 }
  314.                 if(flag_300ms == 1)            //300ms 处理一次温度程序
  315.                 {           
  316.                         flag_300ms = 0;        
  317.                         temperature = read_temp();        //先读出温度的值

  318.                         if(menu_1 == 0)
  319.                         {        
  320.                                 smg_i = 3;
  321.                                 dis_smg[0] = smg_du[temperature % 10];         //取温度的小数显示
  322.                                 dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取温度的个位显示
  323.                                 dis_smg[2] = smg_du[temperature / 100 % 10] ;           //取温度的十位显示
  324.                         }
  325.                 }
  326.                 fengshan_kz();        //风扇控制函数
  327.         }
  328. }
  329. void ISP_IAP_enable(void) /* ================ 打开 ISP,IAP 功能 ================= */
  330. {
  331. EA = 0;       /* 关中断   */
  332. ISP_CONTR = ISP_CONTR & 0x18;       /* (0001,1000) **ISP/IAP 控制寄存器复位*/
  333. ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */
  334. ISP_CONTR = ISP_CONTR | 0x80;       /*(10000000) ISPEN=1 在ISPEN(ISP_CONTR.7) =1时,
  335.                                                                                  (解释当ISPCONTR的最高位=1时有效,)
  336.                                                                                  对ISP_TRIG (命令触发寄存器)先写入46h,再写入B9h,ISP/IAP命令才会生效。 */
  337. }
  338. void ISP_IAP_disable(void) /* =============== 关闭 ISP,IAP 功能 ================== */
  339. {
  340. ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
  341. ISP_TRIG = 0x00;
  342. EA   =   1;   /* 开中断 */
  343. }
  344. void ISPgoon(void) /* ================ 公用的触发代码 ==================== */
  345. {
  346. ISP_IAP_enable();   /* 打开 ISP,IAP 功能 第47行有定义*/
  347. ISP_TRIG = 0x46;  /* 触发ISP_IAP命令字节1      (解释)在ISPEN(ISP_CONTR.7) =1时,
  348.                                                                                  (解释当ISPCONTR的最高位=1时有效,)
  349.                                                                                  对ISP_TRIG (命令触发寄存器)先写入46h,
  350.                                                                                 再写入B9h,ISP/IAP命令才会生效。 */
  351. ISP_TRIG = 0xb9;  /* 触发ISP_IAP命令字节2 */
  352. _nop_();
  353. }
  354. unsigned char byte_read(unsigned int byte_addr) /* ========= 字节读 ============= */
  355. {
  356. ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 读出byte_addr的高八位;
  357.                                                                                                  如果byte_addr是16位的,就是把byte_addr的高八位
  358.                                                                                                 赋值给一个unsigned char类型的变量:ISP_ADDRH*/
  359. ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /* 读出byte_addr的低八位;*/
  360. ISP_CMD   = ISP_CMD & 0xf8;   /* (11111000)清除低3位  */
  361. ISP_CMD   = ISP_CMD | RdCommand; /* 写入读命令 */
  362. ISPgoon();       /* 触发执行  */
  363. ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  364. return (ISP_DATA);    /* 返回读到的数据 */
  365. }
  366. void SectorErase(unsigned int sector_addr) /* =========== 扇区擦除 ============ */
  367. {
  368. unsigned int iSectorAddr;
  369. iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */
  370. ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
  371. ISP_ADDRL = 0x00;
  372. ISP_CMD = ISP_CMD & 0xf8;   /* 清空低3位 (注释)清楚后待机模式,无ISP操作 */
  373. ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3  前面定义过#define EraseCommand 0x03
  374.                                                                                  (00000011)对用户的应用程序flash区及数据flash
  375.                                                                                 区扇区擦除*/
  376. ISPgoon();       /* 触发执行  */
  377. ISP_IAP_disable();    /* 关闭ISP,IAP功能 */
  378. }
  379. void byte_write(unsigned int byte_addr, unsigned char original_data) /* ==== 字节写 ==== */
  380. {
  381. ISP_ADDRH = (unsigned char)(byte_addr >> 8);  /* 取出高八位  */
  382. ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); /*取出低八位*/
  383. ISP_CMD  = ISP_CMD & 0xf8;    /* 清低3位 意思就是将第三位全部清0再在下边的prgcommand(00000010)
  384.                                                                          进行或运算得(*****010)*/
  385. ISP_CMD  = ISP_CMD | PrgCommand;  /* 写命令2 (注释)(*****010)对用户的应用程序flash
  386.                                                                                                                          区及数据flash区字节编程*/
  387. ISP_DATA = original_data;   /* 写入数据准备 注释:DATA为数据寄存器*/
  388. ISPgoon();       /* 触发执行  */
  389. ISP_IAP_disable();     /* 关闭IAP功能 */
  390. }
  391. /*************定时器0中断服务程序***************/
  392. void time0_int() interrupt 1
  393. {        
  394.         static uchar value;                         //定时2ms中断一次
  395.         TH0 = 0xf8;
  396.         TL0 = 0x30;     //2ms
  397.         display();                //数码管显示函数
  398.         value++;         
  399.         if(value >= 150)
  400.         {
  401.                 value = 0;         
  402.                 flag_300ms = 1;
  403.         }
  404.         if(flag_lj_en == 1)           //按下按键使能
  405.         {
  406.                 key_time ++;
  407.                 if(key_time >= 250) //500ms
  408.                 {
  409.                         key_time = 0;
  410.                         key_500ms = 1; //500ms
  411.                         key_value ++;
  412.                         if(key_value > 3)
  413.                         {
  414.                                 key_value = 10;
  415.                                 flag_lj_3_en = 1; //3次后1.5秒连加大些
  416.                         }                                                
  417.                 }
  418.         }
  419. }
  420. /*******************定时器1用做单片机模拟PWM 调节***********************/
  421. void Timer1() interrupt 3  //调用定时器1
  422. {
  423.         static uchar value_l;
  424.         TH1=0xff;    //    定时中断一次
  425.         TL1=0xec;         //


  426. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

温控风扇的全部源码下载:
风扇.rar (4.78 KB, 下载次数: 742)

评分

参与人数 3黑币 +110 收起 理由
hasaakei + 5 很给力!
lzbbb + 5 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:191052 发表于 2017-4-18 23:23 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:185267 发表于 2017-5-20 16:20 | 显示全部楼层
仿真可以用  可不知道为什么  我的实物风扇多少度都不转
回复

使用道具 举报

ID:94068 发表于 2017-5-24 17:45 | 显示全部楼层
原理图跟程序对应不起来呢
回复

使用道具 举报

ID:199814 发表于 2017-5-27 23:18 | 显示全部楼层
为什么用 protues 仿真 数码全亮 888
回复

使用道具 举报

ID:206031 发表于 2017-5-30 12:19 | 显示全部楼层
不错
支持看看
回复

使用道具 举报

ID:208067 发表于 2017-6-6 21:31 | 显示全部楼层
666
回复

使用道具 举报

ID:159139 发表于 2017-6-8 07:48 来自手机 | 显示全部楼层
学习学习,谢谢楼主的分享。
回复

使用道具 举报

ID:84584 发表于 2017-6-25 15:25 | 显示全部楼层
想知可不可以接风扇的PWM控制速度?
回复

使用道具 举报

ID:194014 发表于 2017-7-3 22:02 | 显示全部楼层
程序是能用的可惜差了一个热释电模块不然就完美了
回复

使用道具 举报

ID:55655 发表于 2017-7-7 10:26 | 显示全部楼层
怎么才能掉电保存。谢谢
回复

使用道具 举报

ID:231084 发表于 2017-9-5 11:05 | 显示全部楼层
请问可以购买吗?
回复

使用道具 举报

ID:244184 发表于 2017-11-6 14:18 | 显示全部楼层
有没有硬件下载啊
回复

使用道具 举报

ID:148076 发表于 2017-11-23 14:03 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

ID:259857 发表于 2017-12-12 16:57 | 显示全部楼层
下载特别麻烦
回复

使用道具 举报

ID:278181 发表于 2018-2-5 11:10 | 显示全部楼层
好的,学习一下。
回复

使用道具 举报

ID:238556 发表于 2018-3-5 16:15 | 显示全部楼层
不错的分享
回复

使用道具 举报

ID:234919 发表于 2018-3-5 20:05 | 显示全部楼层
6666
回复

使用道具 举报

ID:314946 发表于 2018-4-23 22:50 | 显示全部楼层
可以,有需要可以联系我。QQ2509463554
回复

使用道具 举报

ID:315890 发表于 2018-4-25 08:12 | 显示全部楼层
谁可以把这个源程序完整的发给我参考一下吗
回复

使用道具 举报

ID:317432 发表于 2018-4-27 10:37 | 显示全部楼层
cwsinglan 发表于 2017-6-25 15:25
想知可不可以接风扇的PWM控制速度?

可以的,pid现在用得少 而且不好掌握 常用的就是pwm
回复

使用道具 举报

ID:264338 发表于 2018-4-27 20:03 | 显示全部楼层
不错,我打算做一个。谢谢
回复

使用道具 举报

ID:218046 发表于 2018-5-6 10:01 | 显示全部楼层
资料很全,感谢楼主分享
回复

使用道具 举报

ID:304629 发表于 2018-6-7 08:55 | 显示全部楼层
感谢楼主,最近在做pid设计,很好的资料!
回复

使用道具 举报

ID:348191 发表于 2018-6-9 14:27 | 显示全部楼层
哇哇哇楼主厉害了
回复

使用道具 举报

ID:348234 发表于 2018-6-9 15:34 来自手机 | 显示全部楼层
感谢大佬分享
回复

使用道具 举报

ID:349194 发表于 2018-6-11 09:18 | 显示全部楼层
很棒,厉害
回复

使用道具 举报

ID:349552 发表于 2018-6-11 16:00 | 显示全部楼层
大佬求一个简单的温控风扇程序。我是真的不知道咋做
回复

使用道具 举报

ID:349605 发表于 2018-6-11 16:43 | 显示全部楼层
很厉害 学习了
回复

使用道具 举报

ID:349194 发表于 2018-6-17 13:40 | 显示全部楼层
为什么仿真显示的一直是8888
回复

使用道具 举报

ID:370318 发表于 2018-8-16 10:51 | 显示全部楼层
真的不错 顶
回复

使用道具 举报

ID:380389 发表于 2018-8-20 06:28 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:243394 发表于 2018-8-27 13:55 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:392137 发表于 2018-9-4 13:54 | 显示全部楼层
可以把这个源程序完整的发给我学习一下吗
回复

使用道具 举报

ID:432637 发表于 2018-11-24 22:45 | 显示全部楼层
很给力
回复

使用道具 举报

ID:433117 发表于 2018-11-27 18:07 | 显示全部楼层
单片机风扇有很多,但这个真的不错
回复

使用道具 举报

ID:439691 发表于 2018-12-4 23:24 来自手机 | 显示全部楼层
怎么下载
回复

使用道具 举报

ID:350104 发表于 2018-12-5 22:13 | 显示全部楼层
有实用价值 可以用在很多方面
回复

使用道具 举报

ID:443235 发表于 2018-12-10 13:41 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:272625 发表于 2018-12-11 00:58 | 显示全部楼层
附近只有C程序,其它没有。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表