2023年單片機(jī)實(shí)驗(yàn)報告山東大學(xué)_第1頁
2023年單片機(jī)實(shí)驗(yàn)報告山東大學(xué)_第2頁
2023年單片機(jī)實(shí)驗(yàn)報告山東大學(xué)_第3頁
2023年單片機(jī)實(shí)驗(yàn)報告山東大學(xué)_第4頁
2023年單片機(jī)實(shí)驗(yàn)報告山東大學(xué)_第5頁
已閱讀5頁,還剩88頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三單元Proteus系統(tǒng)仿真實(shí)驗(yàn)實(shí)驗(yàn)一基本并行口I/O口實(shí)驗(yàn)自我完畢實(shí)驗(yàn)實(shí)驗(yàn)規(guī)定當(dāng)按鍵SW1按下之后,D1-D8輪流點(diǎn)亮,點(diǎn)亮?xí)r間為100ms,當(dāng)按鍵停下后,停止輪換,再次按下后繼續(xù)輪換。2、編程思緒①進(jìn)行初始化工作,涉及設(shè)立堆棧指針SP,將P2口所有位設(shè)立為1,使P2口所接發(fā)光二極管所有熄滅。將顯示緩沖單元(設(shè)為20H單元)初始化為FEH。②從P1口讀數(shù)據(jù),查看P1.0位,假如P1.0位為0,則執(zhí)行如下循環(huán):將顯示緩沖單元的值送給P2口,調(diào)用100ms延時程序,將顯示緩沖單元的值循環(huán)左移1位,再送回顯示緩沖單元。假如P1.0位不為0則不執(zhí)行上述循環(huán)。③反復(fù)上面的操作②3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.5所示原理圖,并將其保存為basicIO_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)編寫控制源程序,將其保存為basicIO_self.asm。③將源程序添加到U1中,并構(gòu)造(build)該程序。④執(zhí)行仿真過程觀測D1-D8的指示,查看程序功能是否對的。⑤修改延時程序延時參數(shù),重新執(zhí)行③和④。4、源程序?ORG0000H?AJMPMAIN ORG0030HMAIN:?MOVSP,#60H MOVP2,#0FFH MOVA,#0FEH?MOV20H,A;緩沖單元LOOP: JNBP1.0,LOOP1;;假如P1.0=0,跳轉(zhuǎn)?SJMPLOOP;否則循環(huán)不斷檢測?LOOP1:?MOVP2,20H;將緩沖單元內(nèi)的值給P2口?LCALLDELAY100MS;延時100ms; MOVA,20H RLA;左移一位?MOV20H,A JBP1.0,LOOP;假如P1.0=1,跳轉(zhuǎn)到LOOP處?LJMPLOOP1;否則循環(huán) DELAY100MS:MOVR7,#200?;1us??DL:MOVR6,#248;1us? DJNZR6,$ ?;248*2=496us NOP ?;1us??DJNZR7,DL??;2us RET?;(496+1+1+2)*200+1=100.001ms END??5、電路圖6、仿真結(jié)果當(dāng)按鍵SW1按下之后,D1-D8輪流點(diǎn)亮,點(diǎn)亮?xí)r間為100ms,當(dāng)按鍵停下后,停止輪換,再次按下后繼續(xù)輪換。實(shí)驗(yàn)二擴(kuò)展并行I/O口實(shí)驗(yàn)自我完畢實(shí)驗(yàn)1、實(shí)驗(yàn)規(guī)定仿真實(shí)現(xiàn)交通信號燈控制功能。控制順序?yàn)?①南北綠燈亮,同時東西紅燈亮10s;②南北黃燈亮,同時東西紅燈亮2s;③南北紅燈亮,同時東西綠燈亮10s;④東西黃燈亮,同時南北紅燈亮2s;⑤反復(fù)①~④。2、編程思緒①進(jìn)行初始化工作,涉及設(shè)立堆棧指針SP,將兩個373的輸出口所有位均設(shè)立為1,使所有發(fā)光二極管所有熄滅。②分析兩個373的地址:假定所有無關(guān)地址均定義為1,那么U4的鎖存地址為:#0FE00H,U5的鎖存地址為:#0FD00H。③分析4個狀態(tài)下兩個373的輸出數(shù)據(jù)值:假定“南北綠燈亮,同時東西紅燈亮”為狀態(tài)1,即:Stat1;“南北黃燈亮,同時東西紅燈亮”為狀態(tài)2,即:Stat2;“南北紅燈亮,同時東西綠燈亮”為狀態(tài)3,即:Stat3;“東西黃燈亮,同時南北紅燈亮”為狀態(tài)4,即:Stat4。3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.7所示原理圖,并將其保存為expandIO_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)編寫控制源程序,將其保存為expandIO_self.asm。③將源程序添加到U1中,并構(gòu)造(build)該程序。④執(zhí)行仿真過程觀測各個方向的交通信號燈指示,查看程序功能是否對的。4、源程序 ORG0000H?AJMPMAIN ORG0030HMAIN:?MOVSP,#60H?MOVA,#0FFH MOVDPTR,#0FE00H?MOVX@DPTR,A MOVDPTR,#0FD00H?MOVX@DPTR,ASTAT1: MOVA,#0F3H?MOVDPTR,#0FE00H MOVX@DPTR,A?MOVA,#0CH MOVDPTR,#0FD00H?MOVX@DPTR,A LCALLDELAY10SSTAT2:?MOVA,#0C3H?MOVDPTR,#0FE00H?MOVX@DPTR,A MOVA,#0FH?MOVDPTR,#0FD00H?MOVX@DPTR,A LCALLDELAY2SSTAT3:?MOVA,#0FCH MOVDPTR,#0FE00H?MOVX@DPTR,A?MOVA,#03H?MOVDPTR,#0FD00H?MOVX@DPTR,A LCALLDELAY10S STAT4:?MOVA,#3CH?MOVDPTR,#0FE00H?MOVX@DPTR,A?MOVA,#0FH MOVDPTR,#0FD00H?MOVX@DPTR,A LCALLDELAY2S? LJMPSTAT1DELAY2S:MOVR7,#20 DL2:MOVR6,#200 DL1:MOVR5,#250?DJNZR5,$ DJNZR6,DL1?DJNZR7,DL2 RET?DELAY10S:MOVR7,#100?DL3:MOVR6,#200?DL4:MOVR5,#250 DJNZR5,$?DJNZR6,DL4?DJNZR7,DL3 ?RETEND5、電路圖6、實(shí)驗(yàn)結(jié)果①南北綠燈亮,同時東西紅燈亮10s;②南北黃燈亮,同時東西紅燈亮2s;③南北紅燈亮,同時東西綠燈亮10s;④東西黃燈亮,同時南北紅燈亮2s;實(shí)驗(yàn)三靜態(tài)LED顯示實(shí)驗(yàn)自我完畢實(shí)驗(yàn)1、實(shí)驗(yàn)規(guī)定圖中7SEG2為十位顯示數(shù)碼管,7SEG1為個位顯示數(shù)碼管,KEY_LOAD為倒計(jì)時初值按鈕,KEY_START為倒計(jì)時啟動按鈕。規(guī)定實(shí)現(xiàn)的功能是:當(dāng)KEY_LOAD按鈕按下時加載倒計(jì)時初值(如:10s),當(dāng)按下KEY_START按鈕時,開始倒計(jì)時,每過1s,計(jì)時器減1,直到減到“00”為止。減到“00”時使P3.0引腳上的LED按10Hz頻率進(jìn)行閃爍,直到再次按下KEY_LOAD按鈕才重新加載初值,并熄滅LED。再次按下KEY_START按鈕又一次開始倒計(jì)時,如此反復(fù)。2、編程思緒①分析兩個373的地址:假定所有無關(guān)地址均定義為1,那么U2的鎖存地址為:#0FE00H,U3的鎖存地址為:#0FD00H。②程序流程圖:3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.9所示原理圖,并將其保存為staticLED_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)編寫控制源程序,將其保存為staticLED_self.asm。③將源程序添加到U1中,并構(gòu)造(build)該程序。④執(zhí)行仿真過程觀測秒表程序功能是否對的。4、源程序?ORG0000H?AJMPMAIN?ORG0030HMAIN: MOVSP,#60H;堆棧初始化 MOVR0,#0;各位?MOVR1,#1;十位?SETBP3.0;關(guān)掉LED1 CLRF0LOOP:?JBP1.1,LOOP2;假如P1.1=1,跳轉(zhuǎn)到LOOP2,LOOP1:?CLRF0?MOV30H,R0?MOV31H,R1;裝載初值?SETBP3.0;關(guān)閉LED1 LCALLDISPLAY;顯示LOOP2: JBP1.0,LOOP;假如P1.0=1,跳回LOOP,否則繼續(xù)執(zhí)行LOOP3: LCALLDISPLAY;刷新顯示 LCALLDELAY1S;延時1s LCALLADJUST2;調(diào)整計(jì)時器寄存器 JBF0,LOOP4?LJMPLOOP3LOOP4:?CLRP3.0;LED閃爍程序 LCALLDELAY100MS?SETBP3.0 LCALLDELAY100MS ?JBP1.1,LOOP4 LJMPLOOP1 DISPLAY:;顯示子程序?MOVA,30H?MOVDPTR,#TABLE?MOVCA,@A+DPTR MOVDPTR,#D1ADD?MOVX@DPTR,A MOVA,31H?MOVDPTR,#TABLE MOVCA,@A+DPTR?MOVDPTR,#D10ADD MOVX@DPTR,A RET? ?ADJUST2: DEC30H?MOVA,30H?CJNEA,#-1,GOTORET?MOV30H,#9 DEC31H MOVA,31H?CJNEA,#-1,GOTO(shè)RET?SETBF0 RET GOTORET: RET??DELAY1S:MOVR7,#10 DL2:MOVR6,#200 DL1:MOVR5,#250??? DJNZR5,$??DJNZR6,DL1 ?DJNZR7,DL2??RETDELAY100MS:MOVR7,#200??DL:MOVR6,#248 DJNZR6,$ NOP? DJNZR7,DL RET?TABLE:DB0C0H,0f9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HD1ADDEQU0FE00H;U3的鎖存地址D10ADDEQU0FD00HEND5、電路圖6、仿真結(jié)果當(dāng)KEY_LOAD按鈕按下時加載倒計(jì)時初值(如:10s),當(dāng)按下KEY_START按鈕時,開始倒計(jì)時,每過1s,計(jì)時器減1,直到減到“00”為止。減到“00”時使P3.0引腳上的LED按10Hz頻率進(jìn)行閃爍,直到再次按下KEY_LOAD按鈕才重新加載初值,并熄滅LED。再次按下KEY_START按鈕又一次開始倒計(jì)時,如此反復(fù)。實(shí)驗(yàn)四矩陣鍵盤掃描實(shí)驗(yàn)自我完畢實(shí)驗(yàn)1、實(shí)驗(yàn)規(guī)定D1~D8八個發(fā)光二極管構(gòu)成彩色旋轉(zhuǎn)燈,D9~D13為檔位指示燈,一檔旋轉(zhuǎn)速度最慢(周期1s,D13亮),二檔較快(周期0.8s,D12亮),三檔更快(周期0.6s,D11亮),四檔再快(周期0.4s,D10亮),五檔最快(周期0.2s,D10亮)。四個按鍵KEY0-KEY1于設(shè)定旋轉(zhuǎn)方向?yàn)轫槙r針旋轉(zhuǎn)或者逆時針旋轉(zhuǎn),KEY2-KEY3用于增快或則減慢旋轉(zhuǎn)速度。2、編程思緒按鍵掃描的方式可以采用前面示例程序中的方法:線反轉(zhuǎn)法或行掃描法。可以用匯編語言實(shí)現(xiàn),也可以用C語言實(shí)現(xiàn)。建議如前面示例所示,匯編采用行掃描法,C語言用線反法。程序控制流程是:一方面初始化設(shè)立默認(rèn)運(yùn)營參數(shù),然后讀取按鍵,辨認(rèn)鍵碼,并根據(jù)鍵碼的不同執(zhí)行運(yùn)營參數(shù)調(diào)整,最后根據(jù)當(dāng)前的運(yùn)營參數(shù)執(zhí)行發(fā)光二極管D1-D8的輪流旋轉(zhuǎn)。速度的控制通過控制調(diào)用延時程序的次數(shù)來決定,假設(shè)延時程序的延時長度為5ms。延時程序可以按如下方式實(shí)現(xiàn)(假設(shè)晶振頻率為12MHz):voiddelays(){uchart,ms;ms=5;//延時5mswhile(ms--)for(t=0;t<120;t++);}或者采用內(nèi)嵌匯編來實(shí)現(xiàn):voiddelays(){#pragmaasmMOVR2,#50//;5ms延時程序DL1:MOVR1,#48DL2:DJNZR1,DL2//;內(nèi)循環(huán)100usNOPDJNZR2,DL1//;中循環(huán)10ms#pragmaendasm}旋轉(zhuǎn)彩燈線反轉(zhuǎn)法C語言程序控制流程圖(1)主控流程圖(2)鍵盤掃描子程序Keyscan流程圖旋轉(zhuǎn)彩燈行掃描法匯編控制流程圖3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.11所示原理圖,并將其保存為keyscan_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)編寫控制源程序,將其保存為keyscan_self.a(chǎn)sm或keyscan_self.c。③將源程序添加到U1中,并構(gòu)造(build)該程序。④執(zhí)行仿真過程觀測秒表程序功能是否對的。4、源程序#include"reg52.h"#include"intrins.h"#defineucharunsignedchar#defineuintunsignedintsbitg0=P0^4;ucharcodeT_TABLE[]={200,160,120,80,40};//周期值表ucharcodekey_code[]={0x22,0x12,0x21,0x11};voiddelay()//延時5ms{ uchart,ms; ms=5; while(ms--) ?for(t=0;t<120;t++);}voidmain(){ intaa=0xfe;?uintdir=1;?uintspeed=0;??inttemp,temp2,keycode; intj,key;?g0=0; while(1) {??P3=0x30;? temp=P3;? if((temp&0x30)?。?x30)//按鍵檢測 ?{ ? delay();? ?delay();? ?P3=0x30; ??temp=P3; ?if((temp&0x30)!=0x30) ?{? ? P3=0x03; ? ?temp2=P3;?? keycode=temp|temp2;? ?for(j=0;j<4;j++)? ? { ?? if(keycode==key_code[j]) ? {?? ? key=j; ? ?}? ? }? ?if(key==0)dir=1;//正轉(zhuǎn) if(key==1)dir=0;//反轉(zhuǎn)? ?if(key==2) ? ?{ ? speed++; ??? if(speed==5)speed=4;//換檔 ? } ? ?if(key==3) ? ?{? ?if(speed==0)speed++;//換檔? ? speed--; ? } ? switch(speed) ? {??? ?case0:P0=0xef;break;? ???case1:P0=0xf7;break; ? ? case2:P0=0xfb;break; ?? ?case3:P0=0xfd;break;?? case4:P0=0xfe;break;? ? default:break; ???} ??P3=0x03;?? ?while(!(P3==0x03));?? }???}?? ??if(dir==1)//正轉(zhuǎn)時執(zhí)行 ?{? P1=aa; ? for(j=0;j<T_TABLE[speed];j++)???delay();? ? aa=_crol_(aa,1);//左移?? } ?if(dir==0)//反轉(zhuǎn)時執(zhí)行??{? ?P1=aa; for(j=0;j<T_TABLE[speed];j++)? ? delay(); ??aa=_cror_(aa,1);//右移 ?} ??}}5、電路圖:6、仿真結(jié)果:D1~D8八個發(fā)光二極管構(gòu)成彩色旋轉(zhuǎn)燈,D9~D13為檔位指示燈,一檔旋轉(zhuǎn)速度最慢,二檔較快,三檔更快,四檔再快,五檔最快。四個按鍵KEY0-KEY1于設(shè)定旋轉(zhuǎn)方向?yàn)轫槙r針旋轉(zhuǎn)或者逆時針旋轉(zhuǎn),KEY2-KEY3用于增快或則減慢旋轉(zhuǎn)速度。實(shí)驗(yàn)五定期器計(jì)數(shù)器實(shí)驗(yàn)自我完畢實(shí)驗(yàn)1、實(shí)驗(yàn)規(guī)定用NE555構(gòu)成的脈沖信號發(fā)生器,右邊是用定期/計(jì)數(shù)器0和定期/計(jì)數(shù)器1構(gòu)成的頻率計(jì)。為了檢查頻率計(jì)量是否準(zhǔn)確,用Proteus的虛擬頻率計(jì)來進(jìn)行測量脈沖信號頻率進(jìn)行比對。7SEG1-7SEG6用于頻率計(jì)百分位、十分位、個位、十位、百位、千位的顯示,單位為Hz。規(guī)定單片機(jī)上電運(yùn)營后作為頻率計(jì)將一直運(yùn)營,改變脈沖發(fā)生器所產(chǎn)生的脈沖頻率,則頻率計(jì)的顯示將跟隨變化。2、編程思緒定期/計(jì)數(shù)器0工作在定期器模式方式1(16位),定期/計(jì)數(shù)器1工作在計(jì)數(shù)器模式方式2(8位自動重裝初值)。定期/計(jì)數(shù)器1計(jì)數(shù)200個脈沖后(每計(jì)數(shù)200個脈沖產(chǎn)生一次中斷)記錄這200個脈沖總的時間長度,計(jì)算出平均每個周期的時間長度。200個脈沖所用時間長度的測量是靠定期/計(jì)數(shù)器0來實(shí)現(xiàn)的,定期/計(jì)數(shù)器0的初值為0。當(dāng)定期/計(jì)數(shù)器1產(chǎn)生中斷時,讀出定期/計(jì)數(shù)器0當(dāng)前計(jì)數(shù)器值,再加上在定期/計(jì)數(shù)器0中斷中累積的值即可得到。實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.11所示原理圖,并將其保存為frequencycounter.DSN文獻(xiàn)。②根據(jù)(2)和(3)編寫控制源程序,將其保存為frequencycounter.c。③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程frequencycounter.uV2,CPU為AT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序frequencycounter.c加入工程frequencycounter.uV2,并設(shè)立工程frequencycounter.uV2屬性,將其晶振頻率設(shè)立為12MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程frequencycounter.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序frequencycounter.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序frequencycounter.hex。⑦運(yùn)營程序,觀測數(shù)碼管的顯示與虛擬頻率計(jì)是否一致。⑧改變RV2的值,繼續(xù)觀測頻率測量結(jié)果,觀測數(shù)碼管的顯示與虛擬頻率計(jì)是否一致。4、源程序#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintucharcodeled_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharxdatada001_at_0xfe00;ucharxdatada01_at_0xfd00;ucharxdatada1_at_0xfb00;ucharxdatada10_at_0xf700;ucharxdatada100_at_0xef00;ucharxdatada1k_at_0xdf00;uchardv001,dv01,dv1,dv10,dv100,dv1k;longsumtime=0;//總時間floatfrequency,ptime;//分別為頻率,單周期時間uinttimer0H;uinttimer0L;voids_timer0()interrupt1{?EA=0;?sumtime=sumtime+65536;?TH0=timer0H;?TL0=timer0L;?EA=1;}voids_timer1()interrupt3{ EA=0; sumtime=sumtime+TH0*256+TL0; TH0=timer0H;?TL0=timer0L;?ptime=(float)sumtime/200; sumtime=0; frequency=(float)1000000/ptime; dv1k=(uchar)(frequency/1000);??frequency=frequency-dv1k*1000; dv100=(uchar)(frequency/100);?frequency=frequency-dv100*100; dv10=(uchar)(frequency/10);?frequency=frequency-dv10*10;?dv1=(uchar)frequency;???frequency=frequency-dv1;?frequency=frequency*10; dv01=(uchar)frequency;???frequency=frequency-dv01; frequency=frequency*10; dv001=(uchar)frequency; ?da001=led_table[dv001];?da01=led_table[dv01];?da1=led_table[dv1];?da10=led_table[dv10];?da100=led_table[dv100]; da1k=led_table[dv1k]; EA=1;?}voidmain(){?TMOD=0X61;//T1計(jì)數(shù)器,方式2,T0定期器,方式1?timer0H=0;//T0定期器初值 timer0L=0; TH1=TL1=56;//T1計(jì)數(shù)器初值256-200=56?EA=1;//開總中斷 ET0=1;//開定期器0中斷?TR0=1;//啟動定期器0?ET1=1;//啟動T1中斷 TR1=1;//啟動T1 while(1); }5、電路圖6、仿真結(jié)果頻率計(jì)顯示的與脈沖發(fā)生器的頻率基本一致。實(shí)驗(yàn)六串口通信實(shí)驗(yàn)自我完畢實(shí)驗(yàn)實(shí)驗(yàn)規(guī)定本實(shí)驗(yàn)運(yùn)用74LS165實(shí)現(xiàn)串口轉(zhuǎn)并行輸入端口,用來采集DSW1的開關(guān)數(shù)據(jù)。采集來的數(shù)據(jù)通過74LS164實(shí)現(xiàn)的串口轉(zhuǎn)并行輸出端口送給兩個7段LED數(shù)碼管7SEG17SEG2。RN1和RN2是兩個排阻用于限流。圖3.22中的R2,R3,C1和KEY1用于產(chǎn)低電平脈沖,其中的R2,R3和C1用于去除按鍵抖動。該電平脈沖一方面連接至P1.1用于CPU探測該脈沖的產(chǎn)生時間,另一方面通過U6A的74LS04之后連接至74LS165的1號(SH/LD),該信號在按鍵KEY1未被按下時為低電平,74LS165的輸入一直被加載至器件內(nèi)部的所存器,當(dāng)KEY1被按下時該信號為高電平,74LS165加載的數(shù)據(jù)將在2號引腳CLK的同步下被串行移出并進(jìn)入單片機(jī)的RXD端口。由于74LS165的9號引腳需要連接到單片機(jī)的RXD端口,而RXD又需要連接至164的1、2號管腳。同時,單片機(jī)的TXD引腳不管在讀74LS165的數(shù)據(jù)還是向74LS164輸出數(shù)據(jù)時都提供時鐘。為了防止74LS165的9號引腳輸出影響RXD至164的1、2號引腳的輸出,并且防止74LS165的輸出被相同的時鐘直接移位進(jìn)入164(走近路),單片機(jī)的TXD和RXD需要分時接入74LS165和74LS164。分時控制的方法就是運(yùn)用U5(74LS125)這一三態(tài)選通緩沖器來實(shí)現(xiàn)。TXD接入U5A(chǔ)和U5D的輸入端,RXD接入U5C的輸入和U5B的輸出。U5A(chǔ)的輸出接74LS165的CLK,U5B的輸入接74LS165的9號引腳,當(dāng)P1.0=0時這兩個三態(tài)緩沖器是接通的,即RXD接至74LS165的9號引腳,TXD接至74LS165的CLK,可以實(shí)現(xiàn)單片機(jī)對74LS165的串行讀取。反之,當(dāng)P1.0=1時,通過反相器使得U5C和U5D接通,使得TXD接至74LS164的CLK,RXD接至74LS164的1,2號引腳,可以實(shí)現(xiàn)單片機(jī)對164的串行輸出。最終規(guī)定實(shí)現(xiàn)的功能是:當(dāng)按鍵按下時,DSW1的開關(guān)數(shù)據(jù)可以被單片機(jī)通過74LS165串行讀取,并通過74LS164串行輸出至兩個7段數(shù)碼管7SEG1和7SEG2顯示,規(guī)定顯示的據(jù)和DSW1的開關(guān)數(shù)據(jù)一致,沒有錯誤數(shù)據(jù)被讀入或顯示。編程思緒串行口工作在定期器模式方式0模式(即:SM1=0,SM0=0)。串行口的數(shù)據(jù)收發(fā)運(yùn)用查詢模式實(shí)現(xiàn)。只有當(dāng)查詢到P1.1有低電平出現(xiàn)時才啟動數(shù)據(jù)收發(fā)過程。啟動的方法就是先使P1.0=0打開接受通道,再使接受控制(REN=1)使能,這時TXD就會自動輸出時鐘,由于這時74LS165正處在移位模式(SH/LD引腳為高電平),數(shù)據(jù)會自動串行移入單片機(jī)的RXD端口。查詢接受完畢標(biāo)志RI,當(dāng)RI=1時1個字節(jié)接受完畢,清掉RI(即使RI=0)。然后,使P1.0=1,打開輸出74LS164通道,把剛才接受的那個數(shù)據(jù)分低半字節(jié)和高半字節(jié),分別查詢出它們共陽七段數(shù)碼管的顯示碼,再將顯示碼(16位)移位送出至74LS164。兩個74LS164是按級聯(lián)方式連接的,先送出的會到達(dá)U3輸出端,后送出的會到達(dá)U2輸出端。送時通過TI標(biāo)志位查詢發(fā)送一個字節(jié)是否完畢。3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.22所示原理圖,并其保存為uart_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)畫出流程圖,并編寫源程序,將其保存為uart_self.c。③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程uart_self.uV2,CPU為AT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序uart_self.c加入工程uart_self.uV2,并設(shè)立工程uart_self.uV2屬性,將其晶振頻率設(shè)立為12MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程uart_self.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序uart_self.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序uart_self.hex。⑦運(yùn)營程序,點(diǎn)擊KEY1觀測數(shù)碼管的顯示是否與DSW1的設(shè)立一致。⑧改變DSW1的設(shè)立,再次點(diǎn)擊KEY1觀測數(shù)碼管的顯示是否與DSW1的設(shè)立一致。反復(fù)本條多次觀測程序運(yùn)營效果。4、源程序#include"reg52.h"#defineucharunsignedchar#defineuintunsignedintucharcodeled_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbitP11=P1^1;sbitP10=P1^0;uchartmp,tmp1,tmp2,tmp3;voidmain(){?SCON=0X00;//設(shè)定定期器為移位寄存器模式//?SM1=0;//?SM0=0;//方式0模式?while(1) {? ?if(P11==0) { ???? P10=0;?? REN=1;???while(!RI);? ?tmp=SBUF;? ?REN=0; ?RI=0; ?? P10=1; tmp1=tmp&0x0f;//低半字節(jié)??? tmp>>=4;?? tmp2=tmp&0x0f;//高半字節(jié)??? SBUF=led_table[tmp1]; ?while(!TI);//等待發(fā)送是否完畢???TI=0;//置發(fā)送標(biāo)志為零? ?SBUF=led_table[tmp2]; ?while(!TI);//等待發(fā)送是否完畢 ?TI=0;//置發(fā)送標(biāo)志為零 while(!P11); ?? }?}}5、電路圖6、實(shí)驗(yàn)結(jié)果當(dāng)按鍵按下時,DSW1的開關(guān)數(shù)據(jù)可以被單片機(jī)通過74LS165串行讀取,并通過74LS164串行輸出至兩個7段數(shù)碼管7SEG1和7SEG2顯示,顯示的據(jù)和DSW1的開關(guān)數(shù)據(jù)一致。實(shí)驗(yàn)七LCD1602顯示實(shí)驗(yàn)自我完畢實(shí)驗(yàn)實(shí)驗(yàn)規(guī)定規(guī)定點(diǎn)擊按鍵KEY1可以在LCD1602(LM016L)第一行上顯示“HelloEveryone”,在第二行上顯示“WelcometoSDU”,并閃爍3次。點(diǎn)擊按鍵KEY2可以將LCD1602清屏。2、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.28所示原理圖,并將其保存為lcd1602.DSN文獻(xiàn)。②將上面(3)中控制源程序保存為lcd1602.c。③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程lcd1602.uV2,CPU為AT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序lcd1602.c加入工程lcd1602.uV2,并設(shè)立工程lcd1602.uV2屬性,將其晶振頻率設(shè)立為11.0592MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程lcd1602.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序lcd1602.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序lcd1602.hex。⑦運(yùn)營程序,點(diǎn)擊圖2.28中各按鍵,觀測1602的顯示是否符合程序規(guī)定。3、編程思緒按鍵的掃描與辨認(rèn)可以參考“3.4.1示例實(shí)驗(yàn)”中的方法。LCD1602的顯示控制可以參考“3.7.2LCD1602示例實(shí)驗(yàn)”。編成時要有一個狀態(tài)變量,該變量用于記錄當(dāng)前是輸入的哪個變量。輸入第一個變量,碰到輸入運(yùn)算符時結(jié)束第一個變量的輸入。輸入第二個變量,碰到“=”號時結(jié)束第二個變量的輸入,并且開始計(jì)算結(jié)果。計(jì)算結(jié)果由于是16進(jìn)制的,要將其轉(zhuǎn)換成十進(jìn)制,并將該十進(jìn)制的數(shù)轉(zhuǎn)換成字符串后逐位顯示出來。減法時要注意結(jié)果是否為負(fù),除法時要注意除數(shù)是否為0,結(jié)果是否帶有余數(shù)。此外,按鍵要注意去抖動解決。4、源程序#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitlcden=P1^5;sbitrs=P1^7;sbitrw=P1^6;sbitbusy=P2^7;chari,j,temp,num,num_1;longa,b,c;floata_c,b_c;ucharflag,fuhao;ucharcodetable[]={0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0};ucharcodetable1[]={0,1,2,3,4,5,6,7,8,9,0x2b-0x30,0x2d-0x30,0x2a-0x30,0x2f-0x30,0x01-0x30,0x3d-0x30}?;voiddelay(ucharz){uchary;for(z;z>0;z--)for(y=0;y<110;y++);}voidcheck(){do{P2=0xFF;rs=0;rw=1;lcden=0;delay(1);lcden=1;}while(busy==1);}voidwrite_com(ucharcom){P2=com;rs=0;rw=0;lcden=0;check();lcden=1;}voidwrite_date(uchardate){P2=date;rs=1;rw=0;lcden=0;check();lcden=1;}voidinit(){num=-1;lcden=1;write_com(0x01);//清零write_com(0x38);//設(shè)立16X2顯示等write_com(0x0c);//設(shè)立開顯示,不顯示光標(biāo)write_com(0x06);//寫入新數(shù)據(jù)后,地址寄存器內(nèi)容加1//自動往下寫write_com(0x80);//第一行第一列開始顯示write_com(0x01);num_1=0;i=0;j=0;a=0;b=0;c=0;flag=0;fuhao=0;}voidkeyscan(){P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){temp=P3&0xf0;switch(temp){case0xe0:num=0;break;case0xd0:num=1;break;case0xb0:num=2;break;case0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2||num==3){if(j!=0)//j標(biāo)志位:第二次計(jì)算時,把前面的清除{write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3?。?xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;switch(temp){case0xe0:num=4;break;case0xd0:num=5;break;case0xb0:num=6;break;case0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6||num==7){if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;switch(temp){case0xe0:num=8;break;case0xd0:num=9;break;case0xb0:num=10;break;case0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9){if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}if(num==11)//-{flag=1;fuhao=2;} if(num==10)//+{flag=1;fuhao=1;}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){temp=P3&0xf0;switch(temp){case0xe0:num=12;break;case0xd0:num=13;break;case0xb0:num=14;break;case0x70:num=15;break;}}while(P3!=0xf7);switch(num){case12://x ? {write_date(0x30+table1[num]); ??flag=1;fuhao=3;}break;case13:///? {write_date(0x30+table1[num]);flag=1;fuhao=4;}break;case15://計(jì)算結(jié)果? {j=1;if(fuhao==1){write_com(0x80+0x4f);//最后一個數(shù)的地址write_com(0x04);//寫入新數(shù)據(jù)后地址寄存器內(nèi)容減1相稱于從后往前顯示c=a+b;while(c!=0){write_dat(yī)e(0x30+c%10);c=c/10;}write_dat(yī)e(0x3d);//=a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_dat(yī)e(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);//符號45write_dat(yī)e(0x3d);//=a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_dat(yī)e(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}elseif(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;? ? ?? ???if(b==0)//假如除數(shù)是0,則顯示error?? {? ? write_date('r');? ? ??write_date('o');?? ? ?write_date('r');?? ? ?write_dat(yī)e('r');? write_date('e'); ? ?? }? ? ? else{ c=(long)(((float(yī))a/b)*1000);while(c!=0){write_date(0x30+c%10);//從個位開始寫最低位c=c/10;i++;if(i==3)write_date(0x2e);//.46}if(a/b<=0)write_dat(yī)e(0x30);//0? ? }write_date(0x3d); ? ? a=0;b=0;flag=0;fuhao=0;}}break;case14: //清除顯示? ?{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}break;}}}main(){init();while(1){keyscan();}}5、電路圖6、仿真結(jié)果能進(jìn)行正常的 加減乘除運(yùn)算,除數(shù)為0是顯示error。實(shí)驗(yàn)八ADC0808/9信號采集實(shí)驗(yàn)實(shí)驗(yàn)規(guī)定本實(shí)驗(yàn)運(yùn)用LCD1602和AD0808實(shí)現(xiàn)簡樸的交流信號過零檢測與頻率分析。規(guī)定信號幅度變化時(滿量程的5%-95%),不影響檢測的結(jié)果。頻率檢測的結(jié)果通過LCD1602的第一行顯示出來,信號過零時,可以通過P2.6輸出一個脈沖寬度為5us的脈沖信號。2、編程思緒LCD1602的控制方法按3.7節(jié)所示方法進(jìn)行ADC0808的控制方法按3.8.1所示方法進(jìn)行。這里重要是過零點(diǎn)的檢測方法如何實(shí)現(xiàn)。不能采用判斷所采集到的數(shù)據(jù)是否為0的方法來實(shí)現(xiàn),由于你的采集時刻不一定可以嚴(yán)格對準(zhǔn)過零時刻。但是,我們注意到在0點(diǎn)的兩邊信號的極性是發(fā)生變化的,我們可以運(yùn)用這一特點(diǎn)來實(shí)現(xiàn)過零檢測。正弦波每個周期有兩個過零點(diǎn),因此,1s內(nèi)過零次數(shù)除以2就是信號的頻率。因此,在程序中可以這樣實(shí)現(xiàn)。當(dāng)每次采集到一個新的數(shù)據(jù)之后都要看一下這個數(shù)據(jù)是正數(shù)還是負(fù)數(shù)。當(dāng)這個數(shù)大于128時是正數(shù),當(dāng)它小于128時是負(fù)數(shù)。判斷當(dāng)前數(shù)據(jù)的正負(fù)極性和上一個數(shù)據(jù)的正負(fù)極性是否一致,假如不一致,則說明通過了一次過零點(diǎn),將其記錄入次數(shù)計(jì)數(shù)器。ADC0808的CLK仍然用定期器T1來實(shí)現(xiàn),可以將其設(shè)立為50kHz(硬件實(shí)現(xiàn)時可以更高,軟件仿真再高將難以實(shí)現(xiàn))。運(yùn)用定期器T0實(shí)現(xiàn)50ms定期,并配合軟件實(shí)現(xiàn)1s鐘定期。采用12M晶振時,T0采用方式1,則處置應(yīng)為(TH0=0x3C,TL0=0xB0)。但是,由于中斷解決函數(shù)需要一定的響應(yīng)時間,因此這個參數(shù)只是理論計(jì)算結(jié)果,要根據(jù)實(shí)測情況稍作調(diào)整。同樣T1理論計(jì)算值和實(shí)際輸出值也許也會有一定的差距,也要進(jìn)行調(diào)整。3、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.22所示原理圖,并將其保存為ADC0808_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)畫出流程圖,并編寫源程序,將其保存為ADC0808_self.c。③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程ADC0808_self.uV2,CPU為AT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序ADC0808_self.c加入工程ADC0808_self.uV2,并設(shè)立工程ADC0808_self.uV2屬性,將其晶振頻率設(shè)立為12MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程ADC0808_self.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序ADC0808_self.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序ADC0808_self.hex。⑦運(yùn)營程序,觀測計(jì)算結(jié)果,并驗(yàn)證其是否對的。⑧改變RV1的抽頭位置,從而改變輸入信號的幅值,觀測計(jì)算結(jié)果是否對的。⑨更改信號發(fā)射器的頻率,再次驗(yàn)證其功能是否對的。(注意:由于是軟仿真,所以信號采集的速度受到限制,因此所輸入的交流信號頻率也不能太高,可以在200Hz以內(nèi)嘗試)。4、源程序:#include<reg52.h>//包含單片機(jī)寄存器的頭文獻(xiàn)#include<intrins.h>//包含_nop_()函數(shù)定義的頭文獻(xiàn)//1602端口定義sbitRS=P2^0;//寄存器選擇位,將RS位定義為P2.0引腳sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2.1引腳sbitE=P2^2;//使能信號位,將E位定義為P2.2引腳sbitBF=P1^7;//忙碌標(biāo)志位,,將BF位定義為P0.7引腳//AD端口定義sbitCLK=P2^3;sbitstart=P2^4;sbitoe=P2^5;sbiteoc=P2^7;sbitout_pulse=P2^6;//5us脈沖sbitp30=P3^0;#defineucharunsignedchar#defineuintunsignedintucharn=0;ucharflag=0;//1s標(biāo)志位/*****************************************************函數(shù)功能:延時1ms***************************************************/voiddelay1ms(){ ?unsignedchari,j;?? for(i=0;i<10;i++) for(j=0;j<33;j++)?;? }/*****************************************************函數(shù)功能:延時若干毫秒入口參數(shù):n***************************************************/voiddelay(unsignedintn){ unsignedinti;?for(i=0;i<n;i++) delay1ms();}/*****************************************************函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitBusyTest(void){ bitresult; RS=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)?RW=1; E=1;//E=1,才允許讀寫?_nop_();//空操作?_nop_();?_nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反映時間??result=BF;//將忙碌標(biāo)志電平賦給result ?E=0;?returnresult;}/*****************************************************函數(shù)功能:將模式設(shè)立指令或顯示地址寫入液晶模塊入口參數(shù):dictate***************************************************/voidWrite_com(unsignedchardictate){while(BusyTest()==1);//假如忙就等待?RS=0;//根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令?RW=0;?E=0;//E置低電平(寫指令時,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"?_nop_();?_nop_();//空操作兩個機(jī)器周期,給硬件反映時間?P1=dictate;//將數(shù)據(jù)送入P0口,即寫入指令或地址?_nop_(); _nop_();?_nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反映時間?E=1;//E置高電平?_nop_();?_nop_();?_nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反映時間?E=0;//當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:指定字符顯示的實(shí)際地址入口參數(shù):x***************************************************/voidWriteAddress(unsignedcharx){Write_com(x|0x80);//顯示位置的擬定方法規(guī)定為"80H+地址碼x"?}/*****************************************************函數(shù)功能:將數(shù)據(jù)(字符的標(biāo)準(zhǔn)ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)***************************************************/voidWriteData(unsignedchary){while(BusyTest()==1);?RS=1;//RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)?RW=0;?E=0;//E置低電平(寫指令時,,//就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"?P1=y;//將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊?_nop_(); _nop_(); _nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反映時間?E=1;//E置高電平?_nop_(); _nop_();?_nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反映時間 E=0;//當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:對LCD的顯示模式進(jìn)行初始化設(shè)立***************************************************/voidLcdInt(void){?delay(15);//延時15ms,初次寫指令時應(yīng)給LCD一段較長的反映時間?Write_com(0x38);//顯示模式設(shè)立:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口?delay(5);//延時5ms Write_com(0x0c);//顯示模式設(shè)立:顯示開,有光標(biāo),光標(biāo)閃爍?delay(5);?Write_com(0x06); delay(5); ??? ??? Write_com(0x01);//清屏幕指令,將以前的顯示內(nèi)容清除 delay(5);}/*********初始化***********/voidsysinit(){ TMOD=0x21;//設(shè)定定期器T1工作方式2T0工作方式1 TH1=0xfd;//運(yùn)用T1中斷產(chǎn)生CLK信號?TL1=0xfd;//50khz?EA=1;//開總中斷??ET1=1;?TR1=1;//啟動定期器T1 TH0=0x45;?TL0=0x00;//50MS定期??ET0=1;?TR0=1; start=0;//START:A/D轉(zhuǎn)換啟動信號,輸入,高電平有效。?oe=0;//數(shù)據(jù)輸出允許信號,輸入,高電平有效。當(dāng)A/D轉(zhuǎn)換結(jié)束時,此端輸入一個高電平,才干打開輸出三態(tài)門,輸出數(shù)字量。}/***********T0中斷服務(wù)程序************/voidt0(void)interrupt1{ ET0=0;?TH0=0X45;//46 TL0=0X00;//50MS定期?n++;?if(n==20){flag=1;n=0;}? ET0=1; }voidt1(void)interrupt3{ ET1=0; CLK=~CLK; ET1=1;}//0808數(shù)據(jù)采集unsignedcharadc(){unsignedcharTemp;start=1;// delay(1);//donotdelay start=0;//啟動信號while(!eoc);//A/D轉(zhuǎn)換結(jié)束信號 P0=0xff;//?delay(1);oe=1; Temp=P0;//讀取采集數(shù)據(jù)oe=0;//delay(4);return(Temp);//返回采集數(shù)據(jù)}voiddisplay(uinta)//顯示子函數(shù){ uintbai,shi,ge; bai=a/100; shi=(a-bai*100)/10; ge=a%10;?WriteAddress(2); WriteData(0x30+bai);//顯示百位 WriteData(0x30+shi);//顯示十位?WriteData(0x30+ge);//顯示個位?}voidmain(){?uinttemp1,temp2;?ucharf=0; LcdInt();?delay(5);?sysinit(); CLK=0;?WriteAddress(0);//從第0行開始顯示?WriteData('f');//顯示f WriteData(':');//顯示:?WriteAddress(5);//從第5行開始顯示 WriteData('H');?//顯示H WriteData('z');//顯示z?while(1)?{ ? temp2=temp1; ?temp1=adc();//ad采集 ?? if(((temp1>=128)&&(temp2<=128))||((temp1<=128)&&(temp2>=128)))? { ? f++;// ??out_pulse=1;? _nop_(); ? _nop_();?? _nop_(); ?_nop_();???_nop_();? out_pulse=0;//產(chǎn)生5us的脈沖信號 }? if(flag==1)//到達(dá)1s后計(jì)算頻率 {?? flag=0; ? f=f/2; ? display(f);//顯示頻率???f=0; ? } ?}}5、電路圖6、仿真結(jié)果對的檢測到波形并顯示過零點(diǎn)。實(shí)驗(yàn)九DAC0832應(yīng)用實(shí)驗(yàn)自我完畢實(shí)驗(yàn)實(shí)驗(yàn)規(guī)定本實(shí)驗(yàn)運(yùn)用ADC0808和DAC0832實(shí)現(xiàn)簡樸的信號采集與輸出。ADC0808的4路輸入分別為:正弦波In0,三角波In1,方波In2,接地In3。2、實(shí)驗(yàn)環(huán)節(jié)①根據(jù)上述實(shí)驗(yàn)內(nèi)容,參考1.2.2,在Proteus環(huán)境下建立圖3.22所示原理圖,并將其保存為DAC0832_self.DSN文獻(xiàn)。②根據(jù)(2)和(3)畫出流程圖,并編寫源程序,將其保存為DAC0832_self.c。③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程DAC0832_self.uV2,CPU為AT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序DAC0832_self.c加入工程DAC0832_self.uV2,并設(shè)立工程DAC0832_self.uV2屬性,將其晶振頻率設(shè)立為12MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程DAC0832_self.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序DAC0832_self.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序DAC0832_self.hex。⑦運(yùn)營程序,觀測運(yùn)營結(jié)果,并驗(yàn)證其是否對的。⑨更改信號發(fā)射器的頻率,再次驗(yàn)證其功能是否對的。(注意:由于是軟仿真,所以信號采集的速度受到限制,因此所輸入的交流信號頻率也不能太高,可以在200Hz以內(nèi)嘗試)。3、源程序#include<reg52.h>//包含單片機(jī)寄存器的頭文獻(xiàn)#include<intrins.h>//包含_nop_()函數(shù)定義的頭文獻(xiàn)//AD端口定義sbitCLK=P3^4;sbitstart=P3^0;sbitoe=P3^1;sbiteoc=P3^2;//DA端口定義sbitdacs=P2^7;sbitdawr=P3^6;#defineucharunsignedchar#defineuintunsignedint/*********初始化***********/voidsysinit(){ TMOD=0x20;//設(shè)定定期器T1工作方式T0工作方式1 TH1=0xfe;//運(yùn)用T1中斷產(chǎn)生CLK信號 TL1=0xfe;//?EA=1;//開總中斷? ET1=1; TR1=1;//啟動定期器T1?start=0;//START:A/D轉(zhuǎn)換啟動信號,輸入,高電平有效。 oe=0;//數(shù)據(jù)輸出允許信號,輸入,高電平有效。當(dāng)A/D轉(zhuǎn)換結(jié)束時,此端輸入一個高電平,才干打開輸出三態(tài)門,輸出數(shù)字量。}voidt1(void)interrupt3{ ET1=0;?CLK=~CLK; ET1=1;}//adc0808數(shù)據(jù)采集unsignedcharadc(){unsignedcharTemp;start=1; start=0;//啟動信號while(!eoc);//A/D轉(zhuǎn)換結(jié)束信號 P1=0xff;oe=1;Temp=P1;//讀取采集數(shù)據(jù)oe=0;return(Temp);//返回采集數(shù)據(jù)}voidmain(){?uchara; sysinit(); ?dacs=0; dawr=0;?while(1)?{ a=adc();//AD轉(zhuǎn)換??P0=a;//DA轉(zhuǎn)換 }}4、電路圖5、仿真結(jié)果按下不同按鍵可以對四個波進(jìn)行選擇實(shí)驗(yàn)十I2C擴(kuò)展實(shí)驗(yàn)1、實(shí)驗(yàn)規(guī)定本實(shí)驗(yàn)與“3.3.2自我完畢實(shí)驗(yàn)”規(guī)定的功能類似,實(shí)現(xiàn)一個倒計(jì)時器。每過1s鐘倒計(jì)時器減1,當(dāng)前時間用兩個數(shù)碼管顯示。該倒計(jì)時器可以通過按鍵控制其起停與初值重載。本實(shí)驗(yàn)與“3.3.2自我完畢實(shí)驗(yàn)”不同之處是數(shù)碼管的驅(qū)動方式不同。本實(shí)驗(yàn)運(yùn)用品有I2C接口的PCF8574來驅(qū)動數(shù)碼管,而“3.3.2自我完畢實(shí)驗(yàn)”中運(yùn)用了74LS373鎖存器驅(qū)動。此外,本實(shí)驗(yàn)增長了一個具有I2C接口的EEPROM24c02來記錄當(dāng)前的運(yùn)營狀態(tài),涉及當(dāng)前時間和當(dāng)前的起停狀態(tài)。這樣,當(dāng)重新運(yùn)營程序時,系統(tǒng)會自動恢復(fù)上次程序運(yùn)營停止前的狀態(tài),并在此狀態(tài)基礎(chǔ)上繼續(xù)運(yùn)營。2、實(shí)驗(yàn)環(huán)節(jié)③運(yùn)營KeiluVision2開發(fā)環(huán)境,按照1.1.3節(jié)介紹的方法建立工程I2C.uV2,CPUAT89C51,包含啟動文獻(xiàn)STARTUP.A51。④按照1.2.2第(6)節(jié)介紹的方法將C語言源程序I2C.c加入工程I2C.uV2,并設(shè)立工程I2C.uV2屬性,將其晶振頻率設(shè)立為12MHz,選擇輸出可執(zhí)行文獻(xiàn),仿真方式為選擇硬仿真,并選擇其中的“PROTEUSVSMMONITOR51DRIVER”仿真器。⑤構(gòu)造(Build)工程I2C.uV2。假如輸入有誤進(jìn)行修改,直至構(gòu)造對的,生成可執(zhí)行程序I2C.hex為止。⑥為AT89C51設(shè)立可執(zhí)行程序I2C.hex。⑦運(yùn)營程序,點(diǎn)擊圖2.51中的各按鍵,程序運(yùn)營情況。⑧點(diǎn)擊主窗口左下方的按鈕,停止仿真過程。再點(diǎn)擊按鈕重新運(yùn)營程序觀測程序運(yùn)營是否可以繼續(xù)上一次運(yùn)營時的狀態(tài)繼續(xù)運(yùn)營3、源程序#include"reg51.h"#include"intrins.h"#defineucharunsignedchar#defineuintunsignedint#definefivenop(); _nop_();_nop_();_nop_();_nop_();_nop_();ucharKEY_TABLE[]={0x22,0x12,0x21,0x11};uintSPEED_TABLE[]={125,100,75,50,25};ucharLED_TABLE[]={0xef,0xf7,0xfb,0xfd,0xfe};ucharm;sbitscl=P1^0;sbitsda=P1^1;bitbdatai2c_ack;bitbdatarsuc;bitrun;ucharrdata,wdata,time;uchardataw2402buf[3];uchardatar2402buf[3];ucharsa8574=0x40;ucharsa2402=0xa0;ucharsa2402r=0xa1;voidi2c_start(){?sda=1;?_nop_(); scl=1; fivenop();?sda=0; fivenop();?scl=0; _nop_(); _nop_();}voidi2c_stop(){?sda=0; _nop_(); scl=1; fivenop();?sda=1;?fivenop();}biti2c_checkack(void){?ucharerrtime=255;?sda=1; fivenop();?scl=1;?fivenop();?while(sda)?{ ?errtime--; ?if(errtime==0)??{???i2c_stop(); ??return(0);??} ?sda=1;?} ?scl=0;?_nop_();?return(1);}voidi2c_sendB(uchar

溫馨提示

  • 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

提交評論