找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11933|回复: 31
收起左侧

智能窗帘设计:51单片机+A/D转换+光敏电阻+LCD1602+步进电机

  [复制链接]
ID:458298 发表于 2019-6-26 13:04 | 显示全部楼层 |阅读模式
这是我做的仿真,如有不足,还请大家指出。谢谢各位。文件中包含protues仿真、程序。
51hei.png

protues仿真图

protues仿真图


单片机源程序如下:
  1. #include <reg52.h>         

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define yi 0x80       //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
  5. #define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

  6. uchar display_digit[]={0,0,0};
  7. uchar yuzhi[]={0,0,0};
  8. uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A
  9. uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D

  10. sbit R_D=P2^0;
  11. sbit W_R=P2^1;        
  12. sbit C_S=P2^2;        

  13. sbit Up=P2^3;               
  14. sbit Down=P2^4;               

  15. sbit rw=P2^5;                 //液晶读写端
  16. sbit rs=P2^6;                 //液晶指令/数据输入控制
  17. sbit en=P2^7;                 //液晶使能端

  18. sbit AD_data=P1;        

  19. sbit bianji=P3^4;
  20. sbit jia=P3^7;
  21. sbit jian=P3^6;

  22. uint adval;
  23. uint fazhi=180;
  24. uchar state=1;//1为窗帘打开,0为窗帘关闭
  25. uchar zhuangtai=1;//1为窗帘打开,0为窗帘关闭

  26. void  Time_init()               
  27. {
  28.         EA=1;
  29.         TMOD=0x11;
  30.         TH0=0xf8;        
  31.         TL0=0xcc;
  32.         ET0=1;
  33.         TR0=0;
  34. }

  35. void delay(uint time)         
  36. {
  37.         uint x,y;                        
  38.         for(x=time;x>0;x--)
  39.         for(y=110;y>0;y--);        
  40. }

  41. void qiangdushuzhi()               
  42. {
  43.         C_S=0;                                 
  44.         W_R=0;                 //启动AD转换
  45.         delay(1);
  46.         W_R=1;
  47.         C_S=1;
  48.         delay(10);
  49.         P1=0xff;                //读取AD转换值前,先把P1口置1               
  50.         C_S=0;
  51.         R_D=0;                         //AD读使能
  52.         delay(1);                  
  53.         adval=P1;                  //把AD转换好的值,赋给 adval
  54.         R_D=1;
  55.         C_S=1;                         //置1后,为下次AD转换做准备
  56.         delay(1);
  57.         
  58.         display_digit[0]=adval/100;
  59.         display_digit[1]=adval%100/10;                   //取得十位数字
  60.         display_digit[2]=adval%10;                   //取得个位数字
  61. }               

  62. void write_1602com(uchar com)
  63. {
  64.         rs=0;                //数据/指令选择置为指令
  65.         rw=0;                //读写选择置为写
  66.         P0=com;              //送入数据
  67.         delay(1);
  68.         en=1;                //拉高使能端,为制造有效的下降沿做准备
  69.         delay(1);
  70.         en=0;                //en由高变低,产生下降沿,液晶执行命令
  71. }

  72. void write_1602dat(uchar dat)
  73. {
  74.         rs=1;               //数据/指令选择置为数据
  75.         rw=0;               //读写选择置为写
  76.         P0=dat;             //送入数据
  77.         delay(1);
  78.         en=1;               //en置高电平,为制造下降沿做准备
  79.         delay(1);
  80.         en=0;               //en由高变低,产生下降沿,液晶执行命令
  81. }

  82. void write_1602str(uchar *s)  //写字符串
  83. {
  84.         while(*s)
  85.                 {
  86.                         write_1602dat(*s++);
  87.     }
  88. }

  89. void lcd_init()
  90. {
  91.         write_1602com(0x38);         //设置液晶工作模式,
  92.         write_1602com(0x0c);         //开显示不显示光标
  93.         write_1602com(0x06);         //整屏不移动,光标自动右移
  94.         write_1602com(0x01);         //清显示
  95.   delay(5);
  96.         write_1602com(yi+5);         //固定符号从第一行第1个位置之后开始显示
  97.         write_1602str("WELCOME");      
  98.         delay(1000);
  99.         write_1602com(0x01);
  100. }

  101. void display( )
  102. {
  103.         yuzhi[0]=fazhi/100;
  104.         yuzhi[1]=fazhi%100/10;
  105.         yuzhi[2]=fazhi%10;
  106.         write_1602com(yi+0);
  107.         write_1602str(" TARGET:");
  108.   if(yuzhi[0]==0)
  109.         {
  110.                 write_1602dat(0x30+yuzhi[1]);
  111.                 delay(5);
  112.                 write_1602dat(0x30+yuzhi[2]);
  113.                 delay(5);
  114.         }
  115.   if(yuzhi[0]!=0)
  116.         {
  117.                 write_1602dat(0x30+yuzhi[0]);
  118.                 delay(5);
  119.                 write_1602dat(0x30+yuzhi[1]);
  120.                 delay(5);
  121.                 write_1602dat(0x30+yuzhi[2]);
  122.                 delay(5);
  123.         }
  124.         write_1602com(er+0);       //er是头文件写的值0x80+0x40
  125.         delay(5);
  126.         write_1602str("CURRENT:");   
  127.         delay(5);
  128.         if(display_digit[0]==0)
  129.         {
  130.                 write_1602dat(0x30+display_digit[1]);      //数字+30得到该数字的LCD1602显示码
  131.           delay(5);
  132.           write_1602dat(0x30+display_digit[2]);      //数字+30得到该数字的LCD1602显示码                        
  133.     delay(5);        
  134.                 write_1602str(" ");      //数字+30得到该数字的LCD1602显示码                        
  135.     delay(5);        
  136.         }
  137.         if(display_digit[0]!=0)
  138.         {
  139.                 write_1602dat(0x30+display_digit[0]);
  140.           delay(5);
  141.           write_1602dat(0x30+display_digit[1]);      //数字+30得到该数字的LCD1602显示码
  142.           delay(5);
  143.           write_1602dat(0x30+display_digit[2]);      //数字+30得到该数字的LCD1602显示码                        
  144.     delay(5);
  145.         }
  146.         if(zhuangtai==1)
  147.         {
  148.                 write_1602com(yi+12);
  149.                 write_1602str("OPEN");
  150.         }
  151.         if(zhuangtai==0)
  152.         {
  153.                 write_1602com(er+11);
  154.                 write_1602str("CLOSE");
  155.         }
  156. }

  157. void zhengzhuan(uchar step)  //上升
  158. {
  159.         uchar i,j,k;
  160.         if(zhuangtai==0)
  161.         {
  162.                 write_1602com(0x01);
  163.                 write_1602com(yi+6);
  164.                 write_1602str("UP");
  165.                 k=20*step;
  166.                 for(j=0;j<k;j++)
  167.                 {
  168.                         for(i=0;i<4;i++)
  169.                         {
  170.                                 P3=phasecw[i];
  171.                                 delay(10);//转速调节
  172.                         }
  173.                 }
  174.     P3=0xf1;
  175.                 zhuangtai=1;
  176.         }
  177. }
  178.         
  179. void fanzhuan(uchar step)  //下降
  180. {
  181.         uchar i,j,k;
  182.         if(zhuangtai==1)
  183.         {
  184.                 write_1602com(0x01);
  185.                 write_1602com(yi+6);
  186.                 write_1602str("DOWN");
  187.                 k=20*step;
  188.                 for(j=0;j<k;j++)
  189.                 {
  190.                         for(i=0;i<4;i++)
  191.                         {
  192.                                 P3=phaseccw[i];
  193.                                 delay(10);//转速调节
  194.                         }
  195.                 }
  196.                 P3=0xf8;
  197.                 zhuangtai=0;
  198.         }
  199. }

  200. void move(uchar level)
  201. {
  202.         switch(level)
  203.                 {
  204.                         case 0:switch(state)
  205.                                 {
  206.                                         case 0:break;
  207.                             case 1:fanzhuan(10);break;
  208.                     }
  209.                         state=0;break;
  210.                   case 1:switch(state)
  211.                                 {
  212.                                         case 0:zhengzhuan(10);break;
  213.                             case 1:break;
  214.                     }
  215.                         state=1;break;
  216.                 }
  217. }


  218. void bijiao()
  219. {
  220.         if(adval>=0&&adval<fazhi)
  221.         move(0);
  222.         if(adval>=fazhi&&adval<500)
  223.         move(1);
  224. }

  225. void yunxing()
  226. {
  227.         if(Down==1)
  228.                 {
  229.                         if(Up==1)
  230.                                 {
  231.                                         bijiao();
  232.                     }
  233.                         else if(Up==0)
  234.                     {
  235.                             zhengzhuan(10);
  236.                     }
  237.           }
  238.         else if(Down==0)
  239.                 {
  240.                   fanzhuan(10);
  241.           }
  242. }

  243. void key()
  244. {
  245.         if(bianji==0)
  246.         {
  247.                 write_1602com(yi+0);
  248.                 write_1602str("ORIGINAL:");
  249.                 if(yuzhi[0]==0)
  250.                 {
  251.                         write_1602dat(0x30+yuzhi[1]);
  252.                         delay(5);
  253.                         write_1602dat(0x30+yuzhi[2]);
  254.                         delay(5);
  255.                 }
  256.                 if(yuzhi[0]!=0)
  257.                 {
  258.                         write_1602dat(0x30+yuzhi[0]);
  259.                         delay(5);
  260.                         write_1602dat(0x30+yuzhi[1]);
  261.                         delay(5);
  262.                         write_1602dat(0x30+yuzhi[2]);
  263.                         delay(5);
  264.                 }
  265.                 write_1602str("    ");
  266.                 delay(5);
  267.                 while(1)
  268.                 {
  269.                         yuzhi[0]=fazhi/100;
  270.                         yuzhi[1]=fazhi%100/10;
  271.                         yuzhi[2]=fazhi%10;
  272.                         write_1602com(er+0);
  273.                         write_1602str("SETTING:");
  274.                         if(yuzhi[0]==0)
  275.                         {
  276.                                 write_1602dat(0x30+yuzhi[1]);
  277.                                 delay(5);
  278.                                 write_1602dat(0x30+yuzhi[2]);
  279.                                 delay(5);
  280.                         }
  281.                         if(yuzhi[0]!=0)
  282.                         {
  283.                                 write_1602dat(0x30+yuzhi[0]);
  284.                                 delay(5);
  285.                                 write_1602dat(0x30+yuzhi[1]);
  286.                                 delay(5);
  287.                                 write_1602dat(0x30+yuzhi[2]);
  288.                                 delay(5);
  289.                         }
  290.                         if(jia==0)
  291.                         {
  292.                                 delay(400);
  293.                                 fazhi=fazhi+5;
  294.                         }
  295.                         if(jian==0)
  296.                         {
  297.                                 delay(400);
  298.                                 fazhi=fazhi-5;
  299.                         }
  300.                         if(bianji==1)
  301.                         {
  302.                                 write_1602com(0x01);
  303.         break;
  304.                         }                                
  305.                 }
  306.         }
  307. }

  308. void main()                                
  309. {
  310.         Time_init();
  311.         delay(50);
  312.         lcd_init();      //调用液晶屏初始化子函数
  313.         while(1)               
  314.         {
  315.                 key();
  316.                 qiangdushuzhi();
  317.                 display();
  318.                 yunxing();
  319.         }
  320. }
复制代码
d.png c.png
所有资料51hei提供下载,用Proteus8.8才能打开:
智能窗帘设计.rar (88 KB, 下载次数: 641)

评分

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

查看全部评分

回复

使用道具 举报

ID:563758 发表于 2019-6-28 06:15 | 显示全部楼层
正在学习中
回复

使用道具 举报

ID:524014 发表于 2019-6-28 08:45 | 显示全部楼层
哇这的不错
回复

使用道具 举报

ID:579842 发表于 2019-7-17 10:18 来自手机 | 显示全部楼层
为什么这个实物焊好液晶屏不显示呢
回复

使用道具 举报

ID:489394 发表于 2019-10-31 21:46 | 显示全部楼层
绝对好帖子 感谢分享!!!
回复

使用道具 举报

ID:245429 发表于 2019-12-2 20:50 | 显示全部楼层
为什么仿真打不开,是打包缺什么文件吗?楼主用的是哪一个版本的PROTEUS
回复

使用道具 举报

ID:564157 发表于 2019-12-17 19:42 | 显示全部楼层
hahahaha..... 发表于 2019-7-17 10:18
为什么这个实物焊好液晶屏不显示呢

你调电位器了吗
回复

使用道具 举报

ID:668500 发表于 2019-12-19 18:21 来自手机 | 显示全部楼层
怎么没有光敏电阻 电路图里面?
回复

使用道具 举报

ID:294123 发表于 2020-2-13 14:39 | 显示全部楼层
793188403 发表于 2019-12-19 18:21
怎么没有光敏电阻 电路图里面?

用滑动变阻器代替了
回复

使用道具 举报

ID:541150 发表于 2020-2-21 19:36 | 显示全部楼层
这个只能实现光控吗?
回复

使用道具 举报

ID:700745 发表于 2020-3-7 13:49 | 显示全部楼层
拿去试一下,再来
回复

使用道具 举报

ID:424140 发表于 2020-3-9 13:08 | 显示全部楼层

实现了吗?
回复

使用道具 举报

ID:729259 发表于 2020-4-25 09:02 | 显示全部楼层
楼主用的那个版本的软件?我下载的工程文件打不开,提示错误
回复

使用道具 举报

ID:737782 发表于 2020-4-25 16:08 | 显示全部楼层
我想弄个温控的
回复

使用道具 举报

ID:366000 发表于 2020-4-25 21:57 来自手机 | 显示全部楼层
设计文档有吗?谢谢
回复

使用道具 举报

ID:582255 发表于 2020-4-25 22:50 | 显示全部楼层
不能手动自动切换吧?
回复

使用道具 举报

ID:646835 发表于 2020-5-11 09:47 | 显示全部楼层
仿真图为什吗打不开
回复

使用道具 举报

ID:137747 发表于 2020-5-11 15:08 | 显示全部楼层
为什么仿真打不开,是打包缺什么文件吗?楼主用的是哪一个版本的PROTEUS
回复

使用道具 举报

ID:646835 发表于 2020-5-13 19:02 | 显示全部楼层
mqq一米八八 发表于 2020-5-11 09:47
仿真图为什吗打不开

打不开,
回复

使用道具 举报

ID:646835 发表于 2020-5-13 19:38 | 显示全部楼层

用ISISprotel
回复

使用道具 举报

ID:766755 发表于 2020-6-4 16:59 | 显示全部楼层
有设计文档吗
回复

使用道具 举报

ID:763338 发表于 2020-6-5 21:52 | 显示全部楼层
哪一个打开呀 为什么用proteus打开不了
回复

使用道具 举报

ID:763338 发表于 2020-6-5 22:18 | 显示全部楼层
cly5940220 发表于 2020-4-25 09:02
楼主用的那个版本的软件?我下载的工程文件打不开,提示错误

我的也打不开
回复

使用道具 举报

ID:775795 发表于 2020-6-15 09:30 来自手机 | 显示全部楼层
有没有说明书
回复

使用道具 举报

ID:864140 发表于 2020-12-23 10:31 | 显示全部楼层
能在这基础上再加一个转机吗?感觉都没有引脚了
回复

使用道具 举报

ID:857685 发表于 2020-12-28 19:34 | 显示全部楼层
想问一下大哥们,就是最近小弟做了个类似的小玩意儿,然后仿真画好了,程序也写好了,步进电机跟光敏电阻+LCD1602显示模块都分别能用,但是不懂如何把它们写到一起呀,求懂的大哥给小弟指点一二
回复

使用道具 举报

ID:674878 发表于 2021-1-5 16:30 | 显示全部楼层
想问一下这个2003驱动管脚在哪里设置的
回复

使用道具 举报

ID:935542 发表于 2021-6-15 14:42 来自手机 | 显示全部楼层
有用STC15来做的吗?
回复

使用道具 举报

ID:1034298 发表于 2023-2-4 21:35 | 显示全部楼层
793188403 发表于 2019-12-19 18:21
怎么没有光敏电阻 电路图里面?

左下角RV1就是光敏电阻
回复

使用道具 举报

ID:1062205 发表于 2023-2-5 16:03 | 显示全部楼层
单调的唯一的 发表于 2019-12-2 20:50
为什么仿真打不开,是打包缺什么文件吗?楼主用的是哪一个版本的PROTEUS

需要8.11以上,你的版本低了吧
回复

使用道具 举报

ID:1062205 发表于 2023-2-5 16:04 | 显示全部楼层
aktuan007 发表于 2020-4-25 22:50
不能手动自动切换吧?

能,只要重新设置按键即可
回复

使用道具 举报

ID:1062205 发表于 2023-2-5 16:05 | 显示全部楼层
fx158 发表于 2020-2-21 19:36
这个只能实现光控吗?

不只是光控,还能控制电机
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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