找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的智能窗帘控制系统Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主
自己做的设计,能够手动开关窗帘,根据光照与温度自动开关窗帘,有温控和光控模式,每个模式都有一个按钮进行控制。窗帘的开关是根据电机的状态来判断的,比如0是打开,130左右是关闭。
本人大二,设计上可能还有改善的空间,但给师傅看时是非常完善,没有错误的,欢迎交流,请多指教~

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


单片机源程序如下:
  1. #include<reg52.h>                   //头文件
  2. #include"LCD1602.h"
  3. #include"ADC0832.h"
  4. #include"28BYJ48.h"
  5. #include"DS18B20.h"

  6. #define uchar unsigned char

  7. sbit k1 = P1^0;
  8. sbit k2 = P1^1;
  9. sbit k3 = P1^2;
  10. sbit k4 = P1^3;

  11. //全局变量
  12. uchar light=0,temp=0;
  13. int flag=0,z=0,f=0;
  14. int q=0;
  15. int j=0,k=0;
  16. int count=0,flag1=0;
  17. int Time;
  18. int mode=0;

  19. void delay(int x)
  20. {
  21.         int i;
  22.         while(x--)
  23.         for(i=10;i>0;i--);
  24. }

  25. void auto_control_motor(uchar dat)
  26. {
  27.         if(Time < dat)
  28.         {
  29.                 Time++;
  30.                 motor_z();
  31.         }
  32.         else if(Time == dat) motor_s();
  33.         else
  34.         {
  35.                 Time--;
  36.                 motor_f();
  37.         }
  38. }

  39. void light_state_control()
  40. {
  41.         if(light<0)                                                        flag = -1;
  42.         if(light>=0 && light<35)                        flag = 0;
  43.         else if(light>35 && light<75)                flag = 1;
  44.         else                                                                flag = 2;

  45.         switch(flag){
  46.                 case -1:        auto_control_motor(0);
  47.                         break;
  48.                 case  0:        auto_control_motor(0);
  49.                         break;
  50.                 case  1:        auto_control_motor(10);
  51.                         break;
  52.                 case  2:        auto_control_motor(30);
  53.                         break;
  54.                 }
  55. }

  56. void temp_state_control()
  57. {
  58.         if(current<0)                                                        flag = 0;
  59.         if(current>15 && current<=25)                        flag = 0;
  60.         else if(current == 15)                                        motor_s();                                         //特殊情况
  61.         else if(current>25 && current<35)                flag = 1;
  62.         else                                                                        flag = 2;

  63.         switch(flag){
  64.                 case -1:delay(10000);
  65.                         break;
  66.                 case  0:        auto_control_motor(0);
  67.                         break;
  68.                 case  1:        auto_control_motor(14);
  69.                         break;
  70.                 case  2:        auto_control_motor(14);
  71.                         break;
  72.                 }
  73. }

  74. void curtain_state_control()
  75. {
  76.         if((light>=0 && light<35))                        flag = 0;
  77.         else if((light>35 && light<75))                flag = 1;
  78.         else                                                                flag = 2;
  79.         
  80.         switch(flag){
  81.         case  0:        
  82.                                 lcd1602_write_character(12, 3, "on  ");
  83.                                 lcd1602_write_character(12, 4, "low ");
  84.                 break;
  85.         case  1:        
  86.                                 lcd1602_write_character(12, 3, "half");
  87.                                 lcd1602_write_character(12, 4, "mid ");
  88.                 break;
  89.         case  2:        
  90.                                 lcd1602_write_character(12, 3, "off ");
  91.                                 lcd1602_write_character(12, 4, "high");
  92.                 break;
  93.         }        
  94. }


  95. void main(void)
  96. {

  97.         delay(100);
  98.         ReadTemperature();
  99.         delay(100);
  100.         LCD_init();
  101.         ADC0832_read(0);
  102.         ADC0832_read(0);
  103.         lcd1602_write_character(0, 1, "Light  :");
  104.         lcd1602_write_character(0, 2, "Temp   :");
  105.            lcd1602_write_character(0, 3, "Cutain :");
  106.         lcd1602_write_character(0, 4, "Level  :");
  107.         while(1)
  108.         {               
  109.                 if(k1 == 0)                mode = 1;
  110.                 if(k2 == 0)                mode = 2;
  111.                 if(k3 == 0)                mode = 3;
  112.                 if(k4 == 0)                mode = 4;

  113.                 if(mode==1)
  114.                 {
  115.                         light=ADC0832_read(0);                                                                //读取AD值
  116.                         light=light*100/255;                                                                //转换为光强
  117.                
  118.                         LCD_disp_char(12, 1, ASCII[light/100]);
  119.                         LCD_disp_char(13,1,ASCII[light%100/10]);
  120.                         LCD_disp_char(14,1,ASCII[light%10]);
  121.                         //窗帘状态管理
  122.                         light_state_control();
  123.                         curtain_state_control();
  124.                 }
  125. //-------------------------------温控模式--------------------------------------
  126.                 if(mode==2)
  127.                 {
  128.                         DS_read_temperature();
  129.                         display_temperature();
  130.                           temp_state_control();
  131.                         if(current>15 && current<=25) lcd1602_write_character(12, 3, "on  ");
  132.                         else lcd1602_write_character(12, 3, "off ");  
  133. ……………………

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

所有资料51hei提供下载:
智能窗帘.zip (84.95 KB, 下载次数: 360)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:791661 发表于 2020-6-29 14:23 | 只看该作者
void auto_control_motor(uchar dat)
{
        if(Time < dat)
        {
                Time++;
                motor_z();
        }
        else if(Time == dat) motor_s();
        else
        {
                Time--;
                motor_f();
        }
}
这一段的Time有数值吗
回复

使用道具 举报

板凳
ID:794694 发表于 2020-7-1 14:07 来自手机 | 只看该作者
我到protues仿真不成功,为什么

5f5e8081fd5fa63.jpg (1.6 MB, 下载次数: 152)

5f5e8081fd5fa63.jpg
回复

使用道具 举报

地板
ID:794590 发表于 2020-7-1 15:32 | 只看该作者
乃万 发表于 2020-6-29 14:23
void auto_control_motor(uchar dat)
{
        if(Time < dat)

全局变量有默认值
回复

使用道具 举报

5#
ID:328014 发表于 2020-7-2 03:47 | 只看该作者
208314763 发表于 2020-7-1 14:07
我到protues仿真不成功,为什么

你这个是安装有问题.我刚下载测试的时候也是报错,不过不是你这个错误,是显示External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.
后来我从http://www.51hei.com/bbs/dpj-56637-1.html  这里下载了adc083x.dll 到模块目录就搞定了
我是安装的Proteus仿真8.8版本

效果如下图:

51hei.png (32.39 KB, 下载次数: 162)

51hei.png
回复

使用道具 举报

6#
ID:796538 发表于 2020-7-5 07:47 | 只看该作者
51hei团团 发表于 2020-7-2 03:47
你这个是安装有问题.我刚下载测试的时候也是报错,不过不是你这个错误,是显示External model DLL "ADC083X ...

怎么安装这个文件包呢,我百度看直接拖进去,我拖进去了还是不好使,还是会显示adc083x
回复

使用道具 举报

7#
ID:897661 发表于 2021-3-30 15:39 | 只看该作者
可以遥控吗
回复

使用道具 举报

8#
ID:910315 发表于 2021-4-26 10:00 | 只看该作者
51hei团团 发表于 2020-7-2 03:47
你这个是安装有问题.我刚下载测试的时候也是报错,不过不是你这个错误,是显示External model DLL "ADC083X ...

你好  附件在哪找的
回复

使用道具 举报

9#
ID:839752 发表于 2021-5-7 19:45 | 只看该作者
你好,有具体的各个模块的讲解吗,比如光敏检测模块的数据传输,单片机初学者,希望得到你的答复
回复

使用道具 举报

10#
ID:721091 发表于 2021-5-25 08:52 | 只看该作者

没做遥控
回复

使用道具 举报

11#
ID:721091 发表于 2021-5-25 08:53 | 只看该作者
TTTZW 发表于 2021-5-7 19:45
你好,有具体的各个模块的讲解吗,比如光敏检测模块的数据传输,单片机初学者,希望得到你的答复

时间太久远了,现在不做单片机,这些资料没有了嗷 不好意思
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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