單片機(jī)控制流水燈_第1頁(yè)
單片機(jī)控制流水燈_第2頁(yè)
單片機(jī)控制流水燈_第3頁(yè)
單片機(jī)控制流水燈_第4頁(yè)
單片機(jī)控制流水燈_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)思考:前面的實(shí)驗(yàn)我們都是直接用一個(gè)p1口的,那么能不能對(duì)p1口的某一個(gè)引腳來(lái)操作呢?c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)任務(wù)3: 流水燈-單片機(jī)內(nèi)部結(jié)構(gòu)單片機(jī)內(nèi)部結(jié)構(gòu)c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)功能要求:功能要求:流水燈指的是單色燈一只一只的亮,一只一只的滅,每次亮的燈只有一個(gè),而且是按照一個(gè)方向順序向前或向后走動(dòng)。硬硬件設(shè)計(jì)件設(shè)計(jì)c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)硬件方案確定硬件方案確定 系統(tǒng)電路圖系統(tǒng)電路圖xtal218xtal119ale30ea31psen29rst9p0.0/ad039p0.1/ad138p0.2/ad237p0.3/ad336p0.4/ad435p0.

2、5/ad534p0.6/ad633p0.7/ad732p1.0/t21p1.1/t2ex2p1.23p1.34p1.45p1.56p1.67p1.78p3.0/rxd10p3.1/txd11p3.2/int012p3.3/int113p3.4/t014p3.7/rd17p3.6/wr16p3.5/t115p2.7/a1528p2.0/a821p2.1/a922p2.2/a1023p2.3/a1124p2.4/a1225p2.5/a1326p2.6/a1427u1at89c52x1crystalc220pfr11kc322ufc120pf12345678161514131211109rn1470

3、d1led-greend2led-greend3led-greend4led-greend5led-greend6led-greend7led-greend8led-greenc51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)12345678910111213142827262524232221 201918171615eprom276412345678910111213142827262524232221 201918171615eprom2764123456789101112131415161718192040393837363534333231302928272625242422211234567891011

4、1213142827262524232221 201918171615ram6264 12345678910111213142827262524232221 201918171615ram6264 80318751805189c51256b(字節(jié))4kc51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)程序程序存儲(chǔ)器存儲(chǔ)器內(nèi)部外部0000h0fffh(4k)0000hffffh(64k)0000h0fffh(4k)0000h0001h0002h(pc)0000h是程序執(zhí)行的起始單元,在這三個(gè)單元存放一條無(wú)條件轉(zhuǎn)移指令中斷5中斷4中斷3中斷2中斷10003h000bh0013h001bh0023h002bh外部中斷0定

5、時(shí)器0中斷外部中斷1定時(shí)器1中斷串行口中斷8位位0fffh0ffehea=1 ea=0ea=1 ea=0程序程序存儲(chǔ)器資源分布存儲(chǔ)器資源分布中斷入口地址c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)0000hffffh(64k)內(nèi)部外部數(shù)據(jù)數(shù)據(jù)存儲(chǔ)器存儲(chǔ)器00hffh7fh80h(高128b)(低128b)ram專用寄存器0000h h07h07h0808h h0fh0fh1010h h17h17h1818h h1fh1fh0區(qū)區(qū)r0r0r7r7r0r0r7r7r0r0r7r7r0r0r7r71區(qū)區(qū)2區(qū)區(qū)3區(qū)區(qū)工作寄存器區(qū)工作寄存器區(qū)可位尋址區(qū)可位尋址區(qū)20h2fh7f 7807 0030h7fh數(shù)據(jù)緩沖區(qū)數(shù)據(jù)

6、緩沖區(qū)/堆棧區(qū)堆棧區(qū)內(nèi)部?jī)?nèi)部ramram存儲(chǔ)器存儲(chǔ)器 工作寄存器區(qū)選擇位rs0、rs1c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)注意注意: : 一個(gè)單元地址對(duì)應(yīng)有一個(gè)單元地址對(duì)應(yīng)有8 8個(gè)位地址個(gè)位地址msbmsbmost significant bit most significant bit (最高有效位)最高有效位)lsb lsb least significant bit least significant bit (最低有效位)最低有效位)單元地址2fh2eh2dh2ch2bh2ah29h28h27h26h25h24h23h22h21h20h7f7f77776f6f67675f5f57574f4f

7、47473f3f37372f2f27271f1f17170f0f0707 msb 位地址 lsb7e7e76766e6e66665e5e56564e4e46463e3e36362e2e26261e1e16160e0e06067d7d75756d6d65655d5d55554d4d45453d3d35352d2d25251d1d15150d0d05057c7c74746c6c64645c5c54544c4c44443c3c34342c2c24241c1c14140c0c04047b7b73736b6b63635b5b53534b4b43433b3b33332b2b23231b1b13130b0b

8、03037a7a72726a6a62625a5a52524a4a42423a3a32322a2a22221a1a12120a0a020279797171696961615959515149494141393931312929212119191111090901017878707068686060585850504848404038383030282820201818101008080000ram位尋址區(qū)位地址表c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)離散分布有離散分布有2121個(gè)個(gè)特殊功能寄存器特殊功能寄存器sfrsfr。 1111個(gè)可以進(jìn)行個(gè)可以進(jìn)行位尋址。位尋址。特別提示:對(duì)特別提示:對(duì)sfrsfr只

9、能使用直接只能使用直接尋址方式,書寫時(shí)尋址方式,書寫時(shí)可使用寄存器符號(hào),可使用寄存器符號(hào),也可用寄存器單元也可用寄存器單元地址。地址。軟件設(shè)計(jì)軟件設(shè)計(jì)c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)思考一下程序如何編寫,首先看電路圖中的8個(gè)單色燈,從上到下分別是l0l7,我們首先應(yīng)該點(diǎn)亮l0,然后熄滅l0;接著點(diǎn)亮l1,然后熄滅l1,以此類推,最后點(diǎn)亮l7,再熄滅l7,周而復(fù)使繼續(xù)下去。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)具體程序如下:#include “reg51.h”void delay()unsigned int i;for(i=0;i10000;i+) ;void main()for(;)p10 0;/點(diǎn)亮l0燈

10、delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p10 1;/熄滅l0燈p11 0;/點(diǎn)亮l1燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)p11 1;/熄滅l1燈p12 0;/點(diǎn)亮l2燈delay(); /延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p12 1;/熄滅l2燈p13 0;/點(diǎn)亮l3燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p13 1;/熄滅l3燈p14 0;/點(diǎn)亮l4燈delay(); /延時(shí)一小段時(shí)間,讓人的肉眼能夠看清 p14 1;/熄滅l4燈p15 0;/點(diǎn)亮l5燈delay(); /延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p15 1;

11、/熄滅l5燈p16 0;/點(diǎn)亮l6燈delay(); /延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p16 1;/熄滅l6燈p17 0;/點(diǎn)亮l7燈delay(); /延時(shí)一小段時(shí)間,讓人的肉眼能夠看清p17 1; /熄滅l7燈c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)我們來(lái)看上面的程序,p1x是不是感覺(jué)非常的不容易理解呢?那么我們可不可以用一些容易看懂并有助于理解的變量名呢?對(duì)于p1口的某一個(gè)引腳我們可以用sbit來(lái)定義,具體的定義如下:(1) sbit 位變量名位地址 sbit l1 = 0 x91; (2) sbit 位變量名特殊功能寄存器名位變量名特殊功能寄存器名位位置位位置 sbit l1 = p1 1;

12、先定義一個(gè)特殊功能寄存器名再指定位變量名所在的位置。當(dāng)可尋址位位于特殊功能寄存器中時(shí)可采用這種方法 (3) sbit 位變量名字節(jié)地址位位置 sbit l1 = 0 x90 1; (0 x901相當(dāng)匯編中的p1.1) c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)這是我們以后在編程時(shí)應(yīng)該注意的一個(gè)小技巧,那么我們可以將源程序作如下修改,見(jiàn)下程序。#include “reg51.h”sbit l0 = p10;sbit l1 = p11;sbit l2 = p12;sbit l3 = p13;sbit l4 = p14;sbit l5 = p15;sbit l6 = p16;sbit l7 = p17;void

13、delay()unsigned int i;for(i=0;i10000;i+) ;c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)void main()for(;)l0 0;/點(diǎn)亮l0燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l0 1;/熄滅l0燈l1 0;/點(diǎn)亮l1燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l1 1;/熄滅l1燈l2 0;/點(diǎn)亮l2燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l2 1;/熄滅l2燈l3 0;/點(diǎn)亮l3燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l3 1;/熄滅l3燈l4 0;/點(diǎn)亮l4燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠

14、看清c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)l4 1;/熄滅l4燈l5 0;/點(diǎn)亮l5燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l5 1;/熄滅l5燈l6 0;/點(diǎn)亮l6燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l6 1;/熄滅l6燈l7 0;/點(diǎn)亮l7燈delay();/延時(shí)一小段時(shí)間,讓人的肉眼能夠看清l7 1;/熄滅l7燈c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)但是上面的這個(gè)程序好像太長(zhǎng),,能不能點(diǎn)亮第二個(gè)燈的同時(shí)我們將第1個(gè)燈熄滅呢?這樣就可以使程序簡(jiǎn)化很多。思路如下:我們可以用二進(jìn)制來(lái)看就清楚的很多了。如下二進(jìn)制數(shù)11111110(十六進(jìn)制數(shù)0 xfe),這樣的一個(gè)二進(jìn)制數(shù)說(shuō)明l1燈

15、亮,l2l8燈是滅。那么l2燈亮,其余燈滅應(yīng)該是怎樣呢?答案是11111101(十六進(jìn)制數(shù)0 xfd)唄。那么我們就可以將這些數(shù)據(jù)送入到p1口就可以點(diǎn)亮對(duì)應(yīng)的小燈了?;谶@樣的思路,我們來(lái)編寫一下程序。#include “reg51.h”void delay()unsigned int i;for(i=0;i10000;i+) ;c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)void main()for(;) p1 0 xfe;/11111110 ,l0亮其余全滅delay();p1 0 xfd;/1111101 ,l0亮其余全滅delay();p1 0 xfb;/11111011 ,l0亮其余全滅delay(

16、);p1 0 xf7;/11110111 ,l0亮其余全滅delay();p1 0 xef;/11101111 ,l0亮其余全滅delay();p1 0 xdf;/11011111 ,l0亮其余全滅delay();p1 0 xbf;/10111111 ,l0亮其余全滅delay();p1 0 x7f;/01111111 ,l0亮其余全滅delay(); c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)這樣看來(lái)程序是不是變得非常的簡(jiǎn)單了呢?但程序的可讀性是不是很差???能不能把p1變一下樣我們來(lái)定義一個(gè)容易理解的變量呢?當(dāng)然可以了。我們可以用c語(yǔ)言中define 的定義。具體格式如下:#define 變量 預(yù)定義名功

17、能:用預(yù)定義名來(lái)代替前面的變量如:#define p1 led這樣以后在程序中出現(xiàn)的led都代表p1口。將上面的程序修改如下:#include “reg51.h”#define p1 ledvoid delay()unsigned int i;for(i=0;i10000;i+) ;c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)void main()for(;) led 0 xfe;/11111110 ,l0亮其余全滅delay();led 0 xfd;/1111101 ,l0亮其余全滅delay();led 0 xfb;/11111011 ,l0亮其余全滅delay();led 0 xf7;/11110111

18、 ,l0亮其余全滅delay();led 0 xef;/11101111 ,l0亮其余全滅delay();led 0 xdf;/11011111 ,l0亮其余全滅delay();led 0 xbf;/10111111 ,l0亮其余全滅delay();led 0 x7f;/01111111 ,l0亮其余全滅delay(); c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)現(xiàn)在我們還是感覺(jué)程序有些長(zhǎng),那么有沒(méi)有更簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)呢?我們來(lái)觀察一下該程序燈亮的順序,能夠看出一個(gè)規(guī)律。如表10-1所示l7l6l5l4l3l2l1l0第一次滅滅滅滅滅滅滅亮第二次滅滅滅滅滅滅亮滅第三次滅滅滅滅滅亮滅滅第四次滅滅滅滅亮滅滅滅第

19、五次滅滅滅亮滅滅滅滅第六次滅滅亮滅滅滅滅滅第七次滅亮滅滅滅滅滅滅第八次亮滅滅滅滅滅滅滅c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)程序修改為:程序修改為:#include /包含包含reg52.h頭文件頭文件#define p1 ledvoid delay() /延時(shí)函數(shù)延時(shí)函數(shù) unsigned char i, j; for (i=0;i255;i+) for (j=0;j255;j+);void main() unsigned char i; unsigned char temp;led= 0 xff; /十六進(jìn)制全十六進(jìn)制全1,熄滅所有熄滅所有l(wèi)ed while(1) temp = 0 x01; /第一

20、位為第一位為1 for (i=0;i8;i+) led= temp; /temp值取反送值取反送p0口口 delay(); temp = temp 1 ; /temp值左移一位值左移一位 c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)分隔符分隔符為分號(hào)為分號(hào)c c語(yǔ)言數(shù)據(jù)與運(yùn)算語(yǔ)言數(shù)據(jù)與運(yùn)算 1. 賦值運(yùn)算符2. 算術(shù)運(yùn)算符和算術(shù)表達(dá)式 3. 關(guān)系運(yùn)算符和關(guān)系表達(dá)4. 邏輯運(yùn)算符和邏輯表達(dá)式c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)賦值運(yùn)算符賦值運(yùn)算符 賦值語(yǔ)句的作用是把某個(gè)常量或變量或表達(dá)式的值賦值給另一個(gè)變量。符號(hào)為=。這里并不是等于的意思,只是賦值,等于用=表示。賦值語(yǔ)句左邊必須是變量或寄存器,且必須先定義。常量不能出

21、現(xiàn)左邊。如: led= 0 xff; c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)賦值運(yùn)算符和賦值表達(dá)式賦值運(yùn)算符和賦值表達(dá)式簡(jiǎn)單的賦值運(yùn)算符:復(fù)合的賦值運(yùn)算符=+ =、-=、*=、%=、/= i + = 2 等價(jià)于等價(jià)于 i = i + 2 a * = b + 5 等價(jià)于等價(jià)于 a = a * (b + 5) x% = 3 等價(jià)于等價(jià)于 x = x%3c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)算術(shù)運(yùn)算符算術(shù)運(yùn)算符(加法運(yùn)算) (減法運(yùn)算) * (乘法運(yùn)算符) (除法運(yùn)算符)% % (求余運(yùn)算符,或稱模運(yùn)算符)如:(求余運(yùn)算符,或稱模運(yùn)算符)如: 4 % 24 % 20 0+ (+ (變量自加變量自加1)1)- - (變量

22、自減(變量自減1 1) 注注 意意p兩個(gè)兩個(gè)整數(shù)整數(shù)相除結(jié)果為相除結(jié)果為整數(shù)整數(shù),如,如8/5的結(jié)果為的結(jié)果為1,舍去小數(shù)部分。,舍去小數(shù)部分。如果參加運(yùn)算的兩個(gè)數(shù)中有一個(gè)數(shù)為如果參加運(yùn)算的兩個(gè)數(shù)中有一個(gè)數(shù)為實(shí)數(shù)實(shí)數(shù),則結(jié)果是,則結(jié)果是實(shí)型實(shí)型。p求余運(yùn)算要求求余運(yùn)算要求%兩側(cè)都是兩側(cè)都是整型數(shù)據(jù)整型數(shù)據(jù)。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)自增、自減運(yùn)算實(shí)戰(zhàn)演練:請(qǐng)說(shuō)明程序運(yùn)行完后實(shí)戰(zhàn)演練:請(qǐng)說(shuō)明程序運(yùn)行完后x,y,z,m,nx,y,z,m,n的值分別是多的值分別是多少?少?main()main() intint x=6,y,z,m,n; x=6,y,z,m,n;y=+x;y=+x;z=x-; z=

23、x-; m= m=y/zy/z; ; n= n=y%zy%z; ; 自增運(yùn)算符(+)和自減運(yùn)算符(-):(1)前置運(yùn)算變量、變量 即先增減、后運(yùn)算。(2)后置運(yùn)算變量、變量 即先運(yùn)算、后增減。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)關(guān)系運(yùn)算符關(guān)系運(yùn)算符關(guān)系運(yùn)算符 優(yōu)先級(jí) = = !=低低高高c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)關(guān)系表達(dá)式關(guān)系表達(dá)式p 用用關(guān)系運(yùn)算符關(guān)系運(yùn)算符將兩個(gè)表達(dá)式(可以是算術(shù)表達(dá)式、關(guān)將兩個(gè)表達(dá)式(可以是算術(shù)表達(dá)式、關(guān)系表達(dá)式、賦值表達(dá)式或邏輯表達(dá)式系表達(dá)式、賦值表達(dá)式或邏輯表達(dá)式)連接起來(lái)的式子,連接起來(lái)的式子,稱為稱為關(guān)系表達(dá)式關(guān)系表達(dá)式。p 關(guān)系表達(dá)式的值為關(guān)系表達(dá)式的值為邏輯值邏輯值

24、“真真”或或“假假”,以,以1代表代表“真真”,以,以0代表代表“假假”。 例如:例如: (1)關(guān)系表達(dá)式關(guān)系表達(dá)式“8=4”的值為的值為 ,表達(dá)式的值為,表達(dá)式的值為 。 (2) 關(guān)系表達(dá)式關(guān)系表達(dá)式“50”的值為的值為 ,表達(dá)式的值,表達(dá)式的值為為 。 c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)邏輯運(yùn)算符及其優(yōu)先級(jí)邏輯運(yùn)算符及其優(yōu)先級(jí) 邏輯運(yùn)算符 優(yōu)先級(jí) ! (邏輯非) & (邏輯與) | (邏輯或) 注意:邏輯運(yùn)算符與位操作運(yùn)算符的區(qū)別。 c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)邏輯表達(dá)式邏輯表達(dá)式用邏輯運(yùn)算符將一個(gè)或多個(gè)表達(dá)式連接起來(lái),進(jìn)行邏輯運(yùn)算的式子。邏輯量的真判斷非0邏輯量的假判斷0 若若a=1,b=2,

25、c=3,x=4,y=3,寫出下各個(gè)表達(dá)式的值:寫出下各個(gè)表達(dá)式的值:(1)a+bc&b=c(2)!ab&b!=c|x+y=3(3)!(x=a)&(y=b)&0000c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)運(yùn)算類型運(yùn)算類型運(yùn)算符運(yùn)算符優(yōu)先級(jí)優(yōu)先級(jí)結(jié)合性結(jié)合性括號(hào)運(yùn)算符括號(hào)運(yùn)算符()()1 1從左至右從左至右邏輯非和按位取反邏輯非和按位取反! 2 2從右至左從右至左算術(shù)運(yùn)算算術(shù)運(yùn)算* * / %/ %3 3從左至右從左至右+ -+ -4 4從左至右從左至右左移、右移運(yùn)算左移、右移運(yùn)算5 5從左至右從左至右關(guān)系運(yùn)算關(guān)系運(yùn)算 = =6 6從左至右從左至右= != !=7 7從左至右從左至右位運(yùn)算位運(yùn)算& &8 8

26、從左至右從左至右 9 9從左至右從左至右| |1010從左至右從左至右邏輯與邏輯與&1111從左至右從左至右邏輯或邏輯或|1212從左至右從左至右賦值運(yùn)算與復(fù)合賦值運(yùn)賦值運(yùn)算與復(fù)合賦值運(yùn)算算 = = 、* *= =、/=/=、&=&=、=、|=|=、=1414從右至左從右至左例如:例如:(1) xy& mn 等效于等效于 (xy) & (mc 等效于等效于(!a) & (bc)c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)位運(yùn)算位運(yùn)算與操作與操作按位與操作符按位與操作符 :&p格式:格式:x&yp規(guī)則:對(duì)應(yīng)位均為規(guī)則:對(duì)應(yīng)位均為1時(shí)才為時(shí)才為1,否則為,否則為0 例如,例如, i=i&0 x0f; 等同于等同于

27、 i&=0 x0f;p主要用途:取主要用途:取(或保留或保留)1個(gè)數(shù)的某個(gè)數(shù)的某(些些)位,其余各位位,其余各位置置0。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)或操作或操作按位或操作符按位或操作符: |p格式:格式:x|yp規(guī)則:對(duì)應(yīng)位均為規(guī)則:對(duì)應(yīng)位均為0時(shí)才為時(shí)才為0,否則為,否則為1 例如,例如, i=i|0 x0f; 等同于等同于 i|=0 x0f;p主要用途:將主要用途:將1個(gè)數(shù)的某個(gè)數(shù)的某(些些)位置位置1,其余各位不變,其余各位不變c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)異或操作異或操作按位異或操作符按位異或操作符:p格式:格式:xyp規(guī)則:對(duì)應(yīng)位相同時(shí)為規(guī)則:對(duì)應(yīng)位相同時(shí)為0,不同時(shí)為,不同時(shí)為1 例

28、如,例如, i=i0 x0f; 等同于等同于 i=0 x0f;p主要用途:使主要用途:使1個(gè)數(shù)的某個(gè)數(shù)的某(些些)位翻轉(zhuǎn)位翻轉(zhuǎn)(即原來(lái)為即原來(lái)為1的位的位變?yōu)樽優(yōu)?,為,為0的變?yōu)榈淖優(yōu)?),其余各位不變。,其余各位不變。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)按位取反操作按位取反操作按位取反操作符按位取反操作符:p格式:格式:xp規(guī)則:各位翻轉(zhuǎn),即原來(lái)為規(guī)則:各位翻轉(zhuǎn),即原來(lái)為1的位變成的位變成0,原來(lái)為,原來(lái)為0的位變成的位變成1 例如,例如, i=i;p主要用途:間接地構(gòu)造一個(gè)數(shù),以增強(qiáng)程序的可移主要用途:間接地構(gòu)造一個(gè)數(shù),以增強(qiáng)程序的可移植性。植性。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)左移運(yùn)算符“”的功能

29、,是把“”左邊的操作數(shù)的各二進(jìn)制位全部左移若干位,移動(dòng)的位數(shù)由“”右邊的常數(shù)指定,高位丟棄,低位補(bǔ)0。例如:“a”的功能,是把“”左邊的操作數(shù)的各二進(jìn)制位全部右移若干位,移動(dòng)的位數(shù)由“”右邊的常數(shù)指定。進(jìn)行右移運(yùn)算時(shí),如果是無(wú)符號(hào)數(shù),則總是在其左端補(bǔ)“0”c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)思考:我們看出燈亮的順序正好符合移位的規(guī)則,而且是一個(gè)循環(huán)移位,現(xiàn)在需要解決的就是如何進(jìn)行循環(huán)移位,那么c51編譯器有沒(méi)有提供循環(huán)移位呢?c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)。移位函數(shù)在頭文件intrins.h中intrins.h文件中的內(nèi)容如下:extern unsigned char _cror_ (unsigned

30、char, unsigned char);/無(wú)符號(hào)字符型變量循環(huán)右移n位,n=255extern unsigned int _iror_ (unsigned int, unsigned char);/無(wú)符號(hào)整型變量循環(huán)右移n位,n=255extern unsigned long _lror_ (unsigned long, unsigned char);/無(wú)符號(hào)長(zhǎng)整型變量循環(huán)右移n位,n=255extern unsigned char _crol_ (unsigned char, unsigned char);/無(wú)符號(hào)字符型變量循環(huán)左移n位,n=255extern unsigned int _

31、irol_ (unsigned int, unsigned char);/無(wú)符號(hào)整型變量循環(huán)左移n位,n=255extern unsigned long _lrol_ (unsigned long, unsigned char);/無(wú)符號(hào)長(zhǎng)整型變量循環(huán)左移n位,n=255那么我們就可以將該頭文件加入到程序中,將程序在修改如下:c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)#include “reg51.h”#include “intrins.h”#define p1 ledvoid delay()unsigned int i;for(i=0;i10000;i+) ;void main()unsigned char k=0 xfe;for(;)led = k;/點(diǎn)亮一個(gè)單色燈delay();/延時(shí)一段時(shí)間,讓你看清楚 k=_crol_(k,1);/形成下一個(gè)要點(diǎn)亮的單色燈到現(xiàn)在我們已經(jīng)將程序簡(jiǎn)化了很多,這充分的體現(xiàn)了c語(yǔ)言的算法了吧。c51c51應(yīng)用培訓(xùn)應(yīng)用培訓(xùn)思考題:依照走馬燈的方式,試編寫讓兩個(gè)燈做走馬燈,即下表的規(guī)律。表表2 燈亮規(guī)律燈亮規(guī)律l7l6l5l4l3l2l1l0第一次滅滅滅滅滅滅亮亮第二次滅滅滅滅亮亮滅滅第三次滅滅亮亮滅滅滅滅第四次亮亮

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論