找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9878|回复: 9
收起左侧

单片机智能窗帘proteus仿真图与代码

  [复制链接]
ID:416761 发表于 2018-10-28 16:19 | 显示全部楼层 |阅读模式
可以给大家参考一下,也是从其他地方学习的,做了一些修改

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

单片机源程序如下:
  1. /*********51单片机智能窗帘设计*********/
  2. /*************JJ电子直营店*************/
  3. /***************原创设计***************/

  4. #include <REGX52.H>                                  //头文件
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. #define CS        P3_0                //ADC0804 CS端口
  8. #define RD        P3_1                //ADC0804 RD端口
  9. #define WR        P3_2                //ADC0804 WR端口
  10. #define g_kz        P2_5         //数码管个位控制
  11. #define s_kz        P2_4        //数码管十位控制
  12. #define b_kz        P2_3        //数码管百位控制
  13. #define q_kz        P2_2        //码管千位控制
  14. #define SMG_XS        P0                //数码管显示端口
  15. #define AD_data        P1                //ADC0804输出端口
  16. #define Up                P2_1        //上限限位开关端口
  17. #define Down         P2_0        //下限限位开关端口
  18. #define Key1        P3_3        //手动/自动切换 按键
  19. #define Key2        P3_4        //定时/光控功能切换 按键
  20. #define Key3        P3_5        //设置 按键
  21. #define Key4        P3_6        //加 按键 (手动模式:打开窗帘 定时模式:定时打开窗帘)
  22. #define Key5        P3_7        //减 按键 (手动模式:关闭窗帘 定时模式:定时关闭窗帘)

  23. #define IA                P2_7        //直流电机控制端口
  24. #define IB                P2_6        //直流电机控制端口

  25. int adval;                 //ADC 输出变量
  26. int j;                        //定义循环变量 i j
  27. uchar flag=0;        //显示标志位(0:正常显示 1:上限光照度设置(调时) 2:下限光照度设置(调分)                                 
  28. bit flag_gd=0;        //光控/定时标志位(0:当前光照度 1:定时时间 )       
  29. bit ms=0;                //模式(0:手动模式 1:自动模式)
  30. bit move=0;                //定时时间到标志位(0:时间未到 1:时间到)
  31. bit OFF_ON=0;        //电机正反转标志位,表示窗帘打开或关闭(0:窗帘关闭 1:窗帘打开)
  32. bit Time_OFF_ON=0;//定时时间到执行窗帘打开或关闭(0:定时关闭窗帘 1:定时打开窗帘)

  33. char hour=12,min=0;sec=0; //定义时间 “时 分 秒”变量 上电默认12.00.00
  34. char num=0;        //时间基数
  35. uint H_GM=240;        //定义上限光敏度设置变量,上电默认200
  36. uint L_GM=100;        //定义下限光敏度设置变量,上电默认100
  37. uchar t=1;                 //数码管动态扫描延时参数
  38.                
  39. uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};       
  40. //数码管显示数组      0    1    2    3    4    5    6    7    8    9

  41. void delay(uint time)                   //延时函数
  42. {
  43.         uint x,y;                         //定义临时变量 x y
  44.         for(x=time;x>0;x--)
  45.         for(y=110;y>0;y--);        //空操作
  46. }

  47. void  Time_init()                //定时器初始化
  48. {
  49.         EA=1;
  50.         TMOD=0x11;

  51.         /*定时器0初始化(产生PWM控制电机转速)*/       
  52.         TH0=0xf8;        //定时2ms
  53.         TL0=0xcc;
  54.         ET0=1;                //使能T0中断
  55.         TR0=0;                //先不启动定时器0
  56.         /*定时器1初始化(产生50ms定时时间)*/
  57.         TH1=0x4c;                 //50ms
  58.         TL1=0x00;
  59.         ET1=1;
  60.         TR1=0;                //先不启动定时器1       
  61. }

  62. void Key_cl()
  63. {
  64.         static bit keybuf1=1;          //Key1值暂存,临时保存按键扫描值
  65.         static bit backup1=1;          //Key1值备份,保存前一次的扫描值
  66.         static bit keybuf2=1;         //Key2值暂存,临时保存按键扫描值       
  67.         static bit backup2=1;        //Key2值备份,保存前一次的扫描值
  68.         static bit keybuf3=1;        //Key3值暂存,临时保存按键扫描值
  69.         static bit backup3=1;         //Key3值备份,保存前一次的扫描值
  70.         static bit keybuf4=1;        //Key4值暂存,临时保存按键扫描值
  71.         static bit backup4=1;         //Key4值备份,保存前一次的扫描值
  72.         static bit keybuf5=1;        //Key5值暂存,临时保存按键扫描值
  73.         static bit backup5=1;         //Key5值备份,保存前一次的扫描值
  74.         keybuf1=Key1;                          //把Key1当前值扫描值暂存
  75.         if(keybuf1!=backup1)        //Key1当前值与前次值不相等,说明Key1按键有动作
  76.         {
  77.                 delay(1);                        //延时去抖
  78.                 if(keybuf1==Key1)        //判断Key1扫描值有没有发生变化,即按键抖动
  79.                 {
  80.                         if(backup1==1)        //Key1按键按下有效
  81.                         {
  82.                                 move=0;                   //重置时间标志位为0(时间未到)
  83.                                 TR0=0;                //关闭定时器0
  84.                                 ms=~ms;                // 模式取反
  85.                                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;//关闭数码管显示
  86.                                 IA=0;IB=0;        //窗帘停止       
  87.                         }
  88.                         backup1=keybuf1; //更新备份Key1当前值,以备进行下次比较
  89.                 }
  90.         }
  91.         if(ms==0)                          //手动模式下
  92.         {
  93.                 if(Key4==0)                //当打开窗帘按键 按下
  94.                 {
  95.                         delay(10);        //延时去抖
  96.                         if(Key4==0)        //再判断按键是否按下
  97.                         {
  98.                                 move=0;                                //重置时间标志位为0(时间未到)
  99.                                 OFF_ON=1;                         //窗帘打开
  100.                                 TR0=1;                                //开启定时器0
  101.                                 SMG_XS=table[1];         //数码管显示"1"
  102.                                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位显示
  103.                                 while(Key4==0);        //等待按键松开
  104.                                 TR0=0;                        //关闭定时器0
  105.                                 IA=0;IB=0;                //窗帘停止
  106.                                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //关闭数码管       
  107.                         }
  108.                 }
  109.                 if(Key5==0)                //当关闭窗帘按键 按下
  110.                 {
  111.                         delay(10);         //延时去抖       
  112.                         if(Key5==0)        //再判断按键是否按下
  113.                         {
  114.                                 move=0;                                //重置时间标志位为0(时间未到)
  115.                                 OFF_ON=0;                         //窗帘关闭
  116.                                 TR0=1;                                //开启定时器0
  117.                                 SMG_XS=table[0];         //数码管显示"0"
  118.                                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位显示
  119.                                 while(Key5==0);        //等待按键松开
  120.                                 TR0=0;                        //关闭定时器0
  121.                                 IA=0;IB=0;        //窗帘停止       
  122.                                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //关闭数码管
  123.                         }
  124.                 }               
  125.         }
  126.         else                 //自动模式下
  127.         {
  128.                 keybuf2=Key2;                          //把Key2当前值扫描值暂存
  129.                 if(keybuf2!=backup2)        //Key2当前值与前次值不相等,说明Key2按键有动作
  130.                 {
  131.                         delay(1);                        //延时去抖
  132.                         if(keybuf2==Key2)        //判断Key2扫描值有没有发生变化,即按键抖动
  133.                         {
  134.                                 if(backup2==1)        //Key2按键按下有效
  135.                                 {       
  136.                                         move=0;                //重置时间标志位为0(时间未到)
  137.                                         flag_gd=~flag_gd; //光控/定时标志位取反(0:当前光照度 1:定时时间 )                                                               
  138.                                 }
  139.                                 backup2=keybuf2; //更新备份Key2当前值,以备进行下次比较
  140.                         }
  141.                 }
  142.                 keybuf3=Key3;                 //把Key3当前值扫描值暂存                       
  143.                 if(keybuf3!=backup3)//Key3当前值与前次值不相等,说明Key3按键有动作
  144.                 {
  145.                         delay(1);                //延时去抖
  146.                         if(keybuf3==Key3)        //判断Key3扫描值有没有发生变化,即按键抖动       
  147.                         {
  148.                                 if(backup3==1)        //Key3按键按下有效
  149.                                 {
  150.                                         move=0;                //重置时间标志位为0(时间未到)
  151.                                         TR0=0;                //关闭定时器0
  152.                                         flag++;
  153.                                         if(flag==3) {flag=0;}        //让flag保持在0-2之间
  154.                                 }
  155.                                 backup3=keybuf3;//更新备份Key3当前值,以备进行下次比较
  156.                         }
  157.                 }
  158.                 if(flag==1)                                //允许上限光照度设置(调时)                       
  159.                 {
  160.                         keybuf4=Key4;                  //把Key4当前值扫描值暂存
  161.                         if(keybuf4!=backup4)//Key4当前值与前次值不相等,说明Key4按键有动作
  162.                         {
  163.                                 delay(1);                  //延时去抖
  164.                                 if(keybuf4==Key4)        //判断Key4扫描值有没有发生变化,即按键抖动       
  165.                                 {
  166.                                         if(backup4==1)        //Key4按键按下有效
  167.                                         {
  168.                                                 if(flag_gd==0)        //光照度设置允许       
  169.                                                 {
  170.                                                         H_GM++;                 //设置上限光敏度加1
  171.                                                         if(H_GM==256) {H_GM=0;}        //让光敏度在0-255之间       
  172.                                                 }
  173.                                                 else                           //否则 调时允许
  174.                                                 {
  175.                                                         hour++;                //时加1
  176.                                                         if(hour==24) {hour=0;}        //hour保持在0-23之间               
  177.                                                 }               
  178.                                         }
  179.                                         backup4=keybuf4;//更新备份Key4当前值,以备进行下次比较
  180.                                 }
  181.                         }
  182.                         keybuf5=Key5;                  //把Key5当前值扫描值暂存
  183.                         if(keybuf5!=backup5)//Key5当前值与前次值不相等,说明Key5按键有动作
  184.                         {
  185.                                 delay(1);                  //延时去抖
  186.                                 if(keybuf5==Key5)        //判断Key5扫描值有没有发生变化,即按键抖动       
  187.                                 {
  188.                                         if(backup5==1)        //Key5按键按下有效
  189.                                         {
  190.                                                 if(flag_gd==0)        //光照度设置允许       
  191.                                                 {
  192.                                                         H_GM--;                 //设置上限光敏度减1
  193.                                                         if(H_GM==-1) {H_GM=255;}        //让光敏度在0-255之间       
  194.                                                 }
  195.                                                 else                           //否则 调时允许
  196.                                                 {
  197.                                                         hour--;                //时减1
  198.                                                         if(hour==-1) {hour=23;}        //hour保持在0-23之间               
  199.                                                 }               
  200.                                         }
  201.                                         backup5=keybuf5;//更新备份Key5当前值,以备进行下次比较
  202.                                 }
  203.                         }
  204.                 }
  205.                 if(flag==2)                                   //下限光照度设置(调分)
  206.                 {
  207.                         keybuf4=Key4;                  //把Key4当前值扫描值暂存
  208.                         if(keybuf4!=backup4)//Key4当前值与前次值不相等,说明Key4按键有动作
  209.                         {
  210.                                 delay(1);                  //延时去抖
  211.                                 if(keybuf4==Key4)        //判断Key4扫描值有没有发生变化,即按键抖动       
  212.                                 {
  213.                                         if(backup4==1)        //Key4按键按下有效
  214.                                         {
  215.                                                 if(flag_gd==0)        //光照度设置允许       
  216.                                                 {
  217.                                                         L_GM++;                 //设置下限光敏度加1
  218.                                                         if(L_GM==256) {L_GM=0;}        //让光敏度在0-255之间       
  219.                                                 }
  220.                                                 else                           //否则 调分允许
  221.                                                 {
  222.                                                         min++;                //分加1
  223.                                                         if(min==60) {min=0;}        //min保持在0-59之间               
  224.                                                 }               
  225.                                         }
  226.                                         backup4=keybuf4;//更新备份Key4当前值,以备进行下次比较
  227.                                 }
  228.                         }
  229.                         keybuf5=Key5;                  //把Key5当前值扫描值暂存
  230.                         if(keybuf5!=backup5)//Key5当前值与前次值不相等,说明Key5按键有动作
  231.                         {
  232.                                 delay(1);                  //延时去抖
  233.                                 if(keybuf5==Key5)        //判断Key5扫描值有没有发生变化,即按键抖动       
  234.                                 {
  235.                                         if(backup5==1)        //Key5按键按下有效
  236.                                         {
  237.                                                 if(flag_gd==0)        //光照度设置允许       
  238.                                                 {
  239.                                                         L_GM--;                 //设置下限光敏度减1
  240.                                                         if(L_GM==-1) {L_GM=255;}        //让光敏度在0-255之间       
  241.                                                 }
  242.                                                 else                           //否则 调分允许
  243.                                                 {
  244.                                                         min--;                //分减1
  245.                                                         if(min==-1) {min=59;}        //min保持在0-59之间                       
  246.                                                 }               
  247.                                         }
  248.                                         backup5=keybuf5;//更新备份Key5当前值,以备进行下次比较
  249.                                 }
  250.                         }
  251.                 }
  252.                 if(flag_gd==1&&flag==0)                //在正常显示倒计时的情况下
  253.                 {
  254.                         keybuf4=Key4;                  //把Key4当前值扫描值暂存
  255.                         if(keybuf4!=backup4)//Key4当前值与前次值不相等,说明Key4按键有动作
  256.                         {
  257.                                 delay(1);                  //延时去抖
  258.                                 if(keybuf4==Key4)        //判断Key4扫描值有没有发生变化,即按键抖动       
  259.                                 {
  260.                                         if(backup4==1)        //Key4按键按下有效
  261.                                         {
  262.                                                 Time_OFF_ON=1;        //定时开启窗帘       
  263.                                         }
  264.                                         backup4=keybuf4;//更新备份Key4当前值,以备进行下次比较
  265.                                 }
  266.                         }
  267.                         keybuf5=Key5;                  //把Key5当前值扫描值暂存
  268.                         if(keybuf5!=backup5)//Key5当前值与前次值不相等,说明Key5按键有动作
  269.                         {
  270.                                 delay(1);                  //延时去抖
  271.                                 if(keybuf5==Key5)        //判断Key5扫描值有没有发生变化,即按键抖动       
  272.                                 {
  273.                                         if(backup5==1)        //Key5按键按下有效
  274.                                         {
  275.                                                 Time_OFF_ON=0;        //定时关闭窗帘       
  276.                                         }
  277.                                         backup5=keybuf5;//更新备份Key5当前值,以备进行下次比较
  278.                                 }
  279.                         }                                                                                       
  280.                 }
  281.         }
  282. }

  283. void disp1()                //光照强度显示
  284. {
  285.         SMG_XS=table[adval/100];                   //ADC输出百位显示               
  286.         q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  287.         delay(t);                                                //延时
  288.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  289.         SMG_XS=table[adval%100/10];                //ADC输出十位显示
  290.         q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  291.         delay(t);                                                //延时
  292.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  293.         SMG_XS=table[adval%10];                        //ADC输出个位显示
  294.         q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  295.         delay(t);                                                   //延时
  296.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  297. }

  298. void disp2()                //上限光照度设置状态
  299. {
  300.         SMG_XS=0x89;                                         //显示"H"
  301.         q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  302.         delay(t);                                                //延时
  303.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  304.         SMG_XS=table[H_GM/100];                 //显示设置光照度百位
  305.         q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  306.         delay(t);                                                //延时
  307.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  308.         SMG_XS=table[H_GM%100/10];                 //显示设置光照度十位
  309.         q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  310.         delay(t);                                                  //延时
  311.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  312.         SMG_XS=table[H_GM%10];                        //显示设置光照度个位
  313.         q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  314.         delay(t);                                                   //延时
  315.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐       
  316. }

  317. void disp3()                //下限光照度设置状态
  318. {
  319.         SMG_XS=0xc7;                                         //显示"L"
  320.         q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  321.         delay(t);                                                //延时
  322.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  323.         SMG_XS=table[L_GM/100];                 //显示设置光照度百位
  324.         q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  325.         delay(t);                                                //延时
  326.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  327.         SMG_XS=table[L_GM%100/10];                 //显示设置光照度十位
  328.         q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  329.         delay(t);                                                  //延时
  330.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  331.         SMG_XS=table[L_GM%10];                        //显示设置光照度个位
  332.         q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  333.         delay(t);                                                   //延时
  334.         q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐       
  335. }

  336. void disp4()        //调时显示
  337. {
  338.         j++;                                                //j加1               
  339.         while(j==150) {j=0;}                //j为40时,j清0
  340.         if(j<75)                                        //j小于20  时,分 都显示                       
  341.         {
  342.                 SMG_XS=table[hour/10];                         //显示小时十位
  343.                  q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  344.                 delay(t);                                                //延时
  345.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  346.        
  347.                 SMG_XS=table[hour%10]&0x7f;         //显示小时个位,带小数点
  348.                  q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  349.                 delay(t);                                                //延时
  350.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  351.        
  352.                 SMG_XS=table[min/10];                         //显示分十位
  353.                 q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  354.                 delay(t);                                                  //延时
  355.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  356.        
  357.                 SMG_XS=table[min%10]&0x7f;                //显示分个位,带小数点
  358.                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  359.                 delay(t);                                                   //延时
  360.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  361.         }
  362.         else                //否则20<j<40        时不显示,分显示       
  363.         {
  364.                 SMG_XS=table[hour/10];                         //显示小时十位
  365.                  q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //不显示
  366.                 delay(t);                                                //延时
  367.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  368.        
  369.                 SMG_XS=table[hour%10]&0x7f;         //显示小时个位,带小数点
  370.                  q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //不显示
  371.                 delay(t);                                                //延时
  372.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  373.        
  374.                 SMG_XS=table[min/10];                         //显示分十位
  375.                 q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  376.                 delay(t);                                                  //延时
  377.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  378.        
  379.                 SMG_XS=table[min%10]&0x7f;                //显示分个位,带小数点
  380.                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  381.                 delay(t);                                                   //延时
  382.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐               
  383.         }               
  384. }

  385. void disp5()        //调分显示
  386. {
  387.         j++;                                                //j加1               
  388.         while(j==150) {j=0;}                //j为40时,j清0
  389.         if(j<75)                                        //j小于20  时,分 都显示                       
  390.         {
  391.                 SMG_XS=table[hour/10];                         //显示小时十位
  392.                  q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  393.                 delay(t);                                                //延时
  394.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  395.        
  396.                 SMG_XS=table[hour%10]&0x7f;         //显示小时个位,带小数点
  397.                  q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  398.                 delay(t);                                                //延时
  399.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  400.        
  401.                 SMG_XS=table[min/10];                         //显示分十位
  402.                 q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  403.                 delay(t);                                                  //延时
  404.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  405.        
  406.                 SMG_XS=table[min%10]&0x7f;                //显示分个位,带小数点
  407.                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  408.                 delay(t);                                                   //延时
  409.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  410.         }
  411.         else                //否则20<j<40        时显示,分不显示       
  412.         {
  413.                 SMG_XS=table[hour/10];                         //显示小时十位
  414.                  q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //不显示
  415.                 delay(t);                                                //延时
  416.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  417.        
  418.                 SMG_XS=table[hour%10]&0x7f;         //显示小时个位,带小数点
  419.                  q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //不显示
  420.                 delay(t);                                                //延时
  421.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  422.        
  423.                 SMG_XS=table[min/10];                         //显示分十位
  424.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //不显示
  425.                 delay(t);                                                  //延时
  426.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  427.        
  428.                 SMG_XS=table[min%10]&0x7f;                //显示分个位,带小数点
  429.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //不显示
  430.                 delay(t);                                                   //延时
  431.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐               
  432.         }               
  433. }

  434. void disp6()                //时间显示
  435. {
  436.         if(num>=10)                //0.5秒时间 显示带小时点
  437.         {
  438.                 SMG_XS=table[hour/10];                         //显示小时十位
  439.                 q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  440.                 delay(t);                                                //延时
  441.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  442.                
  443.                 SMG_XS=table[hour%10]&0x7f;         //显示小时个位,带小数点
  444.                 q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  445.                 delay(t);                                                //延时
  446.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  447.                
  448.                 SMG_XS=table[min/10];                         //显示分十位
  449.                 q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  450.                 delay(t);                                                  //延时
  451.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐

  452.                 if(Time_OFF_ON==0)                                   //如果定时窗帘关闭
  453.                 {               
  454.                         SMG_XS=table[min%10];                        //显示分个位
  455.                 }
  456.                 else                                                           //否则定时窗帘打开
  457.                 {
  458.                         SMG_XS=table[min%10]&0x7f;;                //显示分个位,带小数点
  459.                 }
  460.                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  461.                 delay(t);                                                   //延时
  462.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  463.         }
  464.         else         
  465.         {
  466.                 SMG_XS=table[hour/10];                         //显示小时十位
  467.                 q_kz=0;b_kz=1;s_kz=1;g_kz=1;        //千位允许显示
  468.                 delay(t);                                                //延时
  469.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  470.                
  471.                 SMG_XS=table[hour%10];                         //显示小时个位
  472.                 q_kz=1;b_kz=0;s_kz=1;g_kz=1;        //百位允许显示
  473.                 delay(t);                                                //延时
  474.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  475.                
  476.                 SMG_XS=table[min/10];                         //显示分十位
  477.                 q_kz=1;b_kz=1;s_kz=0;g_kz=1;        //十位允许显示
  478.                 delay(t);                                                  //延时
  479.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐
  480.                
  481.                 SMG_XS=table[min%10];                        //显示分个位
  482.                 q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位允许显示
  483.                 delay(t);                                                   //延时
  484.                 q_kz=1;b_kz=1;s_kz=1;g_kz=1;        //消隐               
  485.         }       
  486. }

  487. void disp_cl()                //显示处理
  488. {
  489.         if(move==0)                        //定时时间未到,处理显示函数
  490.         {
  491.                 if(flag==0)                //正常显示
  492.                 {
  493.                         if(flag_gd==0)        //光控模式下
  494.                         {
  495.                                 disp1();                //光照强度显示               
  496.                         }
  497.                         else                         //否则定时模式下
  498.                         {
  499.                                 disp6();        //时间显示
  500.                                 TR0=0;                //关闭定时器0       
  501.                         }                       
  502.                 }
  503.                 else if(flag==1)        //上限光照度设置显示(调时)
  504.                 {
  505.                         if(flag_gd==0)        //光控模式下
  506.                         {
  507.                                 disp2();        //上限光照度设置状态               
  508.                         }
  509.                         else                         //否则定时模式下
  510.                         {
  511.                                 disp4();        //调时显示       
  512.                         }                       
  513.                 }
  514.                 else if(flag==2)        //下限光照度设置显示(调分)
  515.                 {
  516.                         if(flag_gd==0)        //光控模式下
  517.                         {
  518.                                 disp3();        //下限光照度设置状态               
  519.                         }
  520.                         else                         //否则定时模式下
  521.                         {
  522.                                 disp5();        //调分显示       
  523.                         }
  524.                 }
  525.         }
  526.         else                 //定时器时间到了               
  527.         {
  528.                 if(Time_OFF_ON==1)                //如果定时打开窗帘
  529.                 {
  530.                         OFF_ON=1;                        //窗帘打开
  531.                         TR0=1;                                  //开启定时器0
  532.                         SMG_XS=table[1];         //数码管显示"1"
  533.                         q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位显示
  534.                 }       
  535.                 else                                    //否则定时窗帘          
  536.                 {
  537.                         OFF_ON=0;                          //窗帘关闭
  538.                         TR0=1;                                //开启定时器0
  539.                         SMG_XS=table[0];         //数码管显示"0"
  540.                         q_kz=1;b_kz=1;s_kz=1;g_kz=0;        //个位显示
  541.                 }                       
  542.         }
  543. }

  544. void GZQD()                //光照强度(根据ADC0804转换器时序编写)
  545. {
  546.         static uint i=0;        //定义临时变量i
  547.         CS=0;                                 
  548.         WR=0;                 //启动AD转换
  549.         delay(1);
  550.         WR=1;
  551.         CS=1;
  552.         for(i=0;i<130;i++)        //AD转换需要一点时间,利用for循环处理,来延时一会,不影响显示和按键处理
  553.         {
  554.                 disp_cl();        //显示处理
  555.                 Key_cl();          //按键处理
  556.         }
  557.         P1=0xff;                //读取AD转换值前,先把P1口置1               
  558.         CS=0;
  559.         RD=0;                         //AD读使能
  560.         delay(1);                 
  561.         adval=P1;                  //把AD转换好的值,赋给 adval
  562.         RD=1;
  563.         CS=1;                         //置1后,为下次AD转换做准备
  564.         delay(1);
  565. }               

  566. void GM_cl()                //光照度处理
  567. {
  568.         if(ms==1)                //自动模式下
  569.         {                                                                                 
  570.                 if(adval<L_GM)                 {OFF_ON=1;TR0=1;}        //实际光照强度小于设定下限光照度值时,打开窗帘(启动定时器0)
  571.                 else if(adval>H_GM)        {OFF_ON=0;TR0=1;}         //反之光照强度大于设定上限光照度值,关闭窗帘(启动定时器0)
  572.                 else                                 {TR0=0;IA=0;IB=0;}        //光照强度在正常范围内,窗帘不动(关闭定时器0)
  573.         }
  574. }


  575. void main()                                //主函数入口
  576. {
  577.         Time_init();                //定时器初始化
  578.         Time_OFF_ON=0;                //默认定时关闭窗帘
  579.         while(1)                         //主循环
  580.         {        
  581.                 Key_cl();                //按键处理
  582.                 if(ms==1)                //自动模式下
  583.                 {
  584.                         if(flag_gd==0)        //光控模式
  585.                         {       
  586.                                 TR1=0;                //关闭定时器1
  587.                                 GZQD();                //光照强度
  588.                                 GM_cl();        //光照度处理
  589.                         }
  590.                         else                         //否则定时器模式
  591.                         {
  592.                                 TR1=1;                //开启定时器1       
  593.                         }
  594.                         disp_cl();                //显示处理       
  595.                 }
  596.                 else                                //否则手动模式下
  597.                 {
  598.                         TR1=0;                        //关闭定时器1       
  599.                 }                               
  600.         }
  601. }

  602. void Time0() interrupt 1          //定时器0中断服务函数
  603. {                                                        //利用定时器0产生PWM占空比,占空比小,可以降低直流电机转速
  604.         static uchar a=1;                //定义临时变量a=1
  605.         TH0=0xf8;                                //定时2ms
  606.         TL0=0xcc;
  607.         if(OFF_ON==1)        //如果窗帘需要打开
  608.         {
  609.                 if(Up==1)         //上限限位开关为1(表示窗帘没有到上限位置)
  610.                 {
  611.                         if(a<=1) {IA=1; IB=0;}                 //电机正转
  612.                         else         {IA=0; IB=0;}
  613.                 }
  614.                 else                //否则到上限位置
  615.                 {
  616.                         IA=0; IB=0;                                        //电机停止               
  617.                 }
  618.         }
  619.         else                         //否则窗帘需要关闭
  620.         {
  621.                 if(Down==1)        //下限限位开关为1(表示窗帘没有到下限位置)
  622.                 {
  623.                         if(a<=1) {IA=0; IB=1;}                 //电机反转
  624.                         else         {IA=0; IB=0;}                
  625.                 }
  626.                 else                //否则到下限位置
  627.                 {
  628.                         IA=0; IB=0;                                        //电机停止       
  629.                 }
  630.         }
  631.         a++;          //a加1
  632.         while(a==18) {a=1;}        //a保持在1到27之间(a=1,电机转,1<a<18电机不转,这样的PWM比较小,达到转速慢)
  633. }

  634. void Time1() interrupt 3         //定时器1中断服务函数(产生定时时间)
  635. {
  636.         TH1=0x4c;                 //50ms
  637.         TL1=0x00;
  638.         num++;                        //num加1               
  639.         while(num==20)        //1秒时间到
  640.         {
  641.                 num=0;                  //秒清0
  642.                 sec--;                //秒减1
  643.                 while(sec==-1)        //当秒等于-1
  644.                 {
  645.                         sec=59;                //秒置59
  646.                         min--;                 //分减1
  647.                         while(min==-1)        //当分等于-1
  648.                         {
  649.                                 min=59;                //分置59
  650.                                 hour--;                  //小时减1
  651.                         }
  652.                 }
  653.                 while(hour==0&&min==0&&sec==0)         //定时时间到
  654.                 {
  655.                         hour=12;min=0;sec=0;        //时间初始化恢复 12.00.00
  656.                         move=1;                //定时时间到       
  657.                 }
  658.         }
  659. }
复制代码

所有资料51hei提供下载:
程序仿真.zip (110.84 KB, 下载次数: 251)

评分

参与人数 2黑币 +55 收起 理由
tonggin + 5
admin + 50

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-10-31 15:21 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:506555 发表于 2019-4-7 21:56 | 显示全部楼层
66666666
回复

使用道具 举报

ID:506633 发表于 2019-4-8 01:16 | 显示全部楼层
非常好的,学习了
回复

使用道具 举报

ID:645564 发表于 2019-11-20 09:33 | 显示全部楼层
请问有没有窗帘模型
回复

使用道具 举报

ID:541150 发表于 2020-3-18 14:48 | 显示全部楼层
这个能实现哪些功能呀
回复

使用道具 举报

ID:582255 发表于 2020-4-17 21:09 | 显示全部楼层
楼主厉害啊~~~~~
回复

使用道具 举报

ID:786990 发表于 2020-9-10 22:12 | 显示全部楼层
这个代码谁能详细解释一下原理吗?
回复

使用道具 举报

ID:145887 发表于 2022-2-17 14:40 | 显示全部楼层

好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:941265 发表于 2022-2-18 09:23 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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