Ⅰ 單片機補碼問題
你的追問的圖片中的表示:1111 1111表示-7FH,那是原碼的表示形式,最高位表示負號,低7位表示值,原碼表示只是說明最高位是符號位,但是不實用,因為正負數相加不為0,就你的疑問的正7FH+(-7FH)並不是0,這不符合數學的計算規則,只是一種方法,不好用。
而用補碼表示正負數即能用最高位表示符號,又符合數學規則。雖然補碼的低7位表示數值,但並不等於將最高位的負號位去掉的數值,你圖中的1111 1111並不是-7FH的補碼,而是-1。-7FH是-127,而-127的補碼是1000 0001。計算補碼的值有個最好的方法,就是正負數相加為0,這么表示[正數]補+[負數]補=0,
這樣;1111 1111+0000 0001=0,進位丟掉,即[-1]補+[+1]補=0,則1111 1111是-1的補碼。
負數補碼最小數是1000 0000,這是-128,這不能用[正數]補+[負數]補=0計算了。(其餘都是對的。)
它的絕對值就要取反加1來計算了,取反是7FH,即127+1=128,則80H表示-128。
Ⅱ 單片機中的ADC是什麼意思作用是什麼
ADC即模擬數字轉換器(英語:Analog-to-digital converter)是用於將模擬形式的連續信號轉換為數字形式的離散信號的一類設備。一個模擬數字轉換器可以提供信號用於測量仿判。與之相對的設備成為數字模擬轉換器。
ADC的作用是將連續變化的模擬信號轉換為離散的數字信號。真實世界的模擬信號,例如溫度、壓激哪力、聲音或者圖像等,需要轉換成更容易儲存、處理和發射的數字形式。
(上圖為ADC針腳排布)
擴展備鉛改資料:
ADC模擬數字轉換器:
典型的模擬數字轉換器將模擬信號轉換為表示一定比例電壓值的數字信號。然而,有一些模擬數字轉換器並非純的電子設備,例如旋轉編碼器,也可以被視為模擬數字轉換器。
數字信號輸出可能會使用不同的編碼結構。通常會使用二進制二補數(也稱作「補碼」)進行表示,但也有其他情況,例如有的設備使用格雷碼(一種循環碼)。
參考資料來源:
網路-ADC
Ⅲ 為什麼單片機中CJNE,JNB,JB這幾條指令可實現的轉移范圍是負的128到127
單片機跳轉指令解析
控制轉移類指令
條件轉移指令Jcc根據指定的條件確定程序是否發生轉移。如果滿足條件則程序轉移到目標地址去執行程序;不滿足條件,則程序將順序執行下一條指令。
其通用格式為:
Jcc LABEL ;條件滿足,發生轉移:IP?IP+8位位移量
;否則,順序執行:IP?IP+2 其中,LABEL表示目標地址(8位位移量)。因為Jcc指令為2個位元組,所以順序執行就是指令偏移指針IP加2。條件轉移指令跳轉的目標地址只能用前面介紹的段內短距離跳轉(短轉移),即目標地址只能是在同一段內,且在當前IP地址-128~+127個單元的范圍之內。這種定址方式由於是相對於當前IP 的,所以被稱為相對定址方式。條件轉移指令不影響標志,但要利用標志。條件轉移指令Jcc中的cc表示利用標志判斷的條件,共16種。如下圖:
1、判斷單個標志位狀態
這組指令單獨判斷5個狀態標志之一,根據某一個狀態標志是0或1決定是否跳轉。
(1)JZ/JE和JNZ/JNE利用零標志ZF,判斷結果是否為零(或相等)
JE指令(相等時轉移)
JZ指令(等於0時轉移)
這是當ZF=1時轉移到目標地址的條件轉移指令的兩種助記符。這條指令既適用於判斷無符號數的相等,又適用於判斷帶符號數的相等。
JNE指令(不相等轉移)
JNZ指令(不等於0轉移)
這是當ZF=0時能轉移到目標地址的條件轉移指令的兩種助記符。這條指令也是既適用於判斷無符號數,又適用於判斷帶符號數。
(2)JS和JNS利用符號標志SF,判斷結果是正是負。
JS指令(為負轉移)——當滿足SF=1時,轉移到目標地址
JNS指令(為正轉移)——滿足SF=0時,轉移到目標地址
(3)JO和JNO利用溢出標志,判斷結果是否產生溢出
JO指令(溢出轉移)——OF=1時,轉移到目標地址 JNO指令(未溢出轉移)——OF=0時,轉移到目標地址
(4)JP/JPE和JNP/JPO利用奇偶標志PF,判斷結果中「1」的個數是偶是奇
JP/JPE指令(為偶轉移)——滿足PF=1時轉移 JNP/JPO指令(為奇轉移)——滿足PF=0時轉移 數據通訊為了可靠常要進行校驗。常用的校驗方法是奇偶校驗,即把字元ASCII碼的最高位用作校驗位,是包括校驗位在內的字元中為「1」的個數恆為奇數(奇校驗),或恆為偶數(偶校驗)。若採用奇校驗,在字元ASCII中為「1」的個數已為奇數時,則令其最高位為「0」;否則令最高位為「1」。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用進位標志CF,判斷結果是否進位或借位,CF標志是比較常用的一個標志。 JC——滿足CF=1時轉移 JNC——滿足CF=0時轉移
JB(低於轉移) JNB(不低於轉移) JNAE(不高於等於轉移) JAE(高於等於轉移) 2、用於比較無符號數高低為區別有符號數的大小,無符號數的大小用高(Above)、低(Below)表示,它需要利用CF確定高低、利用ZF標志確定相等(Equal)。兩數的高低分成4種關系:低於(不高於等於)、不低於(高於等於)、低於等於(不高於)、不低於等於(高於);也就分別對應4條指令:JB(JNAE)、 JNB(JAE)、JBE(JNA)、JNBE(JA)。 JA/JNBE
JA即高於轉移,JNBE即不低於且不等於轉移,高於則沒有進位產生,即CF=0,不等於則ZF=0,所以這兩條指令滿足CF=0且ZF=0時轉移
JAE/JNB
高於或等於轉移/不低於轉移是當CF=0(高於就不產生進位)或ZF=1(等於)時轉移。
JB/JNAE
即低於/不高於且不等於轉移,是當CF=1(產生借位)且ZF=0(不相等)時轉移。
JBE/JNA
即低於或等於/不高於轉移,是當CF=1(借位產生)或ZF=1(相等)時轉移。
3、用於比較有符號數大小
判斷有符號數的大(Greater)、小(Less),需要組合OF、SF標志、並利用ZF標志確定相等與否。兩數的大小分成4種關系:小於(不大於等於)、不小於(大於或等於)、小於等於(不大於)、不小於等於(大於);也就分別對應4條指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、 JNLE(JG)。
由上可見,條件轉移指令之前常有CMP、TEST、加減運算、邏輯運算等影響標志的指令,利用這些指令執行後的標志或其組合狀態形成條件。
JG/JNLE
大於/不小於且不等於轉移,是當標志SF與OF同號(即<SF異或OF>=0)且ZF=0時轉移
JGE/JNL大於或等於/不小於轉移,是當標志SF與OF同號(即<SF異或OF>=0)或ZF=0時轉移
JL/JNGL
小於/不大於也不等於時轉移,是當標志SF與OF異號(即<SF異或OF>=1)且ZF=0時轉移
JLE/LNG
小於或等於/不大於轉移,是當標志SF與OF異號(即<SF異或OF>=1)或ZF=1時轉移
4、判斷計數器CX是否為0
JCXZ LABEL ;CX=0,則轉移;否則順序執行
Ⅳ 在單片機中,什麼是補碼最好能給出定義和例子,謝謝
補碼,是正負數存入計算機時的一種形式。
利用補碼,就可把減法,轉換成加法。
利用補碼,目的是減小硬體的復雜性。
補碼,並不難理解,只是被計算機磚家搞亂了概念。
其實,小學生,都知道下面這些常識:
鍾表,倒撥 1 小時,可以用正撥 11 小時來代替。
倒撥 20 分,可以用正撥 40 分來代替。
-π/2 處的三角函數,與+3π/4 處的函數值相同。
在兩位十進制數的條件下,減一,可以用+99 代替。
如:24-1=2324+99=(1) 23。
在上面所說的,就是「補數」的概念。
為了求補數,還要知道一個「周期」,也可稱為「模」。
-------
在計算機中,沒有數字,都是二進制代碼。
補數,也就改稱為「補碼」了。
八位二進制是一個位元組。范圍是:0000 0000~1111 1111。
寫成十進制,就是 0~255,周期,就是 256。
-1,其補碼就是 256-1=255=1111 1111。
-2,其補碼就是 256-2=254=1111 1110。
-3,其補碼就是 256-3=253=1111 1101。
... ...
-128,其補碼就是 256-128=128=1000 0000。
-------
補碼的定義式:
正數的補碼 = 該數字本身。
負數的補碼 = 模+這個負數。
-------
補碼的應用:
6-2=4,用補碼計算如下:
0000 0110
+1111 1110
----------
(1) 0000 0100
進位的 1,舍棄即可。
Ⅳ 對於ov表示有符號數的溢出,為什麼採用C6⊕C7的方法標記
首先,你要知道在單片機裡面的加減運算都是以補碼形式進行的,補碼就是:正數的補碼不變,負數取反加1。八位數,第一位用來表示符號位,一般是0表示正數,1表示正數,求補碼的時候符號位是不能變的。
舉個例子:1111 1111 如果是有符號數的原碼,它的補碼就是1000 0001 ,這個數實際上是-127。再舉個例子1000 0000 如果是有符號數,表示多少呢,你可能會說是﹣0,那0000 0000 也是表示0啊,你發現問題了沒有,所以規定1000 0000 為-128的補碼,如果讓你寫出-128的八位原碼,你是寫不出來的!!
好的,講了這么多就是為了後面的運算做鋪墊。另C6為D6位向D7位的進位或借位,C7為D7向C的進位或借位。八位數 D7 D6 D5 D4 D3 D2 D1 D0!!!!!!
怎麼根據補碼來快速判斷數,先看第一位, 是0,直接算。是1,就先把後面算出來減去128就好了 哈哈哈啊哈哈啊哈哈哈哈哈哈
八位補碼運算,0000 0000 ——0111 1111 是0到127;1000 0000——1111 1111 是-128到-1,好了,現在開始回答你的問題了。什麼情況下會溢出呢,當然是結果超出補碼的表示範圍以後溢出。你來看:
第一種情況兩個正數之和大於127,比如64+96 01 000 000+ 01 100 000,此時C6=1,c7=0;我來引導你思考一下,針對兩個正數為什麼這樣設置是正確的,首先,正數的最高位是0,意味著什麼啊,意味著兩個,正數不管怎麼加,c7必為0,而要想c6=1,必然要求兩個數之和大於127,你想啊,C6進了一個位到了D7的位置,D7的權重就是128啊啊啊啊啊啊
第二種情況兩個負數之和,負數最高位都是1,負數之和小於—128就好溢出,好的,看例子。-64+(-96)=11 000 000 +10 100 000 這時候會溢出,我們來看,C7=1,C6=0,符合;深入思考我們發現C7一定是1的,要想有溢出c6一定是0的。 因為11 000 000+11 000 000=-64+(-64)=-128恰巧不溢出,,,;這是沒有溢出,因為都為1。我 們現在只考低7位,1 000 0000 到1 1111 1111 是-128到-1,1 1000 000 是-64 , 規律就 是 你要C6不為1,它就會溢出。1 000 0000 +1 000 0000 溢出。任何C6=1的負數相加都可以這么等效:::11 000 000+11 000 000=-64+(-64)=-128恰巧不溢出,,只有-128 或比-128大的情況出來;;;;11 000 000 ~~~~後面的0若變1這個數是變大了,往-1去接近,懂了沒,比較抽象一點。
最後一種情況,一正一負,正減負,負減正;;
正減負01 000 000 -11 000 000=64-(-64)此時會溢出,c7=1
c6=0; 這類裡面c7必為1,C6隻有正數小於64或負數大於64時才會有C6=1,或裡面有好幾種情況噢噢噢噢
負減正, 11 000 000 -01 000 000 c7=0 必然的
c6這時候是=0的沒有溢出 這是-64-64 故不溢出
規律總結,只有負數小於-64或正數大於64時,c6才為1,注意這個或是很多種情況,你自己去想想,其實這么說不太准確,但我不想一一羅列 了 啊啊啊啊啊,
你怎麼提這么個問題,真是復雜,好多東西 都是那麼規定的,你就使用就行,很多都是工程上用,工科的搞的太細是不能做大工程的啊,你要注重應用,你又不搞理論 搞不了那麼透, 還是陳景潤厲害啊,搞理論的人頭腦都是不簡單的