新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > C51編程中的自定義“位”及其保存方案

        C51編程中的自定義“位”及其保存方案

        作者: 時間:2013-02-17 來源:網(wǎng)絡(luò) 收藏

          if(Decode_key==0x000C) {//“▼”鍵碼核對

          BEEP=1;//蜂鳴聲響輸出

          if(switch_sign) {//翻轉(zhuǎn)

          JD1_out=1;//繼電器1控制輸出端

          JD2_out=0;//繼電器2控制輸出端

          }

          else {

          JD1_out=0;//繼電器1控制輸出端

          JD2_out=1;//繼電器2控制輸出端

          }

          }

          }

          if(Decode_addr==0x5D35) {//取反操作糾正時地址碼核對

          if(Decode_key==0x00C0) {//“▲”鍵碼核對

          BEEP=1;//蜂鳴聲響輸出

          switch_sign=~switch_sign; //取反一次翻轉(zhuǎn)

          save_data();//調(diào)用保存數(shù)據(jù)子程序

          }

          }

          }

          從上面這段遙控數(shù)據(jù)處理子程序可以看到:在任何時候兩個繼電器的控制輸出端JD1_out與JD2_out至多只能開一個。當遙控“▲”鍵按下有效時,翻轉(zhuǎn)“switch_sign”的邏輯“0”或邏輯“1”狀態(tài)將決定兩個繼電器的控制輸出端JD1_out與JD2_out的一開一關(guān),或一關(guān)一開;同理,當遙控“▼”鍵按下有效時也會得到與“▲”鍵按下相反的類同效果……也就是說,只要改變翻轉(zhuǎn)標志位“switch_sign”的邏輯狀態(tài),就能改變兩個繼電器控制輸出端誰“開”誰“關(guān)”的控制輸出狀態(tài)。亦即,在同一個遙控按鍵按下時(如“▲”鍵按下),標志位“switch_sign”的邏輯狀態(tài)不同,兩個繼電器控制輸出端誰“開”誰“關(guān)”的控制輸出狀態(tài)也將不同。其中的蜂鳴聲響提示按鍵操作是否有效。

          投影屏幕升降的動力電機是一個AC 220V的交流電機,圖1是電機控制電路的簡圖。由此可見,當繼電器JD1閉合,JD2斷開時,電機M中的L1為主繞組,L2為啟動副繞組,電機將一個方向運轉(zhuǎn);當繼電器JD1斷開,JD2閉合時,電機M中的L1為啟動副繞組,而L2為主繞組了,電機將以原來的反方向運轉(zhuǎn)。結(jié)合上文,改變翻轉(zhuǎn)標志位“switch_sign”的邏輯狀態(tài)→改變兩個繼電器控制輸出端誰“開”誰“關(guān)”的控制輸出狀態(tài)→改變電機的運轉(zhuǎn)方向→投影屏幕的升降狀態(tài)。也就是說,改變翻轉(zhuǎn)標志位“switch_sign”的邏輯狀態(tài),就可糾正遙控電機運轉(zhuǎn)方向及其投影屏幕的升降狀態(tài)。將遙控按鍵與投影屏幕升降的對應關(guān)系協(xié)調(diào)后,必須保存的標志位“switch_sign”當前的邏輯狀態(tài),否則,斷電后下一次上電復位初始化,又可能要出洋相了。

          從例舉2的程序中還可以看到,翻轉(zhuǎn)標志位“switch_sign”的取反操作也是用同一個遙控器上的“▲”鍵來執(zhí)行的,只是在遙控器的地址編碼上動了點手腳——改變了一下地址編碼(0x5D35),待操作對應協(xié)調(diào)后再改回到原來的地址編碼(0x5535)。

          2保存1個字節(jié)來復原標志“位”

          標志“位”的保存及其復原有很多種方法,我曾嘗試過幾種方法。例3是一種保存1個字節(jié)來復原1個自定義標志位的方法,具體操作如下:

          static unsigned char current_dat;//定義一個通用的輔助字節(jié)變量

          bit bdata switch_sign;//自定義的翻轉(zhuǎn)標志位(應作全局變量定義)

          ……

          switch_sign=~switch_sign;//取反1次翻轉(zhuǎn)標志位

          if(switch_sign) {//判斷switch_sign是邏輯“1”還是邏輯“0”

          current_dat=0xA5;//對通用的輔助字節(jié)變量賦值

          }

          else {

          current_dat=0x00;//通用的輔助字節(jié)變量

          }

          save_data();//調(diào)用保存數(shù)據(jù)子程序

          BEEP=1;//蜂鳴聲響輸出

          以上程序是:取反翻轉(zhuǎn)標志位“switch_sign”后,若“switch_sign”為邏輯“1”狀態(tài),就給通用的輔助字節(jié)變量“current_dat”賦值“0xA5”(當然,這數(shù)據(jù)由你自己隨意定);若“switch_sign”為邏輯“0”狀態(tài),則給通用的輔助字節(jié)變量“current_dat”賦值“0x00”(這數(shù)據(jù)也是自己隨意定的,只要與前面那個不一樣就是了),然后調(diào)用保存數(shù)據(jù)程序?qū)⑼ㄓ玫妮o助字節(jié)變量“current_dat”保存起來。這樣,即使斷電了翻轉(zhuǎn)標志位“switch_sign”的當前狀態(tài)已間接地被通用的輔助字節(jié)變量“current_dat”保存起來了……當下一次上電復位初始化時,應先將保存的輔助變量“current_dat”的數(shù)據(jù)讀出來,并還原成翻轉(zhuǎn)標志位“switch_sign”相應的邏輯狀態(tài)。上電初始化時若從存儲處讀出的數(shù)據(jù)是“0xA5”,則將翻轉(zhuǎn)標志位“switch_sign”置“1”;若讀出的數(shù)據(jù)是“0x00”,則將翻轉(zhuǎn)標志位“switch_sign”置“0”——這就與原來保存時的狀態(tài)對應起來了。其操作過程如例4:

          static unsigned char current_dat;//定義一個通用的輔助字節(jié)變量

          static unsigned char addr;//自定義地址變量緩沖單元

          static unsigned char Rdat;//自定義讀數(shù)據(jù)緩沖單元

          bit bdata switch_sign;//自定義的翻轉(zhuǎn)標志位(應作全局變量定義)

          ……



        關(guān)鍵詞: C51編程 自定義 標志位

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 若尔盖县| 云安县| 鄂托克前旗| 和政县| 孙吴县| 温宿县| 湘潭市| 资源县| 漾濞| 吐鲁番市| 东明县| 田林县| 资阳市| 石柱| 英德市| 海丰县| 青岛市| 枣庄市| 鄄城县| 沧州市| 石泉县| 浠水县| 沅陵县| 永嘉县| 潜山县| 门源| 涞源县| 松阳县| 岚皋县| 巴东县| 宁安市| 凤台县| 巧家县| 清水河县| 论坛| 东阿县| 凯里市| 铁力市| 延吉市| 祁阳县| 鹤峰县|