專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

AVR單片機(jī)學(xué)習(xí)(四)C語(yǔ)言的流水燈驗(yàn)證

作者:zww 1988   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月18日   【字體:
AVR 的IO口簡(jiǎn)介與寄存器的概念

 一、何謂“寄存器”

    寄存器就是RAM中的一些特殊單元,映射片上外設(shè)的特殊功能

二、何謂“IO口”

    可以將"0"與1轉(zhuǎn)換為電壓信號(hào)的端口

    單片機(jī)中最常用的TTL電平:0V代表“0”,+5V 代表“1”

    Mega16有4個(gè)IO口,PA,PB,PC,PD

三、IO口的性能指標(biāo)

   灌電流能力:能夠流入IO口的最大電流

   拉電流能力:能夠從IO口流出的最大電流

   上拉電阻與下拉電阻

   最大輸入電壓

IO口的兩種狀態(tài)




如上圖(有個(gè)選擇開關(guān)實(shí)際電路中不存在的為了好理解才給出的)輸出就是 要么給個(gè)5V 要么給個(gè)地 0V  就是輸出0  和 1

 

上圖輸入模型  理想的輸入IO口相當(dāng)于一個(gè)懸空的導(dǎo)線,就是輸入這個(gè)對(duì)VCC 與對(duì)地的等效阻抗都必須為無窮大,實(shí)際單片機(jī)現(xiàn)在一般都做到10M歐姆以上。

IO口的輸出性能指標(biāo)

1/AVR 的IO口灌電流能力與拉電流能力均達(dá)30mA

2/51的拉電流能力<100uA,灌電流能力10mA

拉電流能力:

能夠從IO口流出的最大電流

 下圖是只管的看出電流時(shí)從IO口流出,相當(dāng)于內(nèi)部開關(guān)達(dá)到VCC 隨著外面阻值改變電流改變 最大電流30mA Imax



灌電流能力:

能夠流入IO口的最大電流

下圖同理 IO口的輸入


IO口的輸入性能指標(biāo)

一、AVR的IO口輸入狀態(tài)時(shí)可配置上拉電阻,值為100K 數(shù)量級(jí)

二、最大輸入電壓范圍:-0.5V~VCC+0.5V



 AVR 輸入IO是可以配置上拉電阻的是一個(gè)比較弱上拉 大概100K -- 200K 、為什么要配置一個(gè)上拉電阻呢?對(duì)于輸入口,因?yàn)榕渲脼檩斎氲臅r(shí)候,它的等效一個(gè)懸空的一個(gè)點(diǎn),如果在輸入口上真的是一個(gè)懸空的話,這樣一個(gè)懸空的導(dǎo)線的電平會(huì)是多少呢?單片機(jī)內(nèi)部會(huì)認(rèn)為是輸入一個(gè)0 還是1呢/答案就是不確定的,可能受外部一些靜電或一些比較強(qiáng)的電磁場(chǎng)一些影響或者0或者是1,但是如果我們將配置一個(gè)上拉電阻,當(dāng)這個(gè)IO口懸空的時(shí)候,這個(gè)電平就不再是不確定的了,被確定為上拉為1.上拉電阻具體的作用將在下一講,將這個(gè)按鍵程序設(shè)計(jì)時(shí)候大家會(huì)有更深的體會(huì)。承受最大輸入電壓看下圖:輸入做小低電壓電壓 -0.5  最大0.2VCC   輸入高電壓  做小0.7VCC 最大VCC+0.5V  就是說最小-0.5  最大 5.5V

 


除了ATmega16之外其他的AVR芯片跟m16也差不多

一、IO口語(yǔ)IO寄存器的映射(x代表A~D)\

方向寄存器:DDRx

數(shù)據(jù)寄存器:PORTx

輸入寄存器:Pinx

二、C語(yǔ)言變量與寄存器的映射

io.h這個(gè)文件中將所有寄存器映射為同名的變量,對(duì)這些變量的讀寫相當(dāng)于對(duì)寄存器的讀寫

三、輸出狀態(tài)IO寄存器設(shè)置

DDRx某一位置1,相應(yīng)位的IO口被設(shè)置為輸出

PORTx某一位置1或0,對(duì)應(yīng)IO口相應(yīng)位的電平高低

 

 

 

 

 

 

下面是一些映射關(guān)系

 


第一個(gè):C語(yǔ)言通過AVR Studio/WinAVR 等編譯成目標(biāo)代碼,然后通過下載線編程器(現(xiàn)在個(gè)人一般不用了)、JATG口到硬件單片機(jī)

第二個(gè):說的是寄存器到寄存器的映射 通過同名變量 、單片機(jī)一般多數(shù)為8位定時(shí)器當(dāng)然也有16位計(jì)數(shù)器、然后映射到寄存器內(nèi)的數(shù)據(jù)0 1 雖然在RAM存的是0或1 相當(dāng)于內(nèi)部高低電平的一種形式進(jìn)行存儲(chǔ)最后通過IO口 UART  SPI   IIC  轉(zhuǎn)化為 +5v  0v 或LVTTL +3.3V 0V .

第三個(gè)、其他的變量 其實(shí)就是RAM中的數(shù)據(jù)也就是占用RAM中的存儲(chǔ)單元當(dāng)然這個(gè)RAM不能直接跟外界直接進(jìn)行接觸的。

第四個(gè)、函數(shù)表示的就是各個(gè)函數(shù)之間的一些運(yùn)算還有就是互動(dòng)的關(guān)系,表現(xiàn)到單片機(jī)內(nèi)部就是各個(gè)寄存器還有RAM的互動(dòng)關(guān)系,最后轉(zhuǎn)化為硬件模塊之間的關(guān)系。

  • C語(yǔ)言的流水燈驗(yàn)證

循環(huán)語(yǔ)句、

8位流水燈可用于指示8位二進(jìn)制

對(duì)IO寄存器進(jìn)行移位運(yùn)算,即可實(shí)現(xiàn)流水燈效果

循環(huán)語(yǔ)句

  1、while語(yǔ)句

  2、for 語(yǔ)句

各種運(yùn)算符的流水燈驗(yàn)證

賦值=  加+  減-  乘*  除/ 括號(hào)()  求余%

與& 或| 取反 ~  異或^ 左移 <<  右移>>

邏輯與 && 邏輯或||  邏輯非!

while(表達(dá)式)//表達(dá)式不為0 即為真    (1)死循環(huán)

{

   

 



如何設(shè)置斷點(diǎn) 
toggle breakpoint F9

斷點(diǎn)就是全速運(yùn)行時(shí)候當(dāng)運(yùn)行到斷點(diǎn)位置就停下來如下圖

Run  F5



去除斷點(diǎn)就是把光標(biāo)定位到斷點(diǎn)處再次點(diǎn)擊小手或F9 斷點(diǎn)就去除了。

再次按全速運(yùn)行結(jié)果如下圖燈全亮了

原因是因?yàn)檫\(yùn)行循環(huán)速度太快應(yīng)該加個(gè)延時(shí)AVR CPU 主頻能跑到16MHZ 一個(gè)1到2微秒的時(shí)間。1百萬沒秒循環(huán)幾十萬次,然人眼分辨加延時(shí)。

for (賦值初始值只做一次;條件(真進(jìn)入內(nèi)容);執(zhí)行完內(nèi)容后執(zhí)行此條語(yǔ)句){};來回判斷 第2條與第3條語(yǔ)句

for 循環(huán)大括號(hào)沒有是只執(zhí)行 第二條與第三條 判斷 加加動(dòng)作。


位運(yùn)算

  1. 將某一位置1、置0、取反
  2. 置1、

    相應(yīng)位與1 進(jìn)行位或|運(yùn)算

  3.置0

    相應(yīng)位與0進(jìn)行按位與&運(yùn)算

  4.取反

    相應(yīng)位與1進(jìn)行按位異或^ 運(yùn)算    相同為0  相異為1

  5.移位運(yùn)算符:左邊為最高位,右邊為最低位

    左移<<:

  左移n位相當(dāng)于乘2^n運(yùn)算,左側(cè)n丟棄,右側(cè)n個(gè)0

  6.右移

  右移n位相當(dāng)于乘2^n運(yùn)算,右側(cè)n位丟棄,左側(cè)補(bǔ)n個(gè)0

注意:在32位操作系統(tǒng)中 是補(bǔ)符號(hào)位  我在嵌入式32位操作系統(tǒng)試過

如果自制的仿真器缺點(diǎn)如果濾波做不好會(huì)出現(xiàn)跑飛的現(xiàn)象。

 

(引用百度說辭:程序跑飛

程序跑飛是指系統(tǒng)受到某種干擾后,程序計(jì)數(shù)器PC的值偏離了給定的唯一變化歷程,導(dǎo)致程序運(yùn)行偏離正常的運(yùn)行路徑.程序跑飛因素及后果往往是不可預(yù)計(jì)的.在很多情況下,程序跑飛后系統(tǒng)會(huì)進(jìn)入死循環(huán)而導(dǎo)致死機(jī)

 

任何數(shù)與1 進(jìn)行^ 異或就取反了。

PORTB = PORTB ^ 0b11111111;//利用異或可以實(shí)現(xiàn)閃爍燈

 

IO口設(shè)置為輸出狀態(tài)

  • 蜂鳴器

一、有源蜂鳴器

加上電源電壓即可發(fā)出鳴叫聲,消耗電流20mA左右

傳統(tǒng)的蜂鳴器驅(qū)動(dòng)電路

三極管驅(qū)動(dòng)(如下圖)

AVR的蜂鳴器驅(qū)動(dòng)電路

IO口直接驅(qū)動(dòng)(如圖)

 




編一段程序進(jìn)行驗(yàn)證(buzzer 蜂鳴器)

 





可看到PORTA 變化  蜂鳴器叫了

好了總結(jié)下

第一步:IO設(shè)置為輸出

DDRB = 0XFF;

DDRB |= 0b00100000//第五位輸出高電平

第二步:對(duì)應(yīng)位輸出數(shù)據(jù)

輸出1:PORTB |= 0b00100000;//第五位輸出高電平

輸出0:PORTB &= ~0b00100000;//第五位輸出低電平

輸出1:PORTB |= (1<<5);//第五位輸出高電平

輸出0:PORTB &= ~(1<<5);//第五位輸出低電平

對(duì)應(yīng)位取反:PORTB^ = (1<<5);//第五位輸出高電平

關(guān)閉窗口

相關(guān)文章