標題: 單片機溫控風扇Proteus仿真與源程序設計 [打印本頁]

作者: duan19981103    時間: 2019-12-11 21:49
標題: 單片機溫控風扇Proteus仿真與源程序設計
各位師兄可以用到,原理圖,,仿真都有

②573驅(qū)動:

硬件構成:單片機+最小系統(tǒng)+數(shù)碼管顯示模塊+74HC573數(shù)碼管驅(qū)動模塊+溫度采集模塊+風扇驅(qū)動模塊+按鍵模塊

1.采用DS18B20溫度傳感器測溫,74HC573驅(qū)動數(shù)碼管,數(shù)碼管顯示溫度和風扇的檔位;
2.三個按鍵:設置、加、減。按一下設置可以設置上限,再按下設置下限,均可以按鍵加減調(diào)整;
3.利用PWM調(diào)速,當溫度低于下限時,風扇不轉(zhuǎn)動,當溫度處于上、下限之間時1檔轉(zhuǎn)動(風扇50%轉(zhuǎn)速轉(zhuǎn)動),當溫度超過上限時,全速轉(zhuǎn)動。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


制作出來的實物圖如下:


溫控風扇元件清單
1)    7*9萬用板
2)    風扇
3)    STC89C51單片機
4)    74hc573
5)    40腳IC座
6)    20腳IC座
7)    0.36四位一體共陰數(shù)碼管
8)    10k電阻*2
9)    1k電阻*2
10)    103排阻
11)    DS18B20
12)    10uf電容
13)    11.0592M晶振
14)    30pf瓷片電容*2
15)    9012三極管
16)    2p排針
17)    按鍵*3
18)    DC電源接口
19)    自鎖開關
20)    導線若干
21)    焊錫若干
22)    電源線或電池盒+DC電源插頭


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit ds=P3^6;


  7. sbit w1=P2^4;
  8. sbit w2=P2^5;
  9. sbit w3=P2^6;
  10. sbit w4=P2^7;                                //數(shù)碼管的位選端
  11. sbit dp=P0^7;
  12. sbit fm=P3^7;

  13. sbit key_shezhi=P1^5;
  14. sbit key_jia=P1^6;
  15. sbit key_jian=P1^7;
  16. uchar flag_0;
  17. uint t_max=250,t_max_1=300;
  18. uint count=0;
  19. int wendu,t;
  20. void delay(uint z)                                                  //延時函數(shù)
  21. {
  22.         uint x,y;
  23.         for(x=z;x>0;x--)
  24.                 for(y=110;y>0;y--);
  25. }
  26. /********************************/
  27. void pro()
  28. {
  29.         if(key_shezhi==0)
  30.         {
  31.                 delay(10);
  32.                 if(key_shezhi==0)
  33.                 {
  34.                         flag_0++;
  35.                         if(flag_0>=3)
  36.                                 flag_0=0;
  37.                         while(!key_shezhi)        ;
  38.                 }
  39.         }
  40. }
  41. /**********************************/
  42. uchar code table[]={
  43. 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40
  44. };
  45. uchar code table1[]={
  46. 0x38,0x76
  47. };
  48. uint temp,mm;uchar i;float f_temp;
  49. /*******************************************************
  50. 溫度函數(shù)
  51. *******************************************************/
  52. void dsreset(void)                                           //下邊是溫度獲取子程序
  53. {
  54.         uint i;
  55.         ds=0;
  56.         i=103;
  57.         while(i>0)i--;
  58.         ds=1;
  59.         i=4;
  60.         while(i>0)i--;
  61. }
  62. bit tempreadbit(void)                                   //讀一位
  63. {
  64.         uint i;
  65.         bit dat;
  66.         ds=0;i++;
  67.         ds=1;i++;i++;
  68.         dat=ds;
  69.         i=8;while(i>0)i--;
  70.         return(dat);
  71. }
  72. uchar tempread(void)                                         //獲取溫度
  73. {
  74.         uchar i,j,dat;
  75.         dat=0;
  76.         for(i=1;i<=8;i++)
  77.         {
  78.                 j=tempreadbit();
  79.                 dat=(j<<7)|(dat>>1);
  80.         }
  81.         return(dat);
  82. }
  83. void tempwritebyte(uchar dat)                           //寫一個字節(jié)
  84. {
  85.         uint i;
  86.         uchar j;
  87.         bit testb;
  88.         for(j=1;j<=8;j++)
  89.         {
  90.                 testb=dat&0x01;
  91.                 dat=dat>>1;
  92.                 if(testb)
  93.                 {
  94.                         ds=0;
  95.                         i++;i++;
  96.                         ds=1;
  97.                         i=8;while(i>0)i--;
  98.                 }
  99.                 else
  100.                 {
  101.                         ds=0;
  102.                         i=8;while(i>0)i--;
  103.                         ds=1;
  104.                         i++;i++;
  105.                 }
  106.         }
  107. }
  108. void tempchange(void)                                           //溫度轉(zhuǎn)換
  109. {
  110.         dsreset();
  111.         delay(1);
  112.         tempwritebyte(0xcc);
  113.         tempwritebyte(0x44);
  114. }
  115. uint get_temp()                                                        //獲取溫度
  116. {
  117.         uchar a,b;
  118.         dsreset();
  119.         delay(1);
  120.         tempwritebyte(0xcc);
  121.         tempwritebyte(0xbe);
  122.         a=tempread();
  123.         b=tempread();
  124.         temp=b;
  125.         temp<<=8;
  126.         temp=temp|a;
  127.         f_temp=temp*0.0625;
  128.         temp=f_temp*10+0.5;
  129.         f_temp=f_temp+0.05;
  130.         return temp;
  131. }
  132. /***********************************/
  133. void display0()
  134. {
  135.         P0=0x00;
  136.         w1=0;
  137.         P0=0x00;
  138.         delay(2);
  139.         w1=1;
  140.         
  141.         P0=0x00;
  142.         w2=0;
  143.         P0=table[wendu/100];
  144.         delay(2);
  145.         w2=1;
  146.         
  147.         P0=0x00;
  148.         w3=0;
  149.         P0=table[wendu%100/10];
  150.         dp=1;
  151.         delay(2);
  152.         w3=1;
  153.         
  154.         P0=0x00;
  155.         w4=0;
  156.         P0=table[wendu%10];
  157.         delay(2);
  158.         w4=1;               
  159. }
  160. /***************************************/
  161. void baojing()
  162. {
  163.         count++;
  164.         if(count>=3)
  165.                 count=0;
  166.         if(wendu>=t_max&&wendu<t_max_1)
  167.                 {
  168.                         if(count<2)           //只有三分之二的時間會給風扇供電
  169.                                 fm=0;
  170.                         else
  171.                                 fm=1;
  172.                 }
  173.         else if(wendu>=t_max_1)     //高于設定的最高溫度,   全速轉(zhuǎn)動        
  174.                 {
  175.                         fm=0;
  176.                 }
  177.         else                       //高于設定的次級溫度,緩慢轉(zhuǎn)動
  178.                 {
  179.                         fm=1;
  180.                 }
  181. }
  182. /**************************************/
  183. /**************************************/
  184. void display1()
  185. {
  186.         P0=0x00;
  187.         w1=0;
  188.         P0=table1[0];
  189.         delay(2);
  190.         w1=1;
  191.         
  192.         P0=0x00;
  193.         w2=0;
  194.         P0=table[t_max/100];
  195.         delay(2);
  196.         w2=1;
  197.         
  198.         P0=0x00;
  199.         w3=0;
  200.         P0=table[t_max%100/10];
  201.         dp=1;
  202.         delay(2);
  203.         w3=1;
  204.         
  205.         P0=0x00;
  206.         w4=0;
  207.         P0=table[t_max%10];
  208.         delay(2);
  209.         w4=1;               
  210. }
  211. /**************************************/
  212. void display2()
  213. {
  214.         P0=0x00;
  215.         w1=0;
  216.         P0=table1[1];
  217.         delay(2);
  218.         w1=1;
  219.         
  220.         P0=0x00;
  221.         w2=0;
  222.         P0=table[t_max_1/100];
  223.         delay(2);
  224.         w2=1;
  225.         
  226.         P0=0x00;
  227.         w3=0;
  228.         P0=table[t_max_1%100/10];
  229.         dp=1;
  230.         delay(2);
  231.         w3=1;
  232.         
  233.         P0=0x00;
  234.         w4=0;
  235.         P0=table[t_max_1%10];
  236.         delay(2);
  237.         w4=1;               
  238. }

  239. /***************************************/
  240. void shezhi()
  241. {
  242.         if(flag_0==1)
  243.         {
  244.                 if(key_jia==0)
  245.                 {
  246.                         delay(10);
  247.                         if(key_jia==0)
  248.                         {
  249.                                 t_max=t_max+5;
  250.                                 if(t_max>=t_max_1)                                //防止低溫度高于高溫度
  251.                                         t_max=t_max_1-5;                                 
  252.                                 while(!key_jia);
  253.                         }
  254.                 }
  255.                 if(key_jian==0)
  256.                 {
  257.                         delay(10);
  258.                         if(key_jian==0)
  259.                         {
  260.                                 t_max=t_max-5;
  261.                                 while(!key_jian);
  262.                         }
  263.                 }
  264.         }
  265.         if(flag_0==2)
  266.         {
  267.                 if(key_jia==0)
  268.                 {
  269.                         delay(10);
  270.                         if(key_jia==0)
  271.                         {
  272.                                 t_max_1=t_max_1+5;
  273.                                 while(!key_jia);
  274.                         }
  275.                 }
  276.                 if(key_jian==0)
  277.                 {
  278.                         delay(10);
  279.                         if(key_jian==0)
  280.                         {
  281.                                 t_max_1=t_max_1-5;
  282.                                 if(t_max_1<=t_max)                         //防止高溫度小于低溫度
  283.                                         t_max_1=t_max+5;
  284.                                 while(!key_jian);
  285.                         }
  286.                 }
  287.         }
  288. }
  289. void display()
  290. {
  291.                 if(flag_0==0)
  292.                         display0();
  293.                 else if(flag_0==1)
  294.                         display1();
  295.                 else if(flag_0==2)
  296.                         display2();        
  297. }
  298. void main()
  299. {
  300.         while(1)
  301.         {

  302.                 tempchange();
  303.                 t=get_temp();
  304.                 if(t>=0&&t<=1250)  //溫度合法范圍,不在這個范圍就是沒有獲取到合適的值
  305.                 {
  306.                         wendu=t;
  307.                 }
  308.                 pro();
  309.                 display();
  310.                 shezhi();
  311.                 baojing();
  312.         }
  313. }
復制代碼

所有資料51hei提供下載:
溫度風扇74HC573+.7z (869.48 KB, 下載次數(shù): 62)





作者: 該賬號已注銷    時間: 2019-12-12 09:25
好東西,正在學習
作者: qiuyuleil    時間: 2019-12-13 16:40
好東西,學習中。謝謝分享!
作者: 藍寶寶    時間: 2019-12-16 15:02
為什么下載下來什么也沒有
作者: 楓溪丶    時間: 2020-6-9 14:59
學習。。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1