<noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"><delect id="ixm7d"></delect></rt><delect id="ixm7d"></delect><bdo id="ixm7d"></bdo><rt id="ixm7d"></rt><bdo id="ixm7d"></bdo><noframes id="ixm7d"><rt id="ixm7d"><rt id="ixm7d"></rt></rt><rt id="ixm7d"><rt id="ixm7d"></rt></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt> <noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><noframes id="ixm7d"><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d"><rt id="ixm7d"></rt><noframes id="ixm7d">

基于avr的ds18b20程序

2023-07-02

第一篇:基于avr的ds18b20程序

基于AVR的DS18b20程序

//說明:單片機ATmega16的18B20程序。調這個18B20程序問題主要出現在延時部分,即單片機實際輸出的延時與設定不符。//后面為別人精確延時,我用自己的單片機通過示波器重新測量實際延時。建議調延時用示波器先看看。我用的晶振12M,但延時根本就與理論不符。其中480us的延時要在480us與960us之間,選取550us比較合適,一般都這么選。 最后一句話:DS18B20的程序很多,模塊基本相似,調不出來就是因為延時問題,示波器是必備工具,否則很盲目。

#include

#define uchar unsigned char

#define uchar unsigned char

#define uint unsigned int

//------------------------//

//.....18B20........

void init_1820(void)

{

int Flag_1820Error;

uchar i;

uint j=0;

PORTD|=(1<<7);//PORTC|=(1<<7);

PORTD&=~(1<<7);//PORTC&=~(1<<7);

for(i=0;i<8;i++)delay(180);//delay_60us();//480us以上

PORTD|=(1<<7);//PORTC|=(1<<7);

DDRD&=~(1<<7);//DDRC&=~(1<<7);//

delay(40);//delay_15us();//15~60us

delay(40);//delay_15us();

Flag_1820Error=0;

while(PIND&(1<<7)

{ delay(180);//delay_60us();

j++;

if(j>=18000){Flag_1820Error=1;break;}

}

DDRD|=(1<<7);//DDRC|=(1<<7);//PORTC7 is OUTPUT

PORTD|=(1<<7);//PORTC|=(1<<7);

for(i=0;i<4;i++)delay(180);//delay_60us(); //240us

}

/********************************/

/********************************/

void write_1820(uchar x)

{

uchar m;

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

{

if(x&(1<

{

PORTD&=~(1<<7);//PORTC&=~(1<<7);delay_5us(); //5usPORTD|=(1<<7);//PORTC|=(1<<7); //write"1"delay(40);//delay_15us(); //15~45usdelay(40);//delay_15us();delay(40);//delay_15us();

}

else

{

PORTD&=~(1<<7);//PORTC&=~(1<<7);delay_15us();//15us

delay(40);//delay_15us(); //write"0"delay(40); //delay_15us(); //15~45usdelay(40);//delay_15us();

PORTD|=(1<<7);//PORTC|=(1<<7);

}

PORTD|=(1<<7);// PORTC|=(1<<7);

}

/*******************************/

uchar read_1820(void)

{

uchar temp,k,n;

temp=0;

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

{

PORTD&=~(1<<7);//PORTC&=~(1<<7);

delay(13);//delay_5us();

PORTD|=(1<<7);//PORTC|=(1<<7);

delay(13);//delay_5us();

DDRD&=~(1<<7);//DDRC&=~(1<<7);//"PINC7 is INPUT"k=(PIND&(1<<7));//k=(PINC&(1<<7)); //讀數據,從低位開始if(k)

temp|=(1<

else

temp&=~(1<

delay(40);//delay_15us();//45us

delay(40);//delay_15us(); delay(40);//delay_15us();

DDRD|=(1<<7);//DDRC|=(1<<7);//

}

return (temp);

}

/*************************************/

float read_temperature(void)

{

float temp;////////////

uchar teml=0,temh=0;

unsigned long t=0;

init_1820();//復位18b20write_1820(0xcc);// 發出轉換命令write_1820(0x44);

//Delay_nms(100);

init_1820();

write_1820(0xcc);//發出讀命令write_1820(0xbe);

teml=read_1820();//讀數據byte1temh=read_1820();//byte2

t=temh;

t=t<<8; t=t|teml; temp=t*0.0625*260/286; return(temp); /*if(temh&0xf8)sign=0; else sign=1; if(sign==0){temh=255-temh;teml=255-teml;}temh=temh<<4;

temh|=(teml&0xf0)>>4;

}

//再在主程序中調用一下read_temperature(void),讀取溫度。 teml=teml&0x0f; teml=(teml*10)/16; tempval=temh;e[0]=tempval/100; tempval=temh;e[1]=(tempval/10)%10; tempval=temh;e[2]=tempval%10; tempval=teml;e[3]=tempval;*/

第二篇:DS18B20學習總結

及其高精度溫度測量的實現

1.1 DS18B20簡介

DS18B20是美國DALLAS半導體公司生產的可組網數字式溫度傳感器. 主要由三個數據部件組成:64的激光ROM,溫度靈敏原件,非易失性溫度告警觸發器TH和TL。 封裝如圖一:

圖一 1.

2DS18B20的特點:

1. 獨特的單線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊。

2. DS18B20支持多點組網功能,多個DS18B20可以并聯在唯一的三線上,實現多點測溫。 3. DS18B20在使用中不需要任何外圍元件。

4. 測溫范圍-55℃~+125℃,固有測溫分辨率0.5℃。 5. 測量結果以9位數字量方式串行傳送。

內部結構框圖如圖二所示。

圖二

2.1 訪問溫度計的協議:

(一)初始化

(二)ROM操作命令

(三)存貯器操作命令

(四)處理/數據

由熱敏原件中晶振特性計算出所測的溫度。 注意:復位操作如下圖三

圖三 必需要給DS18B20輸入脈沖激活其復位功能。

DS18B20的驅動程序:

/*************************此部分為18B20的驅動程序*************************************/

#include #include sbit D18B20=P3^7; sbit error=P3^4; #define NOP() _nop_() /* 定義空指令 */ #define _Nop() _nop_() /*定義空指令*/ void TempDelay (unsigned char idata us); void Init18b20 (void); void WriteByte (unsigned char idata wr); //單字節寫入 void read_bytes (unsigned char idata j); unsigned char CRC (unsigned char j); void GemTemp (void); void Config18b20 (void); void ReadID (void); void TemperatuerResult(void); bit flag; unsigned int idata Temperature; unsigned char idata temp_buff[9]; //存儲讀取的字節,read scratchpad為9字節,read rom ID為8字節 unsigned char idata id_buff[8];

unsigned char idata crc_data; unsigned char code CrcTable [256]={ 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

void GetTemp() {

if(TIM==100)

{ TIM=0;

TemperatuerResult();

每隔 1000ms 讀取溫度。

void TemperatuerResult(void) {

p = id_buff;

ReadID();

//先確定是第幾個DS18B20

Config18b20(); //配置DS18B20的報警溫度和分辨度

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0x44);

//Temperature convert

Init18b20 ();

//復位)

WriteByte(0xcc);

//skip rom

WriteByte(0xbe);

//read Temperature

p = temp_buff;

GemTemp(); //讀取溫度

}

void GemTemp (void) {

read_bytes (9);

if (CRC(9)==0) //校驗正確

{

Temperature = temp_buff[1]*0x100 + temp_buff[0]; //

Temperature *= 0.0625;

Temperature /= 16;

TempDelay(1);

} } *Function:CRC校驗 *parameter: *Return: *Modify: *************************************************************/ unsigned char CRC (unsigned char j) {

unsigned char idata i,crc_data=0;

for(i=0;i

crc_data = CrcTable[crc_data^temp_buff[i]];

return (crc_data); }

/************************************************************ *Function:向18B20寫入一個字節 *parameter: *Return: *Modify:

void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

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

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //

5 _nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************ *Function:讀18B20的一個字節 *parameter: *Return: *Modify: *************************************************************/ unsigned char ReadByte (void)

//讀取單字節

unsigned char idata i,u=0;

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

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); } /************************************************************ *Function:讀18B20 *parameter: *Return: *Modify: *************************************************************/ void read_bytes (unsigned char idata j) {

unsigned char idata i;

for(i=0;i

{

*p = ReadByte();

p++;

} } /************************************************************ *Function:延時處理 *parameter: *Return: *Modify: *************************************************************/ void TempDelay (unsigned char idata us) {

while(us--); } /************************************************************ *Function:18B20初始化 *parameter: *Return: *Modify: *************************************************************/ void Init18b20 (void) {

D18B20=1;

_nop_();

D18B20=0;

TempDelay(80);

//delay 530 uS//80

_nop_();

D18B20=1;

TempDelay(14);

//delay 100 uS//14

_nop_();

_nop_();

_nop_();

if(D18B20==0)

{flag = 1; error=0; }

//detect 1820 success!

else

{flag = 0; error=1; }

//detect 1820 fail!

TempDelay(20);

//20

_nop_();

_nop_();

D18B20 = 1; }

/************************************************************

向18B20寫入一個字節 *parameter: *Return: *Modify: *************************************************************/ void WriteByte (unsigned char idata wr) //單字節寫入 {

unsigned char idata i;

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

{

D18B20 = 0;

_nop_();

D18B20=wr&0x01;

TempDelay(3);

//delay 45 uS //5

_nop_();

_nop_();

D18B20=1;

wr >>= 1;

} }

/************************************************************

讀18B20的一個字節

*/ unsigned char ReadByte (void)

//讀取單字節 {

unsigned char idata i,u=0;

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

{

D18B20 = 0;

u >>= 1;

D18B20 = 1;

if(D18B20==1)

u |= 0x80;

TempDelay (2);

_nop_();

}

return(u); }

/************************************************************ 3.1.2

SPI數據線配置。

/*************************此部分為74HC595的驅動程序使用SPI總線連接*************************************/

#include #include

#define NOP()

_nop_()

/* 定義空指令 */ #define _Nop() _nop_()

/*?定義空指令*/ void HC595SendData(unsigned int SendVal);

//SPI IO sbit

MOSIO =P1^5; sbit

R_CLK =P1^6; sbit

S_CLK =P1^7; sbit

IN_PL =P3^4;

//74HC165 shift load

把數據加載到鎖存器中 sbit

IN_Dat=P3^5;

//74HC165 output

數據移出 sbit

OE

=P3^6;

/********************************************************************************************************* ** 函數名稱: HC595SendData ** 功能描述: 向SPI總線發送數據

*********************************************************************************************************/ void HC595SendData(unsigned int SendVal) {

unsigned char i;

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

{

if((SendVal<

else MOSIO=0;

S_CLK=0;

NOP();

NOP();

S_CLK=1;

}

R_CLK=0; //set dataline low

NOP();

NOP();

R_CLK=1; //片選

OE=0; }

3.1.

3試驗數碼管上顯示溫度

#include extern GetTemp();

//聲明引用外部函數 extern unsigned int idata Temperature;

// 聲明引用外部變量 void delay(unsigned int i);

sbit

LS138A=P2^2;

//管腳定義 sbit

LS138B=P2^3; sbit

LS138C=P2^4;

//此表為 LED 的字模, 共陰數碼管 0-9 -

unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; unsigned long LedOut[5],LedNumVal; void system_Ini() {

TMOD|= 0x11;

TH1 = 0xD8;

//10

TL1 = 0xF0;

IE = 0x8A;

TR1 = 1 main() { unsigned char i;

system_Ini();

while(1)

{

GetTemp();

/********以下將讀18b20的數據送到LED數碼管顯示*************/

LedNumVal=Temperature;

//把實際溫度送到LedNumVal變量中

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];

LedOut[1]=Disp_Tab[LedNumVal%1000/100];

LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位

LedOut[3]=Disp_Tab[LedNumVal%10];

//個位

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

{

P0 = LedOut[i] ;

switch(i)

{

//138譯碼

case 0:LS138A=0; LS138B=0; LS138C=0; break;

case 1:LS138A=1; LS138B=0; LS138C=0; break;

case 2:LS138A=0; LS138B=1; LS138C=0; break;

case 3:LS138A=1; LS138B=1; LS138C=0; break;

}

delay(100);

}

P0 = 0;

} }

//延時程序

void delay(unsigned int i) {

char j;

for(i; i > 0; i--)

for(j = 200; j > 0; j--); } 4.1 討論DS18B20的自動報警功能實現。

DS18B20只是一個測溫元件,所謂的報警功能要通過程序由單片機來實現。

DS18B20溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節的存儲器,頭2個字節包含測得的溫度信息,第3和第4字節TH(報警溫度上限)和TL(報警溫度下限)的拷貝。第5個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。第

6、

7、8字節保留未用。要實現報警,完成溫度轉換后,就把測得的溫度值與RAM中的TH、TL字節內容作比較(當然要自己編程序)。若T>TH或T

第三篇:數字溫度傳感器DS18B20控制接口設計

摘 要: DS18B20是一款經典的單總線數字溫度傳感器芯片,較傳統的溫度傳感器具有結構簡單、體積小、功耗小、抗干擾能力強、使用簡單、可組網實現多點溫度測量等優點。本設計簡要介紹了數字溫度傳感器DS18B20 的特性及工作原理,著重論述了用FPGA實現對此傳感器的控制,并將測到的溫度在LED數碼管上顯示出來。

關鍵詞:DS18B20;溫度傳感器;FPGA;LED數碼管

Abstract: DS18B20 is a classic single-bus digital temperature sensor chip, the more traditional temperature sensor has a simple structure, small size, low power consumption, and anti-interference ability, easy to use networking to achieve multi-point temperature measurement. The design brief describes the features and working principle of the digital temperature sensor DS18B20, focuses on the control of this sensor using FPGA, and the measured temperature is displayed on the LED digital tube. Keywords: DS18B20; temperature sensor; FPGA; LED digital tube

1 引言

傳統的溫度傳感器系統大都采用放大、調理、A/ D 轉換, 轉換后的數字信號送入計算機處理, 處理電路復雜、可靠性相對較差, 占用計算機的資源較多。DS18B20 是一線制數字溫度傳感器, 它可將溫度信號直接轉換成串行數字信號送給微處理器, 電路簡單, 成本低, 每一只DS18B20 內部的ROM 存儲器都有唯一的64位系列號, 在1 根地址/ 信號線上可以掛接多個DS18B20, 易于擴展, 便于 組網和多點測量。

隨著科技的發展 ,溫度的實時顯示系統應用越來越廣泛 ,比如空調遙控器上當前室溫的顯示、熱水器溫度的顯示等等。實現溫度的實時采集與顯示系統有很多種解決方案 ,本文使用全數字溫度傳感器DS18B20來實現溫度的實時采集FPGA作為控制中心與數據橋梁;LED數碼管作為溫度實時顯示器件。其中DS18B20作為FPGA的外部信號源,把所采集到的溫度轉換為數字信號,通過接口 (113腳)傳給FPGA,FPGA啟動ROM內的控制程序驅動LED數碼管,通過IO口和數據線把數據傳送給LED數碼管,將采集到的溫度實時顯示出來。該設計結構簡單、測溫準確,成本低,工作穩定可靠,具有一定的實際應用價值。

2 DS18B20數字溫度傳感器介紹

DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。DS18B20的性能特點如下:

2.1 DS18B20的性能特點

1獨特的單線接口僅需要一個端口引腳進行通信; ○2多個DS18B20可以并聯在惟一的三線上,實現多點組網功能; ○3無須外部器件; ○4可通過數據線供電,電壓范圍為3.0~5.5V; ○5零待機功耗; ○6溫度以9或12位數字; ○7用戶可定義報警設置; ○8報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件; ○9負電壓特性,電源極性接反時,溫度計不會因發熱而燒毀,但不能正常工作;○ 2.2 DS18B20的內部結構圖

DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內部結構框圖如圖2-1所示。

圖2-1 DS18B20內部結構框圖 圖2-2 DS18B20字節定義

64位ROM的結構開始8位是產品類型的編號,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發器TH和TL,可通過軟件寫入戶報警上下限。DS18B20溫度傳感器的內部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節的存儲器,結構如圖2-2所示。頭2個字節包含測得的溫度信息,第3和第4字節TH和TL的拷貝,是易失的,每次上電復位時被刷新。第5個字節,為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數值。該字節各位的定義如圖3-4所示。低5位一直為1,TM是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數,來設置分率。 2.3 DS18B20測溫原理

DS18B20內部的低溫度系數振蕩器是一個振蕩頻率隨溫度變化很小的振蕩器,為計數器1提供一個頻率穩定的計數脈沖。

高溫度系數振蕩器是一個振蕩頻率對溫度很敏感的振蕩器,為計數器2提供一個頻率隨溫度變化的計數脈沖。初始時,溫度寄存器被預置成-55℃,每當計數器1從預置數開始減計數到0時,溫度寄存器中寄存的溫度值就增加1℃,這個過程重復進行,直到計數器2計數到0時便停止。 初始時,計數器1預置的是與-55℃相對應的一個預置值。以后計數器1每一個循環的預置數都由斜率累加器提供。為了補償振蕩器溫度特性的非線性性,斜率累加器提供的預置數也隨溫度相應變化。計數器1的預置數也就是在給定溫度處使溫度寄存器寄存值增加1℃計數器所需要的計數個數。

DS18B20內部的比較器以四舍五入的量化方式確定溫度寄存器的最低有效位。在計數器2停止計數后,比較器將計數器1中的計數剩余值轉換為溫度值后與0.25℃進行比較,若低于0.25℃,溫度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃時,溫度寄存器的最低位就進位然后置0。這樣,經過比較后所得的溫度寄存器的值就是最終讀取的溫度值了,其最后位代表0.5℃,四舍五入最大量化誤差為±1/2LSB,即0.25℃。

溫度寄存器中的溫度值以9位數據格式表示,最高位為符號位,其余8位以二進制補碼形式表示溫度值。測溫結束時,這9位數據轉存到暫存存儲器的前兩個字節中,符號位占用第一字節,8位溫度數據占據第二字節。

DS18B20測量溫度時使用特有的溫度測量技術。DS18B20內部的低溫度系數振蕩器能產生穩定的頻率信號;同樣的,高溫度系數振蕩器則將被測溫度轉換成頻率信號。當計數門打開時,DS18B20進行計數,計數門開通時間由高溫度系數振蕩器決定。芯片內部還有斜率累加器,可對頻率的非線性度加以補償。測量結果存入溫度寄存器中。一般情況下的溫度值應該為9位,但因符號位擴展成高8位,所以最后以16位補碼形式讀出。 2.4 DS18B20供電方式

DS18B20有兩種供電方式,一種是寄生電源強上拉供電方式,一種是外部供電方式,如下圖:

圖2-3 寄生電源強上拉供電方式電路圖

在寄生電源供電方式下,DS18B20 從單線信號線上汲取能量:在信號線 DQ 處于高電平期間把能量儲存在內部電容里,在信號線處于低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)充電。為了使 DS18B20 在動態轉換周期中獲得足夠的電流供應,當進行溫度轉換或拷貝到 E2 存儲器操作時,用 MOSFET 把 I/O 線直接拉到 VCC 就可提供足夠的電流,在發出任何涉及到拷貝到 E2 存儲器或啟動溫度轉換的指令后,必須在最多 10μS 內把 I/O 線轉換到強上拉狀態。在強上拉方式下可以解決電流供應不走的問題,因此也適合于多點測溫應用,缺點就是要多占用一根 I/O 口線進行強上拉切換。

圖2-4 外部電源供電方式電路圖

在外部電源供電方式下,DS18B20 工作電源由 VDD 引腳接入,此時 I/O 線不需要強上拉,不存在電源電流不足的問題,可以保證轉換精度,同時在總線上理論可以掛接任意多個 DS18B20 傳感器,組成多點測溫系統。在外部供電的方式下,DS18B20的GND引腳不能懸空,否則不能轉換溫度,讀取的溫度總是 85℃。 3 設計需求

1溫度測量范圍:-55℃~+125℃ ○2可編程為9位~12位A/D轉換精度 ○3測溫分辨率可達0.0625℃ ○4 LED數碼管直讀顯示 ○4 設計方案

4.1 硬件設計

將[DF2C8]FPGA 核心板和[EB-F2]基礎實驗板連接在一起,同時使能DS18B20 模塊和數碼管模塊:數碼管使能:用“短路帽”將實驗板上的JP4和JP5全部短接。DS18B20 溫度傳感器使能跳線JP10 全部短接,元件安裝示意如下圖4-1和4-2(注意方向,半圓形的一邊朝板子內部,平面朝外,和板上的圖示一致)。

圖 4-1:數碼管使能圖示 圖 4-2:溫度傳感器安裝和使能圖示

4.1.1 溫度傳感器 DS18B20 電路

基礎實驗板上提供了一個由DS18B20構成的溫度測量模塊,其原理如圖4-3所示。該電路選擇外部供電方式。外部電源供電方式工作穩定可靠, 抗干擾能力強。

圖4-3 單線制溫度傳感器 DS18B20 電路圖

DS18B20與[DF2C8]FPGA核心板的連接關系如表4-1所示

表 4-1:DS18B20與[DF2C8]FPGA核心板連接時的管腳對應關系

4.1.2 數碼管顯示電路

基礎實驗板上具有2個共陽極的位七段數碼管,構成8位構,其電路如圖4-4 所示。

圖 4-4:七段數碼管顯示電路圖

數碼管的控制引腳由兩個跳線JP4和JP5使能(如圖4-1所示) R10~R17是段碼上的限流電阻,位碼由于電流較大,采用了PNP三極管驅動。當位碼驅動信號為低電平(0)時,對應的數碼管才能操作;當段碼驅動信號為低電平(0)時,對應的段碼點亮。數碼管不核心板連接時的管腳對應如表4-2所示:

表 4-2:數碼管與[DF2C8]FPGA核心板連接時的管腳對應關系

4.2 HDL編碼 4.2.1 時序

(1)復位: 使用DS18B20 時, 首先需將其復位, 然后才能執行其它命令。復位時, 主機將數據線拉為低電平并保持480Ls~ 960Ls, 然后釋放數據線, 再由上拉電阻將數據線拉高15~ 60Ls, 等待DS18B20 發出存在脈沖, 存在脈沖有效時間為60~ 240Ls, 這樣, 就完成了復位操作。其復位時序如圖4-5所示。

圖4-5:初始化時序

圖4-6:寫時序

(2)寫時隙: 在主機對DS18B20 寫數據時, 先將數據線置為高電平, 再變為低電平, 該低電平應大于1us。在數據線變為低電平后15us 內, 根據寫“1”或寫“0” 使數據線變高或繼續為低。DS18B20 將在數據線變成低電平后15us~ 60us 內對數據線進行采樣。要求寫入DS18B20 的數據持續時間應大于60us 而小于120us, 兩次寫數據之間的時間間隔應大于1us。寫時隙的時序如圖4-6 所示

(3)讀時隙 :當主機從DS18B20 讀數據時, 主機先將數據線置為高電平, 再變為低電平, 該低電平應大于1us, 然后釋放數據線, 使其變為高電平。DS18B20 在數據線從高電平變為低電平的15us 內將數據送到數據線上。主機可在15us 后讀取數據線。讀時隙的時序如圖4-7 所示。

圖4-7 :讀時隙

4.2.2 DS18B20 的操作命令

主機可通過一線端口對DS18B20 進行操作, 其步驟為: 復位( 初始化命令) -> ROM 功能命令-> 存儲器功能命令-> 執行/ 數據, DS18B20 的ROM 命令有5個( 見表1) , 存儲器命令有6個( 見表2) 。命令的執行都是由復位、多個讀時隙和寫時隙基本時序單元組成。因此, 只要將復位、讀時隙、寫時隙的時序了解清楚, 使用DS18B20 就比較容易了, 時序如上文所述。

表4-3: 存儲器命令操作表 表4-4:ROM命令功能操作表

4.2.3 Verilog HDL編碼

詳細Verilog HDL代碼參見工程文件:DF2C8_13_DS18B20 工程文件中含有三個v 文件,LED_CTL.v 是數碼管顯示功能模塊,DS18B20_CTL.v 是溫度傳感器的控制模塊,TEMP.v 為頂層模塊,實例化了前面兩個模塊,并將采集的溫度值送至數碼管中進行顯示。其中最主要的溫度傳感器的控制模塊,DS18B20_CTL.v。該程序對DS18B20 進行控制, 不僅可以簡化程序, 還可以縮短1 次溫度轉換所需的時間. 這樣的話, 1 次溫度轉換和數字溫度值輸出循環所涉及到的控制命令、數據交換和所需時隙如圖4-8所示。

.

圖4-8:1次溫度轉換的控制命令和時隙

5 仿真測試結果

5.1 仿真波形

溫度測量模塊仿真結果如圖6-1所示:

圖5-1:仿真波形

5.2 結果顯示

下載配置文件后,可在數碼管上觀察到帶一位小數的溫度數值。如果用手捏住傳感器,會發現顯示的溫度在升高。如下圖:

圖5-2 測溫效果圖示

參考文獻:

[1] 沙占友 集成傳感器的應用[M]. 中國電力出版社. [2] 羅鈞,童景琳. 智能傳感器數據采集與信號處理[M]. 化學工業出版社

[3] 周月霞,孫傳友. DS18B20硬件連接及軟件編程[J]. 傳感器世界,2001,12. [4] 王曉娟,張海燕,梁延興.基于DS18B20的溫度實時采集與顯示系統的設計與實現[J]. , 2007:38-41. [5] 黨 峰, 王敬農, 高國旺. 基于DS18B20 的數字式溫度計的實現[ J] . 山西電子技術, 2007( 3) [6] 金偉正. 單線數字溫度傳感器的原理與應用[ J] . 儀表技術與傳感器, 2000( 7) : 42- 43. [7]DS18B20 Datasheet [ EB/ OL] . Dalla s: Dallas Semico nductor Cor po r atio n, 2005.

第四篇:基于AVR單片機的嵌入式系統的應用分析

關鍵字:AVR單片機 嵌入式系統

引言

隨著技術的發展,嵌入式系統的設計及應用對人們的生活產生了很大的影響,并將逐漸改變人們未來的生活方式,在特定的操作系統上開發應用程序,可以使開發人員忽略掉很多底層硬件細節,使得應用程序調試更方便、易于維護、開發周期縮短并且降低開發成本,因而嵌入式操作系統深得開發人員的青睞。

AVR微處理器是Atmel公司開發的8位嵌入式RISC處理器,它具有高性能、高保密性、低功耗、非易失性等優點,而且程序存儲器和數據存儲器可獨立編址,并具有獨立訪問的哈佛結構。AVR單片機內核有豐富的指令集,通過32個通用寄存器直接與邏輯運算單元相連接,允許在一個周期內一條單一指令訪問兩個獨立的寄存器,這樣的結構使代碼的執行效率比傳統的復雜指令集微處理器快了將近10倍。

AVRX是由1barello編寫的源碼公開的嵌入式操作系統,它專門針對AVR系列單片機的RTOS,具有免費和可以修改的特點,它的缺點是由于做為一種專用的操作系統很難移植到其他平臺上。

1 AVRX 系統的特點

AVRX做為AVR專用RTOS有如下的特點:

◆ 完全支持占先式、優先級驅動的任務調度算法;

◆ 16個優先級,相同的優先級的任務采用Round robin調度算法輪流執行; ◆ 信號量可以用于信號傳遞、同步和互斥信號量,支持阻塞和非阻塞語法;

◆ 任務之間可以用消息隊列相互傳遞信息,接收和確認消息可以用阻塞和非阻塞調用; ◆ 在中斷子程序中,大部分非阻塞的中斷服務程序可以使用;

◆ 支持單個定時器的時間隊列管理,任何進程都可以設置一個定時器,并且任何一個任務都可以等待定時器時間到;

◆ 支持單步調式運行著的進程;

◆ 程序空間小,包含所有功能的版本占用1000字節;

◆ 與定時器/計算器有關的一些事務可以用AVRX寫成任務級代碼。 1.1 任務

AVRX2.6為了支持C語言,保存了所有的32個寄存器,最小的上下文是32個寄存器、SREG和PC,總共35個字節。AvrXInitTask()函數給所有的寄存器初始化為0x00;只有進程上下文保存在任務堆棧中,所有其他的使用(包括內核和中斷)保存在內核堆棧。這樣降低了第一個中斷的上下文切換和進入內核API的SRAM消耗。隨后的中斷(如果允許中斷嵌套)嵌入內核堆棧,API不進行上下文切換。 1.2 信號量

信號量是SRAM指針,它們有三中狀態:PEND、WAITING和DONE。當一個進程被一個信號量阻塞時,它處于WAITING狀態,多個任務可以排隊等候一個信號量。在后一種情況下,信號量可以看作互斥信號量。提供的API函數如下:AvrXSetSemaphore、AvrXIntSetSemaphore、AvrXWaitSemaphore、AvrXtestSemaphore、AvrXIntTestSemaphore和AvrXResetSemaphore。 1.3 定時器

定時器控制塊(TCB)長度為4(或6)個字節。它們管理一個16位計數值。定時器隊列管理器管理一個分類的定時器隊列,每個都調整為所有計數器的和到其延時需要的值。提供的API函數如下:AvrXStartTimer、AvrXTimerHandler、AvrXCancelTimer、AvrXWaitTimer、AvrXTestTimer和AvrXDelay。 1.4 消息隊列

消息隊列用消息控制塊(MCB)做為隊列首地址。任何進程、中斷處理函數和多個進程都可以等待消息。MCB的長度是2或4個字節。消息可以認為是靈活性更大的信號量。提供的API函數如下:AvrXSendMessage、AvrXIntSendMessage、AvrXRecvMessage、AvrXWaitMessage、AvrXAckMessage、AvrXTestMessage和AvrXWaitMessageAck。 1.5 單步運行支持

通過重新匯編內核AVRX,可以允許和禁止單步運行的支持。單步運行可以通過編譯內核庫時定義下面的變量:#define SIGNALSTEPSUPPORT。

在能夠單步運行以前,進程必須先暫停。有兩種方法實現:一是僅僅初始化進程但不使能;二是用目標進程的ID調用AvrXSuspend,一旦目標進程掛起,調試SPI就能使用了,提供的API函數有:AvrXStepNext和AvrXSingleStepNext。 1.6 系統對象

AVRX是圍繞系統對象的概念而構建的,系統對象包括一個鏈接和其后面的0個或者若干個字節的數據信號量。進程對象可以根據運行隊列和信號量排隊。計數器控制塊只能根據計數器隊列排隊。消息控制塊只能在消息隊列排隊。進程根據嵌入對象的信號量等待這些對象。

進程堆棧中可用的SRAM是限制系統規模的主要因素,每個進程都需要至少10~35字節的空間來存儲進程上下文。提供的API函數如下:AvrXSetObjectSamaphore、AvrXIntObjectSamaphore、AvrXResetObjectSamaphore、AvrXWaitObjectSamaphore、AvrXTestObjectSamaphore和AvrXIntTestObjectSamaphore。 1.7 系統堆棧

AVRX需要足夠大的堆棧來處理所有可能的中斷嵌套,每次進入內核將會把10~35字節壓進堆棧(標準上下文和返回地址),中斷處理可能壓進去更多。AVRX的API會臨時壓入2個以上的字節。GCC或者匯編代碼定義于SRAM的頂部,保證AVRX的堆棧在有效SRAM空間之內是設計者的工作。 2 AVRX系統的應用

2.1 AVRX在不同型號AVR單片機上的移植

下面以ATmega16為例,介紹移植工作。 (1)編譯器的選擇

由于AVRX的編者是在GNU推出的AVR-GCC編譯器下編寫的,所以選用AVR-GCC編譯器可以大大提高AVRX在不同AVR單片機上的移植特性。 (2)重新編譯AVRX內核

為了將應用程序成功編譯,需要重新編譯AVRX內核,重新編譯包括下述步驟。

① 新修改AVRX源碼的Makefile文件,需要修改的幾處如下 ABSPATH=„/avrx /*更改AVRX原路徑到實際路徑下*/ 修改

MCU=8535

AAVRMCU=1

GCCMCU=at90s$(MCU)

AVRXMCU=_AT90S$(MCU)_ 為

ICCMCU=m16

AAVRMCU=3

GCCMCU=atmega16

AVRXMCU=_AT90Mega16_

②重新修改AVRX源碼的serialio.s文件,即根據不同的單片機修改串口部分的寄存器定義。需要增添如下代碼:

#if defined(UBRRL)

#define UBRR UBRRL

#endif

#if defined(UBRRH)

sts UBRRH,p1h

#endif

③重新編譯內核。具體做法是復制一個“令名提示符”到AVRX目錄下,運行“命令提示符”,鍵入“makegcc”命令后運行就完成了AVRX內核的重新編譯,會生成很多的.o文件和avrx.a文件。這些文件在以后的應用程序中會使用。

至此就完成了AVRX在ATmega16單片機上的內核移植,接著就可以編寫應用程序了。 2.2 在AVRX上編寫應用程序

這時候要用一個新的makefile文件,同時自己的程序可以不和AVRX的內核在一個目錄,但是要指出依賴文件的明確路徑。makefile的框架可以采用Winavr的sample文件夾下的makefile文件框架,這里的難點其實還是makefile文件的語法問題。下面介紹應用程序的makefile文件在實例中需要修改或增加的代碼: MCU=atmega16 /*微處理器的名字*/ TARGET=test /*應用程序文件名*/ GCCLIB=$(AVRX)/avrx/avrx.a GCCINC=-L-I$(AVRX)/avrx-I$(AVR)/avr/inc /*加上相關的庫*/ SCANF_LIB_MIN=-W1,-u,vfscanf-1scanf_min SCANF_LIB_FLOAT=-W1,-u,vfscanf-1scanf_flt SCANF_LIB /*設置sacnf函數庫的類型,在不使用時可以注釋掉,這樣可以減小編譯后的文件大小*/ LDFLAGS+=$(PRINTF_LIB)$(SCANF_LIB)$(MATH_LIB) /*新增的連接器參數設定*/ 3 系統測試

3.1 系統實時性測試

在實時系統中,實時系統的實時性表現在系統對外部事件的響應能力上,系統通過中斷來響應外部事件的發生,并且在用戶中斷程序中做的事要盡量少,把大部分工作留給任務去做,只是通過信號量或者信息機制來通知任務運行。Mega16的定時器2設為比較匹配輸出模式,在匹配時間到了之后產生一定周期脈沖輸出,并產生中斷。設置定時器1為計數模式來計數產生的脈沖輸出。通過定時器2的比較匹配中斷服務子程序來發信號量通知任務運行,并在中斷子程序中不開中斷,而在任務得到信號后開中斷,以實現中斷處理與任務運行的同步,任務中對一個全局變量計數,以記錄任務執行的次數。運行一段時間后,在設置的匹配時間里,任務的運行次數和定時器1的計數一樣,則系統在這段時間里是能完全響應外部事件的,當定時器2的比較匹配時間設為大于23μs時,2個計數是相等的;當小于23μs時,定時器1計數值大于任務計數值,說明任務沒有完全得到響應。這說明中斷的進入和返回即系統對外部時間的響應和處理時間為23μs,遠遠大于其他操作系統在AVR單片機上移植后的響應時間。 3.2 使用例程測試

這里只對源文件中的幾個例程先進行簡單的編譯,然后去掉不必要的代碼,加入自己想測試的一些代碼,進行了定時器控制模塊,信號量和消息隊列以其簡單組合的測試,均在ATmega16上達到了預期的效果。 4 心得體會

①AVRX的源碼都是用匯編語言編寫的,相對來講代碼效率很高,但是由于沒有詳細的API介紹文檔,所以最好的入門方法就是先讀懂RTOS的源碼和例程,然后進行修改,再加上自己的代碼逐漸熟練應用。

②AVRX需要分配的堆棧為35個字節加上任務代碼需要的額外堆棧,具體的大小取決于每個進程用的本地變量個數。比較好的確定分配給任務堆棧大小的方法是:分配很大的堆棧(如70字節)運行一段應用程序后看堆棧到多深(因為GCC啟動時把所有內存都清0了,這樣很容易看到)。不過,為了安全起見,用編譯器或仿真器在估計堆棧的頂端寫入幾個字節的0xFFFFF去驗證到底達到了多少字節,然后分配給比測試結果多兩個以上的字節給這個任務。

③啟動的最后一個指令必須跳轉到Epilog()。 5 結論

AVRX是一個不錯的RTOS,最顯著的特點就是內核小,速度快,編譯后大概只需500~700字節,且基本的調度功能一個也不少。由于其代碼公開,結合不同型號AVR單片機的特性,可以在此基礎上進行系統的裁減和擴展,使之能達到更好的效果,本文為AVR嵌入式系統的應用提供了借鑒。

第五篇:AVR單片機C語言高級程序設計

前言 .................................................................................................................................................. 2 第1章 概述 ................................................................................................................................... 3

1.1提高編制單片機應用程序效率最好的辦法是采用C語言編程 ..................................... 4 1.2 C語言具有突出的優點 ...................................................................................................... 5 1.3 AVR單片機的C編譯器簡介 ............................................................................................ 6 第二章AVR單片機簡介及主要特性 ............................................................................................... 6

2.1 AVR單片機簡介及主要特性 .......................................................................................... 6 2.2 學習開發AVR單片機用到的實驗工具及器材 ............................................................. 8 第3章 AVR單片機開發軟件的安裝及初步使用 ...................................................................... 14

3.1 ICCAVR6.31A C語言編譯器安裝 ............................................................................... 14 3.2 AVR Studio集成開發環境安裝 ..................................................................................... 18 3.3 PonyProg2000下載軟件安裝 ....................................................................................... 18 3.4 我們的第一個AVR入門程序 ....................................................................................... 19 第4章 AVR DEMO單片機綜合試驗板原理介紹及使用 .............................................................. 36

4.1 AVR DEMO單片機綜合試驗板 ........................................................................................ 36 4.2ATMEAG16L單片機的主要特點與內部組成 ................................................................... 38 4.3使用JTAGICE仿真器(JTAG ICE)調試AVR DEMO單片機綜合試驗板 ...................... 39

前言

世界進入21世紀后,由于電子技術及計算機技術的迅猛發展,新型電子產品的更新換代速度越來越快。以單片機為核心構成的智能化產品具有體積小、功能強、應用面廣等優點,目前正以前所未見的速度取代著傳統電子線路構成的經典系統,蠶食著傳統數字電路與模擬電路固有的領地。

從前,匯編語言是單片機工程師進行軟件開發的唯一選擇,但匯編語言程序的可讀性和可移植性較差,采用匯編語言編寫單片機應用系統程序的周期長,而且調試和排錯也比較困難。許多讀者都發現,采用匯編語言設計一個大型復雜程序時,可讀性較困難,往往隔一段時間再看,又要花腦力從頭再來。并且不同類型的單片機,必須采用不同的匯編語言來編寫,這是因為匯編語言完全依賴于單片機硬件。這樣,對開發者而言,如果由于項目的變化而經常變更單片機類型,其開發的難度是可想而知的。因為對于學習一種單片機匯編語言開發,總少不了學習、探索、實踐、進步這樣一個過程,這個過程少則半年,多則1~2年,等你學完后再搞出產品,也許商機已消失。隨著社會競爭的日益激烈,開發效率已成為商戰致勝的最重要法寶之一。

為了提高編制單片機系統和應用程序的效率,改善程序的可讀性和可移植性,最好的辦法是采用高級語言編程。目前,C語言逐漸成為國內外開發單片機的主流語言。

C語言是一種通用的編譯型結構化計算機程序設計語言,在國際上十分流行,它兼顧了多種高級語言的特點,并具備匯編語言的功能。它支持當前程序設計中廣泛采用的由頂向下的結構化程序設計技術。一般的高級語言難以實現匯編語言對于計算機硬件直接進行操作(如對內存地址的操作、移位操作等)的功能,而C語言既具有一般高級語言的特點,又能直接對計算機的硬件進行操作。C語言有功能豐富的庫函數、運算速度快、編譯效率高,并且采用C語言編寫的程序能夠很容易地在不同類型的計算機之間進行移植。因此,C語言的應用范圍越來越廣泛,用C語言進行單片機程序設計是單片機開發與應用的必然趨勢。對匯編語言掌握到只要可以讀懂程序,在時間要求比較嚴格的模塊中進行程序的優化即可。采用C語言不必對單片機和硬件接口的結構有很深入的了解,編譯器可以自動完成變量的存貯單元的分配,編程者就可以專注于應用軟件部分的設計,大大加快了軟件的開發速度。統計資料表明,不同單片機的C語言編譯程序80%的代碼是公共的,采用C語言可以很容易地進行單片機的程序移植工作,有利于產品中的單片機重新選型。C語言的編譯效率也很高,對于同一個問題,用C語言編寫的程序生成代碼的效率僅比用匯編語言編寫的程序低10%~20%,由于現在片上ROM(或FLASH ROM)空間做到32/64K字節(或更大)的單片機比比皆是,因此代碼效率所差的10%~20%已經不是重要問題。至于對開發速度、軟件質量、結構嚴謹、程序堅固等方面進行綜合評述的話,則C語言的完美絕非是匯編語言編程所能比擬的。 本書以初學者為對象,從零開始,循序漸進地講解當前最熱門的AVR單片機的C語言高級程序設計,在介紹AVR單片機的各單元部分基本特性的同時,使用入門難度淺、程序長度短且又能立竿見影的初級實例,詳細介紹了如何使用ATmega16L的片上資源,幫助初學者快速掌握AVR單片機的高效設計。最后3章詳細介紹了3個以AVR單片機為核心的實際產品的軟硬件設計。

隨書所附的光盤中提供了本書的所有軟件設計程序文件,讀者朋友可參考。 本書的編寫工作得到了中國電力出版社大力支持,出版社的資深編輯劉熾老師做了大量耐心細致的工作,使得本書得以順利完成,在此表示衷心感謝。 由于作者水平有限,必定還存在不少缺點或漏洞,誠摯歡迎廣大讀者提出意見并不吝賜教。

第1章 概述

自從筆者出版了《手把手教你學單片機》(北京航空航天大學出版社出版)一書后,由于教學方式新穎獨特,入門難度明顯降低,結合邊學邊練的實訓模式,很快有一大批讀者入了單片機這扇門。據不完全統計,全國各地(包括港澳臺地區)跟著《手把手教你學單片機》學習的讀者超過30萬名,其中不少讀者已取得了豐碩的成果。有的讀者給筆者來電說研制的“包裝線控制器”已穩定運行數月,還有的讀者利用單片機做“霓虹燈程序控制器”并投放市場,„„等等??傊?,《手把手教你學單片機》使不少讀者從傳統的電子技術領域步入了微型計算機領域,進入了一個暫新的天地。

《手把手教你學單片機》一書是以匯編語言為主進行講解實驗的。所謂匯編語言就是一種用文字助記符來表示機器指令的符號語言,是最接近機器碼的一種語言。匯編語言的主要優點是占用資源少、程序執行效率高。作為初學者必須基本掌握匯編語言的設計方法,因為匯編語言直接操作計算機的硬件,學習匯編語言對于了解單片機的硬件構造是有幫助的。

從前,匯編語言是單片機工程師進行軟件開發的唯一選擇,但匯編語言程序的可讀性和可移植性較差,采用匯編語言編寫單片機應用系統程序的周期長,而且調試和排錯也比較困難。許多讀者都發現,采用匯編語言設計一個大型復雜程序時,可讀性較困難,往往隔一段時間再看,又要花腦力從頭再來。更為重要的是,隨著社會競爭的日益激烈,開發效率已成為商戰致勝的最重要法寶之一。 大家知道,不同類型內核的單片機,其指令系統是不一樣的,因此用來編寫程序的匯編語言也是不一樣的,這樣就產生了很嚴重的問題。例如:我們原來是學51系列單片機的,也做過許多產品,創造出一定的經濟效益。但是,忽然有一天,有客戶要求用AVR單片機開發一款產品,其利益回報也相當不錯,但是你怎么辦呢?重新開始學AVR的匯編語言?!等到學好學熟起碼要半年(有些人等到會熟練開發產品可能要一年以上的時間),客戶會等不及,等半年后也許商機已消失。這只是其中的一個難題,因為現在新型的單片機層出不窮,如果你的一些客戶經常拿不同的單片機要你開發設計,那你怎么辦?要較好地解決這些問題,你只能采用高級語言編程了。目前在單片機中,C語言是首選的高級開發語言。

1.1提高編制單片機應用程序效率最好的辦法是采用C語言編程

為了提高編制計算機系統和應用程序的效率,改善程序的可讀性和可移植性,最好的辦法是采用高級語言編程。目前,C語言逐漸成為國內外開發單片機的主流語言。

C語言是一種通用的編譯型結構化計算機程序設計語言,在國際上十分流行,它兼顧了多種高級語言的特點,并具備匯編語言的功能。它支持當前程序設計中廣泛采用的由頂向下的結構化程序設計技術。一般的高級語言難以實現匯編語言對于計算機硬件直接進行操作(如對內存地址的操作、移位操作等)的功能,而C語言既具有一般高級語言的特點,又能直接對計算機的硬件進行操作。C語言有功能豐富的庫函數、運算速度快、編譯效率高,并且采用C語言編寫的程序能夠很容易地在不同類型的計算機之間進行移植。因此,C語言的應用范圍越來越廣泛。

用C語言來編寫目標系統軟件,會大大縮短開發周期,且明顯地增加軟件的可讀性,便于改進和擴充,從而研制出規模更大、性能更完備的系統。 因此,用C語言進行單片機程序設計是單片機開發與應用的必然趨勢。對匯編語言掌握到只要可以讀懂程序,在時間要求比較嚴格的模塊中進行程序的優化即可。采用C語言進行設計也不必對單片機和硬件接口的結構有很深入的了解,編譯器可以自動完成變量存貯單元的分配,編程者就可以專注于應用軟件部分的設計,大大加快了軟件的開發速度。采用C語言可以很容易地進行單片機的程序移植工作,有利于產品中的單片機重新選型。

C語言的模塊化程序結構特點,可以使程序模塊大家共享,不斷豐富。C語言可讀性的特點,更容易使大家可以借鑒前人的開發經驗,提高自己的軟件設計水平。采用C語言,可針對單片機常用的接口芯片編制通用的驅動函數,可針對常用的功能模塊、算法等編制相應的函數,這些函數經過歸納整理可形成專家庫函數,供廣大的工程技術人員和單片機愛好者使用完善,這樣可大大提高國內單片機軟件設計水平。

過去長時間困擾人們的“高級語言產生代碼太長,運行速度太慢不適合單片機使用”的致命缺點已被大幅度地克服。目前,AVR系列單片機的C語言編譯代碼長度,已超過中等程序員的水平。而且,AVR系列單片機片上SRAM、FLASH空間都很大、運行速度很快,代碼效率所差的10%~20%已經不是什么重要問題。關于速度優化的問題,只要有好的仿真器的幫助,用人工優化關鍵代碼就是很簡單的事了。至于談到開發速度、軟件質量、結構嚴謹、程序堅固等方面的話,則C語言的完美絕非是匯編語言編程所能比擬的。

1.2 C語言具有突出的優點

1. 語言簡潔,使用方便靈活

C語言是現有程序設計語言中規模最小的語言之一,而小的語言體系往往能設計出較好的程序。C語言的關鍵字很少,ANSI C標準一共只有32個關鍵字,9種控制語句,壓縮了一切不必要的成份。C語言的書寫形式比較自由,表達方法簡潔,使用一些簡單的方法就可以構造出相當復雜的數據類型和程序結構。

2. 可移植性好

用過匯編語言的讀者都知道,即使是功能完全相同的一種程序,對于不同的單片機,必須采用不同的匯編語言來編寫。這是因為匯編語言完全依賴于單片機硬件。而現代社會中新器件的更新換代速度非???,也許我們每年都要跟新的單片機打交道。如果每接觸一種新的單片機就要學習一次新的匯編語言,那么也許我們將一事無成,因為每學一種新的匯編語言,少則幾月,多則上年,那么我們還有多少時間真正用于產品開發呢?

C語言是通過編譯來得到可執行代碼的,統計資料表明,不同機器上的C語言編譯程序80%的代碼是公共的,C語言的編譯程序便于移植,從而使在一種單片機上使用的C語言程序,可以不加修改或稍加修改即可方便地移植到另一種結構類型的單片機上去。這大大增強了我們使用各種單片機進行產品開發的能力。

3. 表達能力強

C語言具有豐富的數據結構類型,可以根據需要采用整型、實型、字符型、數組類型、指針類型、結構類型、聯合類型、枚舉類型等多種數據類型來實現各種復雜數據結構的運算。C語言還具有多種運算符,靈活使用各種運算符可以實現其他高級語言難以實現的運算。

4. 表達方式靈活

利用C語言提供的多種運算符,可以組成各種表達式,還可采用多種方法來獲得表達式的值,從而使用戶在程序設計中具有更大的靈活性。C語言的語法規則不太嚴格,程序設計的自由度比較大,程序的書寫格式自由靈活。程序主要用小寫字母來編寫,而小寫字母是比較容易閱讀的,這些充分體現了C語言靈活、方便和實用的特點。

5. 可進行結構化程序設計

C語言是以函數作為程序設計的基本單位的,C 1.3 AVR單片機的C編譯器簡介

目前世界上幾乎所有系列的單片機都支持C語言開發,開發AVR單片機的C編譯器主要有:IAR Embedded Workbench(簡稱IAR)、Codevision AVR(簡稱CAVR)、Imagecraft C Compiler(簡稱ICC)、GNU C For AVR(簡稱GCCAVR)等。 IAR是瑞典IAR SYSTEMS公司開發的AVR單片機集成開發環境(IDE),包含嵌入式編譯器、匯編器、連接定位器、庫管理器、項目管理及調試器等。其特點是編譯效率高、功能齊全,但價格昂貴。

CAVR 也是一個開發AVR單片機的集成開發環境,其界面友好,很容易上手。它帶有一個叫Codewizard的代碼生成器,可生成外圍器件的相應初始化代碼,另外,它還提供了很多常用的器件庫代碼,如:LCD、UART、SPI、實時時鐘、溫度傳感器等。它的價格適中。

ICC是Imagecraft公司開發的使用標準C語言的AVR單片機集成開發環境,它有一個Application Wizard的代碼生成器, 也可生成外圍器件的初始化代碼。其價格適中。

GCCAVR是一個公開源代碼的自由軟件,因此使用上時不必考慮價格因素,其缺點是沒有集成開發環境(IDE),使用時麻煩一些。

本書中,我們使用ICC集成開發環境進行學習開發,ICC集成開發環境軟件能夠產生形式簡潔、效率較高的程序代碼,如果程序較大時在代碼質量上可以與匯編語言程序相媲美。

第二章AVR單片機簡介及主要特性

2.1 AVR單片機簡介及主要特性

AVR單片機是ATMEL公司研發的增強型內置Flash的RISC(Reduced Instruction Set CPU)精簡指令集高速8位單片機,設計時吸取了80C51及PIC單片機的優點,具備單時鐘周期執行一條指令的能力,運行速度高達1Mips/MHz。AVR單片機可以廣泛應用于計算機外部設備、工業實時控制、儀器儀表、通訊設備、家用電器等各個領域。

AVR單片機硬件結構采取8位機與16位機的折中策略,即采用局部寄存器存堆(32個寄存器文件)和單體高速輸入/輸出的方案(即輸入捕獲寄存器、輸出比較匹配寄存器及相應控制邏輯),提高了指令執行速度,克服了瓶頸現象,增強了功能;同時又減少了對外設管理的開銷,相對簡化了硬件結構,降低了成本。AVR單片機在軟/硬件開銷、速度、性能和成本諸多方面取得了優化平衡,是一種高性價比的單片機。 其主要特性如下:

1.內嵌高質量的Flash程序存儲器,可反復擦寫,支持ISP和IAP,便于產品的調試、開發、生產、更新。內嵌長壽命的EEPROM可長期保存關鍵數據,避免斷電丟失。片內具有大容量的RAM,有效支持使用高級語言開發系統程序。 2.高速度、低功耗,具有SLEEP(省電休眠)功能。每一指令執行速度可達50ns(20MHz),而耗電則在1mA~2.5mA之間(典型功耗,WDT 關閉時為100nA),AVR運用Harvard結構概念(具有預取指令功能),即對程序存儲和數據帶有不同的存儲器和總線當執行某一指令時, 下一指令被預先從程序存儲器中取出, 這使得指令可以在每一個時鐘周期內被執行。AVR單片機可寬電壓運行(2.7~5.5V),抗干擾能力強,可降低一般8位機中的軟件抗干擾設計工作量和硬件的使用量。

3.AVR單片機的I/O線全部帶可設置的上拉電阻,并行I/O 口輸入輸出特性與PIC 的HI/LOW輸出及三態高阻抗HI-Z 輸入類同外,也可設定類同80C51系列內部拉高電阻作輸入端的功能,可單獨設定為輸入/輸出、可設定(初始)高阻輸入。使得I/O口資源靈活、功能強大、可充分利用。AVR的I/O 口是真正的I/O 口, 能正確反映I/O 口的輸入/輸出真實情況。

4.AVR單片機片內具備多種獨立的時鐘分頻器,分別供URAT、IIC、SPI使用。其中與8/16位定時器配合的具有多達10 位的預分頻器,可通過軟件設定分頻系數提供多種檔次的定時時間。AVR單片機中的定時器/計數器(單)可雙向計數形成三角波,再與輸出比較匹配寄存器配合,生成占空比可變、頻率可變、相位可變方波的脈寬調制輸出PWM,令人耳目一新。

5.工業級產品,具有大電流10~20mA 或40mA(單一輸出),可直接驅動SSR 或繼電器。內置的看門狗定時器(WDT)用于防止程序跑飛,提高產品的抗干擾能力。

6.超功能精簡指令。具有32 個通用工作寄存器(相當于80C51單片機中的32個累加器), 克服了單一累加器在數據處理時造成的瓶頸現象。

7.AVR單片機內有模擬比較器,I/O 口可作A/D 轉換用, 可組成廉價的A/D 轉換器。

8.像80C51一樣,AVR有多個固定中斷向量入口地址,因此可快速響應中斷,而不會像PIC一樣所有中斷都在同一向量地址,需要以程序判別后才可響應。 9.AVR單片機有自動上電復位電路、獨立的看門狗電路、低電壓檢測電路BOD,多個復位源(自動上下電復位、外部復位、看門狗復位、BOD復位),可設置的啟動后延時運行程序,增強了系統的可靠性。

10.有串行異步通訊UART,不占用定時器和SPI 傳輸功能,因其速度高,故可以工作在一般標準整數頻率,而波特率可達576K。 11.有多通道10 位A/D轉換器及實時時鐘RTC。

AVR單片機技術表現出單片機集多種器件(包括FLASH程序存儲器、看門狗、EEPROM、同/異步串行口、TWI、SPI、A/D模數轉換器、定時器/計數器等)和多種功能(增強可靠性的復位系統、降低功耗抗干擾的休眠模式、品種多門類全的中斷系統、具輸入捕獲和比較匹配輸出等多樣化功能的定時器/計數器、具替換功能的I/O端口„„)于一身,充分體現了現代單片機技術向“片上系統SoC”過渡及發展的方向。

2.2 學習開發AVR單片機用到的實驗工具及器材

學習一種新的單片機技術,實驗與實踐是必不可少的,否則只能是紙上談兵。這里我們使用以下的器材進行AVR單片機的C語言設計。 1. ImageCraft公司的ICCAVR6.31A C語言編譯器。 2. Atmel公司的AVR Studio集成開發環境。 3. PonyProg2000下載軟件。 4. AVR DEMO單片機綜合試驗板。 5. AVR單片機JTAG仿真器。 6. 并口下載器。

7. 5V高穩定專用穩壓電源。

8.TOP2004多功能USB編程器(可選購)。 9. 一臺奔騰級及以上的家用電腦(PC機)。 下面簡介一下這些實驗工具及器材。

2.2 學習開發AVR單片機用到的實驗工具及器材

學習一種新的單片機技術,實驗與實踐是必不可少的,否則只能是紙上談兵。這里我們使用以下的器材進行AVR單片機的C語言設計。 1. ImageCraft公司的ICCAVR6.31A C語言編譯器。 2. Atmel公司的AVR Studio集成開發環境。 3. PonyProg2000下載軟件。 4. AVR DEMO單片機綜合試驗板。 5. AVR單片機JTAG仿真器。 6. 并口下載器。

7. 5V高穩定專用穩壓電源。

8.TOP2004多功能USB編程器(可選購)。 9. 一臺奔騰級及以上的家用電腦(PC機)。 下面簡介一下這些實驗工具及器材。 2.2.1 ICCAVR6.31A C語言編譯器 ICCAVR6.31A 是ImageCraft公司開發的用于AVR單片機的C語言編譯器,是一個綜合了編輯器和工程管理器的純32位集成開發環境(IDE)。由于ICCAVR功能強大,使用簡單方便,具有良好的技術支持且價格合適,故得到了廣泛的應用。圖2-1 為ICCAVR的工作界面。

圖2-1 ICCAVR的工作界面

2.2.2 AVR Studio集成開發環境

AVR Studio是一個Atmel公司開發的集項目管理、程序匯編、程序調試、程序下載、JTAG仿真等功能于一體的集成開發環境。但AVR Studio不支持C語言編譯,因此當我們用C語言開發AVR單片機時,需先用ICCAVR編寫C語言并進行編譯,然后使用AVR Studio打開編譯生成的*.cof文件,進行程序的仿真調試。圖2-2 為AVR Studio的工作界面。

圖2-2 AVR Studio的工作界面 2.2.3 PonyProg2000下載軟件

PonyProg2000軟件主要用于AVR單片機及PIC單片機的程序下載,能在Windows95/98/ME/NT/2000/XP等操作系統上使用。對英語不好的讀者,還可以使用PonyProg2000的漢化程序。圖2-3 為PonyProg2000的工作界面。

圖2-3 PonyProg2000的工作界面

2.2.4 AVR DEMO單片機綜合試驗板

AVR DEMO單片機綜合試驗板為多功能實驗板,對入門實習特別有效,其主要功能有:

1.可做AVR單片機的輸入/輸出實驗。 2.可做音響實驗。 3.可做A/D實驗。 4.可做PWM(D/A)實驗。

5.八位數碼管動態掃描輸出及驅動。 6.八位 LED 輸出指示。 7.可做IIC及SPI總線實驗。 8.DS18B20溫度控制實驗。 9.紅外遙控實驗。 10.16*2液晶驅動實驗。 11.128*64液晶驅動實驗。

12.與PC機連接做RS232通信實驗。 圖2-4~2-6為AVR單片機綜合試驗板外型。

圖2-4 AVR DEMO單片機綜合試驗板外型

圖2-5 AVR DEMO單片機綜合試驗板外型(驅動16*2字符型液晶)

圖2-6 AVR DEMO單片機綜合試驗板外型(驅動128*64圖型液晶) 2.2.5 AVR單片機JTAG仿真器

為經典的AVR仿真器,支持的芯片為: ATmega128,ATmega128L,ATmega16, ATmega162,ATmega162V,ATmega165,ATmega165V,ATmega169,ATmega169V, ATmega16L,ATmega32,ATmega323,ATmega323L,ATmega32L,ATmega64, ATmega64L 。圖2-7為AVR單片機JTAG仿真器外型。

圖2-7 AVR單片機JTAG仿真器外型

2.2.6 并口下載器 低價、可靠、實用。支持AVR單片機及AT89S51/52單片機。下載程序時必用的工具。圖2-8為并口下載器外型。

圖2-8 并口下載器外型

2.2.7 TOP2004多功能USB編程器

USB接口。支持AT8

9、AT87F、AT90、ATINY、ATMEGA、SST8

9、SM、MSU、GSM9

7、i87C/LC、P8

7、W77(78)E/LE、IS89C/LV、PIC12/16/17/

18、EM78P系列單片機。27/28/29/39/49/24C/93C系列存儲器。16V

8、20V

8、22V10.支持7

4、4000/4500SRAM數字電路測試。支持芯片超過2000種,適合學習、開發、手機維修、電腦BIOS燒寫。圖2-9為TOP2004多功能USB編程器外型。

圖2-9 TOP2004多功能USB編程器外型 第3章 AVR單片機開發軟件的安裝及初步使用

3.1 ICCAVR6.31A C語言編譯器安裝

在電腦中放入配套光盤,打開ICCAVR6.31A 安裝文件后進入安裝界面(圖3-1),安裝目錄可使用默認方式將其安裝在C盤的icc文件夾中(圖3-2)。

圖3-1 打開ICCAVR6.31A 安裝文件后進入安裝界面

圖3-2 安裝在C盤的icc文件夾中

安裝完成后,需進行注冊才能得到無時間限制的完全版軟件。注冊方式如下: 1.打開ICCAVR6.31A編譯器界面,單擊菜單欄Help→Regist Software(圖3-3),系統會提示關掉計算機的防病毒程序,單擊Continue按鈕進入注冊界面(圖3-4)。

圖3-3 單擊菜單欄Help→Regist Software

圖3-4 單擊Continue按鈕進入注冊界面

2.選中并復制EMail Unlock Code欄右側框內的7組數值。 3.打開注冊器,粘貼剛才復制的數值(圖3-5)。

圖3-5 粘貼剛才復制的數值

4.點擊得到解鎖碼(圖3-6)。復制該解鎖碼。

圖3-6 點擊得到解鎖碼

5.在ICCAVR6.31A編譯器的注冊界面的Paste(~V)the unlock code from Imagecraft’s email欄中,粘貼入解鎖碼(圖3-7),單擊License按鈕后再單擊OK完成注冊(圖3-8)。注冊完成后的ICCAVR6.31A啟動界面如圖3-9所示,主要由菜單欄、工具欄、源文件編輯窗口、工程窗口和編譯輸出窗口五部分組成。

圖3-7 粘貼入解鎖碼

圖3-8 單擊License按鈕后再單擊OK完成注冊

圖3-9 注冊完成后的ICCAVR6.31A啟動界面 3.2 AVR Studio集成開發環境安裝

打開配套光盤內的AVR Studio安裝文件,雙擊Setup.exe文件,按照提示步驟進行安裝。安裝結束后,會出現一個關于安裝USB驅動的界面,由于我們這里不用到USB驅動的器件,只需點擊Cancel關閉即可。安裝完成后的AVR Studio啟動界面如圖3-10所示。

圖3-10 AVR Studio啟動界面

3.3 PonyProg2000下載軟件安裝

PonyProg2000軟件主要用于AVR單片機及PIC單片機的程序下載,能在Windows95/98/ME/NT/2000/XP等操作系統上使用。雙擊配套光盤內的PonyProgV206f軟件進行安裝,安裝過程中只需按照提示,單擊Next按鈕,逐步進行即可。安裝完成后,還可以進行漢化,選中漢化程序包中的PonyProg2000文件(注意不要打開),然后復制,

隨后打開C:/Program Files/ PonyProg2000文件夾,直接點擊粘貼。當彈出對話框提示是否需替換時,點確定,原文件即成為中文版。圖3-11為PonyProg2000的啟動界面。

圖11 PonyProg2000的啟動界面

AVR單片機開發過程為: 1.設置ICCAVR。 2.建立一個工程項目。 2.輸入C源文件。

3.向工程項目中添加源文件。

4.編譯文件,編譯通過后生成COFF/HEX文件。

5. 在AVR Studio集成開發環境中打開COFF文件,使用JTAG仿真器進行實時在線仿真或進行軟件模擬仿真。

7. 使用PonyProg2000軟件將HEX文件下載到單片機中。 8.應用。

3.4 我們的第一個AVR入門程序

接下來我們來做第一個AVR程序,讓程序跑起來,控制AVR單片機綜合試驗板上的8個LED,讓它們亮、滅進行閃爍。

3.4.1 設置ICCAVR 通過ICCAVR對源程序編譯連接工程之前,需要對編譯器屬性進行設置,設置好的某些屬性可保留起來作為新建工程的默認屬性。

打開ICCAVR軟件界面,選擇Project→Option進入屬性設置對話窗。共有Paths、Compiler、Target、Config Salvo四個屬性標簽頁。

1). Paths標簽頁(圖3-12)

在屬性中設置編譯器的頭文件目錄(Include Path(s):)和庫文件目錄(Library Path:)。我們使用系統默認的頭文件目錄和庫文件目錄。

圖3-12 Paths標簽頁

由于我們不使用匯編語言進行開發,因此匯編語言包含路徑(Asm Include Path(s):)空著不填。

輸出文件目錄(Output Directory:)空著不填,則輸出文件自動存放在工程項目目錄中,否則存放在用戶填寫的路徑下。

2).Compiler標簽頁(圖3-13)

Strict ANSI C Checkings:選中表示進行嚴格的C語法檢查。

圖3-13 Compiler標簽頁

Accept Extensions(C++ comments,binary constants) :選中表示接受C++風格的程序注釋。

Int size enum(for backword compatibility) :選中表示可以向下兼容程序。

Optimizations欄可以選擇默認設置(Default)或使能代碼壓縮功能(Enable code compression),對程序的編譯進行優化。

Output Format欄選擇格式輸出。COFF格式的文件用于程序的仿真調試,HEX格式的文件可燒寫入單片機。

AVR Studio Version(COFF)欄中選擇Studio 4.06 and above。 3).Target標簽頁(圖3-14)

在Device Configuration下拉列表中,選擇我們所使用的單片機芯片型號,這里我們選擇ATMega16。其它采用默認設置。

圖3-14 Target標簽頁

4).Config Salvo標簽頁(圖3-15)

采用系統默認的為不帶實時操作系統(Do not use Salvo Configurator)。

圖3-15 Config Salvo標簽頁

完成設置后,單擊OK即完成ICCAVR的屬性設置。如果我們在開發下一個工程項目時,使用這些已經做好的屬性設置,則不必再次進行屬性設置了。

3.4.2 建立一個工程項目 在我的文檔中新建一個ac3-1的文件夾。

在ICCAVR軟件界面中,單擊Project,在彈出的下拉菜單選中New選項,屏幕顯示為圖3-16。在出現的Save New Project As對話框中,選擇工程項目存放的路徑(存放在剛才新建的ac3-1文件夾中)并輸入新建工程項目的名稱(這里我們取名ac3-1),單擊保存按鈕,系統自動初始化成三個空文件夾Files、Headers、Documents,如圖3-17所示。

圖3-16 新建一個工程項目

圖3-17 自動初始化成三個空文件夾Files、Headers、Documents 3.4.3 輸入C源文件 單擊File菜單,在下拉菜單中選擇New,隨后在出現的Untitled-0文本文件編輯窗口中輸入以下的源程序(如圖3-18)。

圖3-18 輸入源程序

#include void delay(void) { unsigned int i,j; for(i=0;i<1000;i++) { for(j=0;j<500;j++) ; } } //============================= void main(void) { DDRB=0xff; PORTB=0xff; while(1) { PORTB=0x00; delay(); PORTB=0xff; delay(); } }

程序輸入完成后,選擇File,在下拉菜單中選中Save as,保存在ac3-1文件夾中,源文件名為ac3-1.c,保存后可看到源文件名由Untitled-0變為ac3-1.c。

3.4.4 向工程項目中添加源文件

選中工程項目區的File文件夾右擊。在出現的下拉窗口中選擇Add Files,如圖3-19所示。在添加文件窗口中選擇ac3-1.c源文件,鼠標單擊打開按鈕,這時ac3-1.c文件便加入到工程項目中(圖3-20)。

圖3-19 向工程項目中添加源文件

圖3-20 源文件加入到工程項目中

3.4.5 編譯文件

選擇主菜單欄中的Project,在下拉菜單中選中Make Project,這時編譯輸出窗口出現源程序的編譯信息,如圖3-21所示。如果編譯出錯,會在編譯輸出窗口中顯示出來。用戶可以在源程序編輯窗口重新輸入、修改源程序文件,并再次編譯,直到編譯通過并生成用戶所需的文件。

圖3-21 編譯輸出窗口出現源程序的編譯信息

3.4.6 軟件模擬仿真

打開AVR Studio集成開發環境,這時出現一個歡迎進入AVR Studio的界面(圖3-22)。

圖3-22 出現一個歡迎進入AVR Studio的界面

單擊Open按鈕,選中ac3-1.cof文件后點擊打開,出現生成AVR Studio工程項目文件的界面后點保存(圖3-23),然后出現選擇仿真平臺的界面(圖3-24)。這里我們進行軟件模擬仿真,Debug Platform欄中選擇AVR Simulator,Device欄選擇Atmega16芯片(圖3-25)。點擊Finish后進入仿真界面(圖3-26)。

圖3-23 出現生成AVR Studio工程項目文件的界面后點保存

圖3-24 出現選擇仿真平臺的界面

圖3-25 Device欄選擇Atmega16芯片

圖3-26 點擊Finish后進入仿真界面

在主菜單中打開Debug,從Debug的下拉菜單中可看到常用的仿真快捷鍵,這里我們選擇F10(Step Over)進行調試。

選擇Debug →AVR Simulator Options,出現圖3-27所示的仿真選項,我們將Frequency一項中的仿真頻率改為8.00MHz,使其與試驗板上的實際工作頻率相符。

圖3-27 選擇Debug →AVR Simulator Options 在左側Workspace窗口中,存放著ATMeag16的各種寄存器的狀態值,我們將I/O ATMEGA16前的加號展開,再將PORTB前的加號展開,將PORTB輸出口打開(圖3-28)。鼠標在程序的光標箭頭上點一下,隨后按動F10,可發現PORTB口的各寄存器會發生變化,DDRB全部為黑色(0xFF),說明方向寄存器的設置為輸出方式,而隨著繼續按動F10,PORTB與PINB則一會兒變黑(0xFF),一會兒變白(0x00)。將Workspace窗口中的Processor前的加號展開,最下面有個Stop Watch項,該項就是AVR Studio在選定時鐘頻率下計算出的運行時間(圖3-29)。我們可發現,PORTB輸出低電平到高電平的時間間隔約0.439秒,反復循環。仿真調試通過后,關閉AVR Studio開發環境。

圖3-28 將PORTB輸出口打開

圖3-29 AVR Studio在選定時鐘頻率下計算出的運行時間

3.4.7 將HEX文件下載到單片機中

將并口下載器插電腦的并口,下載線的另一端插AVR DEMO單片機綜合試驗板的ISP口。

將試驗板上標示PB0-PB7的雙排針上8個短路塊拔下,插到標有LED的雙排針上,使PB口與LED接通。試驗板通電工作,注意,5V穩壓電源接DC5V插座;若使用9V-15V電源時,插9V-15V的插座。插錯電源會損壞芯片!

第一次使用PonyProg2000下載程序時,需對PonyProg2000進行設置,選擇合適的下載接口方式,并對端口進行校正。PonyProg2000支持串口及并口下載,這里我們采用并口SPI方式下載程序。

雙擊桌面上的PonyProg2000快捷圖標運行軟件(圖3-30),出現小馬頭圖標后點確認。

程序下載前先進行端口設置及校正。選擇設置→接口設置,出現圖3-31對話框。如果我們的電腦使用的操作系統是Windows 95/98/ME,單擊并行,選擇Avr ISP API,并選擇LPT1;如果我們的電腦使用的操作系統是Windows NT/2000/XP,則單擊并行,選擇Avr ISP I/O,并選擇LPT1。

圖3-30 運行PonyProg2000軟件

圖3-31 進行端口設置及校正

下來選擇設置→校正,對端口進行校正,出現圖3-32的窗口。單擊Yes開始校正,校正完成后會有提示(圖3-33),點OK即可。

圖3-32 單擊Yes開始校正

圖3-33 校正完成

選擇器件→AVR micro→Atmega16(圖3-34)。

圖3-34 選擇器件→AVR micro→Atmega16 選擇文件→打開程序(FLASH)文件,文件類型選*HEX,裝載編程文件(圖3-35)。

圖3-35 裝載編程文件

選擇命令→擦除,先擦除器件(圖3-36)。

圖3-36 選擇命令→擦除

選擇命令→Security and Configuration Bits„,按圖3-37配置熔絲位。單擊寫入,寫入熔絲位配置。

圖3-37 寫入熔絲位配置

選擇命令→寫入所有,開始下載燒寫文件(圖3-38)。

圖3-38 選擇命令→寫入所有

在下載文件時,ISP旁的發光二極管D0會點亮。 3.4.8 應用

下載燒寫完成時,我們即可看到PB口驅動的8個發光二極管開始閃亮,周期約0.8秒,即點亮0.4秒、熄滅0.4秒,反復進行。

恭喜您,您已經踏入了AVR高速單片機的大門,請您繼續行動起來,掌握AVR單片機的高效設計。

第4章 AVR DEMO單片機綜合試驗板原理介紹及使用

4.1 AVR DEMO單片機綜合試驗板

AVR DEMO單片機綜合試驗板為多功能實驗板,對入門實習及學成后開發產品特別有幫助,圖4-1為AVR DEMO單片機綜合試驗板電路原理圖(作者注:使用Protel99se打開)。

圖4-1 AVR DEMO單片機綜合試驗板電路原理圖

U1為單片機ATMEAG16L。 JP

1、JP2為雙排針,便于單片機外擴其它器件。

D1-D8為8個發光二極管,通過LED雙排針與PB0-PB7連接,可作開關量輸出的指示。

ISP為在線下載程序的接口。 JTAG為在線JTAG仿真接口。

LCD128_64為驅動128*64圖型液晶的接口,可做128*64液晶驅動實驗。 LCD16_2為驅動16*2液晶的接口,可做16*2液晶驅動實驗。 JTAG_R雙排針連接R2-R5這4個10K的上拉電阻,這是進行JTAG仿真所需的,一般情況下用短路塊將JTAG_R雙排針短接。

U2為232通信芯片,通過UART雙排針與單片機ATMEAG16L的PD0、PD1連接,方便與PC機連接做RS232通信實驗。

SW_DIP4為4位拔碼開關,它通過SW_DIP短路塊與PD4-PD7連接,可做狀態轉換的實驗。

RV1為多圈電位器,所取得的模擬電壓通過排針AD后送單片機的PA7,可做A/D實驗。

Q1及蜂鳴器BZ組成音響電路,通過排針BEEP與單片機的PD5連接,可做音響實驗。

S1-S4為4個輕觸式按鍵開關,通過KEY雙排針與PD4-PD7連接,可做開關量的輸入實驗。

INT0、INT1為2個輕觸式按鍵開關,通過INT雙排針與PD

2、PD3連接,可進行AVR單片機的外部中斷實驗。

LEDMOD

1、LEDMOD2為8位數碼管顯示器,其中字段碼經LEDMOD_DATA雙排針后由單片機的PA0-PA7送出,位選碼經LEDMOD_COM雙排針后由單片機的PC0-PC7送出,可做8位數碼管動態掃描輸出及驅動。

U4為IIC總線實驗器件24C01,通過IIC雙排針與PC0、PC1連接,可做IIC總線實驗。

U5為SPI總線實驗器件93C46,通過SPI雙排針與PB4-PB7連接,可做SPI總線實驗。

U7為測溫器件,通過排針18B20與PC7連接,能進行測溫及控溫實驗。 U8為38KHz的紅外接收器,通過排針IR與PD6連接,可做紅外遙控實驗。

U6A、U6B及外圍器件組成有源濾波電路,通過雙排針PWM_IN與單片機的PB

3、PD

4、PD

5、PD7連接,可做PWM(D/A)實驗。

J

1、J2為外接電源插口,其中J1輸入9-15V直流電壓,供U6運放使用,同時經U3穩壓獲得的5V供其它部分使用。若實驗中不需從PWM_OUT

1、PWM_OUT2端口取得PWM的模擬量,那么直接從J2口輸入5V穩壓電源即可,而不用J1口。

4.2ATMEAG16L單片機的主要特點與內部組成

ATMEAG16L是AVR單片機家族中的高檔產品,其包含的功能較為齊全,非常適合于學習及開發實踐。選擇ATMEAG16L進行學習的另一個主要原因是該芯片支持JTAG調試,這樣大大降低了我們在學習、開發過程中的調試難度及成本。

ATMEAG16L的主要特點為:

●內部Flash程序存儲器內部含有16K字節的Flash存儲器,支持ISP(在系統編程)和IAP(在應用編程),可被重復擦寫10000次。

●內部數據存儲器SRAM達1K字節。

●內部EEPROM達512字節,可擦寫100000次,可以在系統掉電時保存一些用戶信息。

●32個I/O口,分PA、PB、PC、PD共4組,每組8位。每個I/O口可負載20~40mA的電流,芯片的總電流不超過200mA。

●有兩個可分頻的8位定時器/計數器和一個可分頻的16位定時器/計數器,帶輸入捕獲、比較輸出功能。有4個通道的PWM,可作DAC轉換器。 ●中斷單元有20個中斷源,每個中斷有獨立的中斷向量入口地址,所有的中斷事件都有各自的使能位,可以根據需要使能或屏蔽。

●Atmega16L支持多種時鐘方式, 有外部晶振、外部RC振蕩、外部時鐘和內部RC振蕩等。Atmega16L內置上電復位電路、可編程低電壓檢測(BOD)復位電路和帶獨立振蕩器的看門狗,支持上電復位、外部復位、看門狗復位和低電壓檢測復位等復位源。

●內置8通道10位精度的逐次逼近式模/數轉換器(ADC),支持單端和雙端差分信號輸入,內含增益可編程運算放大器。 ●SPI同步接口。 ●全雙工的USART。 ●

片內模擬比較器。 ●

二線總線(TWI)等。

圖4-2為ATMEAG16L的引腳排列。圖4-3為ATMEAG16L的內部組成結構。

圖4-2 ATMEAG16L的引腳排列 圖4-3 ATMEAG16L的內部組成結構

4.3使用JTAGICE仿真器(JTAG ICE)調試AVR DEMO單片機綜合試驗板

JTAG ICE與AVR DEMO單片機綜合試驗板連接的電路圖見圖4-4,圖4-4中虛線的部分是可選連接。

圖4-4 JTAG ICE與AVR單片機綜合試驗板連接的電路

當JTAGICE與用戶板和個人電腦均連接上之后,就可以開始調試。 下面以第3章中所作的第一個程序ac3-1.c為例,使用JTAG ICE進行實際調試。

前5步的操作與第3章中介紹的完全相同,即: 1.設置ICCAVR。 2.建立一個工程項目。 3.輸入C源文件。 4.向工程項目中添加源文件。

5.編譯文件,編譯通過后生成COFF/HEX文件。 僅第6步的操作不同,下面將第6步介紹一下:

需要說明的是,進行JTAG仿真前,應確定單片機的JTAGEN熔絲位已被編程,這可以用下載軟件PonyProg2000進行熔絲位檢查。

6.使用JTAG仿真器進行實時在線仿真

將JTAG仿真器通過串口線與PC機的串口連接,另一端的10PlN扁平電纜則插入AVR DEMO單片機綜合試驗板上的JTAG插口。AVR DEMO單片機綜合試驗板通上5V電壓,然后打開AVR Studio集成開發環境,這時出現一個歡迎進入AVR Studio的界面(圖4-5)。

圖4-5 進入AVR Studio的界面

單擊Open按鈕,選中ac3-1.cof文件后點擊打開,出現生成AVR Studio工程項目文件的界面后點保存,然后出現選擇仿真平臺的界面(圖4-6)。這里我們在Debug Platform欄中選擇JTAG ICE,Device欄選擇Atmega16芯片(圖4-7)。點擊Finish后JTAG ICE會與PC機建立通信連接,進入在線仿真界面(圖4-8)。

圖4-6 出現選擇仿真平臺的界面

圖4-7 Device欄選擇Atmega16芯片

圖4-8 進入在線仿真界面

在主菜單中打開Debug,從Debug的下拉菜單中可看到常用的仿真快捷鍵,這里我們選擇F10(Step Over)進行調試。

在左側Workspace窗口中,存放著ATMeag16的各種寄存器的狀態值,我們將I/O ATMEGA16前的加號展開,再將PORTB前的加號展開,將PORTB輸出口打開。鼠標在程序的光標箭頭上點一下,隨后按動F10,可發現PORTB口的各寄存器會發生變化,DDRB全部為黑色(0xFF),說明方向寄存器的設置為輸出方式,而隨著繼續按動F10,PORTB與PINB則一會兒變黑(0xFF),一會兒變白(0x00),對應的,實驗板上的發光二極管也亮、滅閃爍。當按動F5快捷鍵(Run)后,程序全速運行,這時實驗板上的發光二極管自動閃爍。

本文來自 99學術網(www.gaojutz.com),轉載請保留網址和出處

上一篇:module4unit1說課稿下一篇:thepicklejar的寓意

91尤物免费视频-97这里有精品视频-99久久婷婷国产综合亚洲-国产91精品老熟女泄火