找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2485|回复: 2
收起左侧

51单片机的温控风扇程序+元件清单等

[复制链接]
ID:479983 发表于 2019-6-12 19:07 | 显示全部楼层 |阅读模式
一、        材料清单:
风扇电机;

红外对管;

9012三极管;

51最小系统板(含51单片机);

7805稳压芯片;

杜邦线若干;

LCD1602;

红外遥控器+接受头;

热释电红外传感器

ds18b20温度传感器

二、        系统原理图

三、        模块功能
1.    红外遥控器:

红外遥控接收线,是红外接收线的一种。外遥控接收线载波频率为38KHZ 。广泛应用于音响、电视机、机顶盒、卫星接收器、等其它各种辅助延长遥控接收效果的产品!红外遥控接收线是用于红外遥控系统的一体化接收模块,内置PIN光敏二极管和前置放大器IC,实现红外遥控信号的拾取、放大和解调,检波输出信号可以直接由微处理器解码。

2.    红外传感器:


红外传感器黑线的检测原理是红外发射管发射光线到路面,红外光遇到白底则被反射,接收管接收到反射光,经施密特触发器整形后输出低电平;当红外光遇到黑线时则被吸收,接收管没有接收到反射光

3.    51单片机:

AT89C51单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上。如果按功能划分,它由如下功能部件组成,即微处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、并行I/O口(4个8位I/O口)、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是微处理器(CPU)加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式,以实现不同的功能

4.    7805稳压:
7805三端稳压集成电路,顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。

5.    9012三极管:
9012是非常常见的PNP型晶体三极管,在收音机以及各种放大电路中经常看到它,应用范围很广,它是PNP型小功率三极管。该三极管由发射极、基极、集电极。

6.    热释电红外传感器:
热释电红外传感器主要是由一种高热电系数的材料,如锆钛酸铅系陶瓷、钽酸锂、硫酸三甘钛等制成尺寸为2*1mm的探测元件。在每个探测器内装入一个或两个探测元件,并将两个探测元件以反极性串联,以抑制由于自身温度升高而产生的干扰。由探测元件将探测并接收到的红外辐射转变成微弱的电压信号,经装在探头内的场效应管放大后向外输出。为了提高探测器的探测灵敏度以增大探测距离,一般在探测器的前方装设一个菲涅尔透镜,该透镜用透明塑料制成,将透镜的上、下两部分各分成若干等份,制成一种具有特殊光学系统的透镜,它和放大电路相配合,可将信号放大70分贝以上,这样就可以测出10~20米范围内人的行动。品种全、型号多,可供选择的余地大。应用于人体感应开关、报警器等自动开关领域。

7.    LCD1602:
LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示出图形。

8.    Ds18b20温度传感器
DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点 DS18B20数字温度传感器接线方便,封装成后可应用于多种场合。

耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

单片机源程序如下:
  1. /*******************************************************************************
  2. * 实验名                           :温度显示实验
  3. * 使用的IO             :
  4. * 实验效果       :1602显示温度
  5. *        注意                                         :
  6. *******************************************************************************/
  7. #include<reg51.h>
  8. #include"lcd.h"
  9. #include"temp.h"
  10. typedef unsigned int u16;          //对数据类型进行声明定义
  11. typedef unsigned char u8;
  12. uchar xiao=29,da=32;
  13. sbit hong=P3^6;
  14. sbit h=P2^4;
  15. int wendu;
  16. sbit t=P2^0;

  17. sbit K1=P1^2;
  18. sbit K2=P1^3;
  19. sbit K3=P1^4;
  20. sbit K4=P1^5;
  21. uchar CNCHAR[6] = "摄氏度";
  22. //unsigned char datae[] = {0, 0, 0, 0};
  23. void LcdDisplay(int);
  24. void dianji();
  25. void dianji_1();
  26. void key() ;

  27. sbit IRIN=P3^2;

  28. u8 IrValue[6];
  29. u8 Time;
  30. int x=0;

  31. /*******************************************************************************
  32. * 函 数 名         : delay
  33. * 函数功能                   : 延时函数,i=1时,大约延时10us
  34. *******************************************************************************/
  35. void delay_1(u16 i)
  36. {
  37.         while(i--);        
  38. }




  39. /*******************************************************************************
  40. * 函数名         : IrInit()
  41. * 函数功能                   : 初始化红外线接收
  42. * 输入           : 无
  43. * 输出                  : 无
  44. *******************************************************************************/

  45. void IrInit()
  46. {
  47.         IT0=1;//下降沿触发
  48.         EX0=1;//打开中断0允许
  49.         EA=1;        //打开总中断
  50.         IRIN=1;//初始化端口
  51. }


  52. /*******************************************************************************
  53. * 函 数 名       : main
  54. * 函数功能                 : 主函数
  55. * 输    入       : 无
  56. * 输    出             : 无
  57. *******************************************************************************/

  58. /*******************************************************************************
  59. * 函数名         : ReadIr()
  60. * 函数功能                   : 读取红外数值的中断函数
  61. * 输入           : 无
  62. * 输出                  : 无
  63. *******************************************************************************/

  64. void ReadIr() interrupt 0
  65. {
  66.         u8 j,k;
  67.         u16 err;
  68.         Time=0;                                         
  69.         delay_1(700);        //7ms
  70.         if(IRIN==0)                //确认是否真的接收到正确的信号
  71.         {         
  72.                
  73.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  74.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  75.                 侯,程序死在这里*/        
  76.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  77.                 {                        
  78.                         delay_1(1);
  79.                         err--;
  80.                 }
  81.                 if(IRIN==1)                        //如果正确等到9ms低电平
  82.                 {
  83.                         err=500;
  84.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  85.                         {
  86.                                 delay_1(1);
  87.                                 err--;
  88.                         }
  89.                         for(k=0;k<4;k++)                //共有4组数据
  90.                         {                                
  91.                                 for(j=0;j<8;j++)        //接收一组数据
  92.                                 {

  93.                                         err=60;               
  94.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  95.                                         {
  96.                                                 delay_1(1);
  97.                                                 err--;
  98.                                         }
  99.                                         err=500;
  100.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  101.                                         {
  102.                                                 delay_1(10);         //0.1ms
  103.                                                 Time++;
  104.                                                 err--;
  105.                                                 if(Time>30)
  106.                                                 {
  107.                                                         return;
  108.                                                 }
  109.                                         }
  110.                                         IrValue[k]>>=1;         //k表示第几组数据
  111.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  112.                                         {
  113.                                                 IrValue[k]|=0x80;
  114.                                         }
  115.                                         Time=0;                //用完时间要重新赋值                                                        
  116.                                 }
  117.                         }
  118.                 }
  119.                 if(IrValue[2]!=~IrValue[3])
  120.                 {
  121.                         return;
  122.                 }
  123.         }                        
  124. }

  125. /*******************************************************************************
  126. * 函数名         : main
  127. * 函数功能                   : 主函数
  128. * 输入           : 无
  129. * 输出                  : 无
  130. *******************************************************************************/

  131. void delay(uchar ms)
  132. {       // 延时子程序
  133.          uchar i ;
  134.          while(ms--)
  135.          {
  136.                   for(i = 0 ; i<250;i++) ;
  137.          }
  138. }

  139. void main()
  140. {
  141.         IrInit();
  142.         LcdInit();                         //初始化LCD1602
  143.         while(1)
  144.         {
  145.              key();
  146.             dianji();
  147.                 LcdDisplay(Ds18b20ReadTemp());
  148.          if(IrValue[2]==0x5A)
  149.                 {
  150.                 delay_1(500);
  151.                 if(IrValue[2]==0x5A)
  152.         {xiao=xiao+1;
  153.                  if(xiao>=da)
  154.                  { xiao=da-1;}
  155.         
  156.                 IrValue[2]=0x00;
  157.                 }
  158.                 }        
  159.                 if(IrValue[2]==0x08)
  160.                 {
  161.                 delay_1(500);
  162.                 if(IrValue[2]==0x08)
  163.         {xiao=xiao-1;
  164.                 IrValue[2]=0x00;
  165.                 }
  166.                 }                        
  167.                
  168.                
  169.                
  170.                 if(IrValue[2]==0x18)
  171.                 {
  172.                 delay_1(500);
  173.                 if(IrValue[2]==0x18)
  174.         {da=da+1;
  175.                 IrValue[2]=0x00;
  176.                 }
  177.                 }        
  178.                 if(IrValue[2]==0x52)
  179.                 {
  180.                 delay_1(500);
  181.                 if(IrValue[2]==0x52)
  182.         {da=da-1;
  183.                 if(da<=xiao)
  184.                 { da=xiao+1;}
  185.                 IrValue[2]=0x00;
  186.                 }
  187.                 }                        
  188.                                        
  189.                 }}

  190. /*******************************************************************************
  191. * 函数名         : LcdDisplay()
  192. * 函数功能                   : LCD显示读取到的温度
  193. * 输入           : v
  194. * 输出                  : 无
  195. *******************************************************************************/

  196. void LcdDisplay(int temp)          //lcd显示
  197. {
  198.    
  199.           unsigned char i, datas[] = {0, 0, 0, 0, 0},datae[] = {0, 0, 0, 0}; //定义数组
  200.         float tp;  
  201.         if(temp< 0)                                //当温度值为负数
  202.           {
  203.                   LcdWriteCom(0x80);                //写地址 80表示初始地址
  204.                 SBUF='-';//将接收到的数据放入到发送寄存器
  205.                 while(!TI);                                 //等待发送数据完成
  206.                 TI=0;                                                 //清除发送完成标志位
  207.             LcdWriteData('-');                  //显示负
  208.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  209.                 temp=temp-1;
  210.                 temp=~temp;
  211.                 tp=temp;
  212.                 temp=tp*0.0625*100+0.5;        
  213.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  214.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  215.                 //算由?.5,还是在小数点后面。

  216.           }
  217.          else
  218.           {                        
  219.                   LcdWriteCom(0x82);                //写地址 80表示初始地址
  220.             LcdWriteData('+');                 //显示正
  221.                 SBUF='+';//将接收到的数据放入到发送寄存器
  222.                 while(!TI);                                 //等待发送数据完成
  223.                 TI=0;                                                 //清除发送完成标志位
  224.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  225.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  226.                 temp=tp*0.0625*100+0.5;        
  227.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  228.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  229.                 //算加上0.5,还是在小数点后面。
  230.         }
  231.         wendu=temp/100;
  232.         datas[0] = temp / 10000;
  233.         datas[1] = temp % 10000 / 1000;
  234.         datas[2] = temp % 1000 / 100;
  235.         datas[3] = temp % 100 / 10;
  236.         datas[4] = temp % 10;

  237.         datae[0] = xiao/10;
  238.         datae[1] = xiao-datae[0]*10;
  239.         datae[2] = da/10;
  240.         datae[3] = da-datae[2]*10;

  241.         LcdWriteCom(0x80);                //写地址 80+40表示初始地址
  242.         LcdWriteData('T');         

  243.         LcdWriteCom(0x80+0x40);                //写地址 80+40表示初始地址
  244.         LcdWriteData('x');                 
  245.         LcdWriteCom(0x80+0x41);                //写地址 80+40表示初始地址
  246.         LcdWriteData(':');
  247.          LcdWriteCom(0x80+0x44);                //写地址 80+40表示初始地址
  248.         LcdWriteData(' ');         
  249.     LcdWriteCom(0x80+0x45);                //写地址 80+40表示初始地址
  250.         LcdWriteData('s');                 
  251.         LcdWriteCom(0x80+0x46);                //写地址 80+40表示初始地址
  252.         LcdWriteData(':');
  253.         
  254.         LcdWriteCom(0x80+0x42);                 //写地址 80表示初始地址
  255.         LcdWriteData('0'+datae[0]); //十位
  256.         SBUF = '0'+datae[0];//将接收到的数据放入到发送寄存器
  257.         while (!TI);                                 //等待发送数据完成
  258.         TI = 0;        
  259.         LcdWriteCom(0x80+0x43);                 //写地址 80表示初始地址
  260.         LcdWriteData('0'+datae[1]); //ge位
  261.         SBUF = '0'+datae[1];//将接收到的数据放入到发送寄存器
  262.         while (!TI);                                 //等待发送数据完成
  263.         TI = 0;        



  264.         LcdWriteCom(0x80+0x47);                 //写地址 80表示初始地址
  265.         LcdWriteData('0'+datae[2]); //十位
  266.         SBUF = '0'+datae[0];//将接收到的数据放入到发送寄存器
  267.         while (!TI);                                 //等待发送数据完成
  268.         TI = 0;        
  269.         LcdWriteCom(0x80+0x48);                 //写地址 80表示初始地址
  270.         LcdWriteData('0'+datae[3]); //ge位
  271.         SBUF = '0'+datae[1];//将接收到的数据放入到发送寄存器
  272.         while (!TI);                                 //等待发送数据完成
  273.         TI = 0;        



  274.         LcdWriteCom(0x81);                //写地址 80表示初始地址
  275.         LcdWriteData(':');
  276.         
  277.         LcdWriteCom(0x8a);                //写地址 80表示初始地址
  278.         LcdWriteData('C');                 

  279.         LcdWriteCom(0x83);                  //写地址 80表示初始地址
  280.         LcdWriteData('0'+datas[0]); //百位
  281.         SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
  282.         while (!TI);                                 //等待发送数据完成
  283.         TI = 0;
  284.         
  285.         LcdWriteCom(0x84);                 //写地址 80表示初始地址
  286.         LcdWriteData('0'+datas[1]); //十位
  287.         SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
  288.         while (!TI);                                 //等待发送数据完成
  289.         TI = 0;

  290.         LcdWriteCom(0x85);                //写地址 80表示初始地址
  291.         LcdWriteData('0'+datas[2]); //个位
  292.         SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器
  293.         while (!TI);                                 //等待发送数据完成
  294.         TI = 0;

  295.         LcdWriteCom(0x86);                //写地址 80表示初始地址
  296.         LcdWriteData('.');                 //显示 ‘.’
  297.         SBUF = '.';//将接收到的数据放入到发送寄存器
  298.         while (!TI);                                 //等待发送数据完成
  299.         TI = 0;

  300.         LcdWriteCom(0x87);                 //写地址 80表示初始地址
  301.         LcdWriteData('0'+datas[3]); //显示小数点  
  302.         SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器
  303.         while (!TI);                                 //等待发送数据完成
  304.         TI = 0;

  305.         LcdWriteCom(0x88);                 //写地址 80表示初始地址
  306.         LcdWriteData('0'+datas[4]); //显示小数点
  307.         SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器
  308.         while (!TI);                                 //等待发送数据完成
  309.         TI = 0;
  310.         for(i=0; i<6; i++)
  311.         {
  312.                  SBUF = CNCHAR[i];//将接收到的数据放入到发送寄存器
  313.                 while (!TI);                                 //等待发送数据完成
  314.                 TI = 0;
  315.         }         
  316. }

  317. /****************************************/
  318. void dianji_1()
  319. {
  320.      t=0;
  321.          delay(20);
  322.          t=1;
  323.          delay(30);
  324. }
  325. void dianji()
  326. {
  327.    if(hong==1||h==0)
  328.    {
  329.            if(wendu<xiao)
  330.         {
  331.          t=1;
  332.         }
  333.         else
  334.         
  335.         if(wendu>=xiao&&wendu<da)
  336.         {
  337. dianji_1();
  338.         }
  339.         else
  340.         if(wendu>=da)
  341.         {
  342.          t=0;
  343.         }
  344.    
  345.    
  346.    }
  347.    else
  348.    {
  349.             t=1;
  350.    }


  351. ……………………

  352. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0I)S}~C$T(N[`YM7X)$P.png
所有程序51hei提供下载(缺少原理图 不要下载):
d.zip (54.1 KB, 下载次数: 21)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2019-6-13 06:32 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:479983 发表于 2019-6-16 12:22 | 显示全部楼层
admin 发表于 2019-6-13 06:32
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

已补全
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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