版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)教務(wù)年終總結(jié)匯報
- 四川省眉山市東坡區(qū)眉山育英實(shí)驗(yàn)學(xué)校2024-2025學(xué)年高一上學(xué)期1月期末地理試題( 含答案)
- 電氣物資知識培訓(xùn)課件
- 2025年度智能安防SAAS解決方案銷售服務(wù)協(xié)議2篇
- 醫(yī)學(xué)基礎(chǔ)知識培訓(xùn)課件
- 河北省張家口市萬全區(qū)2024-2025學(xué)年八年級上學(xué)期1月期末考試生物試卷(含答案)
- 遼寧省葫蘆島市(2024年-2025年小學(xué)六年級語文)人教版課后作業(yè)(下學(xué)期)試卷及答案
- 2024年事業(yè)單位教師招聘言語理解與表達(dá)題庫附參考答案【突破訓(xùn)練】
- 貴州盛華職業(yè)學(xué)院《個人理財學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 新疆巴音郭楞蒙古自治州(2024年-2025年小學(xué)六年級語文)部編版階段練習(xí)(上學(xué)期)試卷及答案
- 科教版2023-2022小學(xué)五年級科學(xué)上冊期末試卷及答案
- 3360機(jī)dp c2255維修手冊中文版06chapgeneral
- 北京生命科技研究院有限公司招聘考試真題2022
- (42)-妊娠合并內(nèi)外科疾病
- 骨科手術(shù)后患者營養(yǎng)情況及營養(yǎng)不良的原因分析,骨傷科論文
- 糕點(diǎn)生產(chǎn)檢驗(yàn)記錄表
- GB/T 1040.3-2006塑料拉伸性能的測定第3部分:薄膜和薄片的試驗(yàn)條件
- 河北省房屋建筑和市政基礎(chǔ)設(shè)施施工圖設(shè)計文件審查要點(diǎn)(版)
- 醫(yī)院院長年終工作總結(jié)報告精編ppt
- 綠化養(yǎng)護(hù)重點(diǎn)難點(diǎn)分析及解決措施
- “三排查三清零”回頭看問題整改臺賬
評論
0/150
提交評論