移位知識 移位運算_第1頁
移位知識 移位運算_第2頁
移位知識 移位運算_第3頁
移位知識 移位運算_第4頁
移位知識 移位運算_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、AVR移位算法詳細解釋 (1<<X) 很多初學者都會被移位算法迷惑,移位算法形如 (1<<X)這樣的形式,高手寫程序時,習慣用移位算法來寫出各個寄存器的使用。比如下面一段是AVR 的USART 的初始化代碼。UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);UCSR0B = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN); / RXCIE=1;TXCIE=1;UDREIE=0;RXEN=1;TXEN=1這樣的寫法對高手是

2、福,這些代碼里面說明了操作了寄存器的哪些位,能夠看出它的操作的意義;對新手確是禍害,因為新手看不懂這樣的程序?;氐介_始的地方,解釋一下,什么是移位算法:如:A = (1<<2),1寫成二進制就是0000 0001,這個一左移2位就是0000 0100,所以得到的數(shù)A為0000 0100,即0x04。再如:B = (2<<4),2寫成二進制就是0000 0010,這個一左移4位就是0010 0000,所以得到的數(shù)B為0010 0000,即0x20。上面兩個移位算法都是正確的,第一種寫法,表示第三位為1其余都是0的數(shù),數(shù)的時候是從0數(shù)起的,再比如(1<<0)表示

3、的是0000 0001,(1<<7)表示的是1000 0000,但是第二種寫法沒有沒有這種意義,移位也用于乘除法,左移一位乘以2,右移移位除以2,上面的第二種寫法2左移四位得到的數(shù)是2×2×2×2×232,也就是上面的0x20。我們再來看上面的這句話:UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);UCSRC是一個和串口通訊有關的一個八位寄存器,他的每一位都有特殊的定義,我們通過查數(shù)據(jù)手冊可以看到,如下的內容。我們在程序中包含的頭文件iom16v.h類似的文件會有#defi

4、ne URSEL 7 這樣的定義,1<<URSEL即是wei7,1<<UCSZ1選擇位2,1<<UCSZ0選擇位1,整句話UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);的效果就是讓UCSRC的位七,位二,位一為高,其他都為低,然后在數(shù)據(jù)手冊里面你可以看到各個位的作用。UCSRC = (1<<7)|(1<<2)|(1<<1) 即UCSRC = 1000 0110 單片機入門系列-MEGA端口操作說明:本節(jié)重點介紹真正雙向端口操作的方法,及與偽雙向端口操作

5、的不同。跑馬燈例子。建議先看跑馬燈,再繞回來看前面的介紹。  AVR端口是真正的雙向端口,不像51偽雙向。這也是AVR的一項優(yōu)勢,只是操作時大家注意DDRn就可以了。真正雙向端口在模擬時序方面不如偽雙向的方便。  DDRn PORTn PINn 解釋:n為端口號:ABCDE  DDRn:控制端口是輸入還是輸出,0為輸入,1為輸出。個人記憶方法:一比零大所以往外擠,即1為輸出,0為輸入。  PORTn:從引腳輸出信號,當DDRn為1時,可以通過PORTnx等端口操作語句給引腳輸出賦值。  PINn:從引腳讀輸入信號,無論DDRn為何值,都可以通過

6、xPINn獲得端口n的外部電平。  當引腳配置為輸入時,若PORTxn 為"1“,上拉電阻將使能。內部上拉電阻的使用在鍵盤掃描的時候還要說到。端口更詳細功能及介紹以及端口第二功能請參考數(shù)據(jù)手冊。端口引腳配置DDxn   PORTxn   PUD (in SFIOR)   I/O   上拉電阻說明0   0   X   輸入   No 高阻態(tài) (Hi-Z)0   1   0   輸入   Yes被外部電路拉低時將輸出電流0   1   1

7、   輸入   No高阻態(tài)(Hi-Z)1   0   X   輸出   No輸出低電平 ( 漏電流)1   1   X   輸出   No輸出高電平 ( 源電流)  如果有引腳未被使用,建議給這些引腳賦予一個確定電平。最簡單的保證未用引腳具有確定電平的方法是使能內部上拉電阻。但要注意的是復位時上拉電阻將被禁用。如果復位時的功耗也有嚴格要求則建議使用外部上拉或下拉電阻。不推薦直接將未用引腳與VCC 或GND 連接,因為這樣可能會在引腳偶然作為輸出時出現(xiàn)沖擊電流。下面我們來看例子:void

8、 port_init(void)PORTA = 0x03;DDRA = 0x03;PORTB = 0x00;DDRB = 0x01;PORTC = 0x00;DDRC = 0x00;PORTD = 0x00;DDRD = 0x00;/ 建議賦值為零PORTA = 0x03;DDRA = 0x03;這兩句使PA口的PA1和PA0處于輸出狀態(tài),PA7PA2處于輸入狀態(tài)。這里的0x03即二進制的00000011,從左到右對應于Pn7-Pn0八個IO口。通過跑馬燈程序來深入理解IO口的操作:CODE:/ICC-AVR application builder : 2006-11-21 9:20:57/

9、Target : M32/ Crystal: 7.3728Mhz#include <iom32v.h>#include <macros.h>void _delay(unsigned char n) /延時函數(shù)定義unsigned char i,j;for(;n!=0;n-) /n*10ms for(j=100;j!=0;j-) /100us*100=10ms  for(i=147;i!=0;i-) /delay 100us  ;int main(void)unsigned char i,j,k; /PORTA=0xFF;    

10、    /PA口設為輸出高電平,燈滅DDRA=0xFF;           /PA口設置為輸出while(1)  i=1;  for (j=0;j<8;j+) /循環(huán)8次,即PA0PA7輪流閃亮         PORTA=i;       /反相輸出,低電平有效,對應的燈亮      for (k=0;k<10;k+) _delay(100);   /延時 100*10=1秒,可自

11、行調節(jié)         i=i<<1;         /左移一位,I的值將向下面的列表那樣變化  / 0b00000001 PA0  / 0b00000010 PA1  / 0b00000100 PA2  / 0b00001000 PA3  / 0b00010000 PA4  / 0b00100000 PA5  / 0b01000000 PA6  / 0b10000000 PA7  Copy to clipboa

12、rd其他IO口操作指令:void main(void)PORTA=0xff;DDRA=0xff; /輸出 模式 ,IO口上拉電阻有效,1為輸出,0為輸入。PORTA=0xf0; /等以下三條指令只對操作符號右邊的數(shù)字位是一的位操作。PORTA&=0x70; /清零 0x70為 01110000 ,即把654三位清零,其余數(shù)位不變。PORTA|=0x77; /置一 0x77為 01110111 ,即把654210六位清零,其余數(shù)位不變。PORTA=0x70; /翻轉 0x70為 01110000,即654三位,如果是零變成1,是一變成0。(P & 0x80)=0x80; /按位與

13、 判斷p的第七位是否是一,是則成立關于1<<x的說明,網(wǎng)上的程序中經常會看到1<<ADIF類似的語句,新手很難看明白是什么意思,我這里簡單說明一下:ADIF是一個寄存器變量,可以堪稱數(shù)字4, 跟手冊中的定義,包含芯片頭文件的定義是一樣的。 (1<<ADIF) =(1<<4)=0b00010000 ADCSR=(1<<ADIF);     /只是ADIF位 =1,其他=0 ADCSR|=(1<<ADIF);     /只是ADIF位 =1,其他不變 ADCSR&=(1<&

14、lt;ADIF);     /只是ADIF位 =0,其他不變 while(ADCSR&(1<<ADIF) ; /等待ADIF位為0,才退出循環(huán),執(zhí)行下一步 while(1) while(ADCSR&(1<<ADIF) ; /等待ADIF位為0,才退出循環(huán),執(zhí)行下一步 程序. 實踐出真知:只看這樣的說明是很枯燥的,從實踐中去學習會是更好的途徑,把這些代碼都寫到單片機里,一步一步調試運行,看看各個端口以及寄存器的效果,也鍛練程序調試能力,和樂而不為呢?一個簡單易懂的串口通訊例子程序只有基本的功能,用于串口操作的演示,如果需要結構化的程序,

15、到RS232電路圖本程序在本站的開發(fā)板上通過,絕對沒有問題,歡迎討論。測試效果,啟動時發(fā)送加回車換行,然后,收到什么,返回什么,如果給它發(fā)送一個小a,會多發(fā)回一個OK,如果發(fā)的是大A,則發(fā)回Hello字符串。串口程序測試/ ICC-AVR application builder : 2007-5-20 17:21:25/ Target : M16/ Crystal: 7.3728Mhz/ AVR mega16 串口測試/ AVR與虛擬儀器 古欣#include <iom16v.h>#include <macros.h>#define F_CPU 7372800const

16、 unsigned char buffer=""void USART_Init( unsigned int baud )unsigned int tmp;/* 設置波特率*/tmp= F_CPU/baud/16-1;UBRRH = (unsigned char)(tmp>>8);UBRRL = (unsigned char)tmp;/* 接收器與發(fā)送器使能*/UCSRB = (1<<RXEN)|(1<<TXEN);/* 設置幀格式: 8 個數(shù)據(jù)位, 2 個停止位*/UCSRC = (1<<URSEL)|(1<<US

17、BS)|(1<<UCSZ0)|(1<<UCSZ1);/* UMSEL 模式選擇  0 異步操作  1 同步操作USBS 停止位位數(shù)  0   1  1   2  UCSZ2 UCSZ1 UCSZ0 字符長度  0 0 0 5 位  0 0 1 6 位  0 1 0 7 位  0 1 1 8 位  1 0 0 保留  1 0 1 保留  1 1 0 保留  1 1 1 9 位*/ ICC 生成的初始化/UART0 initi

18、alize/ desired baud rate: 9600/ actual: baud rate:9600 (0.0%)/ char size: 8 bit/ parity: Disabledvoid uart0_init(void)UCSRB = 0x00; /disable while setting baud rateUCSRA = 0x00;UCSRC = BIT(URSEL) | 0x06;UBRRL = 0x2F; /set baud rate loUBRRH = 0x00; /set baud rate hiUCSRB = 0x18;/下面兩個函數(shù)直接從數(shù)據(jù)手冊上拷貝過來的/

19、數(shù)據(jù)發(fā)送【發(fā)送5 到8 位數(shù)據(jù)位的幀】void USART_Transmit( unsigned char data )/* 等待發(fā)送緩沖器為空 */while ( !( UCSRA & (1<<UDRE) );/* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */UDR = data; / 數(shù)據(jù)接收【以5 到8 個數(shù)據(jù)位的方式接收數(shù) 據(jù)幀】unsigned char USART_Receive( void )/* 等待接收數(shù)據(jù)*/while ( !(UCSRA & (1<<RXC) );/* 從緩沖器中獲取并返回數(shù)據(jù)*/return UDR; /連續(xù)發(fā)送字符void

20、USART_Transmit_2( void )while ( !( UCSRA & (1<<UDRE) );UDR = 'H'while ( !( UCSRA & (1<<UDRE) );UDR = 'e'while ( !( UCSRA & (1<<UDRE) );UDR = 'l'while ( !( UCSRA & (1<<UDRE) );UDR = 'l'while ( !( UCSRA & (1<<UDRE) );UDR =

溫馨提示

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

最新文檔

評論

0/150

提交評論