找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的窗帘设计(可实现红外遥控和温度检测)源程序+原理图PCB文件

[复制链接]
跳转到指定楼层
楼主
单片机作为简单的控制核心,可以实现一些功能的控制。本次设计的智能窗帘主要功能如下:
1.通过温度传感器来自动的控制窗帘的关闭与开启;
2.通过红外遥控器来手动控制窗帘的关闭,开启,暂停,启动,加速,减速以及智能与人工的转换;
3.测得的温度与相应的步进电机的速度可以通过LCD1602显示出来

基于stc89c52的智能窗帘,可以通过 ds18b20温度传感器控制,并且可以通过红外按键控制,最后通过lcd1602显示温度,速度。
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)



1.    项目的实现思路和实现方法
随着科技的深化发展,人民生活水平的日益提高,自控系统从安防、采暖、采光、烹煮等领域不断扩展,家居智能化的趋势越来越明显。本文针对的,是智能窗帘这一块,它的任务是通过简单省力的操作来实现室内采光自动变化,解决一些实际的困难与需求。
例如:已经上床睡觉,却发现窗帘没关;小朋友、残疾者拉窗帘的不便;外出旅游,需要房间保持定时采光,去湿去霉;希望早上窗帘到点打开,用明亮的阳光来唤醒自己;由于生活的紧凑,没有精力管理窗帘又希望室内采光自动保持在舒适的程度;飘窗、高窗、悬窗、落地窗等窗帘的拉不动或够不着;希望非触碰地拉动层层叠叠的窗帘,保持其造型的美观….这种种问题,通过使用智能电动窗帘便能轻松解决,从而使现代生活变得更方便舒适。
2项目的硬件工作原理分析和调试,各模块介绍
2.1分析项目的硬件工作原理
1.通过温度传感器来自动的控制窗帘的关闭与开启;
2.通过红外遥控器来手动控制窗帘的关闭,开启,暂停,启动,加速,减速以及智能与人工的转换;
3.测得的温度与相应的步进电机的速度可以通过LCD1602显示出来。
2.2介绍该项目中使用的模块,及其作用
2.2.1步进电机
步进电动机是一种将电脉冲信号转换成角位移或线位移的机电元件。步进电动机的输入量是脉冲序列,输出量则为相应的增量位移或步进运动。正常运动情况下,它每转一周具有固定的步数;做连续步进运动时,其旋转转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。
2.2.2DS18B20
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625℃/LSB形式表达,其中S为符号位。
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FE6FH,-55℃的数字输出为FC90H。
2.3系统整体框架


3.软件实现原理和调试以及联合调试的总结
3.1DS18B20
  1. /******************************************************************/
  2. /*                    读一个字节  , 低位开始                     */
  3. /******************************************************************/
  4. unsigned char ReadOneByte(void)
  5. {
  6.       unsigned char i;
  7.     unsigned char value=0;
  8.     for(i=0;i<8;i++)
  9.     {
  10.          value >>=1;
  11.         DQ = 0;
  12.         _nop_();
  13.         _nop_();
  14.         DQ = 1;
  15.         _nop_();
  16.         _nop_();
  17.         _nop_();
  18.         _nop_();
  19.         _nop_();
  20.         _nop_();
  21.         _nop_();
  22.         if(DQ == 1)
  23.         {value |= 0x80;}
  24.         Delay60us();

  25.     }
  26.     return value;
  27. }

  28. /******************************************************************/
  29. /*                 写一个字节    先写低位                         */
  30. /******************************************************************/
  31. void WriteOneByte(unsigned char dat)
  32. {
  33.      unsigned char i;
  34.     for(i=0;i<8;i++)
  35.     {
  36.         DQ =0;
  37.         _nop_();
  38.         _nop_();
  39.         if(dat&0x01)
  40.         {DQ =1;}
  41.         else
  42.          DQ = 0;
  43.         Delay60us();
  44.         DQ = 1;//释放总线   
  45.         dat>>=1;
  46.     }
  47.       
  48. }

  49. /******************************************************************/
  50. /*                   读取温度                                     */
  51. /******************************************************************/
  52. unsigned int ReadTemperature(void)
  53. {

  54.    unsigned int a,b,t;
  55.    EA =0;
  56.    bsp_InitDs18b20();
  57.    WriteOneByte(0xcc);
  58.    WriteOneByte(0x44);
  59.    delay_ms(200);
  60.    bsp_InitDs18b20();
  61.    WriteOneByte(0xcc);
  62.    WriteOneByte(0xbe);
  63.    a= ReadOneByte(); //低字节
  64.    b= ReadOneByte(); //高字节
  65.    b=b<<8;
  66.    t= a+b;
  67.    EA =1;
  68.    return t;
  69. }
  70. 3.2LCD1602
  71. /*------------------------------------------------
  72.                 清屏函数
  73. ------------------------------------------------*/
  74. void LCD_Clear(void)
  75. {
  76.     bsp_LcdWriteComand(0x01);
  77.     delay_ms(5);
  78. }

  79. void bsp_LcdWriteData(unsigned char dat)
  80. {
  81.     //delay_ms(5);
  82.     while(bsp_LcdCheckBusy()&0x80);
  83.       RS =1;
  84.     RW =0;
  85.     LCDPORT = dat;
  86.     EN =1;
  87.     delay_us(10);
  88.     EN =0;
  89. }


  90. void bsp_LcdWriteComand(unsigned char com)
  91. {
  92.     //delay_ms(5);
  93.     while(bsp_LcdCheckBusy()&0x80);
  94.        RS =0;
  95.     RW =0;
  96.     LCDPORT = com;
  97.     EN =1;
  98.     delay_us(10);
  99.     EN =0;
  100. }


  101. void bsp_LcdInit(void)
  102. {
  103.      delay_ms(15);
  104.     bsp_LcdWriteComand(0x38);
  105.     delay_ms(5);
  106.     bsp_LcdWriteComand(0x38);
  107.     delay_ms(5);
  108.     bsp_LcdWriteComand(0x38);
  109.     delay_ms(5);
  110.     bsp_LcdWriteComand(0x38);
  111.     delay_ms(5);
  112.     bsp_LcdWriteComand(0x08);
  113.     delay_ms(5);
  114.     bsp_LcdWriteComand(0x01);
  115.     delay_ms(5);
  116.     bsp_LcdWriteComand(0x06);
  117.     delay_ms(5);
  118.     bsp_LcdWriteComand(0x0c);
  119. }


  120. void bsp_LcdShowChar(unsigned char x,unsigned char y,unsigned char a)
  121. {
  122.     if(y ==0)
  123.          bsp_LcdWriteComand(0x80+x);
  124.     else
  125.         bsp_LcdWriteComand(0xC0+x);
  126.      
  127.     bsp_LcdWriteData(a);   
  128. }


  129. void bsp_LcdShowString(unsigned char x,unsigned char y,unsigned char *s)
  130. {
  131.      if(y ==0)
  132.          bsp_LcdWriteComand(0x80+x);
  133.     else
  134.         bsp_LcdWriteComand(0xC0+x);
  135.     while(*s)
  136.     {
  137.         bsp_LcdWriteData(*s);
  138.         s++;   
  139.     }
  140. }


  141. unsigned char bsp_LcdCheckBusy(void)
  142. {
  143.     unsigned char temp;
  144.      RS =0;
  145.     RW =1;
  146.     EN =1;
  147.     temp =LCDPORT;
  148.     delay_us(10);
  149.     EN =0;
  150.     return temp;
  151. }


  152. void bsp_LcdFillCGRAM(void)     //0x40
  153. {
  154.     unsigned char i=0;
  155.        bsp_LcdWriteComand(0x40);
  156.     for(i=0;i<48;i++)
  157.     {
  158.         bsp_LcdWriteData(my[i]);
  159.     }   
  160. }


  161. void bsp_LcdShowCGRAM(unsigned char x,unsigned char y,unsigned char index)//x 横坐标 y 纵坐标     index 0-7
  162. {
  163.     if(y ==0)
  164.          bsp_LcdWriteComand(0x80+x);
  165.     else
  166.         bsp_LcdWriteComand(0xC0+x);
  167.         bsp_LcdWriteData(index);
  168. }

  169. 3.3步进电机
  170. void ISR_TIMER1(void) interrupt 3  //1ms
  171. {
  172.     static unsigned int num = 0;
  173.     static unsigned char times = 0,i = 0;
  174.     TH1=(65536-1000)/256;          //重新赋值 1ms
  175.     TL1=(65536-1000)%256;
  176.    
  177.     if(!StopFlag)
  178.     {
  179.       if(times == (10-Speed))
  180.       {
  181.         times=0;
  182.         if(TurnFlag == 0)
  183.         {
  184.             switch(i)  //逆时针转动
  185.             {
  186.                 case 0:Coil_A1;i++;break;
  187.                 case 1:Coil_AB1;i++;break;
  188.                 case 2:Coil_B1;i++;break;
  189.                 case 3:Coil_BC1;i++;break;
  190.                 case 4:Coil_C1;i++;break;
  191.                 case 5:Coil_CD1;i++;break;
  192.                 case 6:Coil_D1;i++;break;
  193.                 case 7:Coil_DA1;i++;break;
  194.                 case 8:i=0;break;
  195.                 default:break;
  196.             }
  197.         }
  198.         else if(TurnFlag == 1)
  199.         {
  200.             switch(i)    //顺时针转动
  201.             {
  202.                 case 0:Coil_DA1;i++;break;
  203.                 case 1:Coil_D1;i++;break;
  204.                 case 2:Coil_CD1;i++;break;
  205.                 case 3:Coil_C1;i++;break;
  206.                 case 4:Coil_BC1;i++;break;
  207.                 case 5:Coil_B1;i++;break;
  208.                 case 6:Coil_AB1;i++;break;
  209.                 case 7:Coil_A1;i++;break;
  210.                 case 8:i=0;break;
  211.                 default:break;
  212.             }
  213.             
  214.         }
  215.      }
  216.      times++;
  217.     }
  218.     num++;
  219.     if(num==600)        
  220.     {
  221.         num=0;
  222.         ReadTempFlag=1; //读标志位置1
  223.     }
  224. }
复制代码

4.总结(收获,缺陷,改进,提高)
本设计介绍了基于STC89C52的智能窗帘控制系统的工作原理及实现过程,我在这个星期内阅读大量有关如何通过电机转动来控制窗帘的关闭和开启,以及数字温度计原理及设计的相关资料,设计了实现采集与显示功能的软件程序,完成了基于STC89C52的智能窗帘控制系统的设计。设计中采用最常用的单片机STC89C52作为主控模块,单总线数字温度传感器DS18B20用来测量温度,温度数据采用LCD1602显示。本设计的特点是构成系统的硬件器件少,操作简单,数据处理功能强。
智能化设计重点就在于软件算法的设计,虽然以前还做过这样的设计但这次设计,但都比较简单程序也不是很长也不需要有很巧妙的程序算法。这次软件设计中让我充分理解到了利用子程序的好处。在设计中也遇到很多问题比如相关设备的初始化,经过多次调试修改终于显示成功。还有很多下问题则不必累述。通过这次项目使我学习到了很多的东西,不仅加深了对专业知识的理解,而且更好地把理论知识与实践相结合,提高了自身的动手能力和实践水平,增强了学习单片机系统开发与设计的兴趣。


全部资料51hei下载地址:
智能窗帘.zip (5.87 MB, 下载次数: 101)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2020-3-25 02:21 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:678436 发表于 2020-4-12 21:29 | 只看该作者
好东西,正好需要这个红外,谢谢大佬
回复

使用道具 举报

地板
ID:678436 发表于 2020-4-12 21:30 | 只看该作者
谢谢,正好需要这个红外代码
回复

使用道具 举报

5#
ID:653838 发表于 2020-4-12 23:04 | 只看该作者
这些东西真需要,学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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