久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> AVR I/O口使用方法

AVR I/O口使用方法

關鍵字:AVR 方法 作者:admin 來源:不詳 發布時間:2018-05-19  瀏覽:28

AVR I/O口使用方法

AVR單片機寄存器 DDRx PORTx PINx 與對應IO端口之間的關系(x代表某個端口,如A端口、B端口等)

下表以端口B的第2位PB2為例子加以說明,并且假設PB2為懸空狀態

DDRB.2

PORTB.2

讀取PINB.2的結果

引腳PB2的狀態

1

1

1

PB2推挽輸出

1

1

0

0

PB2推挽輸出

0

0

1

1

PB2弱上拉,可作輸入

0

0

×

PB2高阻抗,可作輸入

讀取PINB.2時,就是讀取PB2引腳的實際電平,

如果PB2直接接VCC,那么任何時候讀取PINB.2的結果都是1

如果PB2直接接GND,那么任何時候讀取PINB.2的結果都是0

下面是一個標準C語言例子:

#include

unsigned char abc; //定義一個變量

void main(void) //主函數

{

DDRB = 0b11110000;

PORTB = 0b11001100;

while (1) //主循環

{

abc = PINB; //讀取B端口的實際電平

}

}

如果整個B端口都是懸空的話,

那么abc的結果就是:0b110011**

如果B端口第7位接GND 、第0位接VCC 、其它位懸空,

那么abc的結果就是:0b010011*1 (PB7工作在“短路”狀態)

其中“*”表示不確定,理想狀態下可以看作0

端口聲明:include

#include "D:ICC_HCmmICC.H"

#define OUT_BUZ sbi(DDRB,3) //PB3

#define BUZ_ON cbi(PORTB,3)

#define BUZ_OFF sbi(PORTB,3)

/*--------------------------------------------------------------------

程序名稱:

程序功能:

注意事項:

提示說明:

輸 入:

返 回:

--------------------------------------------------------------------*/

void main(void)

{

OUT_BUZ; //設置相應的IO口為輸出

while(1)

{

BUZ_ON; //我叫

delay50ms(20);

BUZ_OFF; //我不叫

delay50ms(20);

}

}

系統調試

將語句:delay50ms(20);改為語句:delay50ms(1);可以聽到叫的頻率更高,吵死人了!

以ATMEGA16為例,用輕松幽默的講解方式,講解AVR的每個功能部件,配合給出Protel電路圖及ICCAVR源代碼。

都是網上找的資料,整理了一下,大伙湊或者學吧!

第一課 AVR IO輸出之LED顯示程序

系統功能

使用AVR控制8位LED,做到想閃就閃,不想閃就不閃,左閃右閃,拚命閃,演示AVR單片機之“點燈術”。

硬件設計

關于AVR的I/O結構及相關介紹詳見Datasheet,這里僅對作部分簡單介紹,下面是AVR的I/O引腳配置表:

AVR I/O 口引腳配置表

DDRXn PORTXn PUD I/O 方式 內部上拉電阻 引腳狀態說明

0 0 X 輸入 無效 三態(高阻)

0 1 0 輸入 有效 外部引腳拉低時輸出電流 (uA)

0 1 1 輸入 無效 三態(高阻)

1 0 X 輸出 無效 推挽 0 輸出,吸收電流 (20mA)

1 1 X 輸出 無效 推挽 1 輸出,輸出電流 (20mA)

雖然AVR的I/O口單獨輸出“1”時,可輸出較大電流足已點亮一盞燈,但AVR總的I/O輸出畢竟是有限的,所以,有經驗的點燈者考慮到除了點燈外可能還有其它費勁的活兒要干,會將AVR的I/O口設計為輸出“0”時點燈,輸出“1”時熄燈。這種接法亦叫“灌電流接法”。

AVR主控電路原理圖(點擊圖片放大,不需要放大鏡! )

LED控制電路原理圖(點擊圖片放大,不需要放大鏡! )

軟件設計

下面部分從TXT拷出,拷到網頁,代碼部分缺省了很多空格,比較凌亂,請諒解!

//目標系統: 基于AVR單片機

//應用軟件: ICC AVR

/*01010101010101010101010101010101010101010101010101010101010101010101

----------------------------------------------------------------------

實驗內容:

點燈,讓燈左閃右閃,拼命閃。

----------------------------------------------------------------------

硬件連接:

將PD口的LED指示燈使能開關切換到"ON"狀態。

----------------------------------------------------------------------

注意事項:

(1)若有加載庫程序,請將光盤根目錄下的“庫程序”下的“ICC_H”文件夾拷到D盤

(2)請詳細閱讀:光盤根目錄下的“產品資料開發板實驗板SMK系列SMK1632說明資料”

----------------------------------------------------------------------

10101010101010101010101010101010101010101010101010101010101010101010*/

#include

#include "D:ICC_HCmmICC.H"

#define LED_DDR DDRD

#define LED_PORT PORTD

/*--------------------------------------------------------------------

程序名稱:

程序功能:

注意事項:

提示說明:

輸 入:

返 回:

--------------------------------------------------------------------*/

void main(void)

{

uint8 i,j;

LED_DDR=0XFF;

while(1)

{

for(i=0;i<4;i++)

{

LED_PORT^=0xFF; //我閃!拚命閃!

delay50ms(10);

}

j=0x01;

for(i=0;i<8;i++)

{

j<<=1;

LED_PORT=j; //我左閃!

delay50ms(10);

}

j=0x80;

for(i=0;i<8;i++)

{

j>>=1;

LED_PORT=j; //我右閃!

delay50ms(10);

}

}

}

系統調試

本節的目的在于學習AVR的IO輸出功能,對于AVR來說,它和傳統的51單片機不同,需要設置IO引腳方向。

作如下調試:

(1)改變IO方向,即將“LED_DDR=0XFF;”改為“0X00”,觀察現象。

(2)將語句:delay50ms(10);改為語句:delay50ms(1);可以看到LED閃的更快,眼都花了!

東西在于靈活運用,下面是用LED做的手表,內部是用AVR,ATmega48做的,請思考實現如何下面的功能。

AVR 單片機的IO口是標準的雙向端口,首先要設置IO口的狀態,即:輸入還是輸出

DDRx寄存器就是AVR單片機的端口方向寄存器,通過設置DDRx可以設置x端口的狀態。

DDRx端口方向寄存器相應位設置為1則對應的x端口相應位為輸出狀態,DDRx端口方向寄存器相應位設置為0則對應的x端口相應位為輸入狀態。

例如:

DDRA = 0xFF; //設置端口A所有口為輸出狀態,因為0xFF對應的二進制為11111111b

DDRA = 0x0F //設置端口A高4位為輸入狀態,低4位為輸出狀態,因為0x0F對應的二進制為00001111b

PORTx寄存器是AVR單片機的輸出寄存器,端口輸出狀態設定好后通過設置PORTx可以使端口x的相應位輸入高電平或低電平來控制外部設備。

例如:

PORTA = 0xFF; //端口A所有口線輸出高電平

PORTA = 0x0F; //端口A高4位輸出低電平,低4位輸出高電平

小貼士:

利用位邏輯運算符對特定的端口進行設定。

PORTA = 1<<3; //端口A第4位置為高電平,其它為低電平,應為00000001左移3位后是00001000

PORTA = 1<<7; //同理,第8位置高電平

有時候我們期望端口某一位設置成高電平,但是其它位的高低電平要保持不變,如何做呢?C語言是很強大的,有辦法!如下:

PORTA |=1<<3; //實現端口A第4位置為高電平,其它位的高低電平不受影響

上面的語句是簡化的寫法,分解一下就是:

PORTA = PORTA | (1<<3); //數字1左移3位后與端口A進行按位或,結果就是端口A第4位置為高電平,其它位的高低電平不受影響

那么大家就會問了,如何實現設置某一位為低電平,其它位的高低電平不變呢?建議大家思考1分鐘再看下面的內容。

PORTA &=~(1<<3); //解釋一下,首先將1左移3位變成00001000b,然后再按位取反變成11110111b,然后再與端口A做按位與運算,這樣就實現了設置端口A第4位為低電平,其它位的高低電平不變。

分解后的語句為:

PORTA = PORTA & (~(1<<3)); //結果是一樣的

將某端口相應位的高低電平翻轉,即原來高電平變為低電平,低電平變為高電平,呵呵!好簡單呦!

PORTA = ~PORTA; //將PORTA按位取反后再賦值給PORTA

按位邏輯運算還有一個異或,這個也非常有意思,它能實現電平翻轉,有興趣大家看看書,算是給大家留個想頭吧!

再出個小題目!

大家都知道已知a,b兩個變量,再編程中要交換兩個變量常用的方法是定義一個中間變量c,然后:

c=a;

a=b;

b=c;

通過中間變量c完成a、b變量內容的交換!

不過大家想一想使用C語言能不能不用中間變量來完成a、b變量的交換呢?答案肯定是能,因為C語言很強大!

不過還是希望大家先想一想再看答案,看完答案后再認真分析一下,體會編程的巧妙之處!

答案:

使用到了C語言的按位異或邏輯操作,由于沒有中間變量,同時邏輯運算的速度很快,整個交換過程比常規方法要快不少!

a ^= b;

b ^= a;

a ^= b;

過程就是a異或b,b異或a,然后a再異或b就完成了!

異或的邏輯表

1 ^ 1 0

0 ^ 1 1

1 ^ 0 1

0 ^ 0 0

adm 真厲害,這個你都知道,看來是編程的行家。

交換變量這樣的問題,如果你沒看過相關的資料,初學者很難自己想出來的。

int a,b;

a=3;

b=5;

a=a+b //a=8 b=5

b=a-b //a=8 b=3

a=a-b //a=5 a=3

這樣僅僅是算法技巧的問題,現在很難遇到內存不夠 的情況了。

交換變量這樣的問題,如果你沒看過相關的資料,初學者很難自己想出來的。

int a,b;

a=3;

b=5;

a=a+b //a=8 b=5

b=a-b //a=8 b=3

a=a-b //a......

又學一招,確實也很巧妙!有異曲同工之處。

我這些是看資料從別人那學來的,不過邏輯運算要比算術運算快一倍以上,寫了個程序在AVR Studio 中軟件仿真了一下!

程序如下:

#include

void main (void)

{

int a=10,b=20;

unsigned char x=30,y=40;

a = a + b;

b = a - b;

a = a - b;

x ^= y;

y ^= x;

x ^= y;

while (1);

}

首先僅僅運算,算術運算用了8個時鐘單位,邏輯運算用了3個時鐘單位,因為算術運算牽扯到了負數。

那變量賦值呢,int 賦值用了4個時鐘單位,unsigned char賦值用了2個時鐘單位。

綜合一下,算術運算用時12個單位,邏輯運算用時5個單位,效率要高2.4倍! 項目編譯完后會生成一個.cof的調試文件(我是用ICC,CV應該也有),用AVR Studio打開這個.cof文件,選好處理器型號(M16)就會進入軟件仿真,按Alt+O快捷鍵設置處理器的頻率,這樣可以看運行的時間,否則只能看運行時鐘,時間就不準了。再下來就是按F11單步執行,F10是一下執行完一個過程,如:循環、函數等。時鐘和運行時間可以在任意時間用鼠標右鍵清零,這樣數字比較直觀,不用再加減。

【更多資源】

編輯:admin  最后修改時間:2018-05-19

聯系方式

0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

Copyright © 2014-2026 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
在线看免费毛片| 超碰10000| 国产裸体舞一区二区三区| 超碰97免费观看| 99亚洲精品视频| 91免费国产精品| 成人性免费视频| 欧美亚洲另类色图| 欧美黄色一级片视频| wwwwww.色| 欧洲在线免费视频| 美女扒开大腿让男人桶| 久久视频这里有精品| 97在线播放视频| 午夜久久久精品| eeuss中文| 丰满少妇被猛烈进入高清播放| 爱福利视频一区二区| 久久久久国产一区| 熟女视频一区二区三区| 91九色丨porny丨国产jk| 日韩精品视频久久| 日韩 国产 一区| 少妇av一区二区三区无码| 久久午夜夜伦鲁鲁一区二区| 亚洲三级在线观看视频| 精品成在人线av无码免费看| av免费网站观看| 91日韩精品视频| 日韩激情免费视频| 亚洲精品mv在线观看| 国产主播自拍av| 亚洲精品永久视频| 欧美黄色免费影院| 成人在线观看毛片| 色免费在线视频| 乱妇乱女熟妇熟女网站| 善良的小姨在线| 黑人粗进入欧美aaaaa| 日本中文字幕一级片| 制服丝袜综合网| 人妻精品无码一区二区三区| 一级特黄妇女高潮| 欧美成人手机在线视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 国产一伦一伦一伦| 男人的天堂狠狠干| 看一级黄色录像| 色婷婷一区二区三区在线观看| 大陆极品少妇内射aaaaa| 9色视频在线观看| 国产毛片久久久久久| 69久久久久久| 亚洲少妇久久久| www黄色在线| 国产裸体免费无遮挡| 欧美精品一区免费| 亚洲精品久久久久久久蜜桃臀| 三级网在线观看| 青青草原网站在线观看| 性鲍视频在线观看| xxx中文字幕| 日韩欧美中文在线视频| 午夜啪啪小视频| 天天操精品视频| 日韩视频在线免费播放| 日韩精品一区二区三区电影| 天天色天天干天天色| 精品久久久99| 亚洲综合伊人久久| 日韩精品一区二区三区电影| 精品国产三级a∨在线| 狠狠精品干练久久久无码中文字幕 | 亚洲老女人av| www.51色.com| 国产在线视频在线| 免费一级特黄特色毛片久久看| 久久久久久免费看| 激情综合网俺也去| 中文字幕亚洲欧洲| 红桃一区二区三区| 狠狠爱免费视频| 国产精品嫩草影院8vv8| 日本xxxxx18| av动漫免费看| 亚洲欧美日韩网站| 国产精品无码一区二区在线| 黄色国产小视频| 波多野结衣激情| 日韩欧美国产免费| 一区二区三区欧美精品| 久久久久久久香蕉| 91欧美视频在线| 亚洲理论电影在线观看| 91网址在线播放| 国产精品视频二| xxxx一级片| 免费看毛片的网址| 国产精品区在线| 男人添女人荫蒂免费视频| 另类小说色综合| 青青青青草视频| 女同性恋一区二区| 亚洲老女人av| 日本精品一区二区三区四区| 日韩不卡的av| 蜜臀av免费观看| 精品国产免费av| www.avtt| 毛片在线视频观看| 黄频视频在线观看| 亚洲人辣妹窥探嘘嘘| 一女被多男玩喷潮视频| 8x8ⅹ国产精品一区二区二区| 午夜剧场高清版免费观看| 久久精品免费一区二区| 国产精品videossex国产高清| 九九九九九伊人| 午夜精品免费看| 国产小视频精品| 黄色永久免费网站| 黄色aaa级片| 牛夜精品久久久久久久| www.日日操| 国产av人人夜夜澡人人爽| 久久久久久久久久久福利| 男人天堂a在线| 久久精品国产sm调教网站演员| www婷婷av久久久影片| 精品国产三级a∨在线| 欧美日韩久久婷婷| 国产盗摄视频在线观看| 在线免费黄色小视频| 免费国产成人看片在线| 免费观看国产视频在线| 激情成人开心网| 激情深爱综合网| 看欧美ab黄色大片视频免费 | 久久综合亚洲精品| 国产视频在线观看网站| 国产av人人夜夜澡人人爽麻豆| 久久99中文字幕| 人人干人人视频| 日韩av影视大全| 国产玉足脚交久久欧美| 爱福利视频一区二区| 在线观看免费av网址| 日韩精品第1页| 日本在线观看a| 污污的视频免费观看| 裸体大乳女做爰69| 18岁网站在线观看| 午夜xxxxx| 3d动漫一区二区三区| 欧美成人福利在线观看| 国产在线无码精品| 国产91美女视频| 一级黄色大片儿| 日韩精品无码一区二区三区免费| 久久久九九九热| 男女曰b免费视频| 激情六月天婷婷| 国产精品v日韩精品v在线观看| 天堂8在线天堂资源bt| 黄色一级二级三级| 无码中文字幕色专区| 玖玖爱视频在线| 少妇高潮喷水久久久久久久久久| 欧洲美女亚洲激情| 天天影视综合色| 国产v片免费观看| 日韩欧美一级在线| 福利在线一区二区三区| 欧洲精品一区二区三区久久| 一区二区三区四区毛片| 国产一区亚洲二区三区| 波多野结衣与黑人| 亚洲五月激情网| 五月婷婷六月合| 9久久婷婷国产综合精品性色| 免费看一级大黄情大片| 善良的小姨在线| 五月天婷婷在线观看视频| 在线观看的毛片| 爆乳熟妇一区二区三区霸乳| 青青草成人免费在线视频| 久久久久久久久久伊人| 中国老女人av| 韩国黄色一级大片| 强伦女教师2:伦理在线观看| 欧美伦理片在线观看| 激情综合网婷婷| 91av俱乐部| 亚洲不卡视频在线| 视频二区在线播放| 涩涩网站在线看| 一级黄色片播放| youjizz.com在线观看| www精品久久| www.四虎成人|