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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求助,如何定義51單片機中位尋址的位為標志

[復制鏈接]
跳轉到指定樓層
樓主
ID:76471 發(fā)表于 2015-4-15 21:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
比如PSW中的F0,可以在程序中判斷為1或為0,還可以置1或清零。我看了郭天詳?shù)囊曨l,他講課直接用一個字節(jié)8位做標志,實在是浪費,51的資料RAM從20H到2FH有16字節(jié)共128位可位尋址,請教高手C語言如何定義可尋址位為標志
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:74784 發(fā)表于 2015-4-15 22:24 | 只看該作者
以20H到2FH的128位做用戶標志最便捷

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:76471 發(fā)表于 2015-4-16 18:52 | 只看該作者
lxa0 發(fā)表于 2015-4-15 22:24
以20H到2FH的128位做用戶標志最便捷

如何用,用bit嗎?例如這樣定義,bit flag_0=0x00;這樣只占一位對吧
回復

使用道具 舉報

地板
ID:74784 發(fā)表于 2015-4-16 22:40 | 只看該作者
steb x

評分

參與人數(shù) 1黑幣 +35 收起 理由
admin + 35 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:76471 發(fā)表于 2015-4-17 19:18 | 只看該作者

用C語言寫呀,setb x;不能通過編譯,而且setb不是關鍵字,匯編才能用吧
回復

使用道具 舉報

6#
ID:76471 發(fā)表于 2015-4-17 19:22 | 只看該作者

我回來用bit F1;實現(xiàn)了,還是感謝你的熱情幫助
回復

使用道具 舉報

7#
ID:76471 發(fā)表于 2015-4-17 20:19 | 只看該作者
還找了個高手,要了個標準C定義位的,據(jù)說用到聯(lián)合、枚舉、結構體啥的,能用到所有用C編程的MCU上,經(jīng)測試使用無問題,同大家分享一下。
/**********************************************************************
標準C位定義
***********************************************************************/
typedef unsigned char INT8U;

volatile union uFlag
{
   INT8U byte;       
   struct {
      INT8U bit0:1;
          INT8U bit1:1;
          INT8U bit2:1;
          INT8U bit3:1;
          INT8U bit4:1;
          INT8U bit5:1;
          INT8U bit6:1;
          INT8U bit7:1;
          }flag;                                                                 //flag不能是關鍵字
}umyFlag,keyFlag;                                                         //可定義多個字節(jié)做標志位


#define F1                                                                umyFlag.flag.bit0
#define F2                                                                umyFlag.flag.bit1
#define F3                                                                umyFlag.flag.bit2
#define F4                                                                umyFlag.flag.bit3
#define F5                                                                umyFlag.flag.bit4
#define F6                                                                umyFlag.flag.bit5
#define F7                                                                umyFlag.flag.bit6
#define F8                                                                umyFlag.flag.bit7
回復

使用道具 舉報

8#
ID:76471 發(fā)表于 2015-4-17 20:22 | 只看該作者
這方法即使不是可位尋址的位都可以直接用
回復

使用道具 舉報

9#
ID:95514 發(fā)表于 2016-9-21 17:04 | 只看該作者
在keil里有一個<absacc.h>這個頭文件,這里面的函數(shù)可以滿足你的需要,可以QQ私聊我。3030895463
回復

使用道具 舉報

10#
ID:137239 發(fā)表于 2016-9-21 21:11 | 只看該作者
可以用bit語句來聲明一位,它只占一位
回復

使用道具 舉報

11#
ID:111634 發(fā)表于 2016-9-23 20:53 | 只看該作者
本帖最后由 zl2168 于 2016-9-23 20:58 編輯

⒍ 位變量定義方式

80C51片內RAM16字節(jié)128位的可尋址位(字節(jié)地址20H2FH,位地址00H7FH),還有11個特殊功能寄存器是可位尋址的,C51編譯器擴充了關鍵詞bitsbit,用于定義這些可尋址位。位變量也需先定義,后使用。

定義128位可尋址位的位變量

bit  位變量名

例如:

bit  u,v;                      //定義位變量uv

C51編譯器將自動為其在位尋址區(qū)安排一個位地址(1bit)。

對于4-5中已經(jīng)按存儲器類型bdata定位的字節(jié),其每一可尋址位,可按如下方法定義:

unsigned char bdata  flag;        //定義字符型變量flag,存儲器類型bdata

bit  f0=flag^0;                   //定義位標識符f0,為flag0

bit  f1=flag^1;                //定義位標識符f1,為flag1

上述第一條語句先定義了一個字符型變量flag,存儲器類型bdataC51編譯器將自動為其在片內RAM位尋址區(qū)(20H2FH)安排一個字節(jié)(8bit),第23條語句則分別定義f0f1為該字節(jié)第01位的位標識符。注意,“^”不是運算符,僅指明其位置,相當于匯編中的“.”。

定義11個特殊功能寄存器可尋址位的位變量

80C51單片機11個可尋址位的特殊功能寄存器中,有6SFRPSWTCONSCONIEIPP3),它們每一可尋址位有位定義名稱,C51庫函數(shù)reg51.h也已對其按MCS-51中取的位定義名稱(必須大寫)全部作了定義,并賦予了既定的位地址。只要在頭文件中聲明包含庫函數(shù)reg51.h,就可按位定義名稱直接引用。但是,還有5SFRACCBP0P1P2),可尋址位沒有專用的位定義名稱,只有位編號,但這些位編號不符合ANSI C標識符要求,例如,ACC.0P1.0等(C51標識符規(guī)定不可用小數(shù)點),應重新定義。其格式如下:

sbit  位變量名=位地址常數(shù)

其中,位地址常數(shù)必須是該位變量既定的真實位地址。例如:

sbit  P10=0x90;                          //定義位標識符P10,位地址90HP1.0

sbit  P10= 0x90^0;              //定義位標識符P10,為90HP1口)第0

sbit  P10= P1^0;             //定義位標識符P10,為P1口第0

上述第1條語句是直接用P1.0的位地址,第2條語句是用P1口的字節(jié)地址加位編號,第3條語句是用P1口特殊功能寄存器名加位編號。

需要說明的是,若用戶不按既定的位定義名稱引用6SFR中的可尋址位,另起位變量名,則也須對其重新定義。雖然C51允許用關鍵詞sbit定義這些位變量,體現(xiàn)了C51編譯功能的多樣性和完整性,但編者還是建議讀者不要去重新定義6SFR中的可尋址位,而直接使用預處理命令,既省事又不易出錯。

需要指出的是,使用sbit定義11個特殊功能寄存器可尋址位的位變量,因其具有不變的真實地址,屬于全局變量,應放在主函數(shù)之前(參閱4-6)。

需要注意的是,不要混淆bitsbit的區(qū)別。bit用于普通位變量,而sbit位用于特殊功能寄存器中可位尋址的位變量(有既定位地址)。


以上摘自張志良編著
80C51單片機實用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9


書中電路和程序設計有詳細說明,程序語句條條有注解。


回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色爱综合网 | 久久欧美高清二区三区 | 天天看天天操 | 欧美一区二区三区在线看 | 欧美精| 天堂成人国产精品一区 | 亚洲国产18 | 国产乱码精品一区二区三区忘忧草 | av天天看| 日本天堂一区 | 中文字幕在线视频免费观看 | a级免费观看视频 | 三级视频在线观看 | 久久成人精品一区二区三区 | 免费亚洲成人 | 国产精品久久久久久久久久免费看 | 伊人久久国产 | 国产视频久久 | 久久久一区二区三区 | 成人午夜精品 | 欧美精品久久久久 | 台湾佬久久| 夜夜草| 久久久99精品免费观看 | 欧美精品一区在线发布 | 成人免费网站视频 | 欧美色欧美亚洲另类七区 | 中文字幕在线播放第一页 | 国产免费拔擦拔擦8x高清 | 久久久精彩视频 | av看看| 国产清纯白嫩初高生在线播放视频 | www精品美女久久久tv | 91国产在线视频在线 | 国产精品久久久久久久久污网站 | 亚洲男人的天堂网站 | 欧美一级视频免费看 | 精品视频一区二区三区 | 在线a视频| 欧美日韩不卡合集视频 | 99成人 |