單片機語言--C51語言的數據類型以及存儲類型以及一些基本運算

C51語言

本文主要涉及C51語言的一些基本知識,比如C51語言的數據類型以及存儲類型以及一些基本運算。

文章目錄

  • C51語言
    • 一、 C51與標準C的比較
    • 二、 C51語言中的數據類型與存儲類型
      • 2.1、C51的擴展數據類型
      • 2.2、數據存儲類型
    • 三、 C51的基本運算
      • 3.1 算術運算符
      • 3.2 邏輯運算符
      • 3.3 關系運算符
      • 3.4 位運算
      • 3.5 指針和取地址運算符

一、 C51與標準C的比較

C51的基本語法與標準C相同,C51在標準C的基礎上進行了適合于51系列單片機硬件的擴展。
深入理解Keil C51對標準C的擴展部分以及不同之處,是掌握C51語言的關鍵之一。

C51與標準C的主要區別如下:
(1)庫函數的不同。
(2)數據類型有一定的區別。
(3)C51的變量存儲模式與標準C中的變量存儲模式數據不一樣。
(4)數據存儲類型的不同。
(5)標準C語言沒有處理單片機中斷的定義。
(6)C51語言與標準C語言的輸入/輸出處理不一樣。
(7)頭文件的不同。
(8)程序結構的差異。

但是從數據運算操作、程序控制語句以及函數的使用上來說,Keil C51與標準C幾乎沒有什么明顯的差別。

二、 C51語言中的數據類型與存儲類型

Keil C51支持的基本數據類型如表3-1所示。針對AT89S51單片機的硬件特點,C51在標準C的基礎上,擴展了4種數據類型(表3-1中最后4行)。

注意:擴展的4種數據類型,不能使用指針對它們存取。
在這里插入圖片描述

2.1、C51的擴展數據類型

對擴展的4種數據類型說明:
(1)位變量bit
bit的值可以是1(true), 也可以是0(false)

(2)特殊功能寄存器sfr

特殊功能寄存器分布在片內數據存儲區的地址單元80H~FFH之間,“sfr” 數據類型占用一個內存單元。利用它可以訪問單片機內部的所有特殊功能寄存器
例如:sfr P1=0x90

3)特殊功能寄存器sfr16

“sfr16”數據類型占兩個內存單元。它用于操作占兩個字節的特殊功能寄存器。
例如: “sfr16 DPTR=0x82”語句定義了片內16位數據指針寄存器DPTR,其低8位字節地址為82H,高8位字節地址為83H。

(4)特殊功能位 sbit

sbit—片內特殊功能寄存器的可尋址位

例如:
sfr PSW=0xd0; /定義PSW寄存器地址為0xd0/
sbit PSW^2 = 0xd2; /定義OV位為PSW.2/
符號“”`前`是特殊功能寄存器的`名字`,“”的面數字是特殊功能寄存器可尋址位在寄存器中的位置,取值必須是0~7

注意,不要把bit與sbit混淆
bit是定義普通的位變量,值只能是二進制的0或1。而sbit定義的是特殊功能寄存器的可尋址位,它的值是可進行位尋址的特殊功能寄存器的某位的絕對地址

2.2、數據存儲類型

51單片機有片內、外數據存儲區,還有程序存儲區。51單片機片內的數據存儲區是可讀寫的,51單片機的衍生系列最多可有256個字節的內部數據存儲區,其中低128字節可直接尋址高128字節(80H~FFH)只能間接尋址,從20H開始的16字節可位尋址。

程序存儲區只能讀不能寫,可能在51單片機內部或者外部,或者外部和內部都有,由51單片機的硬件決定。

內部數據存儲區可分為3個不同的數據存儲類型:data、idata和bdata。

訪問片外數據存儲區比訪問片內數據存儲區,C51提供兩種不同數據存儲類型xdatapdata來訪問片外數據存儲區

在這里插入圖片描述

下面對表3-2中的各種存儲區作以說明。

(1)DATA區。
尋址是最快的,應該把經常使用的變量放在DATA區,但是DATA區的存儲空間是有限的,DATA區除了包含程序變量外,還包含了堆棧寄存器組可直接尋址

聲明舉例如下:

  • unsigned char data system_status=0;
  • unsigned int data unit_id[8];
  • char data inp_string[20];

另外,當內部堆棧溢出的時候,程序會莫名其妙地復位。這是因為51單片機沒有報錯的機制,堆棧的溢出只能以這種方式表示,因此要留有較大的堆棧空間來防止堆棧溢出。

(2)BDATA區。
是DATA中的位尋址區,在這個區中聲明變量就可進行位尋址。BDATA區聲明中的存儲類型標識符為bdata,指的是內部RAM可位尋址的16字節存儲區(字節地址為20H~2FH)中的128個位

下面是在BDATA區中聲明的位變量和使用位變量的例子:

  • unsigned char bdata status_byte;
  • unsigned int bdata status_word;
  • sbit stat_flag= status_byte^4;
  • if(status_word^15)
    { …… }
    stat_flag=1;
    C51編譯器不允許在BDATA區中聲明float和double型變量。

(3)IDATA區。
IDATA區使用寄存器作為指針來進行間接尋址,常用來存放使用比較頻繁的變量。與外部存儲器尋址相比,它的指令執行周期和代碼長度相對較。指的是片內RAM的256字節的存儲區只能間接尋址,速度比直接尋址慢。

聲明舉例如下:

  • unsigned char idata system_status=0;
  • unsigned int idata unit_id[8];
  • char idata inp_string[16];
  • float idata out_value;

(4)PDATA區和XDATA區。
PDATA區和XDATA區位于片外存儲區,PDATA區和XDATA區聲明中的存儲類型標識符分別為pdata和xdata。

PDATA區只有256字節,僅指定256字節的外部數據存儲區。但XDATA區最多可達64KB,對應的xdata存儲類型標識符可以指定外部數據區64KB內的任何地址。
對PDATA區的尋址要比對XDATA區尋址快,因為對PDATA區尋址,只需要裝入8位地址,而對XDATA區尋址要裝入16位地址,所以要盡量把外部數據存儲在PDATA區中。

對PDATA區和XDATA區的聲明舉例如下:

  • unsigned char xdata system_status=0;
  • unsigned int pdata unit_id[8];
  • char xdata inp_string[16];
  • float pdata out_value;

(5)程序存儲區CODE。
程序存儲區CODE聲明的標識符為code,儲存的數據是不可改變的。在C51編譯器中可以用存儲區類型標識符code來訪問程序存儲區。
聲明舉例如下:

unsigned char code a[ ] ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

在這里插入圖片描述

三、 C51的基本運算

C51語言的基本運算與標準C類似,主要包括算術運算、關系運算、邏輯運算、位運算和賦值運算及其表達式等。

3.1 算術運算符

算術運算的算術運算符及其說明如表3-4所示。
在這里插入圖片描述

表3-4中的自增和自減運算符是使變量自動加1或減1,自增和自減運算符放在變量前和變量之后是不同的

例如:
++i,–i:在使用i之先使i值加(減)1。
i++,i–:在使用i之后使i值加(減)1。
例如:若i=4,則執行x=++i時,先使i加1,再引用結果,即x=5,運算結果為i=5,x=5。
再如:若i=4,則執行x=i++時,先引用i值,即x=4,再使i加1,運算結果為i=5,x=4。

3.2 邏輯運算符

邏輯運算符及其說明如表3-5所示。
在這里插入圖片描述

3.3 關系運算符

關系運算符就是判斷兩個數之間的關系。關系運算符及其說明如表3-6所示。
在這里插入圖片描述

3.4 位運算

位運算符及其說明如表3-7所示
在這里插入圖片描述

3.5 指針和取地址運算符

在這里插入圖片描述

取內容和取地址的一般形式分別為:

變量=*指針變量
指針變量=&目標變量

取內容運算是將指針變量所指向的目標變量的賦給左邊的變量;取地址運算是將目標變量的地址賦給左邊的變量。
注意,指針變量只能存放地址(也就是指針型數據),一般情況下不要將非指針類型的數據賦值給一個指針變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209095.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

奇數位字符反轉算法

題目描述: 題目描述 編寫函數void oddReverse(char *s),將所有奇數位的字符反轉。輸入格式 輸入一個字符串 s保證輸入字符串 s 的長度大于等于1小于等于100輸出格式 輸出修改后的字符串 s。輸入樣例1 012345輸出樣例1 052341輸入樣例2 01234輸出樣例2 03214輸入樣例…

Pycharm Jupyter ModuleNotFoundError 問題解決

Pycharm Jupyter ModuleNotFoundError 問題解決 0. 問題描述1. 解決方法 0. 問題描述 通過 Pycharm 啟動的 Jypyter,發生 ModuleNotFoundError 的問題。 實際上相關 Module 已經通過 pip install 安裝完成,所以懷疑是 Jupyter 的問題。 1. 解決方法 …

什么是HTML以及超鏈接,特殊符號轉義的簡單使用

目錄 什么是HTML🌸 HTML版本 版本說明🌸 XHTML和HTML的區別 超鏈接🌸基本語法🌸鏈接的分類 特殊符號 什么是HTML HTML 不是編程語言,沒有邏輯處理能力,沒有計算能力,不能動態地生成內容&#x…

docker學習(七、搭建mysql8.2主從)

一、主庫搭建 1.構建主庫鏡像 # 運行mysql鏡像,配置端口3307為主庫 docker run -p 3307:3306 --name mysql-master --privilegedtrue -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc…

前端:HTML+CSS+JavaScript實現輪播圖2

前端:HTMLCSSJavaScript實現輪播圖2 1. 和之前版本的區別2. 實現原理3. 針對上述的改進3. 參考代碼 1. 和之前版本的區別 之前發布的那篇關于輪播圖的文章在這:前端:HTMLCSSJavaScript實現輪播圖,只能說存在問題吧!比…

HuggingFace學習筆記--Prompt-Tuning、P-Tuning和Prefix-Tuning高效微調

1--Prompt-Tuning 1-1--Prompt-Tuning介紹 Prompt-Tuning 高效微調只會訓練新增的Prompt的表示層,模型的其余參數全部固定; 新增的 Prompt 內容可以分為 Hard Prompt 和 Soft Prompt 兩類; Soft prompt 通常指的是一種較為寬泛或模糊的提示&…

搭乘“低代碼”快車,引領食品行業數字化轉型全新升級

數字化技術作為重塑傳統行業重要的力量,正以不可逆轉的趨勢改變著企業經營與客戶消費的方式。 在近些年的企業數字化服務與交流過程中,織信團隊切實感受到大多數企業經營者們從懷疑到猶豫再到焦慮最終轉為堅定的態度轉變。 在這場數字化轉型的競賽中&a…

VS2009和VS2022的錯誤列表可復制粘貼為表格

在VS2019或VS2022中,可看到如下錯誤列表: 如果復制這兩行錯誤信息: 然后把它粘貼到word文件,就可以看到以下表格: 嚴重性 代碼 說明 項目 文件 行 禁止顯示狀態 錯誤(活動) E0020 未定義標識符 "dd"…

0基礎學java-day16-(坦克大戰[1])

一、 坦克大戰游戲演示 1 游戲演示 2.為什么寫這個項目 3.寫項目前的提醒 二、java 繪圖坐標體系 1 坐標體系-介紹 2 坐標體系-像素 3 介紹-快速入門 package com.hspedu.draw;import javax.swing.*; import java.awt.*;/*** author 林然* version 1.0* 演示如何在面板畫圓…

【python可視化系統源碼】基于爬蟲與可視化的電影推薦系統課題背景、目的、意義、研究思路、研究方法

該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程等學習內容。 目錄 一、項目介紹: 二、文檔學習資料: 三、模塊截圖: 四、開發技術與運行環境: 五、代碼展示: 六、數據庫表截圖&#xff1a…

從簡單到入門,一文掌握jvm底層知識文集。

🏆作者簡介,普修羅雙戰士,一直追求不斷學習和成長,在技術的道路上持續探索和實踐。 🏆多年互聯網行業從業經驗,歷任核心研發工程師,項目技術負責人。 🎉歡迎 👍點贊?評論…

【Linux systemctl命令控制軟件的啟動和關閉】

文章目錄 Linux systemctl命令:控制軟件的啟動和關閉1. 查看服務狀態2. 啟動服務3. 停止服務4. 重啟服務5. 設置開機自啟6. 取消開機自啟7. 重新加載配置 Linux systemctl命令:控制軟件的啟動和關閉 1. 查看服務狀態 要查看系統上所有服務的狀態&#…

matlab RGB三元組和十六進制的轉換

matlab畫柱狀圖改顏色的時候,用三元組的形式,范圍是[0,1] 我們獲得了十六進制 到網站轉換為[0,255] https://c.runoob.com/front-end/55/ 然后將得到的值/255 輸入matlab就可以了

Bean作用域和生命周期

小王學習錄 前言Bean的作用域什么是Bean的作用域Bean的六種作用域1. 單例作用域 singleton2. 原型作用域 prototype (多例作用域)3. 請求作用域 request4. 會話作用域 session5. 全局作用域 application6. Http WebSocket作用域 websocket Spring的執行流程和Bean的生命周期Spr…

網頁設計--第6次課后作業

試用Vue相關指令完成對以下json數據的顯示。顯示效果如下: 其中:gender1 顯示為女,gender2顯示為男。價格超過30元,顯示“有點小貴”。價格少于等于30元,則顯示“價格親民”。 data: {books: [{"id": "…

springboot集成字典注解

又是想下班的一天 文章目錄 前言springboot使用AOP簡單集成字典注解 一、通過注解進行字典賦值二、使用步驟1.添加注解2.序列化處理類3.實體類添加注解4.json返回值 總結 前言 springboot使用AOP簡單集成字典注解 一、通過注解進行字典賦值 使用AOP切面實現字典的賦值,自動將…

MongoTemplate 常用查詢

MongoTemplate是Spring Data MongoDB提供的一個Java編程接口,用于操作MongoDB數據庫。它提供了一系列方法和功能,以便進行數據的插入、更新、刪除和查詢等操作。 使用MongoTemplate,你可以通過編寫Java代碼與MongoDB進行交互,而無…

二百一十四、Linux——Linux系統時間比電腦時間慢5分鐘

一、目的 服務器重啟后,發現Linux的系統時間比電腦時間慢5分鐘,于是看了些博客,終于找到了解決方法,記錄一下,以防止后面出現同樣的問題 二、問題 通過date查看,Linux系統時間比電腦時間慢5分鐘 &#…

IEEE RAS 機器人最優控制(Model-based Optimization for Robotics)學習資料

系列文章目錄 前言 電氣和電子工程師學會機器人模型優化技術委員會 一、學習資料 1.1 教程和暑期學校 2020 年 Memmo 歐盟項目暑期班2019年Memmo歐盟項目冬季學校Matthias Gerdts(德國慕尼黑聯邦國防軍大學)在拜羅伊特 OMPC 2013 上舉辦的最優控制教程…

詳解vue生命周期

vue2 生命周期 Vue.js是一個流行的JavaScript框架,它使用了一套生命周期鉤子函數來管理組件的創建、更新和銷毀過程。以下是Vue組件的生命周期鉤子函數: beforeCreate:在實例初始化之后,數據觀測 (data observer) 和 event/watch…