找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的智能晾衣架设计资料(论文+源码+仿真)

  [复制链接]
跳转到指定楼层
楼主
ID:263159 发表于 2018-5-27 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在Proteus中通过模拟温湿度,外接温湿度值,将模拟到的数据进行采集与A/D转换,显示到LCD液晶并控制后级电路进行反馈,完成晾衣架的功能。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

智能晾衣架
第三章:硬件单元电路
经过上述分析明确了本次设计的主要目标,为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当出色。此次设计主要突破在于设计合理的控制电路单元,同时结合采用的主控编写高质量的源码并使系统在实际与应用中能够发挥出色的稳定性和参考价值。本次将围绕主控单元设计合理的电路,结合SHT11温湿度采集单元、感光原件单元、LCD显示单元、模式控制单元使晾衣架能够得到外界的实时数据并作出相应的调整。在设定合适的温湿度及感光度的条件下能够自动控制电机驱动滑杆实现自动量晒与回收衣物,结合光线角度进行上下左右调整。主要框架如下图所示:


3.1主控单元设计
              为了使智能晾衣架在使用时满足嵌入式系统功耗、抗干扰、适用空间等要求,设计之初除了上述因素也考虑到成本因素。通过比较我们选择了51系列中的AT89C52芯片作为主控制单元。无论是功耗还是处理速度上都有着不错的表现,与CONTEX-M3系列单片机相比较处理上稍微慢点,但本次设计对分时处理的要求不是特别高,同时52系列具有简单高效的指令集和,大大减少设计难度,结合SHT11与ADC0804精准的完成数采集与电机控制。
              我们常见的主控封装形式有40脚的DIP直插的也有PQFP类型的贴片封装,在proteus中仿真的时候选择DIP类型,方便自主设计与搭建外围电路单元。从产品角度和制版工艺上面来讲贴片能够节省空间。这次采用的主控制芯片是8位CMOS工艺的单片机,内部有八位CPU和FlASH,在工控领域有着广泛的用途,脱机运行性能稳定,相比较51有着更大的存储和定时器资源,其主要内部参数与引脚分布见下图:
指令集和
兼容MCS-51产品
FLASH
8个字节重复擦写
擦写周期
1000次重复擦写
静态操作
0HZ –- 24MHZ
编程I/O
32个可编程I/O
功耗模式
低功耗和掉电模式
中断源个数
8个中断控制单元
定时器个数
3个16位定时/计数器

表:3.1.1主要参数
图:3.1.2双列直插型                                             图:3.1.3 PLCC贴片型
              由上图可以直接看到引脚标识与编号,左下角的GND与右上角的VCC需要外接合适的工作电压,一般采用5V工作电压。两侧的P0-P3 I/O口是可编程输入输出管脚,一组有四个,一共32个,可以看到I/O资源挺丰富且适合驱动多种外设。最小控制单元自工作的时候需要外部晶振提供合适的工作频率同时为了防止程序跑飞或者陷入死循环还要提供合理的复位单元。通俗点好比人要正常工作的需要心脏提供合适的脉搏跳动,这里我们选的是11.529MHZ的外部无源晶振,在外围接上两个22PF的非极性滤波电容连接到18、19管脚,为最小系统提供合适的工作频率。复位环节通过分压电阻与按键开关为9管脚提供复位信号,10uf的极性电容较减少按动过程中的抖动信号,发送有效地高电平信号可以让单片机重新加载程序,从头开始跑。此次仿真过程中由于I/O分配的原因采用了两片主控,另外需要注意的是P3口除了通用的管脚功能外,还有拓展的第二功能,配置其引脚功能能够实现定时/计数功能以及外部中断资源,在实际设计过程中有着非常多的用途。下面是最小控制单元的原理图以及P3管脚工能分布图:,
图:3.1.3最小系统                                图:3.1.4 P3口复用
3.2LCD液晶显示            
              主控单元在上电之后会对液晶屏幕进行初始化,直观的显示出各项参数,结合独立按键显示控制模式,给用户提供良好的人机交互。常见的显示屏幕有很多尺寸,市面上的电容、电阻屏也数不胜数,这里我们选用户LCD1602作为液晶显示,同样的考虑到功耗与显示区间等因素。1602有着八个数据端口,体积很小亮度饱和能够直观简单的显示ASCII码与字符,与单片机的接口连接简单,控制屏幕上的液晶分子显示出字符,不同的电压控制不同区域
上下两行能够分别显示16个字符,不具备汉字现实的能力,这点上不如12864,但完成设计的时候能够带来更稳定的显示,较强的抗干扰能力。实际硬件分为有无背光源,带背光的厚度稍微大点,会有更好的显示效果且调节背光源之间的滑变能够显示效果。常用的有16个管脚,分为电源区、指令控制区、数据区、背光区。实际外观尺寸见下图:

图:3.2.1 LDC液晶尺寸图
可以看到上图中有两行显示区域,左上角有1-16个外围引脚可以用,用来驱动屏幕显示想要的数据与字符,先简单说下管脚分布和功能:1管脚与2管脚用来接工作电源;3管脚通过VCC与分压电阻控制屏幕的对比度且会随着电压的变化而增加减少,对比度过高会出现阴影不清晰等现象,因此需要条调节合适的对比度以满足正常显示,可以外接10K电阻进行调整;4管脚RS控制端用来告诉模块当前是发送/读写数据还是指令,在实际现实过程中参与控制时序,高的电平信号控制数据控制寄存器、低电平信号控制指令寄存器;5管脚为W/R读写控制端,与4管脚结合起来可以实现数据/命令&读/写功能;6管脚作为EN使能控制端用来控制液晶的工作状态;7管脚到14管脚为数据线,用来读写数据;15与16管脚控制背光,根据实际情况考虑是否需要接入电路中。
              对控制端口有一定的了解后,还需要掌握读写时序图从而根据时序去设计软件驱动,这里以写数据时序图为例子说下原理过程:
图3.2.2 写数据时序
              上图中RS决定当前是要启用命令寄存器还是数据寄存器,写数据的过程中RS要保持高电平信号,写命令的过程要保持低电平信号。当往液晶上写字符的时候,首先要将RS拉低,R/W保持低电频信号,随后有个上升沿将RS拉成高电位,也就是上图RS对应的第二条信号线。图中tsp_x、tR、tHD_x等间距在设计过程中都可以采用延时实现时序同步。我们可以看到valid data是有效地数据段,只有当RS = 1、R/W = 0、DB0-DB7发送数据、EN使能等状态都满足的时候才能实现数据从I/O写入到液晶。这种时序图在液晶操作与与不同工控领域的传感器数据采集中经常会用到,因此软件设计过程中要严格遵守时序从而获得准确有效地数据值。关于读写命令及读写数据的操作时序就不一一说明了,在下表中根据逻辑时序已经归出控制区域I/O的工作状态,方便开发使用。
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
表:3.2.3 控制时序
上面也有提到16个显示区域,它们也是有对应的基带地址,要在固定的地址上显示字符就需要发送对应的地址指令,第一行地址起始地址为0x00,第二行起始地址为0x40,后续的地址参考图3.2.3。设计时如果没有用到屏幕滚动的话可以不考虑虚拟地址。也就是说从0x10以后到0x27以及0x50到0x67需要开启其滚动显示才能显示出该地址空间上的数据。
关于常见的操作指令可以参考手册中的指令集部分,
图3.2.3地址映射
3.3SHT11温湿度
              对于外界环境的一些非线性参数,需要使用传感器将时变环境参数转换成时变模拟信号,经过预处理后由单片机把模拟信号转化成能够识别的数字信号。对于外界环境的温湿度参数获常用到的测量原件有DHT_x系列与SHT_x系列等测量原件。DHT11在控制领域有着广泛的应用,此外对于高精度的测量仪器仪表设备中SHT11也有着广泛的应用。这两款芯片本质上的区别在于内部采样部分,DHT11的核心部件采用的是湿敏电阻原件,准确度与稳定性相对来讲比较差;SHT11内部采用的湿敏电容元器件,抗扰能力强,准确度高,当然成本上会比DHT11高点,这里设计的时候我们选用SHT11电容性原件进行采样与分析处理。另外一点SHT11的接口上与DHT11也有些许差异,同门内部通信需要遵守各自的协议。详细的管脚图及与控制元件的接线见图3.3.1。
                                         
图:3.3.1 SHT11使用原理图
上述原件预留了四个I/O接口,实际上该芯片有8个管脚且NC全部都接空,除了电源接口提供0-5V的工作电压之外还有串行数据通信接口SCK与DATA。我们采样的数据就需要通过IIC协议传送到8位单片机上,为了避免传送过程中带来的干扰需要在VDD与GND之间加上去耦滤波电容。
在采集数据周期内同样要遵守采样时序电路,前面已经以1602写数据为例说明。此外需要知道在启动传感器后如何发送指令集选择自己要得到数据,启动传输时序缓释通过SCK、DATA数据端口控制。SCK由高电频到低电频再到高电平的反转过程中农DATA同时出现高变低再变高的过程,下图为启动时序图:
图:3.3.2SHT11启动时序
常用的获取参数的指令有:温度测量0x03、湿度测量0x50、读状态寄存器0x07、写状态寄存器0x06、软复位0x1E等。当我们要完成温湿度是测量的时候,需要发布测试命令0x05标识RH当前湿度值,0x03表示当前温度值。当指令发送完成以后会有20ms~320ms的等待时间,分别对应不同位数的的采样单元,常见的有8位12位和14位,位数越大精度越高同时处理时间也要变长,等待数据测量完成以后会有“数据妥备”信号,紧接着进行2个字节的测量数据和一个字节的CRC校验确定数据没有发生错误以后才能够将这组数据打包发送;在收到CRC的校验完成以后,表明通讯完成,如果不进行CRC-8校验的能在测量到LSB之后保持高电位的ACK能够终止通讯且SHT1x会自动进入到睡眠模式。详细的查看完整的测量时序见图3.3.3。
图:3.3.3 SHT11采样时序
3.4感光采样单元
              晾衣架的设计要符合日常使用习惯,实现室外环境,温湿度的监控与感光值得检测,这部分的用到LDR光敏电阻,常见的楼房中楼道的声控光控灯中就有光敏电阻,常见的光敏电阻会随着光照的增强电阻值会变小。为了直观的看到光敏值变化我们可以通过ADC0804模数转换芯片将动态变化的电位差转换成直观的数字信号,需要了解到的是0804的采样电压是0-5V,8位的分辨率映射到256,根据0-5V的采样电势差映射到0-256区间,换算成百分比显示出来。关于ADC0804的管脚说明这里不再赘述,详细参考使用手册。图3.4.1是光敏电阻与三极管构成的光感度检测电路,图3.4.2是ADC0804引脚说明。
图:3.4.1 感光度测试电路
图:3.4.2 ADC0804引脚分布
3.5独立按键单元
设置了独立按键用于控制显示模式和增益控制方式,系统按键事件的触发条件可以是外部触发,也可以软件去抖动检测IO高低电平变化。这里为了节省资源开销,采用按键去抖动,监测电平反转情况确定按键是否被按下。按键部分的原理图如下:
图一  按键电路                        图二  按键抖动
硬件部分的结构通过外接3.3正电压,流经10K上拉电阻后接开关接回GND。电路很简单,上拉电阻正常情况下往IO口输入的电平为高电平,默认拉高电位。按键按下的时候会有按键抖动随后电位编程低电平,按键松开的过程亦如此,随后回复高电平。机械按键的接触点抖动会对IO口监测电频带来干扰,通过软件延时去抖动可以合理的判断案件的工作状态。实际抖动过程状态见下上面图二。按键再按下的时候会有连续按下模式和单次按下模式,这里通过软件按位取反设置连续模式还是单次模式,具体实现方法见附件代码。
              设计中要求具备初始值设定,对于温湿度的上下限有合适的设置范围,检测当前的温湿度实时变化与EEPROM中预存值进行比较,从而驱动电机进行角度与高低调整。按键一方面参与了模式控制另一方面人机交互提供了良好的体验,结合EEPROM将数据保存下来,避免了掉电之后的数据丢失。由于单片机I/O带负载能有限,所以要驱动电机转动还用到了继电器控制电路。下图是电机驱动控制电路:
图:3.5.1 电机驱动单元
第四章:系统软件流程4.1设计流程
软件结构这块主要采用STM32的内部资源,因其内置的ADC/DAC的功能很方便,不用再去单独设计模数和数模转换电路。DAC主要功能是驱动增益控制部分,结合按键模式可以设置出自动增益控制或者手动增益控制。同时将控制的结果反馈输出到液晶屏幕上,可以很直观的看到信号的各种数据,ADC的反馈可以实现系统的闭环增益控制,对输出的信号有直观的了解与认识。按键与液晶结合可以在显示模式上有多种选择,此外系统内部的一些定时器,中断的等内部资源也发挥了很大的作用。在任务调度上起到了隔离保护的作用,整体采用低功耗、高效处理的工作模式,使系统更加稳定且自带反馈功能。下面是软件流程结构:

4.2系统原理
              经过上述硬件单元以及软件流程设计,整个流程中用到了单片机,SHT11温湿度采集及ADC0804模数转光感值,通过读写24C02记录与装载值,实时数据与设定值进行匹配,整个系统具有实时反馈,在proteus7中进行了仿真部分仿真原理图如下:
              图中通过两片52单片机的原因是由于1602、单机控制、SHT11、独立按键等外设占用了太多I/O,由于需要给ADC0804提供正常的工作时序,所以这里直接选择了两片52单片机,实际上可以通过74HC573等锁存芯片进行I/O分配与拓展,相比较而言效果会好点,这里采用两片也能够很好地满足设计要求。
第五章:数据测量分析5.1实验测试数据
              本次测试过程用到了SHT11与LDR光敏电阻,由于仿真的缘故需要在仿真过程中设置外界环境因素,人为的模拟温湿度与光感度。温湿度根据SHT11自身的%RH进行温湿度切换,增加按键模拟当前数值。光敏电阻为了直观的看到数据变化通过电压变观察电阻两端的电位差变化,比较SHT11本身设定值与电压表示数值,与LCD1602显示数据对比,观测数据偏差分析出现误差原因。详细测试数据见表5.1.1
测试条件:提前设定温湿度上下限并保存(温度:30℃              湿度:30%)
测量项目
温度Temp
湿度Humi
光敏值%
1电机状态
2组电机状态
设定值
31.0℃
29.0%
16
\
\
实际值
30.7℃
28.8%
16
回收衣物
向左调整
误差
0.3℃
0.2%
0.00
\
\
测量项目
温度Temp
湿度Humi
光敏值%
电机状态
电机状态
设定值
31.0℃
31.0%
22
\
\
实际值
30.7℃
30.8%
22
回收衣物
向右调整
误差
0.3℃
0.2%
0.00
\
\
测量项目
温度Temp
湿度Humi
光敏值%
1电机组状态
2组电机状态
设定值
30.0℃
29.0%
55
\
\
实际值
28.8℃
28.8%
55
晾晒衣物
向左调整
误差
0.2℃
0.2%
0.00
\
\
测量项目
温度Temp
湿度Humi
光敏值%
电机状态
电机状态
设定值
31.0℃
29.0%
60
\
\
实际值
29.8℃
28.8%
60
回收衣物
向左调整
误差
0.2℃
0.2%
0.00
\
\
5.2结果误差分析、
              通过上表测量数据发现模拟过程中的温湿度实测值与模拟设定值有0.2-0.3的实际误差,经分查阅手册发现SHT11在测量过程中会有±3%的测量误差,出现上诉情况属于正常现象,当然为更加直观看到数据,可以在软件里面增加误差值,在显示到液晶之前对数据提前进行预处理,减去相对误差值从而让结果显示出来更加精确。解决方案办法在软件中进行了处理,见下图:



单片机源码:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include <1602.h>
  6. #include <sht11.h>
  7. #include <24c02.h>
  8.    
  9. #define uchar unsigned char
  10. #define uint  unsigned  int
  11. #define W_cmd 0xa0   //24c02写指令
  12. #define R_cmd 0xa1
  13. uint  temp,humi;
  14. value humi_val,temp_val;             //定义两个共同体,一个用于湿度,一个用于温度
  15. uchar error;                        //用于检验是否出现错误
  16. uchar checksum;                              //CRC

  17. uchar TEMP_data[7];                 //用于记录实测的温度
  18. uchar HUMI_data[6];                 //用于记录实测的湿度
  19. uchar LIGH_data[4];                                //用于记录实测光感度

  20. uchar show_temp[5];                   //显示设定的温度
  21. uchar show_humi[4];                   //显示设定的湿度

  22. uchar data temp_humi_cache[4];         //温湿度设置缓存
  23. uchar temp_set;                 //保存温度变量
  24. uchar humi_set;                         //保存湿度变量
  25. uchar presskeynum;                            //按键次数变量
  26. uchar nn;                                    //用于蜂鸣器
  27. uchar code word1[]={"  a product of  "};
  28. uchar code word2[]={"UNITED ELECTRONS"};
  29. uchar code word3[]={" Welcome........"};
  30. sbit k1=P2^0; //选择按键
  31. sbit k2=P2^1; //增加按键
  32. sbit k3=P2^2; //减小按键
  33. sbit k4=P2^3;// 确认按键
  34. sbit led1=P1^4;        //温度过低指示灯
  35. sbit led2=P1^5;        //温度过高
  36. sbit led3=P1^6;        //湿度低于下限值,报警,加湿。
  37. sbit led4=P1^7;        //湿度过高,报警,不调湿
  38. sbit motor1=P3^4;
  39. sbit motor2=P3^5;
  40. sbit motor3=P3^6;
  41. sbit motor4=P3^7;
  42. sbit P2_6=P2^6;

  43. //********延时函数*********
  44. void delay(uint z)  //z为毫秒数

  45. {
  46.      int a,b;
  47.      for(a=z;a>0;a--)
  48.      for(b=120;b>0;b--);
  49. }
  50. void key()
  51. {
  52.      uchar m;
  53.      if (k1==0) //调整按键检测
  54.      {
  55.          delay(5);
  56.          if (k1==0)
  57.          {
  58.              presskeynum++;
  59.              if(presskeynum==3)
  60.              presskeynum=0;
  61.              while(k1==0);         //若一直按下,循环
  62.              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  63.          }
  64.      }
  65.      if(presskeynum==1)//温度设置
  66.      {
  67.          if(k2==0)    // 加
  68.          {
  69.              delay(300);
  70.              temp_set++;
  71.              if (temp_set>30)
  72.              temp_set=30;
  73.              while(k2==0);       //加上此句必须松按键才处理
  74.           }
  75.           if(k3==0)//减
  76.           {
  77.                delay(300);
  78.                 temp_set--;
  79.                 if (temp_set<18)
  80.                 temp_set=18;
  81.                 while(k3==0);       //加上此句必须松按键才处理
  82.            }
  83.      
  84.        }
  85.       
  86.          if(presskeynum==2)//湿度设置
  87.          {
  88.               if(k2==0)// 加
  89.               {
  90.                   delay(300);
  91.                   humi_set++;
  92.                   if (humi_set>99)
  93.                   humi_set=99;
  94.                   while(k2==0);
  95.                 }
  96.                 if(k3==0)//减
  97.                 {
  98.                     delay(300);
  99.                     humi_set--;
  100.                     if (humi_set<1)
  101.                     humi_set=1;
  102. //                                        while(k3==0);                                                        //这句是调试加入的
  103.                   }
  104.       
  105.            }
  106.      

  107.       
  108.        if(k4==0)// 退出键                                                                                        //设置完初始值以后通过IIC写入24c02并清屏       
  109.        {
  110.             delay(10);
  111.             if(k4==0)
  112.             {
  113.                 while(k4==0);
  114.                 presskeynum=0;
  115.                 temp_humi_cache[0]=temp_set/10;
  116.                 temp_humi_cache[1]=temp_set%10;
  117.                 temp_humi_cache[2]=humi_set/10;
  118.                 temp_humi_cache[3]=humi_set%10;
  119.       
  120.                 for(m=0;m<4;m++)
  121.                 {  
  122.                      WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      //设定值写入24c02
  123.                 }
  124.                 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  125.              }
  126.         }
  127. }

  128. //主函数

  129. void main()
  130. {
  131.          uchar t;
  132.          uchar temp_adc;
  133.          k1=k2=k3=k4=1;
  134.          motor1=motor2=motor3=motor4=0;
  135.          P2_6=0;
  136.      for (t=0;t<4;t++)
  137.      temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);                        //读入24c02设定的值
  138.      temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];                        //设置温度
  139.      humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];                        //设置湿度
  140.      LCD_Initial();                                                                                            //液晶初始化
  141.      GotoXY(0,0);
  142.      Print_slow(word1);
  143.      GotoXY(0,1);
  144.      Print_slow(word2);
  145.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  146.      GotoXY(0,0);
  147.      Print_slow(word3);
  148.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏          //完成系统初始化           
  149.      while(1)
  150.      {
  151.                      key();
  152.                          P1 = 0xff;                                                                                         //P1口初始化
  153.                          temp_adc = P1;                                                                                //读取光敏值,8位精度最大256
  154.              if(presskeynum==0)         //测量温湿度
  155.              {                                                                  
  156.              s_connectionreset(); //启动连接复位
  157.              error=0;                                                          //初始化error=0,即没有错误
  158.              error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量值返回到temp.val.i
  159.              error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量值返回到humi_val.i
  160.              if(error!=0)
  161.                          s_connectionreset();                                                                    //如果发生错误,系统复位
  162.              else
  163.                  {
  164.                                         humi_val.f=(float)humi_val.i;                   //转换为浮点数
  165.                                         temp_val.f=(float)temp_val.i;                   //转换为浮点数
  166.                                         calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度,误差弥补
  167.                                         temp=temp_val.f*10;
  168.                                         humi=humi_val.f*10;
  169.                                         GotoXY(0,0);                                    //选择温度显示位置
  170.                                         Print("Temp:      C --- ");                          //5格空格
  171.                                         GotoXY(0,1);                                    //选择湿度显示位置
  172.                                         Print("Humi:      %     ");                          //5格空格
  173.                                                                   
  174.                                         GotoXY(5,0);                                    //设置温度显示位置
  175.                                         TEMP_data[0]=temp/1000+'0';                                                //温度百位
  176.                                         if (TEMP_data[0]==0x30)                                                 //ASCLL = 0
  177.                                         TEMP_data[0]=0x20;                                                            //对应的ASCLL位空格
  178.                                         TEMP_data[1]=temp%1000/100+'0';                        //温度十位      
  179.                                         if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
  180.                                         TEMP_data[1]=0x20;
  181.                                         TEMP_data[2]=temp%100/10+'0';                   //温度个位
  182.                                         TEMP_data[3]=0x2e;                              //小数点
  183.                                         TEMP_data[4]=temp%10+'0';                       //温度小数点后第一位            
  184.                                         TEMP_data[5]=0xdf;                              //显示温度符号℃书上是第248
  185.                                         TEMP_data[6]='\0';                                                                //实际上0xdf对应的是小圆圈
  186.                                         Print(TEMP_data);                               //输出温度
  187.                                                                                                 
  188.                                         GotoXY(5,1);                                    
  189.                                         HUMI_data[0]=humi/1000+'0';                     //湿度百位                           
  190.                                         if (HUMI_data[0]==0x30)
  191.                                         HUMI_data[0]=0x20;
  192.                                         HUMI_data[1]=humi%1000/100+'0';                         //湿度十位      
  193.                                         HUMI_data[2]=humi%100/10+'0';                            //湿度个位
  194.                                         HUMI_data[3]='.' ;                                       //小数点
  195.                                         HUMI_data[4]=humi%10+'0';                                //湿度小数点后第一位   
  196.                                         HUMI_data[5]='\0';
  197.                                         Print(HUMI_data);                                        //输出湿度

  198.                                         GotoXY(13,1);
  199.                                         LIGH_data[0] = temp_adc%1000/100+'0';
  200. //                                        if(LIGH_data[0] == 0x30)
  201. //                                        LIGH_data[0] = 0x20;
  202.                                         LIGH_data[1] = temp_adc%100/10+'0';
  203.                                         LIGH_data[2] = temp_adc%10+'0';
  204.                                         LIGH_data[3] = '\0';
  205.                                         Print(LIGH_data);  
  206.                                                                                                                                
  207.                                            if ((temp/10)<temp_set)                                           
  208.                                         {
  209.                                                 motor1=1;
  210.                                                 motor2=0;                               
  211.                                         }else if ((temp/10)>=temp_set)
  212.                                         {
  213.                                                 motor2=1;
  214.                                                 motor1=0;
  215.                                        
  216.                                         }
  217.                                         if ((humi/10)<humi_set)
  218.                                         {
  219.                                                 motor3=1;
  220.                                                 motor4=0;
  221.                                         }
  222.                                         else if ((humi/10)>=humi_set)
  223.                                         {       
  224.                                                 motor4=1;
  225.                                                 motor3=0;
  226.                                         }
  227.                                                                                        
  228.                                 }  //else
  229.                         }  //if
  230.                                        
  231.                         if(presskeynum==1)  //设定温度时显示的内容
  232.                         {
  233. ……………………

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



全部资料51hei下载地址(内含仿真与源码等全套资料
智能晾衣架.docx (1.6 MB, 下载次数: 512)
光敏电阻.zip (36.01 KB, 下载次数: 326)
温湿采集.zip (158.77 KB, 下载次数: 318)
原件详解.zip (4.75 MB, 下载次数: 400)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:351620 发表于 2018-6-14 10:58 | 只看该作者
看的不是很明白,有详细的吗?
搞了几个小时,最后用Proteus7.5打开终于成功了

51hei.png (23.78 KB, 下载次数: 129)

51hei.png
回复

使用道具 举报

板凳
ID:358206 发表于 2018-6-25 09:36 | 只看该作者
努力发原创赚币下载
回复

使用道具 举报

地板
ID:392792 发表于 2018-9-6 15:07 | 只看该作者
点了下载,但是没有下载成功,黑币也扣掉了,怎么办....
回复

使用道具 举报

5#
ID:458348 发表于 2019-1-14 22:44 | 只看该作者
怎么没看到附件?下载的之word 文档,在哪个磁盘?
回复

使用道具 举报

6#
ID:266070 发表于 2019-4-12 12:20 | 只看该作者
感觉不怎么清楚
回复

使用道具 举报

7#
ID:515998 发表于 2019-7-13 16:25 | 只看该作者
很实用
回复

使用道具 举报

8#
ID:419264 发表于 2019-10-8 13:45 | 只看该作者
老哥,仿真好像不成功啊,LCD只是亮了,没有显示任何东西
回复

使用道具 举报

9#
ID:419264 发表于 2019-10-8 13:47 | 只看该作者
老哥,仿真好像不成功啊,LCD只是亮了,没有显示任何东西,能指导一下吗?谢了
回复

使用道具 举报

10#
ID:332895 发表于 2019-10-18 22:26 | 只看该作者
下载了一篇文档,里面极不完整,缺少很多内容
回复

使用道具 举报

11#
ID:245429 发表于 2019-12-2 20:30 | 只看该作者
不完整只有温度采集和电阻,仿真没有
回复

使用道具 举报

12#
ID:688785 发表于 2020-1-30 15:53 | 只看该作者
123456118 发表于 2018-6-25 09:36
老哥能把文件共享一下么

老哥拿到文件了吗 我也想要
回复

使用道具 举报

13#
ID:693508 发表于 2020-2-17 18:58 | 只看该作者
15038608249 发表于 2019-10-8 13:47
老哥,仿真好像不成功啊,LCD只是亮了,没有显示任何东西,能指导一下吗?谢了

这个帖子的东西全吗?
回复

使用道具 举报

14#
ID:693508 发表于 2020-2-19 19:11 | 只看该作者
15038608249 发表于 2019-10-8 13:47
老哥,仿真好像不成功啊,LCD只是亮了,没有显示任何东西,能指导一下吗?谢了

老哥,你下的文件里面东西全吗?能共享一下吗,最近为文档的事弄得头疼
回复

使用道具 举报

15#
ID:552550 发表于 2020-3-11 22:49 | 只看该作者
Eli_ 发表于 2019-10-18 22:26
下载了一篇文档,里面极不完整,缺少很多内容

仿真得如何???
回复

使用道具 举报

16#
ID:716583 发表于 2020-4-13 15:01 | 只看该作者

你好,为什么我的光强一直都是显示255,光敏检测那部分是不是有问题?
回复

使用道具 举报

17#
ID:161248 发表于 2020-4-26 11:27 | 只看该作者
仿真呢
回复

使用道具 举报

18#
ID:697395 发表于 2020-5-8 20:21 | 只看该作者
也不知道说的是不是真的
回复

使用道具 举报

19#
ID:937315 发表于 2021-6-15 08:23 | 只看该作者
17854168230 发表于 2018-6-14 10:58
看的不是很明白,有详细的吗?
搞了几个小时,最后用Proteus7.5打开终于成功了

里面没有仿真啊
回复

使用道具 举报

20#
ID:328014 发表于 2021-6-16 00:21 | 只看该作者

dsn文件就是仿真工程文件, 用Proteus7.5打开即可,不要用别的版本
回复

使用道具 举报

21#
ID:1028005 发表于 2022-5-23 23:33 | 只看该作者
左下角的AT89C52 芯片的引脚不清楚 可以发清晰一点的吗
回复

使用道具 举报

22#
ID:1028005 发表于 2022-5-24 00:00 | 只看该作者
有人有把这个智能晾衣架系统运行成功吗
回复

使用道具 举报

23#
ID:1028005 发表于 2022-5-26 16:00 | 只看该作者
17854168230 发表于 2018-6-14 10:58
看的不是很明白,有详细的吗?
搞了几个小时,最后用Proteus7.5打开终于成功了

有完整一点的吗左下角芯片的引脚不清楚
回复

使用道具 举报

24#
ID:1028005 发表于 2022-5-26 16:01 | 只看该作者

可以打开运行成功吗
回复

使用道具 举报

25#
ID:696448 发表于 2022-9-8 17:01 | 只看该作者
只有我没看到仿真在哪下载吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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