《單片機(jī)原理與實(shí)驗(yàn)教程》課件第8章_第1頁
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第8章_第2頁
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第8章_第3頁
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第8章_第4頁
《單片機(jī)原理與實(shí)驗(yàn)教程》課件第8章_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第8章綜合設(shè)計性實(shí)驗(yàn)

實(shí)驗(yàn)一DS18B20溫度采集實(shí)驗(yàn)

實(shí)驗(yàn)二D/A轉(zhuǎn)換實(shí)驗(yàn)實(shí)驗(yàn)三A/D轉(zhuǎn)換實(shí)驗(yàn)實(shí)驗(yàn)四IIC總線實(shí)驗(yàn)實(shí)驗(yàn)五SPI總線實(shí)驗(yàn)實(shí)驗(yàn)六實(shí)時時鐘DS12C887實(shí)驗(yàn)實(shí)驗(yàn)七8255A并口擴(kuò)展實(shí)驗(yàn)實(shí)驗(yàn)一DS18B20溫度采集實(shí)驗(yàn)

一、實(shí)驗(yàn)?zāi)康?/p>

(1)掌握單片機(jī)與1wire(一線器)的通信原理與編程方法。(2)掌握LED動態(tài)顯示的方法。(3)了解溫度傳感器的原理。二、實(shí)驗(yàn)原理關(guān)于DS18B20的工作原理,請讀者參考Dallas公司的資料。AT89S52控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過三個步驟:初始化、ROM操作指令、存儲器操作指令。必須先啟動DS18B20開始轉(zhuǎn)換,再讀出溫度轉(zhuǎn)換值。本實(shí)驗(yàn)系統(tǒng)掛接一個DS18B20芯片,可使用默認(rèn)的12位轉(zhuǎn)換精度,外接供電電源,單片機(jī)與DS18B20的接口用的是單片機(jī)的P2.4口。

三、實(shí)驗(yàn)內(nèi)容

(1)參考給出的流程圖(圖8-1),在Keil編譯環(huán)境下編制程序,要求采集溫度并判斷溫度所處范圍,如果超出報警溫度范圍則報警;報警通過實(shí)驗(yàn)箱上的蜂鳴器實(shí)現(xiàn),報警溫度可以通過鍵盤設(shè)置;最后,生成*.HEX文件。(2)通過ISP將生成的*.HEX文件下載到單片機(jī)中,運(yùn)行程序。(3)觀測LCD上顯示的溫度數(shù)據(jù),通過鍵盤操作控制報警溫度。圖8-1

DS18B20溫度采集系統(tǒng)流程圖四、參考程序

//DS18B20溫度傳感器程序

#include<reg52.h>

#defineAlarm10

sbitBeep=P3∧4;

sbitDQ=P2∧4;//數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)引腳unsignedchartempL=0,tempH=0;//設(shè)全局變量

unsignedcharflag=0;

unsignedinttemperature,negtemper;//溫度值保存在

temperature里

unsignedcharidataaddrdat[2]={0x0,0x0};unsignedchartab[]={0xc0,0xf9,0xa4,0xb0,

/*01234*/0x99,0x92,0x82,0xf8,0x80,0x90};

/*56789*/unsignedchartab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};unsignedchardispbuf[3]={0,0,0};unsignedcharwarning=20;biton=0,off=1;//*************************

//延時子程序//**voiddelay(unsignedinti){while(i--);}voidbeep(biti){Beep=i;}//*****************************//初始化程序Init_DS18B20(void){

unsignedcharx=0;DQ=1; //DQ先置高

delay(8); //稍延時

DQ=0; //發(fā)送復(fù)位脈沖

delay(85); //延時(>480μs)

DQ=1; //拉高數(shù)據(jù)線

delay(14); //等待(15~60μs)

x=DQ; //用x的值來判斷初始化有沒有成功,DS18B20存在的//話x=0,否則x=1

delay(20);}//***********************//讀一個字節(jié)ReadOneChar(void) //主機(jī)數(shù)據(jù)線先從高電平拉至低電平,保持1ms以上,再[JP]//使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號

{unsignedchari=0; //每個讀周期最短的持續(xù)時間為60μs,各個讀周期

//之間必須有1ms以上的高電平恢復(fù)期

unsignedchardat=0;

for(i=8;i>0;i--) //一個字節(jié)有8位

{DQ=1;delay(1);DQ=0;dat>>=1;DQ=1;dat|=0x80;delay(4);}return(dat);}//***********************

//寫一個字節(jié)WriteOneChar(unsignedchardat){unsignedchari=0;//數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號

//15ms之內(nèi)將所需寫的位送到數(shù)據(jù)線上

for(i=8;i>0;i--)//在15~60ms之間對數(shù)據(jù)線進(jìn)行采樣,如果是高電平//就寫1,低電平則寫0{DQ=0; //在開始另一個寫周期前必須有1ms以上的高電平恢復(fù)期

DQ=dat&0x01;

delay(5);

DQ=1;

dat>>=1;}delay(4);}//**************************ReadTemperature(void){Init_DS18B20(); //初始化

WriteOneChar(0xcc);//跳過讀序列號的操作

WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換

delay(125); //轉(zhuǎn)換需要一點(diǎn)時間,延時

Init_DS18B20(); //初始化

WriteOneChar(0xcc); //跳過讀序列號的操作

WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)tempL=ReadOneChar(); //讀出溫度的低位LSBtempH=ReadOneChar(); //讀出溫度的高位MSBtemperature=(tempH*256)+tempL;//溫度轉(zhuǎn)換,對高、低位做相應(yīng)的運(yùn)算,轉(zhuǎn)化為//實(shí)際溫度return(temperature);}//****************************voidDispbuf(unsignedinttemper){

dispbuf[2]=(temper>>4)/10; //取十位

dispbuf[1]=(temper>>4)%10; //取個位

if(temper&0x8) //小數(shù)位

dispbuf[0]=0x55;

elsedispbuf[0]=0;

}unsignedchargetkey() //鍵盤掃描程序{

P2=0xff;

P2=0xfe;

if((P2&0xff)![KG-*3]=0xfe)

{

delay(5000);

if((P2&0xff)![KG-*3]=0xfe)

returnP2;

elseP2=0xfd;

}elseP2=0xfd;

if((P2&0xff)![KG-*3]=0xfd)

{

delay(5000);

if((P2&0xff)![KG-*3]=0xfd)

returnP2;

elseP2=0xfb;

}

elseP2=0xfb;

if((P2&0xff)![KG-*3]=0xfb){

delay(5000);

if((P2&0xff)![KG-*3]=0xfb)

returnP2;

elseP2=0xf7;

}

elseP2=0xf7;

if((P2&0xff)![KG-*3]=0xf7)

{

delay(5000);

if((P2&0xff)![KG-*3]=0xf7)

returnP2;

elsereturnP2=0xfe;

}

} Inter0_process()interrupt2//外部中斷1

{

unsignedcharkey;

inti;

unsignedchardis=0x01;

unsignedintj;

for(j=5000;j>0;j--) {

key=getkey(); //取鍵值

if(key==0xee) //如1鍵按下,則溫度值遞增

{

warning++;

delay(8000);

}

if(key==0xed)

{ //如5鍵按下,則溫度值遞減

warning--;

delay(8000);

}if(key==0x77) //按下16鍵則退出中斷

j=1;

for(i=0;i<2;i++) //設(shè)置兩位報警值,并在LED上顯示

{

P1=dis;

dis<<=1;

if(i==0)

P0=tab[warning%10];

else

P0=tab[warning/10];

delay(200);

}dis=0x01;

}}//****************************

//主程序

main(){

unsignedchari,npos=0x01;P0=0xff;

P2=0xff;

P1=0xff;

EX1=1;//開中斷1

IT1=1;//下降沿觸發(fā)

ET1=1;

EA=1;//開總中斷

while(1){

if((temperature&0xf000)==0xf000)

//判斷是否是負(fù)溫度

{ReadTemperature();

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

//4位顯示

{

negtemper=(~temperature)+1;//取原碼

Dispbuf(negtemper);//取位值

P1=npos;

npos<<=1;//循環(huán)使能if(i==1)

//第二位顯示有點(diǎn)

{

P0=tab1[dispbuf[i]];//查表顯示

delay(700);

}

elseif(i==3)

//顯示負(fù)號

P0=0xbf;

else {

P0=tab[dispbuf[i]];

delay(700);

}

}

npos=0x01;

}

else

//如不是負(fù)溫度

{

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

//為負(fù)則顯示3位{

ReadTemperature(); //讀溫度值

Dispbuf(temperature);

if(((temperature>>4)&0xff)>=warning) //溫度值大于報警溫度值則報警

beep(on); //蜂鳴器響else

beep(off); //不響

P1=npos;

npos<<=1; P0=tab1[dispbuf[i]];

else

P0=tab[dispbuf[i]];

delay(100);

}

npos=0x01;

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺、AtmelISP在線編程軟件、DS18B20溫度傳感器實(shí)驗(yàn)?zāi)K。六、思考與分析

(1)說明1wire的工作原理。(2)說明DS18B20的控制原理。

實(shí)驗(yàn)二D/A轉(zhuǎn)換實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)理解D/A轉(zhuǎn)換芯片DAC0832與單片機(jī)的接口方法及編程方法。

(2)了解D/A轉(zhuǎn)換的基本原理。

(3)了解單片機(jī)系統(tǒng)中擴(kuò)展D/A轉(zhuǎn)換的基本方法。二、實(shí)驗(yàn)原理

DAC0832內(nèi)部具有輸入寄存器和DAC寄存器兩級數(shù)據(jù)寄存器,它不需要外加其他電路便可以與單片機(jī)的數(shù)據(jù)總線相連。DAC0832的引腳說明如下:

·D0~D7:8位數(shù)據(jù)輸入。

·Iout1和Iout2:DAC電流輸出1和DAC電流輸出2,Iout1和Iout2之和為一常量。

·RFB:反饋信號輸入端。DAC0832的輸出是電流型的,為了取得電壓輸出需在電壓輸出端接運(yùn)算放大器,RFB即為運(yùn)算放大器的反饋電阻端。反饋電阻在片內(nèi)。

·ILE:允許輸入鎖存信號。

·和:鎖存輸入數(shù)據(jù)的寫信號和鎖存輸入寄存器輸出數(shù)據(jù)的寫信號。:傳送控制信號。:片選信號。

DAC0832的輸出是電流型的,但實(shí)際應(yīng)用中往往需要電壓輸出信號,所以電路中采用運(yùn)算放大器來使電流轉(zhuǎn)換為電壓。本實(shí)驗(yàn)系統(tǒng)采用的參考電壓為5V,所以當(dāng)數(shù)字量輸入在00H~FFH范圍時電壓輸出量為0~+5V,這種方式稱單極型輸出。若電壓輸出為±5V,則稱為雙極型輸出。實(shí)際應(yīng)用中需要單極性輸出,也需要雙極型輸出,所以電路應(yīng)用兩片運(yùn)放LM741來實(shí)現(xiàn)兩種極性的輸出。此實(shí)驗(yàn)系統(tǒng)的原理圖如圖8-2所示。DAC0832與單片機(jī)接口:DAC0832的D0~D7接單片機(jī)P0口;DAC0832的片選信號端接單片機(jī)的P2.7,為了避免模塊之間的沖突,P2.7通過跳線J505與DAC0832相連。DAC0832的WR信號接單片機(jī)的寫信號WR,U506和U507是單運(yùn)放LM741,完成電流到電壓和正負(fù)電壓的轉(zhuǎn)換。單片機(jī)對DAC0832的控制過程:使能、,向寄存器中寫入需轉(zhuǎn)換數(shù)據(jù)。圖8-2

DAC0832應(yīng)用原理圖

三、實(shí)驗(yàn)內(nèi)容

(1)將擴(kuò)展板的電源J501與主板的電源接口J2或J14連接起來;將擴(kuò)展板的信號接口J500與主板的信號接口J15或J13連接起來;將主板上的撥插開關(guān)5、6、7、8撥到ON。

(2)在Keil編程環(huán)境下編寫程序,完成實(shí)驗(yàn)功能。本實(shí)驗(yàn)參考程序完成的實(shí)驗(yàn)功能是在主板數(shù)碼管上顯示“2.7”V電壓,同時使DAC0832的輸出為2.7V電壓。編程時,控制DAC0832的控制碼為:×255,取其整數(shù)部分為138,十六進(jìn)制為0X8AH。在數(shù)碼管上顯示“2.7”字樣。

(3)編譯生成.HEX文件,將.HEX文件下載到實(shí)驗(yàn)系統(tǒng)中。觀察數(shù)碼管上顯示的數(shù)據(jù),并用萬用表測量J502(OUTPUT)的電壓值。四、參考程序

//2.7V直流電壓輸出實(shí)例

#include<reg51.h>

#include<absacc.h>

#defineDAC0832XBYTE[0X7FFF]//DAC0832使能P2.7

#defineVref5

//參考電壓Vref=5V

unsignedcharLED_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//段碼

unsignedcharLED_seg1[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

//段碼

unsignedcharLED_bit[4]={0x01,0x02,0x04,0x08};

//位碼voiddelay(unsignedlongn) //延時函數(shù)

{

for(;n>0;n--);

}

unsignedLED_buf[4]={0,0,0,0};

voidconvert(unsignedintn) //分解位函數(shù)

{

unsignedchari=0;

n=n/10;

while(i<4)

{

LED_buf[i]=(unsignedchar)(n%10);

n=n/10;i++;

}

}

voiddisplay(void) //顯示函數(shù)

{

unsignedchari;

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

{

if(i==2)P0=LED_seg1[LED_buf[i]];

elseP0=LED_seg[LED_buf[i]];

P1=LED_bit[i];

delay(100);

}

}voidchange(unsignedinta) //輸出函數(shù)

{

unsignedchari;

i=(unsignedchar)(a/100*255/Vref/10);

DAC0832=i;

}

voidmain(void){

unsignedinta=2.7*1000; //輸出2.7V電壓

while(1)

{

convert(a);

display(); //顯示

change(a); //輸出

delay(100);

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺、AtmelISP在線編程軟件、示波器、電壓表等。六、思考與分析

修改程序?yàn)槿遣ê弯忼X波輸出,不需要顯示。實(shí)驗(yàn)三A/D轉(zhuǎn)換實(shí)驗(yàn)

一、實(shí)驗(yàn)?zāi)康模?)掌握ADC0809與單片機(jī)的接口方法及其編程方法。(2)了解A/D變換芯片ADC0809的工作原理。(3)通過實(shí)驗(yàn)了解單片機(jī)如何進(jìn)行數(shù)據(jù)采集。二、實(shí)驗(yàn)原理

A/D轉(zhuǎn)換器大致有三類:一類是雙積分A/D轉(zhuǎn)換器,特點(diǎn)是精度高,抗干擾性好,價格便宜,但轉(zhuǎn)換速度慢;一類是逐次逼近A/D轉(zhuǎn)換器,特點(diǎn)是精度、速度、價格均適中;另一類是并行A/D轉(zhuǎn)換器,特點(diǎn)是速度快,但價格昂貴。本實(shí)驗(yàn)用的ADC0809屬第二類,是8位A/D轉(zhuǎn)換器,每采集一次數(shù)據(jù)一般需100μs,A/D轉(zhuǎn)換結(jié)束后會自動產(chǎn)生EOC信號。

ADC0809的引腳含義如下:

·IN0~IN7:8路模擬通道輸入,由ADDA、ADDB、ADDC三條線選擇。

·ADDA、ADDB、ADDC:模擬通道選擇線,比如000時選擇0通道,111時選擇7通道。

·D7~D0:數(shù)據(jù)線,三態(tài)輸出,由OE(輸出允許信號)控制輸出與否。

·OE:輸出允許,該引線為高電平時,打開三態(tài)緩沖器,將轉(zhuǎn)換結(jié)果放到D0~D7上。

·ALE:地址允許鎖存,其上升沿將ADDA、ADDB、ADDC三條引線的信號鎖存,經(jīng)譯碼選擇對應(yīng)的模擬通道。ADDA、ADDB、ADDC可接單片機(jī)的地址線,也可接數(shù)據(jù)線。ADDA接低位線時,ADDC接高位線。

·START:轉(zhuǎn)換啟動信號,在模擬通道選通之后,由START上的正脈沖啟動A/D轉(zhuǎn)換過程。轉(zhuǎn)換時間至少100μs。

·EOC(endofconversion):轉(zhuǎn)換結(jié)束信號,在START信號之后,A/D開始轉(zhuǎn)換。EOC輸出低電平時,表示轉(zhuǎn)換在進(jìn)行中,當(dāng)轉(zhuǎn)換結(jié)束時,數(shù)據(jù)已鎖存在輸出鎖存器之后,EOC變?yōu)楦唠娖?。EOC可視作被查詢的狀態(tài)信號,亦可用來申請中斷。

·REF+、REF-:基準(zhǔn)電壓輸入信號。

·CLOCK:時鐘輸入端,時鐘頻率上限為1280kHz。

ADC0809在實(shí)驗(yàn)平臺中的電路如圖8-3所示。ADC0809輸入通道的控制是由單片機(jī)的P2.0、P2.1和P2.2引腳完成的,跳線J504連通單片機(jī)I/O口與U501的鎖存使能。EOC與單片機(jī)的中斷0(INT0)相連,當(dāng)數(shù)據(jù)轉(zhuǎn)換完成時,EOC向單片機(jī)發(fā)送中斷請求,單片機(jī)響應(yīng)中斷,讀取轉(zhuǎn)換數(shù)據(jù)(也可采用查詢方式)。ADC0809的D0~D7與單片機(jī)的P0口相連。單片機(jī)的ALE信號經(jīng)過74LS74二分頻后,作為ADC0809的時鐘信號。U504是與非門CD4001,用于和單片機(jī)的P2.3產(chǎn)生A/D的片選和使能信號。P2.3為低電平,且當(dāng)WR信號來(為低電平)時,送到A/D轉(zhuǎn)換器的ALE和START引腳為高電平,啟動A/D轉(zhuǎn)換。同樣,當(dāng)RD信號來時使能OE信號,A/D轉(zhuǎn)換器向總線上發(fā)送數(shù)據(jù)。實(shí)驗(yàn)時,對ADC0809的控制過程是:通過P2.0,P2.1和P2.2選擇模擬量輸入通道;通過P2.3和WR信號啟動A/D轉(zhuǎn)換;等待轉(zhuǎn)換結(jié)束標(biāo)志EOC;輸出數(shù)據(jù)使能OE;讀取轉(zhuǎn)換數(shù)據(jù)。圖8-3

ADC0809在實(shí)驗(yàn)平臺中的電路三、實(shí)驗(yàn)內(nèi)容

(1)將擴(kuò)展板的電源J501與主板的電源接口J2或J14連接起來;將擴(kuò)展板的信號接口J500與主板的信號接口J15或J13連接起來;將主板上的撥插開關(guān)5、6、7、8撥到ON。

(2)在Keil編程環(huán)境下編寫程序,完成實(shí)驗(yàn)功能。本實(shí)驗(yàn)參考程序完成的實(shí)驗(yàn)功能是調(diào)節(jié)可調(diào)電阻R500,改變ADC0809的0通道模擬輸入電壓,能夠在主板數(shù)碼管上顯示轉(zhuǎn)換電壓值。

(3)在Keil環(huán)境下編程,編譯生成.HEX文件,將.HEX文件下載到實(shí)驗(yàn)系統(tǒng)中。調(diào)節(jié)電位器R500觀察數(shù)碼管上顯示的數(shù)據(jù);用萬用表測量J502的IN0的電壓值,比較數(shù)碼管上的顯示值和萬用表的測量值,兩個值應(yīng)相差不大。相差太大則表示A/D變換不對。A/D轉(zhuǎn)換流程圖見圖8-4。圖8-4

A/D轉(zhuǎn)換流程圖四、參考程序

C51程序:

#include<reg51.h>

#include<absacc.h>

//start由P2.3控制,用高位地址作為通道選擇和A/D片選信號

#defineIN0XBYTE[0xF0FF]

sbitAD_BUSY=P3∧2; //轉(zhuǎn)換結(jié)束引腳——EOC

unsignedcharLED_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//段碼

unsignedcharLED_seg1[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

//段碼unsignedcharLED_bit[4]={0x01,0x02,0x04,0x08};

voiddelay(unsignedlongn) //延時函數(shù)

{for(;n>0;n--);}

unsignedLED_buf[4]={0,0,0,0};

voidconvert(unsignedintn) //分解位函數(shù){

unsignedchari=0;

n=n*100/51;

while(i<4)

{

LED_buf[i]=(unsignedchar)(n%10);

n=n/10;i++;

}

}voiddisplay(void) //顯示函數(shù){

unsignedchari;

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

{

if(i==2)P0=LED_seg1[LED_buf[i]];

elseP0=LED_seg[LED_buf[i]];

P1=LED_bit[i];

delay(100);

}

}

voidmain(void) //主函數(shù)

{

unsignedinta=0;

convert(a);

display();

while(1){

IN0=0; //開始轉(zhuǎn)換

delay(10);

while(AD_BUSY==0); //等待轉(zhuǎn)換結(jié)束

a=IN0;

convert(a);

display(); //顯示

delay(100);

}

}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺、AtmelISP在線編程軟件、示波器、電壓表等。六、思考與分析(1)說明ADC的控制方法。(2)如何選擇ADC?ADC有哪些重要參數(shù)?

實(shí)驗(yàn)四IIC總線實(shí)驗(yàn)

一、實(shí)驗(yàn)?zāi)康模?)了解IIC(I2C)總線的特點(diǎn)。(2)掌握IIC器件的讀寫程序設(shè)計方法及與AT89S5X連接的接口電路設(shè)計方法。二、實(shí)驗(yàn)原理

IIC采用兩根I/O線,一根時鐘線(SCL串行時鐘線),一根數(shù)據(jù)線(SDA串行數(shù)據(jù)線),實(shí)現(xiàn)全雙工的同步數(shù)據(jù)通信。IIC總線通過SCL/SDA兩根線使掛接到總線上的器件相互進(jìn)行信息傳遞。在AT89S52實(shí)驗(yàn)開發(fā)板上,單片機(jī)的P3.6(WR)通過跳線J406連接AT24C02第6腳SCL為串行時鐘輸入線;單片機(jī)的P3.7(RD)連接AT24C02第5腳SDA為串行數(shù)據(jù)輸入、輸出線,見圖8-5。SDA和SCL都需要和正電源間各接一個5.1kΩ的上拉電阻。第7腳是寫保護(hù),需要接地才能寫入。圖8-5

AT24C04應(yīng)用原理圖三、實(shí)驗(yàn)內(nèi)容

(1)將擴(kuò)展板的2*13接口J401與主板ND1000_002的2*13接口J5或J12連接起來。

(2)將IIC的WP用跳線帽與地連接;將J406用跳線帽連接。

(3)將ND1000_002上的撥插開關(guān)5、6、7、8撥到ON。(4)給系統(tǒng)供電(+5V)。

(5)將用Keil軟件生成的.HEX文件燒入AT89S52芯片中。

(6)此時可以看到數(shù)碼管顯示一個從2402中讀出的值,通、斷電或復(fù)位一次它的值就增加1。

(7)當(dāng)按下INT1鍵時計數(shù)的值清零,數(shù)碼管顯示零。程序流程圖如圖8-6所示。四、參考程序

C51程序:

#include<reg51.h>

sbitSDA=P3∧7;

sbitSCL=P3∧6;

sbitreset=P3∧3;

//函數(shù)聲明

unsignedcharLED_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共陽極

unsignedcharLED_bit[4]={0x01,0x02,0x04,0x08}; //數(shù)碼

unsignedLED_buf[6]={0,0,0,0}; //數(shù)碼unsignedchari2c_read(unsignedchar);voidi2c_write(unsignedchar,unsignedchar);voidi2c_send8bit(unsignedchar);unsignedchari2c_receive8bit(void);voidi2c_start(void);voidi2c_stop(void);biti2c_ack(void);voiddelay(unsignedintj)//延時{

while(j--);}voidconvert(unsignedlongn){

unsignedchari=0;

while(i<4)

{

LED_buf[i]=(unsignedchar)(n%10);

n=n/10;i++;

}}

//====================================voidmain(void){

unsignedchardd,i,j;

dd=i2c_read(0x00);

dd++;

j=dd;

i2c_write(0x00,dd);

while(1)

{

convert(dd);

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

{

P0=LED_seg[LED_buf[i]];

P1=LED_bit[i];

delay(500);

}if(reset==0)

{

dd=0x00;

i2c_write(0x00,dd);//寫入0x00

}

}

}/*====================================i2c_write(地址,數(shù)據(jù)),寫一個字節(jié)====================================*/voidi2c_write(unsignedcharAddress,unsignedcharData){

do{

i2c_start();

i2c_send8bit(0xA0);

}while(i2c_ack());

i2c_send8bit(Address);

i2c_ack();

i2c_send8bit(Data);

i2c_ack();

i2c_stop();}/*====================================i2c_read(地址,數(shù)據(jù)),讀一個字節(jié)===================================*/unsignedchari2c_read(unsignedcharAddress){

unsignedcharc;

do{

i2c_start();

i2c_send8bit(0xA0);

}while(i2c_ack());//=1,表示無確認(rèn),再次發(fā)送

i2c_send8bit(Address);

i2c_ack();do{

i2c_start();

i2c_send8bit(0xA1);

}while(i2c_ack());

c=i2c_receive8bit();

i2c_ack();

i2c_stop();

return(c);}//=====================================//發(fā)送開始信號voidi2c_start(void){

SDA=1;

SCL=1;

SDA=0;

SCL=0;

//return;}//發(fā)送結(jié)束信號voidi2c_stop(void){

SCL=0;

SDA=0;

SCL=1;

SDA=1;

//return;}//發(fā)送接收確認(rèn)信號bit

i2c_ack(void){

bitack;

SDA=1;

SCL=1;

delay(200);

if(SDA==1)ack=1;

elseack=0;

SCL=0;

return(ack);}//送8位數(shù)據(jù)voidi2c_send8bit(unsignedcharb){

unsignedchari=8;

while(i--)

{

SCL=0;

SDA=(bit)(b&0x80);b<<=1;

SCL=1;

}

SCL=0;}//IIC接收8位數(shù)據(jù)unsignedchari2c_receive8bit(void){

unsignedchari=8;

unsignedchardat=0;

SDA=1;

while(i--)

{

dat<<=1;

SCL=0;

SCL=1;

dat|=SDA;

}

SCL=0;

return(dat);}五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺、ISP在線編程軟件。六、思考與分析

(1)說明IIC總線的操作過程。(2)說明24C04的操作過程。

實(shí)驗(yàn)五SPI總線實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模?)了解SPI總線的特點(diǎn)。(2)掌握SPI器件的讀寫程序設(shè)計方法及與AT89S5x連接的接口電路設(shè)計方法。(3)掌握模擬SPI總線編程方法。二、實(shí)驗(yàn)原理

SPI(SerialPeripheralInterface,串行外設(shè)接口)總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息。外圍設(shè)備有FlashRAM、網(wǎng)絡(luò)控制器、LCD顯示驅(qū)動器、A/D轉(zhuǎn)換器和MCU等。SPI總線系統(tǒng)可直接與各個廠家生產(chǎn)的多種標(biāo)準(zhǔn)外圍器件直接接口,該接口一般使用4條線:串行時鐘線(SCK)、主機(jī)輸入/從機(jī)輸出數(shù)據(jù)線MISO、主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI和低電平有效的從機(jī)選擇線CS(有的SPI接口芯片帶有中斷信號線INT,有的SPI接口芯片沒有主機(jī)輸出/從機(jī)輸入數(shù)據(jù)線MOSI)。由于SPI系統(tǒng)總線一共只需3~4位數(shù)據(jù)線即可實(shí)現(xiàn)與具有SPI總線接口功能的各種I/O器件進(jìn)行接口,而擴(kuò)展并行總線則需要8根數(shù)據(jù)線、8~16位地址線、2~3位控制線,因此,采用SPI總線接口可以簡化電路設(shè)計,節(jié)省很多常規(guī)電路中的接口器件和I/O口線,提高設(shè)計的可靠性。由此可見,在MCS51系列等不具有SPI接口的單片機(jī)組成的智能儀器和工業(yè)測控系統(tǒng)中,當(dāng)傳輸速度要求不是太高時,使用SPI總線可以增加應(yīng)用系統(tǒng)接口器件的種類,提高應(yīng)用系統(tǒng)的性能。

AT93C46與單片機(jī)的接口如圖8-7所示:單片機(jī)的T0作為AT93C46的時鐘信號(SCK);單片機(jī)的A15作為AT93C46的片選信號(CS),片選通過跳線J403完成;單片機(jī)的A14作為AT93C46的數(shù)據(jù)輸入(MOSI);單片機(jī)的A13作為AT93C46的數(shù)據(jù)輸出(MISO)。AT93C46的ORG外接低電平時,表示AT93C46是作為128×8存儲器使用的,如果ORG接高電平,則表示AT93C46是作為64×16存儲器使用的。本實(shí)驗(yàn)中ORG接低電平。圖8-7

AT93C46的應(yīng)用原理圖對于不帶SPI串行總線接口的MCS51系列單片機(jī)來說,可以使用軟件來模擬SPI的操作,包括串行時鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出。對于不同的串行接口外圍芯片,它們的時鐘時序是不同的。對于在SCK的上升沿輸入(接收)數(shù)據(jù)和在下降沿輸出(發(fā)送)數(shù)據(jù)的器件,一般應(yīng)將其串行時鐘輸出口P3.4的初始狀態(tài)設(shè)置為1,而在允許接口后再置P3.4為0。這樣,MCU在輸出1位SCK時鐘的同時,將使接口芯片串行左移,從而輸出1位數(shù)據(jù)至單片機(jī)的P2.5(A13)口(模擬MCU的MISO線),此后再置P2.5為1,使MCS51系列單片機(jī)從A14(模擬MCU的MOSI線)輸出1位數(shù)據(jù)(先為高位)至串行接口芯片。至此,模擬1位數(shù)據(jù)輸入/輸出便宣告完成。此后再置P1.1為0,模擬下一位數(shù)據(jù)的輸入/輸出……依此循環(huán)8次,即可完成一次通過SPI總線傳輸8位數(shù)據(jù)的操作。注意:模擬的SPI總線調(diào)試最好用存儲示波器調(diào)試,這樣可以看到完整波形,讀者需詳細(xì)閱讀AT93C46文檔中的時序部分內(nèi)容。三、實(shí)驗(yàn)內(nèi)容

(1)將擴(kuò)展板的2*13接口J401與ND1000_002的2*13接口J5或J12連接起來。

(2)將AT93C46的J405用跳線帽與地連接;將J403用跳線帽連接。

(3)將ND1000_002上的撥插開關(guān)5、6、7、8撥到ON。

(4)給系統(tǒng)供電(+5V)。

(5)在Keil環(huán)境下編寫程序,要求上電后寫入10個數(shù)據(jù),分別是0~9,寫入后,將寫入的數(shù)據(jù)循環(huán)讀出,然后顯示。最后,清0,編譯生成.HEX文件,燒AT89S52芯片中。

(6)數(shù)碼管顯示一個從AT93C46中讀出的值。四、參考程序

93C46讀寫程序?qū)嵗?/p>

#include<reg51.h>

#include<intrins.h>

//defineOPcode

#defineOP_EWEN_H0x00//00writeenable

#defineOP_EWEN_L0x60//11XXXXXwriteenable

#defineOP_EWDS_H0x00//00disable

#defineOP_EWDS_L0x00//00XXXXXdisable

#defineOP_WRITE_H0x40//01A6-A0writedata

#defineOP_READ_H0x80//10A6-A0readdata

#defineOP_ERASE_H0xc0//11A6-A0eraseaword

#defineOP_ERAL_H0x00//00eraseall

#defineOP_ERAL_L0x40//10XXXXXeraseall#defineOP_WRAL_H0x00//00writeall#defineOP_WRAL_L0x20//01XXXXXwriteallsbitCS=P2∧7;sbitSK=P3∧4;sbitDI=P2∧6;sbitDO=P2∧5;unsignedcharcodedis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsignedcharLED_bit[4]={0xF1,0xF2,0xF4,0xF8};unsignedLED_buf[4]={0,0,0,0};voidewen();voidewds();voiderase();voidwrite(unsignedcharaddr,unsignedcharindata);unsignedcharread(unsignedcharaddr);voidinop(unsignedcharop_h,unsignedcharop_l);voidshin(unsignedcharindata);unsignedcharshout();voiddelayms(unsignedcharms);voiddelay(unsignedcharn);//---------------main函數(shù)-----------------main(){

unsignedchari,j;

CS=0;

SK=0;

DI=1;

DO=1;

ewen();

erase();

for(i=0;i<10;i++)//寫入顯示代碼到AT93C46

{write(i,dis_code[i]);

delay(10);//-------------

}

ewds();

i=0;

while(1){

j=read(i);

P0=j;//循環(huán)讀取AT93C46內(nèi)容,并輸出到P0口

P1=LED_bit[0];

i++;

i&=0x0F;

if(i==0x0A)i=0;

delayms(250);

delayms(250);

}}//---------------主函數(shù)--------------------voidwrite(unsignedcharaddr,unsignedcharindata)

//寫入數(shù)據(jù)indata到addr{

inop(OP_WRITE_H,addr);

shin(indata);

CS=0;

delayms(10);}unsignedcharread(unsignedcharaddr)//讀取addr處的數(shù)據(jù){

unsignedcharout_data;

inop(OP_READ_H,addr);

delay(10);

out_data=shout();

CS=0;

returnout_data;}voidewen(){

inop(OP_EWEN_H,OP_EWEN_L);

CS=0;}voidewds(){

inop(OP_EWDS_H,OP_EWDS_L);

CS=0;}voiderase(){

inop(OP_ERAL_H,OP_ERAL_L);

delayms(30);

CS=0;}voidinop(unsignedcharop_h,unsignedcharop_l){

unsignedchari;

SK=0;

DI=1;

CS=1;

delay(10);

SK=1;

delay(20);

SK=0;

delay(10);

DI=(bit)(op_h&0x80);//先移入指令碼高位

SK=1;

delay(10);

op_h<<=1;SK=0;

delay(10);

DI=(bit)(op_h&0x80);//移入指令碼次高位

SK=1;

delay(10);

SK=0;

op_l<<=1;

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

{

DI=(bit)(op_l&0x80);//先移入高位

SK=1;

delay(10);

op_l<<=1;

SK=0;

}

DI=1;}voidshin(unsignedcharindata)//移入數(shù)據(jù){

unsignedchari;

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

{

DI=(bit)(indata&0x80);//先移入高位

SK=1;

delay(10);

indata<<=1;

SK=0;

}

DI=1;}unsignedcharshout(void)//移出數(shù)據(jù){

unsignedchari,out_data;

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

{

SK=1;

delay(10);

out_data<<=1;

SK=0;

out_data|=(unsignedchar)DO;

}

return(out_data);}voiddelayms(unsignedcharms)//延時子程序{

unsignedchari;

while(ms--)

{

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

}}voiddelay(unsignedcharn){

for(;n>0;n--);}

五、實(shí)驗(yàn)儀器和設(shè)備

Keil軟件、AT89S52實(shí)驗(yàn)平臺、ISP在線編程軟件、示波器。六、思考與分析(1)說明單片機(jī)完成SPI總線操作的方法。(2)修改程序?yàn)槊看紊想姾髮?~9存儲器里面的內(nèi)容讀出,然后加1,顯示。實(shí)驗(yàn)六實(shí)時時鐘DS12C887實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?/p>

(1)理解單片機(jī)并口編程方法。(2)掌握DS12C887的編程方法。(3)了解DS12C887的原理。(4)了解實(shí)時時鐘的設(shè)計方法。二、實(shí)驗(yàn)原理

DS12C887是Dallas公司開發(fā)的實(shí)時時鐘芯片。DS12C887可以提供實(shí)時時鐘/日歷、時間報警、三個可屏蔽中斷、一個可編程方波輸出、113B電池供電的靜態(tài)RAM。DS12C887內(nèi)部集成了一個晶體和一個鋰電池,采用DIP(雙列直插)封裝方式。DS12C887在32H地址增加了100個字節(jié)的存儲器。DS12C887能夠自動調(diào)整31天和30天的月份,期間可以在24小時和12小時方式(AM/PM)間切換。在芯片內(nèi)部有一個精確的溫度補(bǔ)償電路,用于檢測電源電壓的狀態(tài)。當(dāng)電源電壓的變化超出允許范圍時,內(nèi)部電源切換到備用電池供電。

DS12C887主要應(yīng)用在嵌入式系統(tǒng)、儀表、安全系統(tǒng)、網(wǎng)絡(luò)交換機(jī)、路由器等方面。

DS12C887在該實(shí)驗(yàn)系統(tǒng)中的應(yīng)用及讀寫信號與單片機(jī)的接口如圖8-8所示。A15通過跳線J407作為DS12C887的片選信號。實(shí)驗(yàn)系統(tǒng)工作原理:INT0用于進(jìn)入設(shè)置,當(dāng)該鍵按下時,就進(jìn)入時間設(shè)置,再次按下時,進(jìn)入下一個時間設(shè)置,此點(diǎn)可以參考后面的參考程序的操作。DOWN和UP用于減少和增加當(dāng)前設(shè)置的值,OK用于退出時間設(shè)置。圖8-8

DS12C887應(yīng)用原理圖三、實(shí)驗(yàn)內(nèi)容

(1)將擴(kuò)展板的電源J501與主板的電源接口J2或J14連接起來;將擴(kuò)展板的信號接口J500與主板的信號接口J15或J13連接起來;將主板上的液晶跳線接上。

(2)在Keil編程環(huán)境下編寫程序,完成實(shí)驗(yàn)功能要求:能顯示年月日,而且時間能夠通過鍵盤設(shè)置。

(3)編譯生成.HEX文件,并將.HEX文件下載到實(shí)驗(yàn)系統(tǒng)中,觀察液晶屏上顯示的數(shù)據(jù),同時用鍵盤設(shè)置時間參數(shù)。四、參考程序

//說明:6位數(shù)碼管顯示時,分,秒;鍵盤可調(diào)時間

//晶振為11.0592MHz

#include<reg51.h>

#include<absacc.h>

sbitRESET=P3∧2; //鍵盤

sbitOK=P3∧4; //鍵盤

sbitINC=P2∧1; //鍵盤

sbitDEC=P2∧2; //鍵盤

sbitRS=P1∧0;//指令和數(shù)據(jù)寄存器

sbitRW=P1∧1;//讀寫控制

sbitE=P1∧2;//片選

sbitFLAG=P0∧7;//忙信號

#defineucharunsignedchar#definetime_aXBYTE[0x7f0a]//控制寄存器A#definetime_bXBYTE[0x7f0b] //控制寄存器B#definedata_IOP0uchartime[12]={0};ucharxdata*addr=0x7f00;//P2.7片選,低電平有效ucharyear,month,day,hour,minute,second;//聲明函數(shù)voidget_time(void);voidintial(void);intial_lcd();voidbusy();voidw_com(ucharcom);voidw_dat(uchardat);voiddisplay();voiddelay(unsignedlongN);voiddisplayD(ucharj);voidconvert(void);voidINT0_ISR();voidget_time(void){

year=*(addr+9);

month=*(addr+8);

day=*(addr+7);

hour=*(addr+4);

minute=*(addr+2);

second=*addr;}voidintial(void){

time_a=0x70;

time_b=0x8e;//可以設(shè)置12、24小時制 *(addr+2)=0x00;//分初值:30 *(addr+4)=0x0C; //時初值:12 *(addr+7)=0x10; //日初值:16 *(addr+8)=0x07; //月初值:07 *(addr+9)=0x07; //年初值:07

time_a=0x27;

time_b=0x1e;//設(shè)置最高位為0,芯片更新,正常運(yùn)行}//-----------------液晶顯示--------------intial_lcd(){

RS=0;

RW=0;

E=0;

delay(100);

w_com(0x38);

w_com(0x38);

w_com(0x38);//顯示為8位兩行字符

w_com(0x08);

w_com(0x01);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論