版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
PAGEPAGE2北航單片機(jī)原理及其應(yīng)用實(shí)驗(yàn)報(bào)告班級:110323姓名:趙敏杰學(xué)號:11031064同組者:鄭碩學(xué)號:11031105實(shí)驗(yàn)一單片機(jī)開發(fā)環(huán)境以及I/O使用實(shí)驗(yàn)一.實(shí)驗(yàn)?zāi)康?.熟悉MCS-51系列單片機(jī)開發(fā)軟件的使用2.掌握單片機(jī)I/O口的使用3.學(xué)習(xí)延時子程序的編寫和使用二.實(shí)驗(yàn)內(nèi)容1.驗(yàn)證性實(shí)驗(yàn)(1)實(shí)驗(yàn)內(nèi)容:I/O口做輸出口,I/O口接一個LED發(fā)光二極管,使其閃爍。有關(guān)說明:根據(jù)LED的單向?qū)ㄐ?,可以用單片機(jī)的P1.0(也可以是其他I/O口)作為LED的控制端。當(dāng)P1.0輸出為低電平時,LED滅,反之,LED亮。本實(shí)驗(yàn)系統(tǒng)晶振為11.0592MHz,則一個機(jī)器周期為12/11.0592us=1.085us,為方便編寫延時函數(shù),認(rèn)為一個機(jī)器周期為1us。硬件連接:用導(dǎo)線將試驗(yàn)箱中的P1.0與L1相連。程序:C語言程序#include<AT89X52.H>//89S52寄存器定義頭文件/*延時子程序(有參函數(shù)),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}/*主函數(shù)*/voidmain() { P1=0x01; for(i=1;i<=8;i++) {delay(100); P1=P1<<1; if(P0_1!=0|P0_0!=0) break; } } if(P0_1==0&P0_0==1) { P1=0x80; for(i=1;i<=8;i++) {delay(100); P1=P1>>1; if(P0_1!=0|P0_0!=1) break; } } if(P0_1==1&P0_0==0) { P1=0x01; for(i=1;i<=4;i++) {delay(100); P1=P1<<2; if(P0_1!=1|P0_0!=0) break;}P1=0x02; for(i=1;i<=4;i++) {delay(100); P1=P1<<2; if(P0_1!=1|P0_0!=0) break; } } if(P0_1==1&P0_0==1) {P1=0xff; delay(100); P1=0x00; delay(100); if(P0_1!=1|P0_0!=1) break; }}}三.實(shí)驗(yàn)分析與感想本次實(shí)驗(yàn)的內(nèi)容是單片機(jī)的開發(fā)環(huán)境以及I/O的使用,主要要求我們熟悉MCS-51系列單片機(jī)開發(fā)軟件的使用,掌握單片機(jī)I/O口和延時子程序的使用。第一次接觸編寫程序的軟件有些不熟練,慢慢摸索之后逐漸掌握了編寫和倒入單片機(jī)的過程,但是由于電腦串口的問題,經(jīng)常出現(xiàn)串口被占用的情況,多次檢查之后仍然不能排除錯誤,最后重啟電腦之后可以繼續(xù)完成實(shí)驗(yàn),但一兩次使用之后又出現(xiàn)串口的情況,十分奇怪,最近不得不換電腦才能完成實(shí)驗(yàn)。本次實(shí)驗(yàn)基本完成了老師要求的內(nèi)容,但由于串口被占用的情況,被浪費(fèi)太多時間,以至于最后一個實(shí)驗(yàn)沒有完全完成,但整體思想及程序上已沒有問題。第二次實(shí)驗(yàn)二單片機(jī)中斷及定時器使用實(shí)驗(yàn)一.實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)外部中斷技術(shù)的基本使用方法及中斷處理的編程方法。2.學(xué)習(xí)單片機(jī)定時器的基本使用方法及其編程方法。二.實(shí)驗(yàn)內(nèi)容1.驗(yàn)證性實(shí)驗(yàn)(1)實(shí)驗(yàn)內(nèi)容:外部中斷的實(shí)驗(yàn),8路LED做流水燈,當(dāng)接收到外部中斷后,LED全部點(diǎn)亮一段時間,之后恢復(fù)到流水燈狀態(tài)。有關(guān)說明:采用外部中斷0負(fù)邊沿產(chǎn)生中斷信號,中斷響應(yīng)函數(shù)應(yīng)盡量簡潔。硬件連接:用導(dǎo)線將實(shí)驗(yàn)箱中的P1.0~P1.7分別與LED發(fā)光二極管L1~L8相連。INT0與負(fù)脈沖相連(硬件在實(shí)驗(yàn)箱的具體位置可以參照文檔最后面的附圖)。程序:C語言程序#include<regx51.h>unsignedcharSTATE;unsignedchars0;/*延時子程序(有參函數(shù)),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}voidmain(){EA=1;//CPU開中斷EX0=1;//開外部中斷0IT0=1;//邊沿觸發(fā)方式s0=0x01;while(1){if(!STATE)//如果標(biāo)志位STATE為0,則做流水燈{P1=s0;s0=s0<<1;if(s0==0x00)s0=0x01;delay(30);}else//如果標(biāo)志位STATE為1,則LED全亮{STATE=0;P1=0xff;delay(100);}}}/*中斷服務(wù)函數(shù)*/voidint0()interrupt0{STATE=1;}//標(biāo)志位STATE置1匯編語言程序ORG0000HJMPSTART;在首地址處放置跳轉(zhuǎn)指令;以免主程序占用中斷入口地址ORG0003H;外部中斷0程序入口地址JMPINTORG0030HSTART:SETBEA;CPU開中斷SETBEX0;開外部中斷0SETBIT0;邊沿觸發(fā)方式MOVA,#01HCALLLOOPLOOP:MOVP1,AMOVR0,#30;R0的值決定延時時間長短;t=R0*10msCALLDELAY;調(diào)用延時函數(shù)RLA;移位JMPLOOP;無條件跳轉(zhuǎn)至LOOP,繼續(xù)循環(huán)執(zhí)行/*外部中斷0中斷程序*/INT:MOVB,#0FFHMOVP1,BMOVR0,#30CALLDELAYRETI/*延時子程序,t=R0*10ms*/DELAY:D1:MOVR1,#20D2:MOVR2,#248DJNZR2,$DJNZR1,D2DJNZR0,D1RETEND實(shí)驗(yàn)現(xiàn)象:可以看到在沒有中斷的時候,8路LED從右至左流水點(diǎn)亮,當(dāng)外部中斷脈沖到來以后8路LED全部點(diǎn)亮一段時間,之后恢復(fù)流水點(diǎn)亮狀態(tài)。(2)實(shí)驗(yàn)內(nèi)容:定時器實(shí)驗(yàn),8路LED所表示的二進(jìn)制數(shù)每定時0.5s增1。有關(guān)說明:實(shí)驗(yàn)箱單片機(jī)使用的晶振頻率為11.0592MHz,在計(jì)算定時器初值的時候要注意。在匯編語言中,數(shù)據(jù)長度只支持到8位,因此在用定時器定時的時候要注意到這一點(diǎn)。硬件連接:用導(dǎo)線將實(shí)驗(yàn)箱中的P1.0~P1.7分別與LED發(fā)光二極管L1~L8相連。程序:C語言程序#include<regx51.h>inttime;voidmain(){TMOD=0x01;//定時器0工作方式1TH0=64614/256;//計(jì)算初值TL0=64614%256;EA=1;//CPU開中斷ET0=1;//開定時器中斷0TR0=1;//開啟定時器0并開始工作while(1);//等待中斷}/*定時器0中斷服務(wù)函數(shù)*/voidtime0()interrupt1{time++;//每1ms,time加1if(time==500)//time加滿500次后,0.5s時間到{time=0;//time清零,重新計(jì)數(shù)P1++;}TH0=64614/256;//重新裝載定時器初值TL0=64614%256;}匯編語言參考程序ORG0000HJMPSTART;在首地址處放置跳轉(zhuǎn)指令;以免主程序占用中斷入口地址ORG000BH;定時器0程序入口地址JMPET0PORG0030HSTART:MOVTMOD,#01H;定時器0,工作方式1MOVTH0,#4CH;定時器裝載初值,50ms中斷一次MOVTL0,#00H;這里需要注意,前面的c程序定時時間為;1ms,這里匯編定時時間為50ms,因?yàn)閰R編;數(shù)據(jù)長度只支持到8位,如果定時時間為1ms,;500ms需要中斷500次,匯編無法支持,所以;定時時間改為50msSETBEA;CPU開中斷SETBET0;開定時器中斷SETBTR0;定時器開始工作MOVA,#0AHCALLLOOPLOOP:CJNEA,#00H,LOOP;A不等于零,跳轉(zhuǎn)LOOPINCB;B加1MOVP1,BMOVA,#0AHJMPLOOP;/*定時器0中斷程序*/ET0P:DECA;A減1MOVTH0,#4CHMOVTL0,#00HRETIEND實(shí)驗(yàn)現(xiàn)象:可以看到用P1口所接的8路LED表示的二進(jìn)制數(shù)每隔0.5s加1。2.設(shè)計(jì)性實(shí)驗(yàn)實(shí)驗(yàn)內(nèi)容:模擬救護(hù)車優(yōu)先的交通燈控制實(shí)驗(yàn)具體要求:具體要求為用兩組不同顏色的LED分別模仿兩個路口的“紅燈”、“綠燈”、“黃燈”。平時兩組交通燈按規(guī)律點(diǎn)亮,具體規(guī)律為:南北路口:綠燈(5s)黃燈(2s)紅燈(5s)黃燈(2s)綠燈(5s)……東西路口:紅燈(5s)黃燈(2s)綠燈(5s)黃燈(2s)紅燈(5s)……當(dāng)救護(hù)車來時(用負(fù)脈沖觸發(fā)外部中斷表示救護(hù)車到來),兩個路口馬上都變成紅燈讓救護(hù)車優(yōu)先通過,紅燈保持3s,待救護(hù)車通過以后,兩個路口的交通燈恢復(fù)正常的工作狀態(tài)。實(shí)驗(yàn)中的交通燈點(diǎn)亮的時間需要用定時器精確定時,不能使用延時函數(shù)。硬件連接:INT0與負(fù)脈沖相連,LED與單片機(jī)的連接沒有固定要求,下圖只是提供一種參考接法。程序:#include<regx51.h>unsignedcharSTATE;unsignedchars0;/*延時子程序(有參函數(shù)),t=n*10ms*/voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}voidmain(){EA=1;//CPU開中斷EX0=1;//開外部中斷0IT0=1;//邊沿觸發(fā)方式s0=0x01;while(1){if(!STATE)//如果標(biāo)志位STATE為0,則做流水燈{P1=s0;s0=s0<<1;if(s0==0x00)s0=0x01;delay(30);}else//如果標(biāo)志位STATE為1,則LED全亮{STATE=0;P1=0xff;delay(100);}}}/*中斷服務(wù)函數(shù)*/voidint0()interrupt0{STATE=1;}//標(biāo)志位STATE置1#include<regx51.h>inttime,i;unsignedcharSTATE;unsignedcharm;voiddelay(unsignedcharn){unsignedchari,j,k;for(i=0;i<n;i++)for(j=0;j<14;j++)for(k=0;k<237;k++);}voidmain(){TMOD=0x01;//定時器0工作方式1TH0=64614/256;//計(jì)算初值TL0=64614%256;EA=1;//CPU開中斷ET0=1;//開定時器中斷0TR0=1;//開啟定時器0并開始工作EX0=1;//開外部中斷0IT0=1;//邊沿觸發(fā)方式while(1);}/*定時器0中斷服務(wù)函數(shù)*/voidtime0()interrupt1{time++;//每1ms,time加1if(time<5000)P1=0x21;if(time>=5000&&time<=7000){P1=0x12;}if(time>=7000&&time<=12000){P1=0x0c;}if(time>=12000&&time<=14000){P1=0x12;}if(time>14000){time=0;}TH0=64614/256;//重新裝載定時器初值TL0=64614%256;}voidint0()interrupt0{P1=0x24;ET1=1;TR1=1;TH1=64614/256;//重新裝載定時器初值TL1=64614%256;while(m<=3000);ET1=0;TR1=0;}voidt1()interrupt3{m++;TH1=64614/256;//重新裝載定時器初值TL1=64614%256;}三.實(shí)驗(yàn)分析與感想本次實(shí)驗(yàn)是單片機(jī)中斷及定時器使用實(shí)驗(yàn),要求我們學(xué)習(xí)外部中斷技術(shù)的基本使用方法及中斷處理的編程方法,學(xué)習(xí)單片機(jī)定時器的基本使用方法及其編程方法。前兩個小實(shí)驗(yàn)都比較順利,分別利用了中斷和定時器的功能。只要注意一下實(shí)驗(yàn)使用的LED燈是共陽的還是共陰的,應(yīng)該就可以較順利完成。第三個設(shè)計(jì)性實(shí)驗(yàn)綜合了前兩個實(shí)驗(yàn)的內(nèi)容,而且要求中出現(xiàn)了三個時間,但是51單片機(jī)沒有三個定時器,故要利用軟件的輔助才能完成。但是始終沒有結(jié)果,調(diào)試將近半節(jié)課還是不行,在老師的幫助下再次調(diào)試,發(fā)現(xiàn)單片機(jī)出現(xiàn)了問題。這讓我領(lǐng)悟到:出現(xiàn)問題不要一味埋頭找程序錯誤或者硬件連接錯誤,應(yīng)該靈活的判斷器件是否出現(xiàn)了故障。這會讓我們節(jié)約很多時間,少走一些彎路。實(shí)驗(yàn)三單片機(jī)串口使用實(shí)驗(yàn)一.實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)單片機(jī)與上位機(jī)串行通信的基本使用方法。2.學(xué)習(xí)動態(tài)數(shù)碼管顯示的基本使用方法。二.實(shí)驗(yàn)內(nèi)容1.驗(yàn)證性實(shí)驗(yàn)(1)實(shí)驗(yàn)內(nèi)容:單片機(jī)串行接收數(shù)據(jù)實(shí)驗(yàn):6位數(shù)碼管通過動態(tài)掃描作為顯示模塊,上位機(jī)通過串口調(diào)試助手以十六進(jìn)制形式向單片機(jī)發(fā)送‘00’-‘ff’范圍內(nèi)的數(shù)據(jù),波特率為9600,單片機(jī)接收到數(shù)據(jù)以后,在數(shù)碼管的最后兩位顯示出來,數(shù)碼管其它位熄滅。有關(guān)說明:LED數(shù)碼管顯示是單片機(jī)應(yīng)用系統(tǒng)中最常用、最基本的輸出設(shè)備,用戶可以利用顯示器件顯示各種需要輸出的視覺信息,實(shí)現(xiàn)人機(jī)對話。單片機(jī)對數(shù)碼管的顯示方式可分為靜態(tài)顯示與動態(tài)顯示兩種。靜態(tài)顯示中每一個數(shù)碼管需要一個獨(dú)立的輸出口控制,靜態(tài)顯示的特點(diǎn)是顯示程序簡單、亮度高、穩(wěn)定性好、占用CPU時間少,但占用的I/O口較多,所以靜態(tài)顯示常用在顯示器數(shù)目較少的應(yīng)用系統(tǒng)中。當(dāng)顯示位數(shù)較多時,可以采用動態(tài)顯示。動態(tài)顯示是指數(shù)碼管輪流地顯示各自的字符,每位數(shù)碼管都在顯示和熄滅兩個狀態(tài)中循環(huán),同一時間只有一位數(shù)碼管處于顯示狀態(tài)。動態(tài)顯示的特點(diǎn)是線路簡單、硬件成本相對較低,但需要不斷刷新、掃描I/O口,占用CPU時間較多。動態(tài)數(shù)碼管控制原理:采用各位數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示頻率較高時,由于人眼的暫留特性,看不出閃爍顯示現(xiàn)象,這種顯示需要一個接口完成字型碼的輸出(字形選擇),另一接口完成各數(shù)碼管的輪流點(diǎn)亮(數(shù)位選擇)。AT89S52有UART可編程的全雙工串行口用于串行通信,由TXD發(fā)送數(shù)據(jù),RXD接收外部輸入的數(shù)據(jù)。具有兩個緩沖器SBUF,一個作發(fā)送緩沖器,另一個作接收緩沖器,它們擁有相同的名字和地址空間,但不會出現(xiàn)沖突,因?yàn)橐粋€只能讀出數(shù)據(jù),一個只能寫入數(shù)據(jù)。硬件連接:首先將實(shí)驗(yàn)箱上的LD0——LD5與S0——S5之間的短路冒全部拔去,a——h與B0——B3、A0——A3之間的短路帽也全部拔去,將短路帽插到雙排插針中的一根針上,防止丟失,做完實(shí)驗(yàn)再重新插回去。之后將LD0——LD5與P2_0——P2_5用導(dǎo)線相連,a——h與P1_0——P1_7用導(dǎo)線相連,最后還需要將串口插到電腦上,串口線的另一端與實(shí)驗(yàn)箱的J13相連,注意引腳排列順序。程序:C語言程序#include<reg52.h>#defineucharunsignedchar//變量類型定義ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//七段碼0--70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//七段碼8--f,最后一碼0x00作用為熄滅數(shù)碼管ucharsegment[6];//段選ucharbyte[6];//位選ucharplay[6]={0,0,0,0,0,0};//要顯示的數(shù)字uchark;uchard;voidDisplay_Init();//數(shù)碼管顯示初始化voidUart_Init();//串口初始化voidDisplay();//數(shù)碼管顯示函數(shù)/*數(shù)碼管顯示初始化*/voidDisplay_Init()//初始化,通過定時器,按固定頻率掃描數(shù)碼管{TMOD=TMOD|0x01;//定時器0,工作方式1TH0=0xfc;//計(jì)算初值,定時時間為1msTL0=0x66;EA=1;//CPU開中斷ET0=1;//開定時器中斷0TR0=1;//開啟定時器0并開始工作}5/*串口初始化*/voidUart_Init(){TMOD=TMOD|0x20;//定時器1,工作方式2TH1=0xfd;//波特率為9600TL1=0xfd;SCON=0x50;//設(shè)置定時器工作方式PCON=0;EA=1;//CPU開中斷ES=1;//允許串口中斷TR1=1;//定時器1開始工作}/*掃描數(shù)碼管數(shù)據(jù)顯示函數(shù)*/voidDisplay(){ucharn=0;ucharm=0x01;for(n=0;n<6;n++){if(play[n]>0x0f)segment[n]=0x10;//顯示的數(shù)據(jù)大于0x0f,則該位熄滅elsesegment[n]=play[n];byte[n]=m;m=m<<1;}}/*主函數(shù)*/voidmain(void){Uart_Init();Display_Init();play[0]=0x00;play[1]=0x00;play[2]=0xff;play[3]=0xff;play[4]=0xff;play[5]=0xff;while(1)6{Display();}}/*定時器0中斷服務(wù)函數(shù)*/voidtime0()interrupt1{P1=table[segment[k]];P2=byte[k];k++;if(k==6)k=0;TH0=0xfc;//重新裝載初值TL0=0x66;}voiduart()interrupt4{if(RI)//接收標(biāo)志位{d=SBUF;//讀取串口發(fā)來的數(shù)據(jù)play[1]=d/0x10;play[0]=d%0x10;RI=0;//清除接收標(biāo)志位}}實(shí)驗(yàn)現(xiàn)象:單片機(jī)復(fù)位以后,最后兩位數(shù)碼管顯示‘00’,其它位數(shù)碼管則熄滅,當(dāng)上位機(jī)通過串口發(fā)送數(shù)據(jù)時,數(shù)碼管的后兩位顯示數(shù)據(jù)。(2)實(shí)驗(yàn)內(nèi)容:單片機(jī)串行發(fā)送數(shù)據(jù)實(shí)驗(yàn),波特率為9600,外部中斷INT0與負(fù)脈沖相連,對脈沖個數(shù)進(jìn)行計(jì)數(shù),將計(jì)數(shù)結(jié)果以字符形式通過串口發(fā)送到上位機(jī)。上位機(jī)通過串口調(diào)試助手以字符形式顯示計(jì)數(shù)結(jié)果。有關(guān)說明:以字符形式發(fā)送不同于十六進(jìn)制形式發(fā)送,發(fā)送計(jì)數(shù)結(jié)果時,百位、十位、個位要分別發(fā)送,發(fā)送的時候要轉(zhuǎn)換成對應(yīng)的ASCII碼。硬件連接:用導(dǎo)線將實(shí)驗(yàn)箱中負(fù)脈沖與外部中斷INT0相連。程序:C語言程序#include<reg52.h>#defineucharunsignedchar//變量類型定義uchard;ucharSENT;voidInt0_Init();voidUart_Init();//串口初始化voidInt0_Init(){EA=1;//CPU開中斷EX0=1;//開外部中斷0IT0=1;//邊沿觸發(fā)方式}/*串口初始化***/voidUart_Init(){TMOD=0x20;//定時器1,工作方式2TH1=0xfd;//波特率為9600TL1=0xfd;SCON=0x50;//設(shè)置定時器工作方式PCON=0;TR1=1;//定時器1開始工作}/*主函數(shù)*/voidmain(void){Int0_Init();Uart_Init();while(1){if(SENT==1){SBUF=(d/100+0x30);while(TI==0);TI=0;SBUF=(d%100/10+0x30);while(TI==0);TI=0;8SBUF=(d%10+0x30);while(TI==0);TI=0;SBUF='';while(TI==0);TI=0;EX0=1;//重新開外部中斷SENT=0;}}}/*定時器0中斷服務(wù)函數(shù)*/voidInt0()interrupt0{d++;if(d==0xff)d=0;SENT=1;EX0=0;//關(guān)外部中斷,防止按鍵抖動引起干擾}實(shí)驗(yàn)現(xiàn)象:每按一下脈沖按鈕,串口調(diào)試助手接收到的計(jì)數(shù)值增1。2.設(shè)計(jì)性實(shí)驗(yàn)實(shí)驗(yàn)內(nèi)容:模擬上位機(jī)控制云臺實(shí)驗(yàn)具體要求:監(jiān)控行業(yè)通信協(xié)議應(yīng)用最廣的協(xié)議就是美國PELCO-P、PELCO-D協(xié)議,PELCO主控與前端解碼器是通過RS422\RS485通信格式傳輸,PELCO協(xié)議內(nèi)容包括云臺控制命令,攝像機(jī)控制命令,輔助控制命令,預(yù)置位設(shè)置和調(diào)用命令?,F(xiàn)在我們通過用RS232通信格式傳輸命令,模擬控制云臺,云臺控制協(xié)議選用PELCO-D協(xié)議。PELCO-D協(xié)議數(shù)據(jù)格式:1位起始位、8位數(shù)據(jù)、1位停止位,無效驗(yàn)位。波特率:2400B/S命令格式如下:1.該協(xié)議中所有數(shù)值都為十六進(jìn)制數(shù)2.同步字節(jié)始終為FFH3.地址碼為云臺的邏輯地址號,地址范圍:00H–FFH4.指令碼表示不同的動作5.數(shù)據(jù)碼1、2分別表示水平、垂直方向速度(00-3FH),FFH表示“turbo”速度6.校驗(yàn)碼=(字節(jié)2+字節(jié)3+字節(jié)4+字節(jié)5+字節(jié)6)/100H本次實(shí)驗(yàn)的具體要求為根據(jù)云臺控制的PELCO-D通訊協(xié)議,上位機(jī)通過串口調(diào)試軟件以PELCO-D的格式向下發(fā)送指令,發(fā)送指令應(yīng)以十六進(jìn)制格式發(fā)送。由于是模擬云臺控制,所以只需要模擬其中幾條常用的命令,命令具體如下:云臺向上運(yùn)動:0xff,0x01,0x00,0x08,0x00,0xff,0x08,云臺向下運(yùn)動:0xff,0x01,0x00,0x10,0x00,0xff,0x10,云臺向左運(yùn)動:0xff,0x01,0x00,0x04,0xff,0x00,0x04,云臺向右運(yùn)動:0xff,0x01,0x00,0x02,0xff,0x00,0x02,通過串口調(diào)試助手發(fā)送的時候只需以16進(jìn)制形式連續(xù)發(fā)送以下字符就可以了:上:ff01000800ff08下:ff01001000ff10左:ff010004ff0004右:ff010002ff0002單片機(jī)對接收到的命令進(jìn)行解析,如果是以上四條命令中的一條,則單片機(jī)通過用最低位數(shù)碼管對應(yīng)顯示‘A’、‘B’、‘C’、‘D’,其它位數(shù)碼管熄滅,如果接收到的命令不符合上面四條命令,則單片機(jī)向上位機(jī)發(fā)送“e”代表error的意思,同時用數(shù)碼管最低位顯示字母E。硬件連接:硬件連接與驗(yàn)證性實(shí)驗(yàn)的第一個實(shí)驗(yàn)的連線相同。程序:#include<AT89X52.h>#include<absacc.h> //儲存器分配宏定義#defineDATXBYTE[0x1B30]//數(shù)據(jù)口地址#defineCOMXBYTE[0x1B31]//命令/狀態(tài)口地址#defineucharunsignedchar//變量類型定義ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//七段碼0--70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//七段碼8--f,最后一碼0x00作用為熄滅數(shù)碼管ucharcodea[7]={0xff,0x01,0x00,0x08,0x00,0xff,0x08};ucharcodeb[7]={0xff,0x01,0x00,0x10,0x00,0xff,0x10};ucharcodec[7]={0xff,0x01,0x00,0x04,0xff,0x00,0x04};ucharcoded[7]={0xff,0x01,0x00,0x02,0xff,0x00,0x02};uchare[7]={0,0,0,0,0,0,0};uchark;ucharx;voidUart_Init();//串口初始化voidInit8279(); //8279初始化voidDisplay(uchara);//數(shù)碼管顯示函數(shù)/*串口初始化*/voidUart_Init(){TMOD=TMOD|0x20;//定時器1,工作方式2TH1=0xf4;//波特率為2400TL1=0xf4;SCON=0x50;//設(shè)置定時器工作方式PCON=0;EA=1;//CPU開中斷ES=1;//允許串口中斷TR1=1;//定時器1開始工作}/*8279初始化函數(shù)*/voidInit8279(void){ucharreg1;COM=0xd1;//11010001B,總清除命令do{reg1=COM;//讀狀態(tài)字,DU=1時,表示清除命令正在執(zhí)行}while(reg1&0x80);//10000000B,等待清除結(jié)束,DU=0,相與為0,清除結(jié)束COM=0;//00000000B,設(shè)置8279工作方式,8位字符,左端輸入//編碼鍵盤掃描,兩鍵封鎖COM=0x32;//00110010B,時鐘頻率18分頻 10010B=18D}/****數(shù)碼管顯示函數(shù)****/voidDisplay(uchara){ucharrowdata;//行數(shù)寄存器ucharlinedata;//列數(shù)寄存器ucharb;a=a&0x3f;//00111111B,屏蔽高兩位數(shù)//鍵的編碼格式CNTLSHIFT掃描行序號(3位)(硬件的列號),回饋線列信號(3位)(硬件的行號)linedata=a&0x07;//獲得列數(shù)值,00000111B;rowdata=a&0x38;//獲得行數(shù)值,00111000B;rowdata=(rowdata>>3);//變量的第三位表示行號與列號b=0x85;COM=b;//向控制口寫顯示RAM命令,10000000B,AI=0(不自增),寫到RAM中16個地址中的0號地址;A4A3A2A1=0101~0000(6個地址)if(rowdata==1)//行數(shù)為1的代碼為0~7,其列數(shù)也為0~7{ DAT=table[linedata];//把0~7寫到數(shù)據(jù)口}elseif(rowdata==0)//行數(shù)為0的代碼為8,9,a~f,其列號為0~7{DAT=table[linedata+8];//把8,9,a~f寫到數(shù)據(jù)口}else//行數(shù)為2的代碼為GMPRWXYS,其列號為0~7{;//不執(zhí)行操作}}/*主函數(shù)*/voidmain(void){Uart_Init();Init8279();IT0=1;//外部中斷0下降沿觸發(fā)EX0=1;//開外部中斷0EA=1;//打開中斷總開關(guān)while(1){}}/*鍵盤中斷服務(wù)程序*/voidKeyIn()interrupt0{ucharkeydata;//定義鍵盤數(shù)據(jù)寄存器COM=0x40;//01000000B,讀FIFORAM命令,AI=0,從堆棧頂讀鍵值keydata=DAT;//讀取鍵盤數(shù)據(jù)Display(keydata);//調(diào)用顯示函數(shù)}voiduart()interrupt4{inti;if(RI)//接收標(biāo)志位{x=SBUF;//讀取串口發(fā)來的數(shù)據(jù)e[i]=x;i++;if(i>=7){ i=0; e[6]=(e[1]+e[2]+e[3]+e[4]+e[5])/256; if(e[6]==a[6]) Display(10); elseif(e[6]==b[6]) Display(11); elseif(e[6]==c[6]) Display(12); elseif(e[6]==d[6]) Display(13); /*if(e[0]==a[0]&&e[1]==a[1]&&e[2]==a[2]&&e[3]==a[3]&&e[4]==a[4]&&e[5]==a[5]&&e[6]==a[6]) Display(10); elseif(e[0]==b[0]&&e[1]==b[1]&&e[2]==b[2]&&e[3]==b[3]&&e[4]==b[4]&&e[5]==b[5]&&e[6]==b[6]) Display(11); elseif(e[0]==c[0]&&e[1]==c[1]&&e[2]==c[2]&&e[3]==c[3]&&e[4]==c[4]&&e[5]==c[5]&&e[6]==c[6]) Display(12); elseif(e[0]==d[0]&&e[1]==d[1]&&e[2]==d[2]&&e[3]==d[3]&&e[4]==d[4]&&e[5]==d[5]&&e[6]==d[6]) Display(13);*/ else { Display(14); SBUF=(69);//e的ASCII碼 while(TI==0); TI=0; }}RI=0;//清除接收標(biāo)志位}}三.實(shí)驗(yàn)分析與感想本次實(shí)驗(yàn)是單片機(jī)串口使用實(shí)驗(yàn),要求我們學(xué)習(xí)單片機(jī)與上位機(jī)串行通信的基本使用方法,學(xué)習(xí)動態(tài)數(shù)碼管顯示的基本使用方法。由于第一次使用串口通信,實(shí)驗(yàn)過程中遇到了很多問題,經(jīng)過反復(fù)研究和修改最終完成實(shí)驗(yàn)。在驗(yàn)證性實(shí)驗(yàn)中我們也按照實(shí)驗(yàn)的具體步驟操作并且得到了預(yù)期的結(jié)果。這次的設(shè)計(jì)性試驗(yàn)是模擬上位機(jī)控制云臺實(shí)驗(yàn)。這個設(shè)計(jì)性試驗(yàn)比較復(fù)雜,我們研究和嘗試了好久,才完成程序的編寫,很慶幸我們最后完成了實(shí)驗(yàn),我們設(shè)計(jì)的程序,基本滿足了題目中的協(xié)議中所有數(shù)值都為十六進(jìn)制數(shù)、同步字節(jié)始終為FFH、地址碼為云臺的邏輯地址號以及指令碼表示不同的動作等要求。通過這次的試驗(yàn),我們對程序的編寫有了更進(jìn)一步的認(rèn)識,熟練度也大大提高。實(shí)驗(yàn)四單片機(jī)擴(kuò)展模數(shù)轉(zhuǎn)換器實(shí)驗(yàn)一.實(shí)驗(yàn)?zāi)康?1.掌握A/D轉(zhuǎn)換與單片機(jī)的接口方法。2.了解A/D芯片ADC0809轉(zhuǎn)換性能及編程方法。3.通過實(shí)驗(yàn)了解單片機(jī)如何進(jìn)行數(shù)據(jù)采集二.實(shí)驗(yàn)內(nèi)容1.驗(yàn)證性實(shí)驗(yàn)(1)實(shí)驗(yàn)內(nèi)容:單片機(jī)模數(shù)轉(zhuǎn)換實(shí)驗(yàn),利用實(shí)驗(yàn)臺上的ADC0809做A/D轉(zhuǎn)換器,實(shí)驗(yàn)臺上的電位器提供模擬量輸入,編制程序,將模擬量轉(zhuǎn)換成數(shù)字量,把數(shù)字量轉(zhuǎn)換為電壓值,并把電壓以字符形式通過串口上傳到PC機(jī)上,PC機(jī)端以串口助手接收。有關(guān)說明:A/D轉(zhuǎn)換器用于實(shí)現(xiàn)模擬量到數(shù)字量的轉(zhuǎn)換,按轉(zhuǎn)換原理可分為4種:計(jì)數(shù)式A/D轉(zhuǎn)換器、雙積分式A/D轉(zhuǎn)換器、逐次逼近式A/D轉(zhuǎn)換器和并行式A/D轉(zhuǎn)換器。目前最常用的是雙積分式和逐次逼近式。雙積分式A/D轉(zhuǎn)換器的主要優(yōu)點(diǎn)是轉(zhuǎn)換精度高,抗干擾性能好,價(jià)格便宜,但轉(zhuǎn)換速度較慢,因此這種轉(zhuǎn)換器主要用于速度要求不高的場合。逐次逼近式A/D轉(zhuǎn)換器是一種速度較快精度較高的轉(zhuǎn)換器,其轉(zhuǎn)換時間大約在幾微妙到幾百毫秒之間。ADC0809是8位逐次逼近型A/D轉(zhuǎn)換器,帶8個模擬量輸入通道,芯片內(nèi)帶通道地址譯碼鎖存器,輸出帶三態(tài)數(shù)據(jù)鎖存器,啟動信號為脈沖啟動方式,可實(shí)現(xiàn)8路模擬信號的分時采集,每一通道的轉(zhuǎn)換時間大約100us。ADC0809進(jìn)行完一次轉(zhuǎn)換以后采用中斷方式,此時0809的EOC信號需要經(jīng)過反相器才能產(chǎn)生負(fù)脈沖。例程硬件連接說明:如圖1所示,0809片選端CS5接20——27,EOC接INT01(注意INT01的位置,INT01經(jīng)過反相器與單片機(jī)的INT0相連);P1.0——P1.7接發(fā)光二極管L1——L8,10K電位器中間頭接IN0,另外兩個頭一端接+5V,另一端接地。程序:C語言程序#include<reg52.h>#include<absacc.h>#defineucharunsignedchar//變量類型定義ucharIN;//模擬量輸入通道#defineDATXBYTE[0x1B20+IN]//數(shù)據(jù)口地址voidInt0_Init();voidInt0_Init(){EA=1;//CPU開中斷EX0=1;//開外部中斷0IT0=1;//邊沿觸發(fā)方式}voidmain(){Int0_Init();IN=0;//設(shè)置模擬量輸入通道為0DAT=0x00;//任意寫一個數(shù),開始A/D轉(zhuǎn)換while(1);}voidInt0()interrupt0{P1=DAT;//讀取轉(zhuǎn)換結(jié)果并顯示DAT=0x00;//開始下一次轉(zhuǎn)換}實(shí)驗(yàn)現(xiàn)象:通過旋轉(zhuǎn)電位器,與P1口相連的8個LED表示的二進(jìn)制數(shù)隨著電壓值的變壓而變化。(2)實(shí)驗(yàn)內(nèi)容:單片機(jī)串行發(fā)送數(shù)據(jù)實(shí)驗(yàn),波特率為9600,外部中斷INT0與負(fù)脈
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024高端汽車租賃服務(wù)詳細(xì)協(xié)議
- 2024導(dǎo)演合作拍攝協(xié)議細(xì)則
- 董事長的具體職責(zé)職能模板范文5篇
- 2024年度環(huán)保垃圾清運(yùn)服務(wù)協(xié)議模板
- 2024年個人合伙權(quán)益股份轉(zhuǎn)讓協(xié)議
- 安檢服務(wù)人員2024勞動協(xié)議樣本
- 2024年建筑項(xiàng)目安全保證協(xié)議
- 文書模板-《合伙銷售白酒合同》
- 2024年教育培訓(xùn)業(yè)務(wù)合作協(xié)議
- 2024年度車輛租賃化三方協(xié)議
- 婦產(chǎn)科學(xué)課件:胎心監(jiān)測
- 新蘇教版科學(xué)四年級上冊學(xué)生活動手冊習(xí)題與講解
- 基礎(chǔ)護(hù)理質(zhì)量標(biāo)準(zhǔn)及考核評分表
- 商務(wù)條款響應(yīng)表
- 二年級上冊美術(shù)教案-7. 去遠(yuǎn)航 -冀教版
- 二年級上冊語文課件-10《日月潭》|人教(部編版) (共19張PPT)
- 《詩情畫意》教學(xué)設(shè)計(jì)
- 中華文化與傳播教材課件
- Unit3 Sports and Fitness Reading for writing健康生活講義-高中英語人教版(2019)必修第三冊
- Unit 4 Viewing Workshop 課件-高中英語北師大版(2019)選擇性必修第二冊
- 血尿尿頻尿急尿痛課件
評論
0/150
提交評論