學習51單片機有感
定義特殊功能寄存器的位變量。
本文引用地址:http://www.ex-cimer.com/article/201611/318120.htmbit和sbit都是C51擴展的變量類型。
典型應用是:sbit P0_0=P0^0;//即定義P0_0為P0口的第1位,以便進行位操作。
利用異或操作取位,進行,,,,,,
在設置定時器的時候發(fā)現(xiàn)下列的代碼
THO = (65536 - 5000)/256;//賦值高8位
TLO = (65536 - 5000)%256;//賦值低8位
你說這與直接將65536 - 5000 賦予寄存器 有什么區(qū)別,這樣有什么好處?怎么有種脫了褲子放屁的感覺,----后來了解到原來是兩個8位寄存器合成的,怪不得要分別賦值。
//產(chǎn)生 3:1的脈沖 燈亮1s 熄滅3s 交替相間 #include// 包含51單片機寄存器定義的頭文件unsigned int beforeFlag = 0,afterFlag = 0;sbit Signal = P1^1;void beforeHalf(void) interrupt 1 using 1{beforeFlag++;TR1 = 1;//open oppsiteTR0 = 0;// close myselfTL0 = 0x06;//250 us}void afterHalf(void) interrupt 3 using 2 //這里的中斷號不能亂寫哦,0-4..。后面都是空的沒用{afterFlag++;TR0 = 1;//open oppsiteTR1 = 0;// close myselfTH0 = 0x06;//250 us}void main(void){Signal = 1;TMOD = 0x03;//我們在這里使用兩個定時器形如TMOD = 0x11并不可行。這樣的話,中斷從未被激活。調(diào)試器里的statue 一直增加,(本子上)》》》?????EA = 1;ET0 = 1;ET1 = 1;TH0 = 0x6;TL0 = 0x6;TR0 = 1;TR1 = 1;//這兩句賦值后 TL和TH會發(fā)生改變 (因為是片內(nèi)定時,所以一打開便開始計時)while(1){if(beforeFlag == 12000)//3s{Signal = ~Signal;//在這里我們發(fā)現(xiàn)使用Signal = 0;然后下面的使用 Signal = 1并不可行,調(diào)試發(fā)現(xiàn)一個beforeFlag++的定時器 一直都未關過(雖然上面有關的語句TR1 = 0;),這是為什么呢?(本子上測試通過,用的是3版本的)beforeFlag = 0;}if(afterFlag == 4000)//1s{Signal = ~Signal;afterFlag = 0;}}return ;}
評論