




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、16位二進制數(shù)轉(zhuǎn)換成BCD碼的的快速算法51單片機2010-02-18 00:43在做而論道上篇博文中,回答了一個16位二進制數(shù)轉(zhuǎn)換成BCD碼的問題,給出了一個網(wǎng)上廣泛流傳的經(jīng)典轉(zhuǎn)換程序。程序可見:.說它經(jīng)典,不僅是因為它已經(jīng)流傳已久,重要的是它的編程思路十分清晰,十分易于延伸推廣。做而論道曾經(jīng)利用它的思路,很容易的編寫出了48位二進制數(shù)變換成16位BCD碼的程序。但是這個程序有個明顯的缺點,就是執(zhí)行時間太長,轉(zhuǎn)換16位二進制數(shù),就必須循環(huán)16遍,轉(zhuǎn)換48位二進制數(shù),就必須循環(huán)48遍。上述的HEX2BCD子程序,雖然長度僅僅為26字節(jié),執(zhí)行時間卻要用331個機器周期。.單片機系統(tǒng)多半是用于各種
2、類型的控制場合,很多時候都是需要“爭分奪秒”的,在低功耗系統(tǒng)設(shè)計中,也必須考慮因為運算時間長而增加系統(tǒng)耗電量的問題。為了提高整機運行的速度,在多年前,做而論道就另外編寫了一個轉(zhuǎn)換程序,程序的長度為81字節(jié),執(zhí)行時間是81個機器周期,(這兩個數(shù)字怎么這么巧?。﹫?zhí)行時間僅僅是經(jīng)典程序的1/4!.近來,在網(wǎng)上發(fā)現(xiàn)了一個鏈接:這篇文章好像是選自某個著名雜志,但是在術(shù)語的使用上,有著明顯的漏洞,不像是專業(yè)人員的手筆。比如說文中提到的:“使用51條指令代碼,但執(zhí)行這段程序卻要耗費312個指令周期”,就是敗筆。51條指令代碼,真不知道說的是什么,指令周期是因各種機型和指令而異的,也不能表示確切的時間。.下面
3、說說做而論道的編程思路。;-;已知16位二進制整數(shù)n以b15b0表示,取值范圍為065535。;那么可以寫成:; n = b15 b0;把16位數(shù)分解成高8位、低8位來寫,也是常見的形式:; n = b15b8 * 256 + b7b0;那么,寫成下列形式,也就可以理解了:; n = b15b12 * 4096 + b11b0;式中高4位b15b12取值范圍為015,代表了4096的個數(shù);;上式可以變形為:; n = b15b12 * 4000 + b15b12 * (100 - 4) + b11b0;用x代表b15b12,有:; n = x * 4000 + x * (100 - 4) +
4、b11b0;即:; n = 4*x (千位) + x (百位) + b11b0 - 4*x;寫到這里,就可以看出一點BCD碼變換的意思來了。;上式中后面的位:b11b0 - 4*x,如果小于256,那就太簡單了,馬上就可以去按照常規(guī)轉(zhuǎn)換BCD了。;如果數(shù)值較大,就要把b11b7看成128的個數(shù)y;在百位中加上y、在十位加上3*y、并在b6b0中減去2*y。;那么就有:; n = 4*x (千位) + x (百位) + b11b0 - 4*x; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + b6b0 - 2*y;由此,就可以明確由高9位b15b7變換出來十進制
5、的各個位的數(shù)值,可能大于9,到最后整理一下即可。;剩下的低7位b6b0,已經(jīng)是單字節(jié)數(shù)據(jù),變換成BCD碼那就十分簡單了。;-從最后的表達式中可以看出,高9位變換的計算方法極為簡單,只是使用左移、加減等指令即可,基本上不涉及多字節(jié)的運算。編程的時候,要充分利用單字節(jié)、單周期的指令,使程序的長度和執(zhí)行時間盡量縮短。做而論道的編程思路已經(jīng)給出,程序代碼還是過一段時間再公布,給大家留下一個發(fā)揮的時間。感興趣的網(wǎng)友可以留言,寫出自己編寫的程序。 51單片機把4位16進制數(shù)轉(zhuǎn)成10進制數(shù)的方法2010-02-10 23:33, 2位16進制轉(zhuǎn)10進制,用除以10求商跟余數(shù)的方法,即可。4位16進制數(shù)呢?D
6、IV指令只可以對2位16進制數(shù)進行除法運算啊,求高手解答。例如把TH1 TL1的數(shù)值轉(zhuǎn)成十進制, 分別存入R4 R3 R2 R1 R0。我要的是匯編的方法,C語言還沒學(xué)到。懸賞分:30 - 解決時間:2010-2-10 22:47 ;-最佳答案:兩個字節(jié)的二進制數(shù)轉(zhuǎn)換成BCD碼,必須編寫程序來解決。下面把這段轉(zhuǎn)換程序,寫成子程序的結(jié)構(gòu),便于網(wǎng)友移植。;程序經(jīng)過仿真調(diào)試通過,如下所示:;-; MOV R0, TH1 MOV R1, TL1 CALL HEX2BCD ;調(diào)用子程序把R0 R1中的數(shù)字,轉(zhuǎn)換成壓縮的BCD碼,送到R2 R3 R4;-下面,把萬千百十個位,分別存入R4 R3 R2 R1
7、 R0 MOV A, R4 ;先分離R4中的壓縮型BCD碼,包含的是十位與個位的數(shù) MOV B, #16 DIV AB ;除以16,目的是分離出高、低四位 MOV R1, A ;存放十位 MOV R0, B ;存放個位; MOV A, R2 ;萬位數(shù)不超過6,即R2中的壓縮型BCD碼只有一個,直接放到萬位R4中 MOV R4, A ;存放萬位; MOV A, R3 ;分離R3中的壓縮型BCD碼,其包含的是千位和百位數(shù) MOV B, #16 ;半字節(jié)分離 DIV AB MOV R3, A MOV R2, B SJMP $ ;到此,完成了題目要求;-;兩個字節(jié)的二進制數(shù)轉(zhuǎn)換成BCD碼的程序如下:;
8、功能:16位二進制數(shù)變換成為 BCD 碼;;入口:R0 R1 中是 16 位二進制數(shù),其中R0中是高 8 位;;出口:R2 R3 R4 中是 BCD 碼,其中R2中是萬位,R3中是千、百位,R4中是十、個位。HEX2BCD: CLR A MOV R2, A ;先對要放入轉(zhuǎn)換后的壓縮型BCD碼的寄存器通通清零 MOV R3, A MOV R4, A MOV R5, #16 ;共轉(zhuǎn)換十六位數(shù)LOOP: CLR C MOV A, R1 ;從待轉(zhuǎn)換數(shù)的高端移出一位到Cy(從低8位R1開始轉(zhuǎn)換) RLC A MOV R1, A MOV A, R0 RLC A MOV R0, A MOV A, R4 ;送
9、到BCD碼的低端 ADDC A, R4 ;帶進位加。自身相加,相當(dāng)于左移一位 DA A ;十進制調(diào)整,變成BCD碼 MOV R4, A MOV A, R3 ADDC A, R3 DA A MOV R3, A MOV A, R2 ADDC A, R2 MOV R2, A DJNZ R5, LOOP ;共轉(zhuǎn)換十六位數(shù) RET將A中的二進制數(shù)轉(zhuǎn)換為3位的BCD碼,其中百位數(shù)存放.2010-01-11 09:13請各位懂得幫寫下這個程序片段。將A中的二進制數(shù)轉(zhuǎn)換為3位的BCD碼。其中百位數(shù)存放到31H中,十位和個位數(shù)壓縮后,存放到30H中。懸賞分:80 - 解決時間:2009-10-19 09:59
10、最佳答案:;-看來這個題目是屬于MCS-51單片機的。下面用51單片機的匯編語言來求解。 MOV B, #100 DIV AB MOV 31H, A ;存百位數(shù) MOV A, #10 XCH A, B DIV AB SWAP A ;十位數(shù)換到高四位 ADD A, B ;加上個位數(shù) MOV 30H, A ;保存 R0中的8位二進制數(shù)轉(zhuǎn)換成3位BCD碼 單片機編程2010-01-10 23:18單片機的不難編程題!急!將R0中的8位二進制數(shù)轉(zhuǎn)換成3位BCD碼,結(jié)果存入外部RAM的1002H1000H(從高位到低位)單元中。例如:地址:R0 執(zhí)行后:1002H 1001H 1000H 數(shù)據(jù):81H
11、01 02 09 懸賞分:15 - 解決時間:2009-10-15 19:10 提問者: stefine_ - 一級最佳答案:;-呵呵,樓上的程序,使用了DEC DPTR,要知道,51單片機指令系統(tǒng)里面,是沒有DEC DPTR指令的。按照下面的思路做,還可以再簡練些。R0中的8位二進制數(shù)轉(zhuǎn)換成3位BCD碼: MOV DPTR, #1000H ;個位的地址 MOV A, R0 MOV B, #10 DIV AB XCH A, B MOVX DPTR, A INC DPTR MOV A, #10 XCH A, B DIV AB XCH A, B MOVX DPTR, A INC DPTR XCH
12、A, B MOVX DPTR, A RET 僅用了24字節(jié) 16位二進制轉(zhuǎn)BCD碼 -單片機2010-01-03 14:19要求:編寫一段程序,把計數(shù)器中T0中計的數(shù)(TH0和TL0)轉(zhuǎn)成8421BCD碼。并且高8位給p1口,低8位給p0口,要是轉(zhuǎn)成BCD碼超過16位,則給p2.0高電平。我是做單片機課設(shè)的,這段程序?qū)嵲诰幉幻靼琢?,向各位大俠請教了!無比感謝中!答對有額外加分啊! 懸賞分:200 - 解決時間:2010-1-3 13:03 最佳答案:16bit 表示:65536,萬位不超6程序如下: MOV R0, TL0 ; MOV R1, TH0 ;待轉(zhuǎn)換的16bit數(shù)分別放入(由高到低)
13、R1R0中; CLR A MOV R2, A ;先清零 MOV R3, A MOV R4, A MOV R5, #16 ;共轉(zhuǎn)換16位數(shù)LOOP: CLR C ;c=0 MOV A, R0 ;從待轉(zhuǎn)換低8bit數(shù)的高端移出一位到Cy(轉(zhuǎn)換最先由低8位開始) RLC A ;R0中的最高位移入到A中 MOV R0, A MOV A, R1 ;(高8位二進制數(shù)) RLC A ;此時C中的由低8位所移入的數(shù)重新移入高8位的低端 MOV R1, A ;相當(dāng)于16bit的高端移出了1bit到C中了 MOV A, R4 ;送到BCD碼的低端 ADDC A, R4 ;帶進位加。自身相加,相當(dāng)于左移一位 DA
14、A ;十進制調(diào)整,變成BCD碼 MOV R4, A MOV A, R3 ADDC A, R3 DA A MOV R3, A MOV A, R2 ADDC A, R2 MOV R2, A DJNZ R5, LOOP ;循環(huán)16遍, 轉(zhuǎn)換即完成; MOV P0, R4 ;按照要求輸出 MOV P1, R3 CLR P2.0 MOV A, R2 JZ P20_L SETB P2.0P20_L: RET 如果隨意對一個累加器A中的二進制數(shù)據(jù)進行“二進制轉(zhuǎn)十進制”調(diào)整是沒有任何實際意義的!DA調(diào)整的對象是在ADD或ADDC之后的結(jié)果,而且是以BCD碼相加以后才能夠調(diào)整,否則沒有實際意義!比如,現(xiàn)在要執(zhí)行
15、12D+39D也就是兩個十進制數(shù)相加這樣一個加法(有時候程序處理的需要,數(shù)據(jù)在單片機中是以BCD碼的形式存儲的,也就是12H和39H(十六進制),但我們可以人為將它們看為12D和39D(十進制),而且還希望相加以后的結(jié)果為51H,也就是說符合十進制運算規(guī)則12+39=51,而不是4BH的結(jié)果),但這樣的十進制加法運算在單片機中是不能夠直接實現(xiàn)的。因為單片機只能夠執(zhí)行二進制加法指令,也就是所有的運算都按照二進制中的規(guī)則進行!于是就出現(xiàn)了DA調(diào)整指令!現(xiàn)在12H+39H,將12H放于A中,執(zhí)行 ADD A,#39H指令,則結(jié)果為4BH,這不是我們希望的51H的數(shù)據(jù)形式!這時執(zhí)行DA A 指令后,就
16、會將A中的數(shù)據(jù)調(diào)整為51H(具體調(diào)整過程和原理你可以詳細看書,如果單片機書中講的不詳細,那么微機原理中一定說的非常詳細),而我們按照BCD碼規(guī)則就將其看為51D,符合我們的要求!也就是說加數(shù)和被加數(shù)都是BCD碼的形式,最大也只可能是99H,也就是我們十進制數(shù)中的99,只有這樣才會有實際的意義!所以你說的當(dāng)A=#24H的時候的情況是不會存在的,嚴格的說是沒有意義的!而且DA A指令只用于十進制BCD碼加法指令 ADD/ADDC 以后,否則是沒有實際意義的!定義:用4位二進制數(shù)來表示1位十進制數(shù)中的09這10個數(shù)碼,簡稱BCD碼 即BCD代碼。Binary-Coded Decimal?,簡稱BCD
17、,稱BCD碼或二-十進制代碼,亦稱二進碼十進數(shù)。是一種二進制的數(shù)字編碼形式,用二進制編碼的十進制代碼。這種編碼形式利用了四個位元來儲存一個十進制的數(shù)碼,使二進制和十進制之間的轉(zhuǎn)換得以快捷的進行。這種編碼技巧,最常用于會計系統(tǒng)的設(shè)計里,因為會計制度經(jīng)常需要對很長的數(shù)字串作準確的計算。相對于一般的浮點式記數(shù)法,采用BCD碼,既可保存數(shù)值的精確度,又可免卻使電腦作浮點運算時所耗費的時間。此外,對于其他需要高精確度的計算,BCD編碼亦很常用。 由于十進制數(shù)共有0、1、2、9十個數(shù)碼,因此,至少需要4位二進制碼來表示1位十進制數(shù)。4位二進制碼共有24=16種碼組,在這16種代碼中,可以任選10種來表示1
18、0個十進制數(shù)碼,共有N=16!/(16-10)!約等于2.9乘以10的10次方種方案。常用的BCD代碼列于末。 常用BCD編碼方式 最常用的BCD編碼,就是使用"0"至"9"這十個數(shù)值的二進碼來表示。這種編碼方式,在中國大陸稱之為“8421碼”。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法,以適應(yīng)不同的需求。這些編碼,大致可以分成有權(quán)碼和無權(quán)碼兩種: 有權(quán)BCD碼,如:8421(最常用)、2421、5421 無權(quán)BCD碼,如:余3碼、格雷碼 以下為三種常見的BCD編碼的比較。 十進數(shù) 8421-BCD碼 余3-BCD碼 2421-A碼 (M10)
19、D C B A C3 C2 C1 C0 a3 a2 a1 a0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 2 0 0 1 0 0 1 0 1 0 0 1 0 3 0 0 1 1 0 1 1 0 0 0 1 1 4 0 1 0 0 0 1 1 1 0 1 0 0 5 0 1 0 1 1 0 0 0 0 1 0 1 6 0 1 1 0 1 0 0 1 0 1 1 0 7 0 1 1 1 1 0 1 0 0 1 1 1 8 1 0 0 0 1 0 1 1 1 1 1 0 9 1 0 0 1 1 1 0 0 1 1 1 1 常用BCD碼 十
20、進制數(shù) 8421碼 5421碼 2421碼 余3碼 余3循環(huán)碼 0 0000 0000 0000 0011 0010 1 0001 0001 0001 0100 0110 2 0010 0010 0010 0101 0111 3 0011 0011 0011 0110 0101 4 0100 0100 0100 0111 0100 5 0101 1000 1011 1000 1100 6 0110 1001 1100 1001 1101 7 0111 1010 1101 1010 1111 8 1000 1011 1110 1011 1110 9 1001 1100 1111 1100 101
21、0 - 特點: 8421編碼直觀,好理解。 5421碼和2421碼中大于5的數(shù)字都是高位為1,5以下的高位為0。 余3碼是8421碼加上3,有上溢出和下溢出的空間。 格雷碼相鄰2個數(shù)有三位相同,只有一位不同。 什么是BCD碼2006-3-19 13:24:45 bcd碼也叫8421碼就是將十進制的數(shù)以8421的形式展開成二進制,大家知道十進制是09十個數(shù)組成,著十個數(shù)每個數(shù)都有自己的8421碼: 00000 10001 20010 30011 40100 50101 60110 70111 81000 91001 舉個例子: 321的8421碼就是 3 2 1 0011 0010 0001 原
22、因:0011=8x0+4x0+1x2+1x1=3 0010=8x0+4x0+2x1+1x0=2. 0001=8x0+4x0+2x0+1x1=1 具體: bcd碼是四位二進制碼, 也就是將十進制的數(shù)字轉(zhuǎn)化為二進制, 但是和普通的轉(zhuǎn)化有一點不同, 每一個十進制的數(shù)字0-9都對應(yīng)著一個四位的二進制碼,對應(yīng)關(guān)系如下: 十進制0 對應(yīng) 二進制0000 ;十進制1 對應(yīng)二進制0001 . 9 1001 接下來的10就有兩個上述的碼來表示 10 表示為00010000 也就是BCD碼是遇見1001就產(chǎn)生進位,不象普通的二進制碼,到1111才產(chǎn)生進位10000 舉例: 某二進制無符號數(shù)11101010,轉(zhuǎn)換為
23、三位非壓縮BCD數(shù),按百位、十位和個位的順序表示,應(yīng)為<U>_C</U>_。 A.00000001 00000011 00000111 B. 00000011 00000001 00000111 C.00000010 00000011 00000100 D. 00000011 00000001 00001001 解:(1)11101010轉(zhuǎn)換為十進制:234 (2)按百位、十位和個位的順序表示,應(yīng)為<U>_C</U>_。 附注:壓縮BCD碼與非壓縮BCD碼的區(qū)別 壓縮BCD碼的每一位用4位二進制表示,一個字節(jié)表示兩位十進制數(shù)。例如10010110
24、B表示十進制數(shù)96D;非壓縮BCD碼用1個字節(jié)表示一位十進制數(shù),高四位總是0000,低4位的00001001表示09.例如00001000B表示十進制數(shù)關(guān)于MCS-51單片機是如何將單字節(jié)二進制數(shù)轉(zhuǎn)化為BCD碼的問題 懸賞分:20 - 解決時間:2010-5-5 15:15 程序如下:BINBCD:MOV B, #100 (100作為除數(shù)送入B中) DIV AB (十六進制數(shù)除以100) MOV R3, A (百位數(shù)送r3,余數(shù)放入B中) MOV A, #10 (分離十位數(shù)與個位數(shù)) XCH A,B (余數(shù)放入A中,除數(shù)放入B中) DIV AB (分離出十位在A中,個位在B中) SWAP A
25、(十位數(shù)交換到A的高4位) ADD A,B (十位數(shù)與個位數(shù)相加送入 A中) END1 請問這個程序求解的思路是什么?2 該程序的第二句"DIV AB"的解釋是十六進制數(shù)除以100,可是A中應(yīng)該存放的是一個八位的二進制數(shù),這是怎么回事?3 最后為什么要十位數(shù)與個位數(shù)相加,不是要分離十位數(shù)與個位數(shù)嗎? 乘除法的時候可以不考慮進制的,比如說 #0FFH這個十六進制數(shù) 存放于A中,#100這個十進制數(shù)放于B中 然后DIV AB 這時 A等于#02H B等于#37H等于55在然后 假設(shè)A中的數(shù)為 FFHBINBCD:MOV B, #100 (B=100,十進制100,)DIV AB (A
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 項目管理過程中的風(fēng)險監(jiān)控相關(guān)題目試題及答案
- 行政管理師資格證書考試要點試題及答案
- 注冊會計師考試2025年技術(shù)變革對會計行業(yè)的影響試題及答案
- 項目管理過程中的決策制定技巧考核試題及答案
- 一步步掌握注冊會計師試題及答案
- 注會審計計算能力試題及答案
- 福建事業(yè)單位考試國際合作政策題及答案
- 2025年國際金融理財師考試小額貸款管理試題及答案
- 2024年項目管理師測試技巧試題及答案
- 注冊會計師考試成功背后的努力與堅持試題及答案
- 《高中信息技術(shù)課分層教學(xué)的探索與研究》課題研究開題報告結(jié)題報告
- 財產(chǎn)險水災(zāi)現(xiàn)場勘查及理賠定損標準
- JB-T 2302-2022 雙筒網(wǎng)式過濾器 型式、參數(shù)與尺寸
- 船舶帶纜知識學(xué)習(xí)
- 導(dǎo)線懸垂合成絕緣子串絕緣子、金具機械強度計算
- 文化遺產(chǎn)與自然遺產(chǎn)學(xué)習(xí)通期末考試答案2023年
- 雞蛋的營養(yǎng)價值和功效
- 福樓拜-教學(xué)講解課件
- 《衛(wèi)生應(yīng)急管理》衛(wèi)生應(yīng)急管理概述-課件
- 感染性疾病的分子生物學(xué)檢驗技術(shù)-遺傳學(xué)疾病的分子生物學(xué)檢驗技術(shù)-醫(yī)學(xué)院課件
- 《現(xiàn)代世界形成》
評論
0/150
提交評論