<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

  引言

  在現有的教課書(shū)及相關(guān)文章中,都難得提到在單片機C語(yǔ)言編程中對于“位”的狀態(tài)進(jìn)行保存的理念。

  當單片機C語(yǔ)言編程中提及“位”的概念時(shí),人們自然會(huì )想到狀態(tài)字PSW中PSW.5的F0與PSW.1的F1兩個(gè)用戶(hù)通用。這兩個(gè)均可參與布爾運算、“位”控操作,也可隨狀態(tài)字PSW一起保存。但是,往往會(huì )忽視這一點(diǎn):在一些特定的情況下,如在C語(yǔ)言編程的中斷服務(wù)程序中,對狀態(tài)字PSW中PSW.5的F0與PSW.1的F1這兩個(gè)用戶(hù)的操作可能是無(wú)效的。如:

  void EX1_ISR() interrupt 2 {//外部中斷1

  static unsigned int tempaddr;//定義接收地址緩存

  static unsigned int tempkey;//定義接收數據緩存

  unsigned int timecnt;

  timecnt=TH1*256+TL1;

  TH1=0;

  TL1=0;

  TR1=1;//定時(shí)器1啟動(dòng)

  F0=~F0;//取反F0

  if(F0) {

  tempaddr=tempaddr1;

  }

  else {

  tempkey=tempkey1;

  }

  }

  以上是一段單片機外部中斷1的中斷服務(wù)程序,乍看似乎沒(méi)什么問(wèn)題,仿真調試時(shí)也能通過(guò)“編輯”。但實(shí)際上這是一段錯誤的程序——其中對“F0”用戶(hù)標志位的“取反”操作是達不到其預期效果的。因為對“F0”用戶(hù)標志位的“取反”操作是在中斷服務(wù)程序中進(jìn)行的。在進(jìn)入中斷時(shí),C語(yǔ)言自動(dòng)會(huì )保護“中斷現場(chǎng)”——將程序指針PC、累加器ACC、狀態(tài)字PSW等壓入堆棧保護起來(lái)……直到中斷返回時(shí)彈出堆棧并覆蓋了中斷服務(wù)時(shí)的變值,恢復到壓入堆棧之前的原樣。因此,狀態(tài)字PSW中的F0也不例外,如果壓入堆棧之前F0是處于邏輯“0”狀態(tài),中斷返回后還是復原成邏輯“0”狀態(tài)——不管中斷服務(wù)程序中怎么取反改變——也就是說(shuō),在中斷服務(wù)程序中試圖改變F0之值的操作是有失偏頗的。對于上文例舉的那段中斷服務(wù)程序來(lái)說(shuō),若F0的初始狀態(tài)為邏輯“0”,即進(jìn)入中斷服務(wù)之前和中斷返回之后總是邏輯“0”,那么進(jìn)入執行“F0=~F0”指令后F0總是邏輯“1”,因而接下運行的是“if(F0)”下花括號中“tempaddr=tempaddr1;”指令,而“else”下花括號中“tempkey=tempkey1”指令永遠也運行不到。所以,若要中斷服務(wù)程序達到預期的效果——“if(F0)”下花括號中的指令與“else”下花括號中的指令輪番運行,必須設立一個(gè)不受中斷現場(chǎng)保護等影響的標志位。

  1標志“位”的保存

  在C語(yǔ)言編程中,自定義標志位的運用概率很大,有的一個(gè)程序中就會(huì )有好多的自定義標志位,且其中幾個(gè)可能是必須要保存的。譬如有些控制器件中對一些控制狀態(tài)進(jìn)行保持,即使是停電之后再來(lái)電了這種控制狀態(tài)依然能保持不變——這就牽涉到保存問(wèn)題。

  例舉2:我們曾搞過(guò)一個(gè)鐳射投影屏幕升降的無(wú)線(xiàn)遙控裝置。這個(gè)以單片機為核心的控制裝置與屏幕升降的卷動(dòng)電機等都安裝固定在一個(gè)直徑不足50 mm的狹長(cháng)鐵桶里面,因此裝入或拆卸都非常麻煩。為了一次性成功——避免再次拆卸裝入的麻煩,在用C語(yǔ)言編程時(shí)我特意多用了一個(gè)自定義的標志位——翻轉標志位“switch_sign”。因為無(wú)線(xiàn)遙控手柄上的向上“▲”、暫?!啊觥?、向下“▼”的鍵標志都已是做定的,因此,如果由于接線(xiàn)等失誤導致按向下“▼”鍵時(shí)投影屏幕向上卷、按向上“▲”鍵時(shí)投影屏幕卻向下伸……有了“switch_sign”自定義的標志位就不用怕這些了。相關(guān)的C語(yǔ)言程序段如下:

  #defineuint unsigned int

  #defineuchar unsigned char

  uint Decode_addr,Decode_key,addr;

  sbit JD1_out=P0^4;//定義繼電器1控制輸出端

  sbit JD2_out=P0^5;//定義繼電器2控制輸出端

  sbit BEEP=P0^3;//定義蜂鳴聲響輸出

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

  voidTelecontrol_Data() {

  ……

  if(Decode_addr==0x5535) {//地址碼核對

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

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

  if(switch_sign) {//翻轉標志位

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

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

  }

  else {

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

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

  }

  }

  if(Decode_key==0x0030) {//“■”鍵碼核對

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

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

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

  }


上一頁(yè) 1 2 3 下一頁(yè)

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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>