1. 程式人生 > >一: AVR 微控制器實現 LED 燈閃爍.

一: AVR 微控制器實現 LED 燈閃爍.

不同的開發環境, C 語言的語句不同, 主要看標頭檔案裡有沒定義宣告, 開始啥也不懂湊活著來吧. 

開發環境為AVR Studio5.1和WinAVR-20100110. 也可以選用 IAR 或者Code Vision AVR 或 ICC AVR等. 

沒工夫搗鼓了.

ATmega16 有 4 個 8 位的雙向 I/O 埠 PA, PB, PC, PD, 他們對外對應 32 個 I/O 引腳, 每一位都可以獨立的用於邏輯訊號的輸入和輸出. 在 5V 工作電壓下, 輸出高電平時, 每個引腳可輸出達 20mA 的驅動電流; 而輸出低電平時, 每個引腳可以吸收最大 40mA 的電流.

AVR系列微控制器所有的 I/O 暫存器可以通過兩種不同的方法來訪問: 使用對 I/O 暫存器訪問的 

IN 和 OUT 專用指令或者使用對 SRAM 訪問的指令. 其中 IN, OUT 指令週期為 1 個時鐘週期另外, I/O 暫存器地址範圍在 $00 - $1F 之間的暫存器(前 32 個)還可以通過指令實現位操作和位判斷跳轉. 如: SBI(I/O暫存器指定位置 1), CBI(I/O暫存器指定位清 0), SBIS(I/O暫存器指定位為 1 跳轉), SBIC(I/O暫存器指定位為 0 跳轉).詳細的看手冊才是王道.

模擬電路簡圖(LED可能看不到, 另存為或者新視窗開啟看吧):

測試程式, 更改可以觀察不同現象, 有助理解. 和 51 的不同就是 IO 口的方向控制.

/*
 * AVRGCC.c
 *
 * Created: 2012/5/27 18:09:54
 * Author: KISSMonX
 */ 

#define F_CPU 4000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
	PORTC = 0x80;			// PC 口的第 0/7 位輸出 "0"/"1", LED1 和 LED2 都亮.
	DDRC  = 0x81;			// 定義 PC 口的第 0 和 7 位為輸出方式
	_delay_ms(2000);		// 開始時兩個 LED 都要亮, 持續 2s 後進入迴圈.
	
    while(1)
    {
		_delay_ms(200);	    // 庫函式 ms 延時函式, 0.2s	
		PORTC = ~PORTC;		// PC 口第 0/7 位取反後輸出
    }
	
	return 0;
}