久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10471|回復: 9
打印 上一主題 下一主題
收起左側

單片機智能窗簾proteus仿真圖與代碼

  [復制鏈接]
跳轉到指定樓層
樓主
可以給大家參考一下,也是從其他地方學習的,做了一些修改

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


單片機源程序如下:
  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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發
ID:1 發表于 2018-10-31 15:21 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:506555 發表于 2019-4-7 21:56 | 只看該作者
66666666
回復

使用道具 舉報

地板
ID:506633 發表于 2019-4-8 01:16 | 只看該作者
非常好的,學習了
回復

使用道具 舉報

5#
ID:645564 發表于 2019-11-20 09:33 | 只看該作者
請問有沒有窗簾模型
回復

使用道具 舉報

6#
ID:541150 發表于 2020-3-18 14:48 | 只看該作者
這個能實現哪些功能呀
回復

使用道具 舉報

7#
ID:582255 發表于 2020-4-17 21:09 | 只看該作者
樓主厲害啊~~~~~
回復

使用道具 舉報

8#
ID:786990 發表于 2020-9-10 22:12 | 只看該作者
這個代碼誰能詳細解釋一下原理嗎?
回復

使用道具 舉報

9#
ID:145887 發表于 2022-2-17 14:40 | 只看該作者

好資料,51黑有你更精彩!!!
回復

使用道具 舉報

10#
ID:941265 發表于 2022-2-18 09:23 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人精品一区 | 欧美精品久久久久久久久老牛影院 | 伊人超碰| 欧美激情在线精品一区二区三区 | 日日操夜夜操天天操 | 在线免费毛片 | 久草视频在线播放 | 人人草人人干 | 美女黄网站视频免费 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 国产精品福利在线 | 国产精品美女久久久久aⅴ国产馆 | 日日操夜夜操天天操 | 精品视频一二区 | 日韩一区二区三区在线观看 | 国产人成精品一区二区三 | 免费视频一区二区 | 精品久久久久香蕉网 | 高清视频一区二区三区 | 久久久久一区二区三区 | 国产成人综合在线 | 久草网址| 久久精品成人一区 | www.4虎影院 国产999精品久久久影片官网 | 日本精品一区二区三区在线观看 | 久久久久国产精品午夜一区 | 特级特黄特色的免费大片 | 99福利视频 | 精品丝袜在线 | 一区二区三区成人 | 欧美一区二区久久 | 天天艹| 国产精品日韩欧美一区二区三区 | 国产精品国产a | 日韩高清中文字幕 | 一区二区三区高清在线观看 | 99精品99| 精品99久久久久久 | av手机免费在线观看 | a级大毛片 | 亚洲一区二区三区在线视频 |