流水燈 單片機(jī)課程設(shè)計_第1頁
流水燈 單片機(jī)課程設(shè)計_第2頁
流水燈 單片機(jī)課程設(shè)計_第3頁
流水燈 單片機(jī)課程設(shè)計_第4頁
流水燈 單片機(jī)課程設(shè)計_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE1實(shí)驗(yàn)LED流水燈一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)單片機(jī)并口的使用方法。2.學(xué)習(xí)延時子程序的編寫和使用。3.學(xué)習(xí)集成開發(fā)環(huán)境MedWin的安裝與使用。4.學(xué)習(xí)STC單片機(jī)在線下載軟件STC-ISP的使用。二、實(shí)驗(yàn)內(nèi)容所謂流水燈就是8個發(fā)光二極管(LED)輪流點(diǎn)亮,周而復(fù)始。實(shí)驗(yàn)板上以P0口作輸出口,經(jīng)74LS244驅(qū)動,接8只發(fā)光二極管LED0-LED7。當(dāng)單片機(jī)的引腳輸出為低電平時發(fā)光二極管點(diǎn)亮,為高電平時息滅。編寫程序,使8個發(fā)光二極管循環(huán)點(diǎn)亮,時間間隔約0.5秒。三、實(shí)驗(yàn)電路連線實(shí)驗(yàn)板上與本實(shí)驗(yàn)有關(guān)的硬件如下圖所示。74LS244驅(qū)動輸出串聯(lián)8個限流電阻接8個LED發(fā)光管,以防止其電流過大而燒壞。單片機(jī)的主時鐘為11.0592MHz。JMP0和JMP1都短接1-2腳。四、實(shí)驗(yàn)說明1、P0口作為通用接口時是一準(zhǔn)雙向口,它作為輸出口時與一般的雙向口使用方法相同。由準(zhǔn)雙向口結(jié)構(gòu)可知當(dāng)P0口用作輸入口時必須先對它置“1”。若不先對它置“1”,讀入的數(shù)據(jù)是不正確的。輸出時需要接上拉電阻,P0口內(nèi)部沒有上拉電阻,若將外圍電路設(shè)計為低有效,高無效,則無需再外接上拉電阻。2、編寫一個軟件延時子程序,延時時間約0.5秒,采用三重循環(huán)實(shí)現(xiàn),匯編語言程序如下:DELAY:MOVR7,#198DEL1:MOVR6,#50DEL2:MOVR5,#23 DJNZR5,$ DJNZR6,DEL2DJNZR7,DEL1 RET查指令表可知執(zhí)行MOV指令需用1個機(jī)器周期,DJNZ指令需用2個機(jī)器周期,在11.0592MHz晶振時,一個機(jī)器周期時間長度為1.085μs,所以該段程序執(zhí)行時間為:[1+(1+2×23)×50]×198×1.085μs≈500mS3、若使用C語言,可用for循環(huán)實(shí)現(xiàn)延時,下面的程序延時約500mS。voiddelay(void){ inti,j; for(i=0;i<1000;i++) for(j=0;j<50;j++) {_nop_();_nop_();}}4、流水燈的主程序(匯編語言)為: ORG0000H LJMPMAIN ORG0100HMAIN: CLRP1.5 ;P1.5=0,關(guān)閉蜂鳴器。MOVA,#0FEHLOP: MOVP0,A LCALLDELAY RLA SJMPLOP END5、流水燈的C語言主程序?yàn)椋?include<reg51.h>#include<stdio.h>#include<intrins.h>voidmain(void){ unsignedchara,c; P1=0xdf; //P1.5=0,關(guān)閉蜂鳴器。 a=0xfe; while(1) { P0=a; c=a&0x80; a=a<<1; a=a|(c==0x80); delay(); }}五、思考題1.如何使點(diǎn)亮的LED從右往左移動?2.如何使點(diǎn)亮的LED從兩邊往中間移動?

實(shí)驗(yàn)二用一位數(shù)碼管循環(huán)顯示數(shù)字0~9一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)單片機(jī)并口的使用方法。2.學(xué)習(xí)延時子程序的編寫和使用。3.學(xué)習(xí)LED數(shù)碼管的驅(qū)動、編碼。二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)板上有8個LED數(shù)碼管,編寫程序,使最右邊的一個LED數(shù)碼管循環(huán)顯示0~9十個數(shù)字。時間間隔約0.5秒,其余LED數(shù)碼管關(guān)閉。三、實(shí)驗(yàn)電路連線實(shí)驗(yàn)板上與本實(shí)驗(yàn)有關(guān)的硬件如下圖所示。8個共陽的LED數(shù)碼管(S0-S7)上同名的引腳連接在一起,由單片機(jī)P0口通過74HC244驅(qū)動(段控制),R12-R19為限流電阻。單片機(jī)P2口的8個引腳分別通過三極管Q0-Q7控制8個LED數(shù)碼管的公共端(位控制)。單片機(jī)的主時鐘為11.0592MHz。JMP0短接2-3腳,JMP1短接1-2腳。8??LEDêy??1ü?ˉì???ê?μ??·8??êy?Y?y?ˉía?ó?§??四、實(shí)驗(yàn)說明1、P0口和P2都是準(zhǔn)雙向口,輸出時需要接上拉電阻。P0內(nèi)部沒有上拉電阻,P2口內(nèi)部有弱上拉。2、下表為驅(qū)動LED數(shù)碼管的段代碼表,1--代表對應(yīng)的筆段亮,0--代表對應(yīng)的筆段不亮。若需要在最右邊(S0)顯示數(shù)字“5”,只要將從表中查得的段代碼2CH寫入P0口,再將P2.0置高,P2.1-P2.7置低即可。數(shù)字dpecgbfa十六進(jìn)制P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0共陰共陽010110111B74810001010014EB210101101AD523100111019D624000111101E64610111011BB4470001010115EA810111111BF409100111119F603、實(shí)現(xiàn)最右邊的一個LED數(shù)碼管循環(huán)顯示0~9十個數(shù)字的C語言程序如下:#include<reg51.h>#include<stdio.h>#include<intrins.h>#defineucharunsignedcharconstucharcodetab[]={0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60};voiddelay(void){ inti,j; for(i=0;i<1000;i++) for(j=0;j<50;j++) {_nop_();_nop_();}}voidmain(void){ uchari; P2=0x01; P1=0xdf; while(1) { P0=tab[i]; delay(); i++; if(i==10)i=0; }}4、實(shí)現(xiàn)最右邊的一個LED數(shù)碼管循環(huán)顯示0~9十個數(shù)字的匯編語言程序如下:ORG0000H LJMPMAIN ORG0100HMAIN: MOVP1,#0DFH MOVP2,#01H MOVR1,#00HLOOP: MOVA,R1 MOVDPTR,#TAB MOVCA,@A+DPTR MOVP0,A LCALLDELAY INCR1 MOVA,R1 CJNEA,#10,LOOP CLRA MOVR1,A SJMPLOOP DELAY: MOVR7,#198DEL1: MOVR6,#50DEL2: MOVR5,#23 DJNZR5,$ DJNZR6,DEL2 DJNZR7,DEL1 RETTAB: DB48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60H END五、思考題1.分別寫出六個字母(用于顯示十六進(jìn)制數(shù))的段代碼,編寫程序,在最右邊數(shù)碼管上實(shí)現(xiàn)0-F的循環(huán)顯示。2.能否交替點(diǎn)亮點(diǎn)8個LED數(shù)碼管?

實(shí)驗(yàn)三LED數(shù)碼管的動態(tài)驅(qū)動一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)LED數(shù)碼管的動態(tài)驅(qū)動編程。2.學(xué)習(xí)使用定時/計數(shù)器、中斷。3.學(xué)習(xí)匯編語言的有關(guān)運(yùn)算。二、實(shí)驗(yàn)內(nèi)容編寫程序,使實(shí)驗(yàn)板上的8個LED數(shù)碼管穩(wěn)定顯示8個不同的數(shù)字,并使這四位數(shù)從00000000開始,每0.5秒鐘加1。三、實(shí)驗(yàn)電路連線本實(shí)驗(yàn)有關(guān)的硬件見實(shí)驗(yàn)二。四、實(shí)驗(yàn)說明1.在實(shí)驗(yàn)二中,我們已經(jīng)能夠讓某一個LED數(shù)碼管顯示需要的數(shù)字,比如選讓第一個LED顯示“1”,隔一較短的時間(如2.5毫秒)后關(guān)閉第一個LED,讓第二個LED顯示“2”,如此周而復(fù)始,讓8個LED依次顯1、2、3、4、5、6、7、8,我們就能看到8個LED上穩(wěn)定地顯示8個不同的數(shù)字。當(dāng)然,每個瞬間只有一個LED被點(diǎn)亮,大家亮的時間相同,均為2.5毫秒,8個LED數(shù)碼管點(diǎn)亮一遍需要20毫秒,一秒鐘各亮50次,所以看上去不會有閃爍感,但亮度只是實(shí)驗(yàn)二中LED亮度的八分之一。要實(shí)現(xiàn)每隔再隔2.5毫秒變換一個LED,最好的方法是使用定時器中斷。2.匯編語言參考程序?yàn)椋篖ED_PORT EQU P0 ;筆劃輸出,低有效SCN_PORT EQU P2 ;段掃描輸出,低有效(P2.4-P2.7) DSEG ORG 10HDISP_BUF: DS 8 ;顯示緩沖區(qū)SCN_INX: DS 1 ;掃描指針SCN_COD: DS 1 ;掃描碼CNT: DS 1 ;中斷計數(shù),每2.5ms加1 CSEG ORG 00H LJMP MAIN ;主程序入口,轉(zhuǎn)初始化程序 ORG 0BH ;定時中斷0入口 LJMP INTP0 ;每2.5ms中斷一次,用于刷新顯示;初始化 ORG 30HMAIN: MOV SP,#50H ;初始化堆棧指針 CLR RS0 ;選用第0組通用寄存器 CLR RS1 CLRP1.5 CLR A MOV CNT,A MOVR1,#8 MOVR0,#DISP_BUFLOOP1: MOV@R0,A ;顯示緩沖區(qū)清零 INCR0 DJNZR1,LOOP1 MOV SCN_INX,A ;掃描指針置0MOVSCN_COD,#80H ;右邊LED先點(diǎn)亮MOV TMOD,#01H ;定時器0,方式1 MOV TH0,#0F7H ;計數(shù)初值,每次2.5ms(11.0592MHz晶振) MOV TL0,#000H ;65536-(2.5ms/1.085us)=65536-2304=63232=0F700H SETB TR0 ;啟動定時器0 SETB EA ;中斷總允許 SETB ET0 ;允許定時器0中斷 SJMP $ ;主程序在此循環(huán);定時器0中斷服務(wù)程序,間隔2.5msINTP0: PUSH ACC PUSH PSW MOV TH0,#0F7H ;置計數(shù)初值 MOV TL0,#00H SETB RS0 ;選用第1組通用寄存器 CLR RS1 MOV A,SCN_INX ;取掃描指針 ANL A,#07H ;清除高5位 ADD A,#DISP_BUF ;加顯示緩沖區(qū)首地址 MOV R1,A MOV A,@R1 MOV DPTR,#CODE_TAB ;DPTR指向筆劃代碼表 ANL A,#0FHMOVCA,@A+DPTR ;取筆劃代碼 MOVLED_PORT,A ;筆劃代碼送LED口 MOV A,SCN_COD ;取掃描段代碼 MOV P2,AMOV A,SCN_CODRRA ;掃描段代碼循環(huán)右移一位 MOV SCN_COD,A INC SCN_INX ;掃描指針+1 INC CNT MOV A,CNT CJNEA,#200,EN MOV CNT,#0 INC DISP_BUF+7 ;個位加一 MOV A,DISP_BUF+7 CJNEA,#10,EN ;不進(jìn)位轉(zhuǎn)移 MOV DISP_BUF+7,#0 ;進(jìn)位則個位清零 INC DISP_BUF+6 ;十位加一 MOV A,DISP_BUF+6 CJNEA,#10,EN MOV DISP_BUF+6,#0 ;進(jìn)位則十位清零 INC DISP_BUF+5 ;百位加一 MOV A,DISP_BUF+5 CJNEA,#10,EN MOV DISP_BUF+5,#0 ;進(jìn)位則百位清零 INC DISP_BUF+4 ;千位加一 MOV A,DISP_BUF+4 CJNEA,#10,EN MOV DISP_BUF+4,#0 ;進(jìn)位則千位清零 INC DISP_BUF+3 ;萬位加一 MOV A,DISP_BUF+3 CJNEA,#10,EN MOV DISP_BUF+3,#0 ;進(jìn)位則萬位清零 INC DISP_BUF+2 ;十萬位加一 MOV A,DISP_BUF+2 CJNEA,#10,EN MOV DISP_BUF+2,#0 ;進(jìn)位則十萬位清零 INC DISP_BUF+1 ;百萬位加一 MOV A,DISP_BUF+1 CJNEA,#10,EN MOV DISP_BUF+1,#0 ;進(jìn)位則百萬位清零 INC DISP_BUF+0 ;千萬位加一 MOV A,DISP_BUF+0 CJNEA,#10,EN MOV DISP_BUF+0,#0 ;進(jìn)位則千萬位清零 EN: POP PSW POP ACC RETI;筆劃代碼表CODE_TAB: DB 48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60H END3.C語言參考程序?yàn)椋?include<reg51.h>#defineucharunsignedcharconstucharcodetab1[]={0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60};constucharcodetab2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};ucharbuf[8]={0,0,0,0,0,0,0,0};//顯示緩沖區(qū),開機(jī)先顯示"00000000"voidmain(void){ P1=0xdf; EA=1; //允許中斷 TMOD=0x01; //設(shè)定時器0為模式1(16位) ET0=1; //定時器0中斷允許 TH0=0xf7; //晶振11.0592MHz,2.5ms TL0=0; TR0=1; //開始計數(shù) while(1); //死循環(huán),等待中斷}voidtimeint(void)interrupt1//定時器0中斷服務(wù)程序{ staticuchark,count; chari; TH0=0xf7; //設(shè)置定時器時間常數(shù) TL0=0; k++; k&=0x07; P0=tab1[buf[k]]; //筆劃代碼送P0口 P2=tab2[k]; //控制掃描碼送P2口 if(++count==200) //計數(shù)200次為2.5msX200=0.5s { count=0; //到0.5秒鐘,顯示的數(shù)字加一 for(i=7;i>=0;i--) {buf[i]++; if(buf[i]==10)buf[i]=0;//加到10向前進(jìn)位 elsebreak; } }}五、思考題如何讓8個LED數(shù)碼管從00-00-00開始,每秒鐘自動加1,前兩位代表時,中間兩位代表分,后兩位代表秒?

實(shí)驗(yàn)四用單片機(jī)自動演奏樂曲一、實(shí)驗(yàn)?zāi)康模?)進(jìn)一步熟悉89C51定時器/計數(shù)器的功能及應(yīng)用;(2)掌握其初始化與中斷服務(wù)程序的編程方法;(3)掌握用定時器/計數(shù)器發(fā)出不同音調(diào)的編程方法。二、實(shí)驗(yàn)內(nèi)容用單片機(jī)的定時器/計數(shù)器0作定時器使用,工作于模式1,中斷產(chǎn)生方波發(fā)聲,根據(jù)各個的頻率,計算對應(yīng)的定時時間常數(shù),定時器中斷后按此常數(shù)賦初值,從而發(fā)出對應(yīng)的音調(diào)。將歌曲的音調(diào)和節(jié)拍編成一個表,用音調(diào)作為定時器的初值,用節(jié)拍控制發(fā)音時間,就可以實(shí)現(xiàn)自動演奏。三、實(shí)驗(yàn)電路連線本實(shí)驗(yàn)有關(guān)的硬件如右圖所示。四、實(shí)驗(yàn)說明聲單定時初值常數(shù)計算方法:根據(jù)下表的音階頻率,計算對應(yīng)的音階周期T,用T/2計算定時周期數(shù)(晶振11.0592MHz),填入下表中。定時器的計數(shù)初值為65536-定時周期數(shù),在程序計算產(chǎn)生。定時周期數(shù)增加1倍,音階降低八度,定時周期數(shù)降低1倍,音階升高八度。音階(C調(diào))1234567頻率(Hz)256288320341384427480周期(μs)3906347231252932260423422083定時周期數(shù)3600320028802702240021581920自動演奏《東方紅》樂曲的C語言程序?yàn)椋?include<REG51.h>#defineucharunsignedchar#defineuintunsignedintsbitP15=P1^5;codeuintcyc[]={3600,3200,2880,2702,2400,2158,1920};//音階1-7對應(yīng)的計數(shù)周期數(shù)codeuchartone[]={15,15,16,12,11,11,06,12,15,15,16,21,16,15,11,11, 06,12,15,12,11,7,6,5,15,12,13,12,11,11,6,12, 13,12,11,12,11,7,6,5,0};//樂曲《東方紅》的簡譜表codeuchartime[]={8,4,4,16,8,4,4,16,8,8,4,4,4,4,8,4, 4,16,8,8,8,4,4,8,8,8,4,4,8,4,4,4, 4,4,4,4,4,4,4,16,0};//節(jié)拍表(8為1拍,約570mS)ucharH0,L0,cnt;voidcntint0(void)interrupt1//定時器0中斷用于產(chǎn)生音調(diào){ TH0=H0; TL0=L0; P15=~P15; //P1.5是音樂信號輸出腳}voidcntint1(void)interrupt3//定時器1中斷用于產(chǎn)生節(jié)拍{ cnt++; //定時器的計數(shù)初值為0,所以不用賦值}voidmain(void){ uchari,a,t; uintb;next: TMOD=0x11; EA=1; ET0=1; ET1=1; cnt=0; TR1=1; i=0; while(1) { t=tone[i]; //讀音調(diào) if(t==0)break; //是0,則結(jié)束 b=cyc[t%10-1]; if(t<10)b=b*2; if(t>20)b=b/2;b=b/2; H0=(65536-b)/256; L0=(65536-b)%256; cnt=0; a=time[i]; //讀節(jié)拍 if(a!=255)TR0=1; //255是休止符 while(a>cnt); TR0=0; i++; for(b=0;b<1000;b++); } P15=1; //關(guān)閉喇叭 gotonext; //重放一遍}五、思考題參考《東方紅》樂曲的演奏程序,編寫《康定情歌》樂曲的演奏程序?!犊刀ㄇ楦琛返臉纷V如下:康定情歌13,15,16,16,15,16,13,12,12,13,15,16,16,15,16,13,13,13,15,16,16,15,8,8,8,4,4,8,8,12,4,8,8,8,4,4,8,16,8,8,8,8,4,4,16,13,12,12,15,13,12,13,12,11,12,6,6,12,8,8,12,4,8,8,4,4,4,4,8,24,8,24,15,13,12,6,16,15,13,12,13,12,11,12,6,5,68,24,8,16,8,8,8,4,4,4,4,8,16,8,32附:自動演奏樂曲《八月桂花啟遍地開》的匯編語言參考程序。ORG0000HLJMPSTART ORG000BH INC20H ;中斷服務(wù),中斷計數(shù)器加1 MOVTH0,#0DCH MOVTL0,#00H ;11.0592MHz晶振,形成10毫秒中斷 RETISTART: MOVSP,#50H MOVTH0,#0DCH MOVTL0,#00H MOVTMOD,#01H MOVIE,#82HMUSIC0: NOP MOVDPTR,#DAT ;表頭地址送DPTR MOV20H,#00H ;中斷計數(shù)器清0MUSIC1: NOP CLRA ;ACC清零 MOVCA,@A+DPTR ;查表取代碼 JZEND0 ;是00H,則結(jié)束 CJNEA,#0FFH,MUSIC5 ;如果是休止符,往下執(zhí)行 LJMPMUSIC3MUSIC5: NOP MOVR6,A ;R6=18H音符的頻率 INCDPTR ;DPTR加一 MOVA,#0 MOVCA,@A+DPTR ;取節(jié)拍代碼送R7 MOVR7,A ;R7=30H音符發(fā)音的時間 SETBTR0 ;啟動計數(shù)MUSIC2: NOP CPLP1.5 ;P1.5是音樂輸出引腳 MOVA,R6 MOVR3,A ;R3=R6=18H LCALLDEL MOVA,R7 CJNEA,20H,MUSIC2 ;中斷計數(shù)器(20H)=R7否?;不等,則繼續(xù)循環(huán) MOV20H,#00H ;等于,則取下一代碼 INCDPTR LJMPMUSIC1MUSIC3: NOP ;休止100毫秒 CLRTR0 MOVR2,#0DH ;R2=13MUSIC4: NOP MOVR3,#0FFH ;R3=255 LCALLDEL DJNZR2,MUSIC4 INCDPTR LJMPMUSIC1END0: NOP MOVR2,#0FFH ;歌曲結(jié)束,延時1秒后繼續(xù)MUSIC6: MOVR3,#00H LCALLDEL DJNZR2,MUSIC6 LJMPMUSIC0DEL: NOPDEL3: MOVR4,#02HDEL4: NOP DJNZR4,DEL4 NOP DJNZR3,DEL3 RETDAT: DB18H,30H,1CH,10H,20H,40H,1CH,10H,18H,10H,20H,10H,1CH,10H,18H,40H DB1CH,20H,20H,20H,1CH,20H,18H,20H,20H,80H,0FFH,20H,30H,1CH,10H,18H DB20H,15H,20H,1CH,20H,20H,20H,26H,40H,20H,20H,2BH,20H,26H,20H,20H DB20H,30H,80H,0FFH,20H,20H,1CH,10H,18H,10H,20H,20H,26H,20H,2BH,20H DB30H,20H,2BH,40H,20H,20H,1CH,10H,18H,10H,20H,20H,26H,20H,2BH,20H DB30H,20H,2BH,40H,20H,30H,1CH,10H,18H,20H,15H,20H,1CH,20H,20H,20H DB26H,40H,20H,20H,2BH,20H,26H,20H,20H,20H,30H,80H,20H,30H,1CH,10H DB20H,10H,1CH,10H,20H,20H,26H,20H,2BH,20H,30H,20H,2BH,40H,20H,15H DB1FH,05H,20H,10H,1CH,10H,20H,20H,26H,20H,2BH,20H,30H,20H,2BH,40H DB20H,30H,1CH,10H,18H,20H,15H,20H,1CH,20H,20H,20H,26H,40H,20H,20H DB2BH,20H,26H,20H,20H,20H,30H,30H,20H,30H,1CH,10H,18H,40H,1CH,20H DB20H,20H,26H,40H,13H,60H,18H,20H,15H,40H,13H,40H,18H,80H,00H END

實(shí)驗(yàn)五電子鐘一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)使用定時/計數(shù)器。2.學(xué)習(xí)獨(dú)立式按鍵的查詢識別方法。3.學(xué)習(xí)實(shí)用程序的編程技巧。二、實(shí)驗(yàn)內(nèi)容在實(shí)驗(yàn)板上編寫程序,實(shí)驗(yàn)電子鐘功能。時間顯示格式為HH-MM-SS,用按鍵可以調(diào)整當(dāng)前時間,具有整點(diǎn)提示功能。三、實(shí)驗(yàn)電路連線本實(shí)驗(yàn)有關(guān)顯示部分的硬件見實(shí)驗(yàn)二,按鍵連接見下圖。四、實(shí)驗(yàn)說明該電子鐘在上電或復(fù)位后時間從13時59分50秒開始,若要使電子鐘斷電后照常行走,應(yīng)采取電池供電。為了降低使用成本及減小體積,可采用兩節(jié)5號電池,其滿電量時電壓為3伏,89C51單片機(jī)的正常工作電壓范圍為4.5~5.5伏,無法使用,可選用89C2051單片機(jī)(電壓范圍2.7~6伏),最好使用工作電壓更低的單片機(jī)(如1.8伏)。為了延長電池使用壽命,必須采取一些節(jié)電措施,如將LED換成液晶、讓單片機(jī)不工作時進(jìn)入休眠方式、適當(dāng)降低單片機(jī)的時鐘頻率等。電子鐘C語言參考程序如下:(含按鍵檢測、調(diào)整時間、整點(diǎn)提示功能)#include<reg51.h>#include<stdio.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;typedefunsignedlongulong;#defineK00x01#defineK10x02#defineK20x04#defineK30x08ucharsec=50,min=59,hour=13;ucharkey_new;uintcount;uintdelay_time;bitkey_on,key_again;bitNewTime=0;sbitP15=P1^5;voidkeyscan();voiddelay(uintt);voidmain(){ P1=0xdf; TMOD=0x01; TH0=(65536-2304)/256; //設(shè)置定時器初值,2.5ms中斷一次 TL0=(65536-2304)%256; TR0=1; ET0=1;EA=1; while(1) { if(key_on) { key_on=0; switch(key_new) { caseK0:sec=0;min++;min%=60;count=0;break; caseK1:sec=0;hour++;hour%=24;count=0;break; caseK2:sec=0;hour=0;min=0;count=0;break; caseK3:sec=0;hour=23;min=59;count=0;break; } } if(NewTime==1) { NewTime=0; if((min==59)&&(sec>=55)) { P15=1;delay(80);P15=0;} elseif((min==0)&&(sec==0)) { P15=1;delay(250);P15=0;} } }}//==========================================================================voidkeyscan(){ uchardatakey_temp; staticuchardatakeylong; key_temp=(~P1)&0x0f; if(key_temp==0) {key_new=key_temp;keylong=0;key_on=0;key_again=0;} elseif(key_new!=key_temp) {key_new=key_temp;key_on=0;key_again=0;keylong=1;} elseif(keylong<4) {key_on=0;key_again=0;keylong++;} elseif(keylong==4) {key_on=1;key_again=1;keylong++;} elseif(keylong>200){key_on=0;key_again=1;keylong=170;} else{keylong++;}}//==========================================================================voidtimer_0(void)interrupt1{ codeucharTAB1[]={0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60}; codeucharTAB2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; staticuchardsp[8]; staticucharn; TH0=(65536-2304)/256; //設(shè)置定時器初值,2.5ms中斷一次 TL0=(65536-2304)%256; delay_time++; if(++count==400) { ++sec;count=0;NewTime=1; if(sec==60) {++min; sec=0;} if(min==60) {++hour; min=0;} if(hour==24) {hour=0;} } dsp[0]=TAB1[hour/10]; dsp[1]=TAB1[hour%10]; dsp[2]=0xf7; dsp[3]=TAB1[min/10]; dsp[4]=TAB1[min%10]; dsp[5]=0xf7; dsp[6]=TAB1[sec/10]; dsp[7]=TAB1[sec%10]; n++;n%=8; P0=dsp[n];P2=TAB2[n]; if((count%10)==0)keyscan();}//========================================================================voiddelay(uintt){ EA=0; delay_time=0; EA=1; while(delay_time<t);}五、思考題1.給電子鐘加上打鈴的功能,打鈴時間固定。2.給電子鐘加上打鈴時間調(diào)節(jié)功能。如何實(shí)現(xiàn)多點(diǎn)(4個)打鈴功能?附:電子鐘匯編參考程序,不含按鍵檢測和整點(diǎn)提示功能。LED_PORT EQU P0 ;筆劃輸出,低有效SCN_PORT EQU P2 ;段掃描輸出,低有效(P2.4-P2.7) DSEG ORG 10HDISP_BUF: DS 8 ;顯示緩沖區(qū)SCN_INX: DS 1 ;掃描指針SCN_COD: DS 1 ;掃描碼CNT: DS 2 ;中斷計數(shù),每2.5ms加1 CSEG ORG 00H LJMP MAIN ;主程序入口,轉(zhuǎn)初始化程序 ORG 0BH ;定時中斷0入口 LJMP INTP0 ;每2.5ms中斷一次,用于刷新顯示;初始化 ORG 30HMAIN: MOV SP,#50H ;初始化堆棧指針 CLR RS0 ;選用第0組通用寄存器 CLR RS1 CLRP1.5 CLR A MOV CNT+0,A MOV CNT+1,A MOV DISP_BUF+0,#2 ;時十位 MOV DISP_BUF+1,#3 ;時個位 MOV DISP_BUF+2,#10 ;顯示'-' MOV DISP_BUF+3,#5 ;分十位 MOV DISP_BUF+4,#8 ;分個位 MOV DISP_BUF+5,#10 ;顯示'-' MOV DISP_BUF+6,#0 ;秒十位 MOV DISP_BUF+7,#0 ;秒個位 MOV SCN_INX,A ;掃描指針置0MOVSCN_COD,#80H ;右邊LED先點(diǎn)亮MOV TMOD,#01H ;定時器0,方式1 MOV TH0,#0F7H ;計數(shù)初值,每次2.5ms(11.0592MHz晶振) MOV TL0,#000H ;65536-(2.5ms/1.085us)=65536-2304=63232=0F700H SETB TR0 ;啟動定時器0 SETB EA ;中斷總允許 SETB ET0 ;允許定時器0中斷 SJMP $ ;主程序在此循環(huán);定時器0中斷服務(wù)程序,間隔2.5msINTP0: PUSH ACC PUSH PSW MOV TH0,#0F7H ;置計數(shù)初值 MOV TL0,#00H SETB RS0 ;選用第1組通用寄存器 CLR RS1 MOV A,SCN_INX ;取掃描指針 ANL A,#07H ;清除高5位 ADD A,#DISP_BUF ;加顯示緩沖區(qū)首地址 MOV R1,A MOV A,@R1 MOV DPTR,#CODE_TAB ;DPTR指向筆劃代碼表 ANL A,#0FHMOVCA,@A+DPTR ;取筆劃代碼 MOVLED_PORT,A ;筆劃代碼送LED口 MOV A,SCN_COD ;取掃描段代碼 MOV P2,AMOV A,SCN_CODRRA ;掃描段代碼循環(huán)右移一位 MOV SCN_COD,A INC SCN_INX ;掃描指針+1 INC CNT ;中斷計數(shù),計2個200次1秒 MOV A,CNT CJNEA,#200,EN MOV CNT,#0 INCCNT+1 MOVA,CNT+1 CJNEA,#2,EN MOVCNT+1,#0 INC DISP_BUF+7 ;秒個位加一 MOV A,DISP_BUF+7 CJNEA,#10,EN ;不進(jìn)位轉(zhuǎn)移 MOV DISP_BUF+7,#0 ;進(jìn)位則秒個位清零 INC DISP_BUF+6 ;秒十位加一 MOV A,DISP_BUF+6 CJNEA,#6,EN MOV DISP_BUF+6,#0 ;進(jìn)位則秒十位清零 INC DISP_BUF+4 ;分個位加一 MOV A,DISP_BUF+4 CJNEA,#10,EN MOV DISP_BUF+4,#0 ;進(jìn)位則分個位清零 INC DISP_BUF+3 ;分十位加一 MOV A,DISP_BUF+3 CJNEA,#6,EN MOV DISP_BUF+3,#0 ;進(jìn)位則分十位清零 INC DISP_BUF+1 ;時個位加一 MOV A,DISP_BUF+1 CJNEA,#10,EN1 MOV DISP_BUF+1,#0 ;進(jìn)位則時個位清零 INC DISP_BUF+0 ;時十位加一 EN1: MOVA,DISP_BUF+0 CJNEA,#2,EN MOVA,DISP_BUF+1 CJNEA,#4,EN MOV DISP_BUF+0,#0 MOV DISP_BUF+1,#0 EN: POP PSW POP ACC RETI;筆劃代碼表CODE_TAB: DB 48H,0EBH,52H,62H,0E1H,64H,44H,0EAH,40H,60H,0F7H END

實(shí)驗(yàn)六單片機(jī)與PC機(jī)的串行通信一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)單片機(jī)串口的設(shè)置。2.學(xué)習(xí)TTL-RS232信號的轉(zhuǎn)換。3.學(xué)習(xí)單片機(jī)串行通信程序設(shè)計。二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)板上有RS-232接口,將該接口與PC機(jī)的串口連接,可以實(shí)現(xiàn)單片機(jī)與PC機(jī)的串行通信,進(jìn)行雙向數(shù)據(jù)傳輸。本實(shí)驗(yàn)要求在實(shí)驗(yàn)五的基礎(chǔ)上增加通訊功能,單片機(jī)每秒鐘向PC機(jī)發(fā)送用ASCII碼表示的時間,格式為HH:MM:SS(時:分:秒)。同時可以通過PC機(jī)向單片機(jī)發(fā)送修改時間的指令,實(shí)現(xiàn)時間的調(diào)整,指令格式為TIMEHH:MM:SS。三、實(shí)驗(yàn)電路連線本實(shí)驗(yàn)有關(guān)的硬件見下圖。四、實(shí)驗(yàn)說明51單片機(jī)有一個全雙工的串行通訊口,所以單片機(jī)和電腦之間可以方便地進(jìn)行串口通信。進(jìn)行串行通訊信要滿足一定的條件,比如電腦的串口是RS232電平(-5~-15V為1,+5~+15V為0),而單片機(jī)的串口是TTL電平(大于+2.4V為1,小于-0.7V為0),兩者之間必須有一個電平轉(zhuǎn)換電路,上圖中用MAX232E集成電路實(shí)現(xiàn)RS232電平與TTL電平的相互轉(zhuǎn)換。為了能夠在PC機(jī)上看到單片機(jī)發(fā)出的數(shù)據(jù),我們必須借助一個Windows軟件進(jìn)行觀察,這里我們可以使用免費(fèi)的串口調(diào)試程序SSCOM32或Windows的超級終端。單片機(jī)與PC機(jī)的串行通信C51參考程序如下:#include<reg51.h>#include<stdio.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;typedefunsignedlongulong;#defineK00x01#defineK10x02#defineK20x04#defineK30x08ucharsec=50,min=59,hour=13;ucharkey_new;uintcount;uintdelay_time;bitkey_on,key_again;bitNewTime=0;sbitP15=P1^5;voidkeyscan();voiddelay(uintt);voidSentTime();voidmain(){ P1=0xdf; TMOD=0x21; //定時器0工作方式1,定時器1工作方式2。 TH0=(65536-2304)/256; //設(shè)置定時器0初值,2.5ms中斷一次 TL0=(65536-2304)%256; SCON=0x50; //串口工作方式1,允許接收 TH1=0xfd; //設(shè)置波特率為9600 TL1=0xfd; TR0=1; TR1=1; ET0=1; ES=1; EA=1; //中斷允許 IP=0; PS=1; //串行中斷高優(yōu)先級 while(1) { if(key_on) { key_on=0; switch(key_new) { caseK0:sec=0;min++;min%=60;count=0;break; caseK1:sec=0;hour++;hour%=24;count=0;break; caseK2:sec=0;hour=0;min=0;count=0;break; caseK3:sec=0;hour=23;min=59;count=0;break; } } if(NewTime==1) { NewTime=0; SentTime(); if((min==59)&&(sec>=55)) { P15=1;delay(80);P15=0;} elseif((min==0)&&(sec==0)) { P15=1;delay(250);P15=0;} } }}//==========================================================================voidkeyscan(){ uchardatakey_temp; staticuchardatakeylong; key_temp=(~P1)&0x0f; if(key_temp==0) {key_new=key_temp;keylong=0;key_on=0;key_again=0;} elseif(key_new!=key_temp) {key_new=key_temp;key_on=0;key_again=0;keylong=1;} elseif(keylong<4) {key_on=0;key_again=0;keylong++;} elseif(keylong==4) {key_on=1;key_again=1;keylong++;} elseif(keylong>200){key_on=0;key_again=1;keylong=170;} else{keylong++;}}//==========================================================================voidtimer_0(void)interrupt1{ codeucharTAB1[]={0x48,0xeb,0x52,0x62,0xe1,0x64,0x44,0xea,0x40,0x60}; codeucharTAB2[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; staticuchardsp[8]; staticucharn; TH0=(65536-2304)/256; //設(shè)置定時器初值,2.5ms中斷一次 TL0=(65536-2304)%256; delay_time++; if(++count==500) { ++sec;count=0;NewTime=1; if(sec==60) {++min; sec=0;} if(min==60) {++hour; min=0;} if(hour==24) {hour=0;} } dsp[0]=TAB1[hour/10]; dsp[1]=TAB1[hour%10]; dsp[2]=0xf7; dsp[3]=TAB1[min/10]; dsp[4]=TAB1[min%10]; dsp[5]=0xf7; dsp[6]=TAB1[sec/10]; dsp[7]=TAB1[sec%10]; n++;n%=8; P0=dsp[n];P2=TAB2[n]; if((count%10)==0)keyscan();}//==========================================================================voiddelay(uintt){ delay_time=0; while(delay_time<t);}//==========================================================================voidints(void)interrupt4{ staticucharj=0; constucharcodetab[]="TIME00:00:00"; ucharch,t[12]; if(RI==0){TI=0;return;}; RI=0; ch=SBUF; if((tab[j]=='0')||((tab[j]!='0')&&(ch==tab[j]))){t[j]=ch;j++;} else j=0; if(j==13) { hour=(t[5]-'0')*10+(t[6]-'0'); min=(t[8]-'0')*10+(t[9]-'0'); sec=(t[11]-'0')*10+(t[12]-'0'); j=0; } return;}//==========================================================================voidSentTime(){ ES=0; SBUF='0'+(hour/10); while(TI==0);TI=0; SBUF='0'+(hour%10); while(TI==0);TI=0; SBUF=':'; while(TI==0);TI=0; SBUF='0'+(min/10); while(TI==0);TI=0; SBUF='0'+(min%10); while(TI==0);TI=0; SBUF=':'; while(TI==0);TI=0; SBUF='0'+(sec/10); while(TI==0);TI=0; SBUF='0'+(sec%10); while(TI==0);TI=0; SBUF='\r'; while(TI==0);TI=0; SBUF='\n'; while(TI==0);TI=0; ES=1;}五、思考題1.改變串行通訊的波特率,如4800,2400等。修改程序,用PC機(jī)控制單片機(jī)是否每秒鐘向PC機(jī)傳送時間,命令為:傳送PC機(jī)發(fā)送SEND1;不傳送PC機(jī)發(fā)送SEND0。2.實(shí)驗(yàn)五思考題要求給電子鐘加上打鈴的功能,編寫程序,實(shí)現(xiàn)通過PC機(jī)設(shè)置單片機(jī)多點(diǎn)(如4個打鈴點(diǎn))打鈴時間。

實(shí)驗(yàn)七I2C串行flash存儲器的讀寫一、實(shí)驗(yàn)?zāi)康?.學(xué)習(xí)I2C總線串行flash存儲器24C01的讀寫操作。2.學(xué)習(xí)多個C51程序文件的編寫和編譯方法。二、實(shí)驗(yàn)內(nèi)容實(shí)驗(yàn)板上有1片串行flash存儲器24C01,編寫程序,對該存儲器進(jìn)行讀寫操作。具體要求是,每次程序初始化時,讀取24C01地址為0x00-0x02的3個單元的值,將0-2單元的值分別賦給時、分、秒,作為時鐘的起始時間;每次時鐘秒更新,再將當(dāng)前時間的時、分、秒分別存儲到24C01地址為0x00-0x02的3個單元。這樣,單片機(jī)每次開機(jī)后,時間接著上次關(guān)機(jī)的時間繼續(xù)計時。三、實(shí)驗(yàn)電路連線本實(shí)驗(yàn)有關(guān)的電路連接見右圖。四、實(shí)驗(yàn)說明89C51單片機(jī)沒有內(nèi)部閃存,若有用戶輸入的數(shù)據(jù)需掉電保持,則要加外部閃存,24CXX系列就是常用的閃存芯片。串行閃存芯片的引腳少,占線路板面積小,與單片機(jī)的連線簡單,因而被廣泛使用。89C51單片機(jī)不支持I2C總線協(xié)議,必須按照I2C總線時序用軟件模擬。1.實(shí)現(xiàn)對24C01進(jìn)行讀寫的C語言程序:24c01.c#include<reg51.h>#include<intrins.h>//對24C01的讀、寫externvoidDelayMs(unsignedint);externvoidRead24c01(unsignedchar*RamAddress,unsignedcharRomAddress,unsignedcharbytes);externvoidWrite24c01(unsignedchar*RamAddress,unsignedcharRomAddress,unsignedcharbytes);/***************************************************************************/#define WriteDeviceAddress0xa0#define ReadDviceAddress0xa1/***************************************************************************/sbit SCL=P1^6;sbit SDA=P1^7;/***************************************************************************/voidDelayMs(unsignedintnumber){ unsignedchartemp; for(;number!=0;number--) { for(temp=112;temp!=0;temp--){ } }}/***************************************************************************/voidStart(){ SDA=1;SCL=1;SDA=0;SCL=0;}/***************************************************************************/voidStop(){ SCL=0;SDA=0;SCL=1

溫馨提示

  • 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

提交評論