帶你從(cong)軟硬件兩方面來分析Atmega16單(dan)片機
時(shi)間:2018-04-26 來源:未知
1. Atmega16單片機簡介(jie)
今(jin)天我們的(de)(de)主題是單(dan)(dan)片(pian)(pian)機(ji),說道(dao)單(dan)(dan)片(pian)(pian)機(ji)你(ni)可(ke)能最先想到(dao)的(de)(de)是51單(dan)(dan)片(pian)(pian)機(ji),然后通過外接的(de)(de)數字電路和(he)模擬(ni)電路來控制外圍的(de)(de)硬(ying)件(jian),比(bi)如(ru)PWM,ADC,I2C等等。那么今(jin)天我們所說的(de)(de)Atmega16單(dan)(dan)片(pian)(pian)機(ji)和(he)51單(dan)(dan)片(pian)(pian)機(ji)的(de)(de)區別是什(shen)么那?其實你(ni)把Atmega16單(dan)(dan)片(pian)(pian)機(ji)當成51單(dan)(dan)片(pian)(pian)機(ji)來使用即可(ke),只不(bu)過是Atmega16單(dan)(dan)片(pian)(pian)機(ji)的(de)(de)外圍接口更(geng)豐富,那么它都有(you)什(shen)么外設資(zi)源那?
ATmega16是基于增(zeng)強的(de)AVR RISC結構的(de)低功耗8 位CMOS微(wei)控制器,由(you)于其先進(jin)的(de)指(zhi)(zhi)令集以及單時鐘(zhong)周(zhou)期指(zhi)(zhi)令執行時間,ATmega16 的(de)數(shu)據(ju)吞吐率高(gao)達1 MIPS/MHz。ATmega16常用(yong)片上(shang)資源有定時器、PWM、外部中斷、SPI總線、兩線串行接口TWI、EEPROM、USART、模擬比較器、ADC轉換、IEEE(JTAG)邊(bian)界掃描等。如何去(qu)學習Atmega16單片機那?我(wo)們(men)從硬件和軟件兩方面分析(xi)。
2. Atmega16單片機硬件(jian)原(yuan)理圖(最小系統)
從上述的最小(xiao)系(xi)統板子(zi)上們可以(yi)看到它分(fen)為如下幾個部(bu)分(fen):
電(dian)源電(dian)路:5V電(dian)源
復(fu)位電路:上(shang)電復(fu)位(電容),手動(dong)按鍵(jian)復(fu)位。
晶振電路(lu):Atmega16單片機內部自帶RC震蕩(dang)電路(lu),但(dan)是自帶的(de)震蕩(dang)電路(lu)不夠精確,所以這里(li)就外接(jie)了一個8MHZ的(de)晶振。
下載程序(xu)(xu)接口ISP:ISP串(chuan)行的(de)下載程序(xu)(xu)的(de)接口
Atmega16單片(pian)機(ji)(ji):8位avr單片(pian)機(ji)(ji)。
1. Atmega16單(dan)片機編程
AVR單(dan)片(pian)機的(de)編譯(yi)軟件有GCC AVR和ICC AVR等(deng),通常使用(yong)(yong)較(jiao)多的(de)是(shi)ICC AVR,也比較(jiao)好用(yong)(yong),本書以ICC AVR6.31版本為(wei)例介(jie)紹編譯(yi)軟件的(de)使用(yong)(yong)。啟動ICC AVR,界面如下圖所示。如何(he)使用(yong)(yong)avr單(dan)片(pian)機控制(zhi)最小(xiao)系(xi)統上的(de)led燈那?代(dai)碼如下:
AVR ATmega16 流水燈C程序
/**************************************************************************/
#include
#include
void delay(void) //自定義延時函數
{
unsigned char i,j;
for(i=0;i<255;i++)
for(j=0;j<10;j++)
;
}
void cpu_init(void) //單片機初始化函數
{
PORTA = 0x00; //PA口輸出值都定(ding)義為0
DDRA = 0x00; //PA口輸出允許(xu)關
PORTB = 0x00; //PB口(kou)輸出值都(dou)定義為(wei)0
DDRB = 0x00; //PB口輸出允許關
PORTC = 0x00; //PC口輸出(chu)值(zhi)都定義為0
DDRC = 0x00; //PC口輸出允許(xu)關
PORTD = 0x00; //PD口輸出值都定義為0
DDRD = 0x00; //PD口輸出允許關(guan)
}
void main(void)
{
cpu_init(); //初(chu)始化單片機
while(1)
{
PORTA=0X00; /*點亮led燈,由最小系(xi)統的外部電路(lu)決定(ding)單片(pian)機輸(shu)出
低電平時流水燈點(dian)亮*/
DDRA=0XFF; /*允許輸出,此(ci)時PORTA的賦值才有效(xiao),這事(shi)AVR比51高級的地方*/
//由于其他端口沒有(you)接外(wai)圍設備先不(bu)用(yong)定義(yi)
delay();
DDRA=0X00; //關閉(bi)led燈
delay();
}
}

