可以給大家參考一下,也是從其他地方學習的,做了一些修改
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.png (59.71 KB, 下載次數: 101)
下載附件
2018-10-28 16:22 上傳
0.png (44.73 KB, 下載次數: 71)
下載附件
2018-10-31 15:20 上傳
單片機源程序如下:
- /*********51單片機智能窗簾設計*********/
- /*************JJ電子直營店*************/
- /***************原創設計***************/
- #include <REGX52.H> //頭文件
- #define uchar unsigned char
- #define uint unsigned int
- #define CS P3_0 //ADC0804 CS端口
- #define RD P3_1 //ADC0804 RD端口
- #define WR P3_2 //ADC0804 WR端口
- #define g_kz P2_5 //數碼管個位控制
- #define s_kz P2_4 //數碼管十位控制
- #define b_kz P2_3 //數碼管百位控制
- #define q_kz P2_2 //碼管千位控制
- #define SMG_XS P0 //數碼管顯示端口
- #define AD_data P1 //ADC0804輸出端口
- #define Up P2_1 //上限限位開關端口
- #define Down P2_0 //下限限位開關端口
- #define Key1 P3_3 //手動/自動切換 按鍵
- #define Key2 P3_4 //定時/光控功能切換 按鍵
- #define Key3 P3_5 //設置 按鍵
- #define Key4 P3_6 //加 按鍵 (手動模式:打開窗簾 定時模式:定時打開窗簾)
- #define Key5 P3_7 //減 按鍵 (手動模式:關閉窗簾 定時模式:定時關閉窗簾)
- #define IA P2_7 //直流電機控制端口
- #define IB P2_6 //直流電機控制端口
- int adval; //ADC 輸出變量
- int j; //定義循環變量 i j
- uchar flag=0; //顯示標志位(0:正常顯示 1:上限光照度設置(調時) 2:下限光照度設置(調分)
- bit flag_gd=0; //光控/定時標志位(0:當前光照度 1:定時時間 )
- bit ms=0; //模式(0:手動模式 1:自動模式)
- bit move=0; //定時時間到標志位(0:時間未到 1:時間到)
- bit OFF_ON=0; //電機正反轉標志位,表示窗簾打開或關閉(0:窗簾關閉 1:窗簾打開)
- bit Time_OFF_ON=0;//定時時間到執行窗簾打開或關閉(0:定時關閉窗簾 1:定時打開窗簾)
- char hour=12,min=0;sec=0; //定義時間 “時 分 秒”變量 上電默認12.00.00
- char num=0; //時間基數
- uint H_GM=240; //定義上限光敏度設置變量,上電默認200
- uint L_GM=100; //定義下限光敏度設置變量,上電默認100
- uchar t=1; //數碼管動態掃描延時參數
-
- uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- //數碼管顯示數組 0 1 2 3 4 5 6 7 8 9
- void delay(uint time) //延時函數
- {
- uint x,y; //定義臨時變量 x y
- for(x=time;x>0;x--)
- for(y=110;y>0;y--); //空操作
- }
- void Time_init() //定時器初始化
- {
- EA=1;
- TMOD=0x11;
- /*定時器0初始化(產生PWM控制電機轉速)*/
- TH0=0xf8; //定時2ms
- TL0=0xcc;
- ET0=1; //使能T0中斷
- TR0=0; //先不啟動定時器0
- /*定時器1初始化(產生50ms定時時間)*/
- TH1=0x4c; //50ms
- TL1=0x00;
- ET1=1;
- TR1=0; //先不啟動定時器1
- }
- void Key_cl()
- {
- static bit keybuf1=1; //Key1值暫存,臨時保存按鍵掃描值
- static bit backup1=1; //Key1值備份,保存前一次的掃描值
- static bit keybuf2=1; //Key2值暫存,臨時保存按鍵掃描值
- static bit backup2=1; //Key2值備份,保存前一次的掃描值
- static bit keybuf3=1; //Key3值暫存,臨時保存按鍵掃描值
- static bit backup3=1; //Key3值備份,保存前一次的掃描值
- static bit keybuf4=1; //Key4值暫存,臨時保存按鍵掃描值
- static bit backup4=1; //Key4值備份,保存前一次的掃描值
- static bit keybuf5=1; //Key5值暫存,臨時保存按鍵掃描值
- static bit backup5=1; //Key5值備份,保存前一次的掃描值
- keybuf1=Key1; //把Key1當前值掃描值暫存
- if(keybuf1!=backup1) //Key1當前值與前次值不相等,說明Key1按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf1==Key1) //判斷Key1掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup1==1) //Key1按鍵按下有效
- {
- move=0; //重置時間標志位為0(時間未到)
- TR0=0; //關閉定時器0
- ms=~ms; // 模式取反
- q_kz=1;b_kz=1;s_kz=1;g_kz=1;//關閉數碼管顯示
- IA=0;IB=0; //窗簾停止
- }
- backup1=keybuf1; //更新備份Key1當前值,以備進行下次比較
- }
- }
- if(ms==0) //手動模式下
- {
- if(Key4==0) //當打開窗簾按鍵 按下
- {
- delay(10); //延時去抖
- if(Key4==0) //再判斷按鍵是否按下
- {
- move=0; //重置時間標志位為0(時間未到)
- OFF_ON=1; //窗簾打開
- TR0=1; //開啟定時器0
- SMG_XS=table[1]; //數碼管顯示"1"
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位顯示
- while(Key4==0); //等待按鍵松開
- TR0=0; //關閉定時器0
- IA=0;IB=0; //窗簾停止
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //關閉數碼管
- }
- }
- if(Key5==0) //當關閉窗簾按鍵 按下
- {
- delay(10); //延時去抖
- if(Key5==0) //再判斷按鍵是否按下
- {
- move=0; //重置時間標志位為0(時間未到)
- OFF_ON=0; //窗簾關閉
- TR0=1; //開啟定時器0
- SMG_XS=table[0]; //數碼管顯示"0"
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位顯示
- while(Key5==0); //等待按鍵松開
- TR0=0; //關閉定時器0
- IA=0;IB=0; //窗簾停止
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //關閉數碼管
- }
- }
- }
- else //自動模式下
- {
- keybuf2=Key2; //把Key2當前值掃描值暫存
- if(keybuf2!=backup2) //Key2當前值與前次值不相等,說明Key2按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf2==Key2) //判斷Key2掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup2==1) //Key2按鍵按下有效
- {
- move=0; //重置時間標志位為0(時間未到)
- flag_gd=~flag_gd; //光控/定時標志位取反(0:當前光照度 1:定時時間 )
- }
- backup2=keybuf2; //更新備份Key2當前值,以備進行下次比較
- }
- }
- keybuf3=Key3; //把Key3當前值掃描值暫存
- if(keybuf3!=backup3)//Key3當前值與前次值不相等,說明Key3按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf3==Key3) //判斷Key3掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup3==1) //Key3按鍵按下有效
- {
- move=0; //重置時間標志位為0(時間未到)
- TR0=0; //關閉定時器0
- flag++;
- if(flag==3) {flag=0;} //讓flag保持在0-2之間
- }
- backup3=keybuf3;//更新備份Key3當前值,以備進行下次比較
- }
- }
- if(flag==1) //允許上限光照度設置(調時)
- {
- keybuf4=Key4; //把Key4當前值掃描值暫存
- if(keybuf4!=backup4)//Key4當前值與前次值不相等,說明Key4按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf4==Key4) //判斷Key4掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup4==1) //Key4按鍵按下有效
- {
- if(flag_gd==0) //光照度設置允許
- {
- H_GM++; //設置上限光敏度加1
- if(H_GM==256) {H_GM=0;} //讓光敏度在0-255之間
- }
- else //否則 調時允許
- {
- hour++; //時加1
- if(hour==24) {hour=0;} //hour保持在0-23之間
- }
- }
- backup4=keybuf4;//更新備份Key4當前值,以備進行下次比較
- }
- }
- keybuf5=Key5; //把Key5當前值掃描值暫存
- if(keybuf5!=backup5)//Key5當前值與前次值不相等,說明Key5按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf5==Key5) //判斷Key5掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup5==1) //Key5按鍵按下有效
- {
- if(flag_gd==0) //光照度設置允許
- {
- H_GM--; //設置上限光敏度減1
- if(H_GM==-1) {H_GM=255;} //讓光敏度在0-255之間
- }
- else //否則 調時允許
- {
- hour--; //時減1
- if(hour==-1) {hour=23;} //hour保持在0-23之間
- }
- }
- backup5=keybuf5;//更新備份Key5當前值,以備進行下次比較
- }
- }
- }
- if(flag==2) //下限光照度設置(調分)
- {
- keybuf4=Key4; //把Key4當前值掃描值暫存
- if(keybuf4!=backup4)//Key4當前值與前次值不相等,說明Key4按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf4==Key4) //判斷Key4掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup4==1) //Key4按鍵按下有效
- {
- if(flag_gd==0) //光照度設置允許
- {
- L_GM++; //設置下限光敏度加1
- if(L_GM==256) {L_GM=0;} //讓光敏度在0-255之間
- }
- else //否則 調分允許
- {
- min++; //分加1
- if(min==60) {min=0;} //min保持在0-59之間
- }
- }
- backup4=keybuf4;//更新備份Key4當前值,以備進行下次比較
- }
- }
- keybuf5=Key5; //把Key5當前值掃描值暫存
- if(keybuf5!=backup5)//Key5當前值與前次值不相等,說明Key5按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf5==Key5) //判斷Key5掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup5==1) //Key5按鍵按下有效
- {
- if(flag_gd==0) //光照度設置允許
- {
- L_GM--; //設置下限光敏度減1
- if(L_GM==-1) {L_GM=255;} //讓光敏度在0-255之間
- }
- else //否則 調分允許
- {
- min--; //分減1
- if(min==-1) {min=59;} //min保持在0-59之間
- }
- }
- backup5=keybuf5;//更新備份Key5當前值,以備進行下次比較
- }
- }
- }
- if(flag_gd==1&&flag==0) //在正常顯示倒計時的情況下
- {
- keybuf4=Key4; //把Key4當前值掃描值暫存
- if(keybuf4!=backup4)//Key4當前值與前次值不相等,說明Key4按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf4==Key4) //判斷Key4掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup4==1) //Key4按鍵按下有效
- {
- Time_OFF_ON=1; //定時開啟窗簾
- }
- backup4=keybuf4;//更新備份Key4當前值,以備進行下次比較
- }
- }
- keybuf5=Key5; //把Key5當前值掃描值暫存
- if(keybuf5!=backup5)//Key5當前值與前次值不相等,說明Key5按鍵有動作
- {
- delay(1); //延時去抖
- if(keybuf5==Key5) //判斷Key5掃描值有沒有發生變化,即按鍵抖動
- {
- if(backup5==1) //Key5按鍵按下有效
- {
- Time_OFF_ON=0; //定時關閉窗簾
- }
- backup5=keybuf5;//更新備份Key5當前值,以備進行下次比較
- }
- }
- }
- }
- }
- void disp1() //光照強度顯示
- {
- SMG_XS=table[adval/100]; //ADC輸出百位顯示
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[adval%100/10]; //ADC輸出十位顯示
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[adval%10]; //ADC輸出個位顯示
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- void disp2() //上限光照度設置狀態
- {
- SMG_XS=0x89; //顯示"H"
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[H_GM/100]; //顯示設置光照度百位
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[H_GM%100/10]; //顯示設置光照度十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[H_GM%10]; //顯示設置光照度個位
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- void disp3() //下限光照度設置狀態
- {
- SMG_XS=0xc7; //顯示"L"
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[L_GM/100]; //顯示設置光照度百位
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[L_GM%100/10]; //顯示設置光照度十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- SMG_XS=table[L_GM%10]; //顯示設置光照度個位
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- void disp4() //調時顯示
- {
- j++; //j加1
- while(j==150) {j=0;} //j為40時,j清0
- if(j<75) //j小于20 時,分 都顯示
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]&0x7f; //顯示小時個位,帶小數點
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min%10]&0x7f; //顯示分個位,帶小數點
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- else //否則20<j<40 時不顯示,分顯示
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]&0x7f; //顯示小時個位,帶小數點
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min%10]&0x7f; //顯示分個位,帶小數點
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- }
- void disp5() //調分顯示
- {
- j++; //j加1
- while(j==150) {j=0;} //j為40時,j清0
- if(j<75) //j小于20 時,分 都顯示
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]&0x7f; //顯示小時個位,帶小數點
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min%10]&0x7f; //顯示分個位,帶小數點
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- else //否則20<j<40 時顯示,分不顯示
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]&0x7f; //顯示小時個位,帶小數點
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min%10]&0x7f; //顯示分個位,帶小數點
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //不顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- }
- void disp6() //時間顯示
- {
- if(num>=10) //0.5秒時間 顯示帶小時點
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]&0x7f; //顯示小時個位,帶小數點
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- if(Time_OFF_ON==0) //如果定時窗簾關閉
- {
- SMG_XS=table[min%10]; //顯示分個位
- }
- else //否則定時窗簾打開
- {
- SMG_XS=table[min%10]&0x7f;; //顯示分個位,帶小數點
- }
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- else
- {
- SMG_XS=table[hour/10]; //顯示小時十位
- q_kz=0;b_kz=1;s_kz=1;g_kz=1; //千位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[hour%10]; //顯示小時個位
- q_kz=1;b_kz=0;s_kz=1;g_kz=1; //百位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min/10]; //顯示分十位
- q_kz=1;b_kz=1;s_kz=0;g_kz=1; //十位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
-
- SMG_XS=table[min%10]; //顯示分個位
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位允許顯示
- delay(t); //延時
- q_kz=1;b_kz=1;s_kz=1;g_kz=1; //消隱
- }
- }
- void disp_cl() //顯示處理
- {
- if(move==0) //定時時間未到,處理顯示函數
- {
- if(flag==0) //正常顯示
- {
- if(flag_gd==0) //光控模式下
- {
- disp1(); //光照強度顯示
- }
- else //否則定時模式下
- {
- disp6(); //時間顯示
- TR0=0; //關閉定時器0
- }
- }
- else if(flag==1) //上限光照度設置顯示(調時)
- {
- if(flag_gd==0) //光控模式下
- {
- disp2(); //上限光照度設置狀態
- }
- else //否則定時模式下
- {
- disp4(); //調時顯示
- }
- }
- else if(flag==2) //下限光照度設置顯示(調分)
- {
- if(flag_gd==0) //光控模式下
- {
- disp3(); //下限光照度設置狀態
- }
- else //否則定時模式下
- {
- disp5(); //調分顯示
- }
- }
- }
- else //定時器時間到了
- {
- if(Time_OFF_ON==1) //如果定時打開窗簾
- {
- OFF_ON=1; //窗簾打開
- TR0=1; //開啟定時器0
- SMG_XS=table[1]; //數碼管顯示"1"
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位顯示
- }
- else //否則定時窗簾
- {
- OFF_ON=0; //窗簾關閉
- TR0=1; //開啟定時器0
- SMG_XS=table[0]; //數碼管顯示"0"
- q_kz=1;b_kz=1;s_kz=1;g_kz=0; //個位顯示
- }
- }
- }
- void GZQD() //光照強度(根據ADC0804轉換器時序編寫)
- {
- static uint i=0; //定義臨時變量i
- CS=0;
- WR=0; //啟動AD轉換
- delay(1);
- WR=1;
- CS=1;
- for(i=0;i<130;i++) //AD轉換需要一點時間,利用for循環處理,來延時一會,不影響顯示和按鍵處理
- {
- disp_cl(); //顯示處理
- Key_cl(); //按鍵處理
- }
- P1=0xff; //讀取AD轉換值前,先把P1口置1
- CS=0;
- RD=0; //AD讀使能
- delay(1);
- adval=P1; //把AD轉換好的值,賦給 adval
- RD=1;
- CS=1; //置1后,為下次AD轉換做準備
- delay(1);
- }
- void GM_cl() //光照度處理
- {
- if(ms==1) //自動模式下
- {
- if(adval<L_GM) {OFF_ON=1;TR0=1;} //實際光照強度小于設定下限光照度值時,打開窗簾(啟動定時器0)
- else if(adval>H_GM) {OFF_ON=0;TR0=1;} //反之光照強度大于設定上限光照度值,關閉窗簾(啟動定時器0)
- else {TR0=0;IA=0;IB=0;} //光照強度在正常范圍內,窗簾不動(關閉定時器0)
- }
- }
- void main() //主函數入口
- {
- Time_init(); //定時器初始化
- Time_OFF_ON=0; //默認定時關閉窗簾
- while(1) //主循環
- {
- Key_cl(); //按鍵處理
- if(ms==1) //自動模式下
- {
- if(flag_gd==0) //光控模式
- {
- TR1=0; //關閉定時器1
- GZQD(); //光照強度
- GM_cl(); //光照度處理
- }
- else //否則定時器模式
- {
- TR1=1; //開啟定時器1
- }
- disp_cl(); //顯示處理
- }
- else //否則手動模式下
- {
- TR1=0; //關閉定時器1
- }
- }
- }
- void Time0() interrupt 1 //定時器0中斷服務函數
- { //利用定時器0產生PWM占空比,占空比小,可以降低直流電機轉速
- static uchar a=1; //定義臨時變量a=1
- TH0=0xf8; //定時2ms
- TL0=0xcc;
- if(OFF_ON==1) //如果窗簾需要打開
- {
- if(Up==1) //上限限位開關為1(表示窗簾沒有到上限位置)
- {
- if(a<=1) {IA=1; IB=0;} //電機正轉
- else {IA=0; IB=0;}
- }
- else //否則到上限位置
- {
- IA=0; IB=0; //電機停止
- }
- }
- else //否則窗簾需要關閉
- {
- if(Down==1) //下限限位開關為1(表示窗簾沒有到下限位置)
- {
- if(a<=1) {IA=0; IB=1;} //電機反轉
- else {IA=0; IB=0;}
- }
- else //否則到下限位置
- {
- IA=0; IB=0; //電機停止
- }
- }
- a++; //a加1
- while(a==18) {a=1;} //a保持在1到27之間(a=1,電機轉,1<a<18電機不轉,這樣的PWM比較小,達到轉速慢)
- }
- void Time1() interrupt 3 //定時器1中斷服務函數(產生定時時間)
- {
- TH1=0x4c; //50ms
- TL1=0x00;
- num++; //num加1
- while(num==20) //1秒時間到
- {
- num=0; //秒清0
- sec--; //秒減1
- while(sec==-1) //當秒等于-1
- {
- sec=59; //秒置59
- min--; //分減1
- while(min==-1) //當分等于-1
- {
- min=59; //分置59
- hour--; //小時減1
- }
- }
- while(hour==0&&min==0&&sec==0) //定時時間到
- {
- hour=12;min=0;sec=0; //時間初始化恢復 12.00.00
- move=1; //定時時間到
- }
- }
- }
復制代碼
所有資料51hei提供下載:
程序仿真.zip
(110.84 KB, 下載次數: 251)
2018-10-28 16:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|