找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3826|回复: 4
打印 上一主题 下一主题
收起左侧

单片机温控风扇Proteus仿真与源程序设计

[复制链接]
跳转到指定楼层
楼主
各位师兄可以用到,原理图,,仿真都有

②573驱动:

硬件构成:单片机+最小系统+数码管显示模块+74HC573数码管驱动模块+温度采集模块+风扇驱动模块+按键模块

1.采用DS18B20温度传感器测温,74HC573驱动数码管,数码管显示温度和风扇的档位;
2.三个按键:设置、加、减。按一下设置可以设置上限,再按下设置下限,均可以按键加减调整;
3.利用PWM调速,当温度低于下限时,风扇不转动,当温度处于上、下限之间时1档转动(风扇50%转速转动),当温度超过上限时,全速转动。

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


制作出来的实物图如下:


温控风扇元件清单
1)    7*9万用板
2)    风扇
3)    STC89C51单片机
4)    74hc573
5)    40脚IC座
6)    20脚IC座
7)    0.36四位一体共阴数码管
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;                                //数码管的位选端
  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)                                                  //延时函数
  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. 温度函数
  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)                           //写一个字节
  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)                                           //温度转换
  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)     //高于设定的最高温度,   全速转动        
  174.                 {
  175.                         fm=0;
  176.                 }
  177.         else                       //高于设定的次级温度,缓慢转动
  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, 下载次数: 62)




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:431591 发表于 2019-12-12 09:25 | 只看该作者
好东西,正在学习
回复

使用道具 举报

板凳
ID:475402 发表于 2019-12-13 16:40 | 只看该作者
好东西,学习中。谢谢分享!
回复

使用道具 举报

地板
ID:665214 发表于 2019-12-16 15:02 来自手机 | 只看该作者
为什么下载下来什么也没有
回复

使用道具 举报

5#
ID:773993 发表于 2020-6-9 14:59 | 只看该作者
学习!!!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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