單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(V2.3)_第1頁
單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(V2.3)_第2頁
單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(V2.3)_第3頁
單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(V2.3)_第4頁
單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(V2.3)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

/單片機(jī)原理與應(yīng)用技術(shù)實(shí)驗(yàn)指導(dǎo)書(Freescale)機(jī)械工程學(xué)院機(jī)械電子工程教研室王曉峰實(shí)驗(yàn)一飛思卡爾嵌入式實(shí)驗(yàn)系統(tǒng)入門—GPIO控制實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模菏煜odeWarrior集成開發(fā)環(huán)境及飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)掌握AW60的GPIO結(jié)構(gòu)及控制方法掌握CodeWarrior工程結(jié)構(gòu)及創(chuàng)建匯編工程熟悉匯編指令及應(yīng)用匯編語言編程方法二、實(shí)驗(yàn)內(nèi)容1。運(yùn)用CodeWarrior新建工程,進(jìn)行工程程序編輯、編譯、下載、調(diào)試;2.利用飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)根據(jù)實(shí)驗(yàn)需要進(jìn)行硬件連接;3.觀察示例工程項(xiàng)目,該工程功能為:根據(jù)連接在PTC0、PTC1口上的兩個(gè)撥動(dòng)開關(guān)的狀態(tài),控制接中PTB口上的八個(gè)LED處在以下二種不同狀態(tài):八個(gè)LED同時(shí)亮—滅循環(huán);四個(gè)燈交替亮—滅;4。設(shè)計(jì)一個(gè)比示例工程簡(jiǎn)單的工程項(xiàng)目,內(nèi)容為控制PTB口上連接的八個(gè)LED燈同時(shí)亮-滅循環(huán)一次再四個(gè)燈交替亮—滅一次.5.設(shè)計(jì)一個(gè)比示例工程更復(fù)雜一些的工程項(xiàng)目,根據(jù)連接在PTC口上的兩個(gè)撥動(dòng)開關(guān)的狀態(tài),控制接中PTB口上的八個(gè)LED處在以下四種不同狀態(tài):八個(gè)LED亮—滅循環(huán);四個(gè)燈交替亮—滅;一個(gè)LED左移流水燈;兩個(gè)LED右移流水燈。三、實(shí)驗(yàn)步驟(注意:在調(diào)試過程中如需要進(jìn)行連接線路時(shí),要先將實(shí)驗(yàn)箱斷電,待電路連接好后再接通電源!?。。?.將飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)實(shí)驗(yàn)箱接上電源,寫入器BDM接頭插接入核心卡BDM座,USB頭接入PC機(jī)USB口.2.PC機(jī)上啟動(dòng)CodeWarrior,新建工程LED。mcp(注意設(shè)置工程保存路徑)3.觀察工程文件結(jié)構(gòu),查看相應(yīng)文件。4.在main.a(chǎn)sm中編輯工程主文件5.編輯相關(guān)子程序6.編譯,如果有錯(cuò)誤修改,直至編譯通過7.鏈接、下載,調(diào)試觀察LED燈現(xiàn)象GNDGNDVcc撥碼開關(guān)導(dǎo)線接插點(diǎn)圖1—1LED及撥動(dòng)開關(guān)原理圖四、參考程序1。主匯編程序main。asm該程序?yàn)楦鶕?jù)PTD口的PTD0上接的撥動(dòng)開關(guān)的狀態(tài)控制連接在PTB口上的八個(gè)LED燈在四亮四暗狀態(tài)或八個(gè)燈同時(shí)亮同時(shí)暗的狀態(tài)XDEFasm_mainXREFMCUInitXREFDelayHXINCLUDE’derivative。inc'INCLUDE’light.inc'INCLUDE'switch。inc'MyCode:SECTION;thisassemblyroutineiscalledtheC/C++applicat(yī)ionasm_main:JSRMCUInitJSRSwitch_InitJSRLight_InitM_Scan:JSRSwitch_ReadLDA$70CMP?!?1BNEM01LDA#0JSRLight_On_OffLDHX?!?fffJSRDelayHXLDA#1JSRLight_On_OffLDHX#$0fffJSRDelayHXBRAM_ScanM01:CMP#$02BNEM02JSRLight_HalfLDHX#$0fffJSRDelayHXM02:BRAM_ScanRTS;returntocaller2、LED燈構(gòu)件程序light.a(chǎn)sm;[Light.asm]小燈驅(qū)動(dòng)—-—-—--—-—--——-—-——-—-—-——-——-—----———--——-------*;本文件包含:*;(1)Light_init:定義控制小燈的MCU的I/O引腳為輸出*;(2)Light_On_Off:驅(qū)動(dòng)小燈"亮”,”暗"*;-------——----——-—--—---———--——-—--—-----—---—-—-——---———-—-—--——-——-----*;小燈驅(qū)動(dòng)所需頭文件INCLUDE'MC9S08AW60.inc';MCU映像寄存器名;小燈控制引腳宏定義Light_P:equPTBD;燈(Light)接在PTB口Light_D:equPTBDD;相應(yīng)的方向寄存器Lon:equ$00Loff:equ$ffLdiff:equ$0f;聲明外部函數(shù)XDEFLight_Init;小燈初始化XDEFLight_On_Off;驅(qū)動(dòng)小燈"亮",”暗”XDEFLight_Half;驅(qū)動(dòng)小燈”四亮","四滅";Lightinit:定義控制小燈的MCU引腳為輸出———--—-—-————---—-—————*;功能:定義控制小燈的MCU引腳為輸出,并使小燈初始為暗*;-——————-—————--—--—-----—--—-——--—------———————-——-------------—-—---——--—-*Light_Init:LDA#$FFSTALight_P;設(shè)置初始時(shí)八個(gè)LED燈全滅LDA#$FFSTALight_D;設(shè)置LED所接PTB口為輸出RTS;Light_On_Off:驅(qū)動(dòng)小燈”亮","滅”--——--—-——--———-——-—--——---—--—-——---—-*;功能:根據(jù)A的值控制小燈的亮和暗*;-----------——--——---—-—--——-————---——-—-——-——-——---—--—--—----—--—-——-—-*Light_On_Off:CMP#0BNELight_1LDA#LonSTALight_PBRALight_ExitLight_1:CMP#1BNELight_Exit;入口非’L'/'A’,程序無響應(yīng)LDA#LoffSTALight_PLight_Exit:RTS;Light_Half:驅(qū)動(dòng)小燈"四亮",”四滅”-—--—-———-—-—--————-——-—-—-—---*;功能:根據(jù)A的值控制小燈的亮和暗*;—-—-——-——-—-------—------—-----—-——-—-—-------—------——--—---*Light_Half:LDALight_PCMP#LdiffBNELight_half1LDA#~LdiffSTALight_PBRAL_exitLight_h(yuǎn)alf1:LDA#LdiffSTALight_PL_exit:RTS3、撥動(dòng)開關(guān)控制程序Switch.asm;[switch.asm]開關(guān)狀態(tài)輸入——-—-—-----——--—-—---—-—-—-----——---—--———-—-*;本文件包含:*;(1)Switch_init:定義連接開關(guān)的MCU的I/O引腳為輸入*;(2)Switch_read:讀取開關(guān)狀態(tài)*;(3)RAM$70保存開關(guān)狀態(tài);--------———-——-—---—----—--—----—--—---—-—---———-—-—--—--—----——-—*;小燈驅(qū)動(dòng)所需頭文件INCLUDE'MC9S08AW60。inc';MCU映像寄存器名XDEFSwitch_InitXDEFSwitch_Read;開關(guān)連接引腳宏定義Switch_P:equPTCDSwitch_D:equPTCDDS_K1:equ0S_K2:equ1;Switch_Init:定義連接開關(guān)的I/O為輸入—--—-——---——---—-—--————---—--———-*Switch_Init:BCLRS_K1,Switch_DBCLRS_K2,Switch_DRTS;Switch_Read:讀取連接開關(guān)的I/O口數(shù)據(jù),取出開關(guān)狀態(tài)-—---————---*;RAM$70保存開關(guān)狀態(tài)*;—-—--—-—----—--—-—-—---——----————--—----—-—-—---——---——--———-——————---—------*Switch_Read:PSHALDA#0STA$70BSETS_K1,$70BSETS_K2,$70LDASwitch_PAND$70STA$70PULARTS4、延時(shí)通用程序DelayHX.a(chǎn)smXDEFDelayHXDelayHX:PSHA;[A進(jìn)棧](保護(hù)寄存器A)CPX#0;X變址寄存器中的值是否為0BEQDelayHX_ExitDelayHX_1:LDA#200;延時(shí)約200*5=1000(T)—-----DelayHX_2:NOP;(1T)NOP;(1T)DBNZADelayHX_2AIX#—1;(HX-1)->HXCPHX#0BNEDelayHX_1DelayHX_Exit:PULA;[A出棧](恢復(fù)寄存器A)RTS;[MCUInit。asm]AW60芯片初始化子程序—-——----———-------—--*;功能:*;系統(tǒng)初始化設(shè)置,設(shè)置ICGC1和ICGC2寄存器,SOPT的寄存器*;設(shè)置,由外部晶振f=4MHz,產(chǎn)生內(nèi)部總線時(shí)鐘f=20MHz*;入口:無*;出口:無*;--—--—--—----------——-----—-—-----—-—-—--——-—*INCLUDE'MC9S08AW60。inc';MCU映像寄存器名;聲明外部函數(shù)XDEFMCUInit;芯片初始化MCUInit:PSHA;A進(jìn)棧(保護(hù)寄存器A)LDA#%01100000;|||;|||;|||;||+---—-—STOPE—--允許STOP;|+-—-—---COPT----longtimeout2^18;+-—------COPE--—-關(guān)看門狗STASOPT;系統(tǒng)選項(xiàng)寄存器(只寫一次)MOV#%00110000,ICGC2;||||||||應(yīng)該在設(shè)置ICGC1之前寫MFDx;|||||||+-RFD0\;||||||+-—RFD1分頻因子R=1;|||||+---RFD2/;||||+—-—-LOCRE---丟失時(shí)鐘信號(hào)后產(chǎn)生一個(gè)中斷信號(hào);|||+-----MFD0\;||+--—MFD1-——鎖頻環(huán)倍乘因子N=10;|+—------MFD2/;+-——--LOLRE———鎖頻環(huán)失鎖后產(chǎn)生一個(gè)中斷信號(hào)(不復(fù)位)MOV#%01111000,ICGC1;|||||||x;||||||+--LOCD—---允許檢測(cè)時(shí)鐘信號(hào)丟失LostofClock;|||||+-—-OSCSTEN—在OFF模式下允許晶振電路;||||+—-——CLKS0\—選擇FLLengagedexternalreference(FEE);|||+--—--CLKS1/使用鎖頻環(huán)的外時(shí)鐘模式;||+-—-—--REFS---—使用晶振(0表示使用外時(shí)鐘信號(hào));|+----——-RANGE———使用高頻晶振(4MHzp=1)(1-1;0—64);+-----—--HGO-——--低功耗;等待FLL穩(wěn)定PULA;A出棧(恢復(fù)寄存器A)RTS四、思考題?1.CodeWarrior建立工程有什么工程框架文件,這些文件的作用? 2.該實(shí)驗(yàn)采用模塊化設(shè)計(jì)方法,工程框架包含哪些文件,畫出其組織結(jié)構(gòu),畫出主程序流程圖。?3。進(jìn)行調(diào)試時(shí)都有哪些方法?在調(diào)試過程中可以觀察到什么與程序相關(guān)的要素?

實(shí)驗(yàn)二串口通信(SCI)實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1.進(jìn)一步熟悉嵌入式開發(fā)系統(tǒng)環(huán)境、匯編、C語言、調(diào)試方式。2.加強(qiáng)串口通信(SCI)基本原理及編程原理的理解。3.理解C語言工程結(jié)構(gòu),掌握運(yùn)用08C建立工程的方法.4.分別運(yùn)用查詢方式、中斷方式實(shí)現(xiàn)通信。二、實(shí)驗(yàn)要求:1.仔細(xì)閱讀本實(shí)驗(yàn)指導(dǎo)書.2。復(fù)習(xí)有關(guān)的串行通信(SCI)的章節(jié)3.熟悉AW60串行通信(SCI)的工作方法及編程.4.根據(jù)實(shí)驗(yàn)內(nèi)容要求編寫好程序,為實(shí)驗(yàn)做充分地準(zhǔn)備。441235678923平OUTINMAX232CPE16151413121110912345678+5VGND+5VTTL電平OUTINTTL電平轉(zhuǎn)為232電平1μ×4412356789PC412356789412356789RxDTxD實(shí)驗(yàn)原理圖如下:三.實(shí)驗(yàn)設(shè)備及其連接1.PC機(jī)???? ?一臺(tái)2.飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)?一臺(tái)3.串行通信線 ???一根4.萬用表 ??一只四.實(shí)驗(yàn)內(nèi)容1.理解串行通信(SCI)原理。2.理解及掌握本實(shí)驗(yàn)的樣例工程:先通過串口向外發(fā)送一個(gè)字符串,等待從串口接收信息,以中斷方式的接收信息,當(dāng)接收到的信息為“A"、“B"、“C"、“D”時(shí),分別使接在PTB中上的八個(gè)LED燈分別為“八個(gè)同時(shí)亮—暗”、“四個(gè)亮四個(gè)暗”、“一個(gè)LED亮右移”、“一個(gè)LED亮左移"四種狀態(tài).3。編制一個(gè)發(fā)送字符串通信程序:有需要發(fā)送字符串有8組分別為“A1111111111”,“B222222222",“C333333333”,“D444444444”,“E555555555”,“F666666666”,“G777777777”,“H888888888”,每次將一組字符通過SCI1發(fā)送出去后,點(diǎn)亮在接在PTB口上的一個(gè)LED燈。4.完成樣例工程的功能用輪詢方式實(shí)現(xiàn)。五.編程提示1.按照結(jié)構(gòu)要求寫好編程代碼和注釋。2.計(jì)算波特率,SCInInit(SCI初始化子程序)設(shè)置SCI比特率寄存器(SCInBDH,SCInBDL),設(shè)置允許SCI正常碼輸出、8位數(shù)據(jù)、無校驗(yàn),即設(shè)置SCI控制寄存器1(SCIxC1)相應(yīng)位,設(shè)置是否允許發(fā)送與接收、是中斷接收還是查詢接收,即設(shè)置SCI控制寄存器2(SCIxC2)相應(yīng)位.3.查詢方式通信程序的主程序主體是一個(gè)永久循環(huán),循環(huán)體中是不斷檢測(cè)SCI是否發(fā)送完畢,即檢測(cè)SCI狀態(tài)寄存器1(SCIxS1)第七位是否為1,為1則將控制接在PTB口的一個(gè)LED亮.4.中斷方式通信程序的主程序也主體是一個(gè)永久循環(huán),在循環(huán)中根據(jù)中斷程序中接收到的數(shù)據(jù)設(shè)置的變量值,調(diào)用相應(yīng)的LED控制程序。中斷程序根據(jù)接收到的數(shù)據(jù)設(shè)置一個(gè)全局變量值。六。實(shí)驗(yàn)報(bào)告要求1.小結(jié)AW60串行通信(SCI)的原理及編程,并畫出其流程圖和程序代碼與硬件接線圖.2。小結(jié)中斷方式和查詢方式的編程方法,并畫出其流程圖和程序代碼與硬件接線圖.3.回答下列問題(1)串行SCI通信有哪些中斷?各在什么情況下發(fā)生,作用是什么?(2)用中斷方式與查詢方式有什么差別?七。參考例程:1.主程序main.c//===========================================================================//函數(shù)名稱:main。c工程主函數(shù)//函數(shù)參數(shù):無//函數(shù)返回:無//功能概要:初始化發(fā)送字符串,Light構(gòu)件,MCU,SCI1,開SCI1接收中斷,從SCI1發(fā)送字符串//主循環(huán)中根據(jù)全局變量CF的值控制Light構(gòu)件運(yùn)行于四種狀態(tài)中的一種或從//SCI1發(fā)送一個(gè)”Next?。⒆址?/===========================================================================#include<hidef.h〉/*forEnableInterruptsmacro*/? #include”derivative.h"/*includeperipheraldeclarat(yī)ions*/ #include”SCI。h" #include”Light.h”??voidMCUInit(void); //MCU構(gòu)件文件聲明? charCF;//CF全局變量,為Light構(gòu)件控制變量 charP_Shift=0xfe;//P_Shift全局變量,Light構(gòu)件左右移的控制變量voidmain(void){charSbuffer[]="Hello!Iam007。"; //初始化發(fā)送字符串charSbuffer1[]="Next!”;DisableInterrupts;//關(guān)中斷MCUInit();//MCU初始化SCIInit(9600);//SCI1初始化Light_Init();//Light構(gòu)件初始化EnableInterrupts;//開中斷SCI1C2|=SCI2C2_RIE_MASK;//開串行口接收中斷SCISendS(Sbuffer);for(;;){if(CF==1)Light_On_Off();if(CF==2)Light_Half();if(CF==3)Light_R();if(CF==4)Light_L();if(CF==5)SCISendS(Sbuffer1);}}2.MCU構(gòu)件的初始化程序MCUInit。c//===========================================================================//函數(shù)名稱:MCUInit。c(AW60系統(tǒng)初始化子程序)//函數(shù)參數(shù):無//函數(shù)返回:無//功能概要:系統(tǒng)初始化設(shè)置,設(shè)置ICGC1和ICGC2寄存器,SOPT的寄存器設(shè)置,由外部晶振//f=4MHz,產(chǎn)生內(nèi)部總線時(shí)鐘f=20MHz//===========================================================================voidMCUInit(void){ SOPT=0b01100000;//關(guān)閉看門狗? ICGC2=0b00110000;//ICG設(shè)置總線頻率 ?ICGC1=0b01111000; while(?。蒀GS1_LOCK);? //等待FLL穩(wěn)定}3.SCI構(gòu)件相關(guān)程序SCI.c//================================================================//文件名稱:SCI.c//文件構(gòu)成:SCIInitSCI1初始化//SCISend1()SCI1發(fā)送一個(gè)字符程序//SCISends()SCI1發(fā)送字符串程序//文件概要:SCI1構(gòu)件初始化及發(fā)送函數(shù)//================================================================#include”MC9S08AW60.h"#include"SCI.h"voidSCIInit(wordbaud) ?{?wordMbaud=0; Mbaud=20*(10000/(baud/100))/16;?SCI1BDH=(byte)((Mbaud&0xFF00)>〉8);?SCI1BDL=(byte)(Mbaud&0x00FF); SCI1C1=0;?SCI1C2=(0|SCI1C2_TE_(tái)MASK|SCI1C2_RE_MASK);??}voidSCISendS(char*p){?wordi;?if(p==0)return;?for(i=0;p[i]!=’\0';++i){ SCISend1(p[i]); }}voidSCISend1(charSch){?while(!(SCI1S1&SCI1S1_TDRE_MASK)); SCI1D=Sch;}4.Light構(gòu)件控制程序Light。c//====================================================//構(gòu)件名稱:light。c//構(gòu)件組成:Light_InitLED初始化//Light_On_Off八個(gè)LED亮暗控制程序//Light_Half四個(gè)LED燈交替亮暗控制程序//Light_R1個(gè)LED燈右移控制程序//Light_L1個(gè)LED燈左移控制程序//=====================================================#include"Light。h”#include"General.h"externcharP_Shift;voidLight_Init(void){Light_D=0xff;Light_P=0xff;}voidLight_On_Off(void){Light_P=0xff;delay(10000);Light_P=0x00;delay(10000);};voidLight_Half(void){Light_P=0xf0;delay(10000);Light_P=0x0f;delay(10000);}voidLight_R(void){Light_P=P_Shift;if((P_Shift&0x01)==0)P_Shift=0x7f;elseP_Shift=(P_Shift>〉1)|0x80;delay(10000);}voidLight_L(void){;自行編寫此程序}5。通用構(gòu)件General//=======================================================================//函數(shù)名稱:General.c//函數(shù)參數(shù):k—-延時(shí)的時(shí)間參數(shù)//函數(shù)返回:無//功能概要:可以根據(jù)時(shí)間參數(shù)K值延時(shí)//========================================================================#include"General。h”voiddelay(intk){intj;chari;for(j=0;j〈k;++j)for(i=0;i<255;++i);}6.中斷程序Isr。c//=======================================================================//函數(shù)名稱:Isc。c//函數(shù)參數(shù):無//函數(shù)返回:無//功能概要:SCI1接收中斷(17號(hào))程序,當(dāng)接收到字符時(shí)將數(shù)據(jù)時(shí)將接收到的數(shù)據(jù)//讀入,根據(jù)數(shù)據(jù)是否為”A",”B","C”,"D”將全局變量CF設(shè)置為//1~5,該變量在中程序中作為控制Light構(gòu)件的參數(shù).//========================================================================#include"MC9S08AW60。h”externcharCF;voidinterrupt17SCI1Rec(void){charRechar,ReS;ReS=SCI1S1;Rechar=SCI1D;switch(Rechar){case0x41:CF=1;break;case0x42:CF=2;break;case0x43:CF=3;break;case0x44:CF=4;break;default:CF=5;}}?實(shí)驗(yàn)三鍵盤中斷及LED數(shù)碼塊實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康模?.熟練運(yùn)用嵌入式開發(fā)系統(tǒng)環(huán)境、C語言及調(diào)試方式;2.復(fù)習(xí)串行通信接口(SCI)的內(nèi)容;3。加強(qiáng)對(duì)鍵盤原理的理解掌握鍵盤處理編程方法;4。理解LED數(shù)碼塊的顯示原理,掌握LED數(shù)碼塊顯示編程方法。實(shí)驗(yàn)箱提供一個(gè)16鍵鍵盤,用于鍵盤中斷信號(hào)的輸入。系統(tǒng)提供兩種接線方式:①當(dāng)將鍵盤接入上一排插孔時(shí)為固定接線,鍵盤接線原理圖如圖3—1所示。②當(dāng)將鍵盤接入下一排插孔時(shí)為手動(dòng)接線,連線的位置在鍵盤的左邊。實(shí)驗(yàn)箱提供四個(gè)LED數(shù)碼塊,PB0~PB7為段碼接口,PTD0、PTD1、PTD4、PTD5為位碼控制接口。列線列線n1n2n3n4MCU內(nèi)部上拉電阻12345678行線m1m2m3m4+5VPTG1PTG0PTG2PTG3PTG4PTD2PTD3PTD7aagdfecbhagdfecbhagdfecbhagdfecbhabfCS0CS1CS2cdeghCS3123456789101112PTD3PTB6PTB2PTB7PTB3PTB41K1K1K1KPTB1PTD2PTD1PTB5PTB0PTD033—1鍵盤及LED數(shù)碼塊原理圖二、實(shí)驗(yàn)要求:1。仔細(xì)閱讀本實(shí)驗(yàn)指導(dǎo)書;2.復(fù)習(xí)有關(guān)的鍵盤中斷和串行通信接口(SCI)的章節(jié);3.熟悉AW60鍵盤模塊的工作方法及編程;4.熟悉LED數(shù)碼塊原理及動(dòng)態(tài)顯示編程;4.根據(jù)實(shí)驗(yàn)內(nèi)容要求編寫好程序,為實(shí)驗(yàn)做充分地準(zhǔn)備。三.實(shí)驗(yàn)設(shè)備及其連接1.PC機(jī)? ???? 一臺(tái)2.飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng) 一臺(tái)3.串行通信線?? ? 一根四.實(shí)驗(yàn)內(nèi)容1。理解并運(yùn)行按鍵掃描及鍵值鍵碼發(fā)送樣例程序(將按鍵的鍵值及鍵碼從串行口發(fā)送到PC機(jī)端的串口工具軟件);采用鍵盤中斷方式。PTD7,3,2及PTG4接鍵盤4根列線,PTG3-0接鍵盤4根行線。要求按下的一個(gè)鍵的鍵值和鍵面定義值(鍵的ASCII碼值)通過串口在PC方軟件界面顯示,(鍵的ASCII碼值)。2。理解并運(yùn)行LED數(shù)碼塊樣例程序(在LED數(shù)碼塊上顯示“2012”);3.參考按鍵及LED數(shù)碼塊樣例程序,設(shè)計(jì)一個(gè)按鍵顯示程序,將按鍵的鍵碼在LED數(shù)碼塊上顯示.7段LED顯示字型碼顯示字符hgfedcba字型碼共陰極共陽極001111113FC01000011006F9210110115BA4310011114FB0411001106699511011016D92611111017D827000011107F8811111117F80911011116F90A11101117788B11111007C83C011100139C6D10111105EA1E11110017986F1110001718E五.編程提示1.利用構(gòu)件式方法編程,可以使程序結(jié)構(gòu)清晰,可移植性好,但要注意建立相關(guān)的頭文件;2。矩陣式鍵盤采用掃描法來確定哪一個(gè)鍵被按下,鍵盤的接口硬件確定后,每個(gè)鍵的鍵值就確定了,但每個(gè)鍵的鍵碼可以根據(jù)需要定義;鍵的標(biāo)示碼(鍵碼)與鍵值對(duì)應(yīng)關(guān)系通過列表對(duì)應(yīng)起來,通過“行掃描”法獲得某個(gè)鍵的鍵值時(shí),通過查表法就可以得到它的定義值.3.PTD7,3,2及PTG4-PTG0與鍵盤中斷輸入引腳復(fù)用,設(shè)置鍵盤中斷允許寄存器,當(dāng)鍵盤有鍵被按下時(shí),立即產(chǎn)生中斷,中斷程序處理按鍵事件,比如確定哪個(gè)鍵被按下,然后轉(zhuǎn)換為該鍵的定義值.4.鍵盤掃描處理程序中的“消抖”及按鍵重復(fù)響應(yīng)通過延時(shí)及判斷按鍵是否被釋放解決。六。實(shí)驗(yàn)報(bào)告要求1.按實(shí)驗(yàn)報(bào)告格式認(rèn)真完成實(shí)驗(yàn)報(bào)告,要求畫出總體流程圖;2.本實(shí)驗(yàn)中用的是鍵盤中斷編程方式,也可以使用查詢編程方式,請(qǐng)盡量少修改代碼改用查詢編程方式重新編寫相應(yīng)的子程序和主程序。提示:注意重鍵問題。思考題:1.矩陣式鍵盤的行線及列線的特點(diǎn)與作用?2.如何消除鍵盤抖動(dòng)及按鍵重復(fù)響應(yīng)?3.AW60的鍵盤中斷模塊用行掃描方式最多能夠?qū)崿F(xiàn)幾列的鍵盤?七。參考例程:1。按鍵處理程序main。c#include"Includes.h"voidmain(void){DisableInterrupts;//禁止總中斷MCUInit(); ? //芯片初始化SCI1Init(SYSTEM_CLOCK,9600);//用SCI1,系統(tǒng)時(shí)鐘為時(shí)鐘源,波特率為9600KBInit(); //鍵盤初始化KBI1SC|=(1<<1); ?//開鍵盤中斷EnableInterrupts; //開總中斷 while(1) ??//主循環(huán){}}總頭文件Includes。h#include”MC9S08AW60。h”//映像寄存器地址頭文件?#include"Type.h"//類型別名定義?#include"GeneralFun.h”//通用函數(shù)頭文件?#include<hidef.h>/*forEnableInterruptsmacro*/ //1.2包含面向硬件對(duì)象頭文件 #include"SCI。h"http://該頭文件包含SCI串行通信函數(shù)聲明?#include"Keyboard.h"//該頭文件包含鍵盤函數(shù)聲明 #defineSYSTEM_CLOCK20//系統(tǒng)總線頻率(MHz)?//4函數(shù)聲明 voidMCUInit(void);//AW60芯片初始化數(shù)據(jù)類型重定義頭文件Type.h#ifndefTYPE_H//防止重復(fù)定義#defineTYPE_(tái)H?typedefunsignedcharuint8;//8位無符號(hào)數(shù)?typedefunsignedshortintuint16;//16位無符號(hào)數(shù)?typedefunsignedlongintuint32;//32位無符號(hào)數(shù) typedefcharint8;//8位有符號(hào)數(shù) typedefshortintint16;//16位有符號(hào)數(shù)?typedefintint32;//32位有符號(hào)數(shù) #endif串行口構(gòu)件程序文件SCI。c#include"SCI.h”voidSCI1Init(uint8sysclk,uint16baud){unsignedintubgs=0;//1.計(jì)算波特率并設(shè)置:ubgs=fsys/(波特率*16)(其中fsys=sysclk*1000000)ubgs=sysclk*(10000/(baud/100))/16;SCI1BDH=(unsignedchar)((ubgs&0xFF00)〉〉8);SCI1BDL=(unsignedchar)(ubgs&0x00FF);SCI1C1=0;//無校驗(yàn),正常模式(開始信號(hào)+8位數(shù)據(jù)(先發(fā)最低位)+停止信號(hào))?SCI1C2=(0|SCI1C2_TE_MASK|SCI1C2_RE_M(jìn)ASK);//允許發(fā)送,允許接收,查詢方式收發(fā)}voidSCI1Send1(unsignedcharch){while(!(SCI1S1&SCI1S1_TDRE_(tái)MASK));//判斷發(fā)送緩沖區(qū)是否為空SCI1D=ch;}voidSCISendString(char*p){wordk;if(p==0)return;for(k=0;p[k]?。?\0';++k){SCI1Send1(p[k]);}}按鍵處理構(gòu)建程序文件Keyboard.c文件#include”Keyboard.h"#include”GeneralFun。h”//初始化鍵盤模塊voidKBInit(void){PTDD&=0b01110011;//鍵盤口復(fù)位PTGD&=0b11100000;PTDDD&=0b01110011;//定義列線(7-4位)為輸入PTGDD&=0b11101111;PTDPE|=0b10001100;//輸入引腳(列線)有內(nèi)部上拉電阻PTGPE|=0b00010000;PTGDD|=0b00001111;//行線(3-0位)為輸出KBI1SC&=~(1<<1);//屏蔽鍵盤中斷(KBIE=0)KBI1PE=(0|KBI1PE_KBIPE7_MASK|KBI1PE_KBIPE6_MASK|KBI1PE_KBIPE5_MASK|KBI1PE_KBIPE4_MASK);//允許輸入引腳(列線)的中斷可進(jìn)入KBI1SC=(0|KBI1SC_KBACK_MASK);//清除鍵盤中斷請(qǐng)求(KBACK=1)}//N次掃描模塊:N次掃描鍵盤,消除"抖動(dòng)"問題uint8KBScanN(uint8KB_count){uint8i,KB_value_last,KB_value_now;if(0==KB_count||1==KB_count)//先掃描一次得到的鍵值,便于下面比較returnKBScan1();KB_value_now=KB_value_last=KBScan1();for(i=0;i〈KB_count—1;i++) ? //以下多次掃描消除誤差{Delay(15);KB_value_now=KBScan1();if(KB_value_now==KB_value_last)returnKB_value_now;//返回掃描的鍵值elseKB_value_last=KB_value_now;}return0xFF;? ?? ?//返回出錯(cuò)標(biāo)志}//鍵盤定義表constuint8KBtable[]={0xEE,’F’,0xDE,'E',0xBE,'D’,0x7E,’C',0xED,'2',0xDD,’5',0xBD,'8’,0x7D,'B',0xEB,'1',0xDB,'4’,0xBB,'7',0x7B,’A',0xE7,'0',0xD7,'3’,0xB7,'6’,0x77,'9',0x00};//鍵值轉(zhuǎn)換模塊:鍵值轉(zhuǎn)為定義值uint8KBDef(uint8valve){uint8KeyPress;//鍵定義值uint8i;i=0;KeyPress=0xff;while(KBtable[i]?。剑皒00)//在鍵盤定義表中搜索欲轉(zhuǎn)換的鍵值,直至表尾{if(KBtable[i]==valve)//在表中找到相應(yīng)的鍵值{KeyPress=KBtable[i+1];//取出對(duì)應(yīng)的鍵定義值break;}i+=2;//指向下一個(gè)鍵值,繼續(xù)判斷}returnKeyPress;}//鍵盤掃描模塊:掃描1次4*4鍵盤,返回讀取的鍵值uint8KBScan1(void){uint8line,i,tmp,tmp1,tmp2;line=0b11111110;//使第一根行線為0(低電平)for(i=1;i<=4;i++)//最多將掃描4根行線{PTGD=line;//輸出開始掃描asm("NOP");asm(”NOP");tmp1=PTDD;//輸入掃描結(jié)果tmp2=PTGD;//整合掃描結(jié)果,即鍵盤輸入引腳的4位tmp=(tmp1&0x80);tmp1&=0x0C;tmp1=(tmp1<<3);tmp|=tmp1;tmp|=(tmp2&0x1f);//通過觀察4根列線中是否出現(xiàn)低電平來判斷當(dāng)前行有無按鍵if((tmp&0xF0)!=0xF0)//當(dāng)前行有鍵按下?{break;//退出循環(huán)不再掃描}else //當(dāng)前行無按鍵,準(zhǔn)備掃描下一行l(wèi)ine=(line<〈1)|0x01;}if(i==5) ? //無按鍵,以后將返回0xFFtmp=0xFF;return(tmp);}中斷程序Isr.c#include”Includes。h"http://鍵盤中斷處理程序:掃描鍵盤,向串口發(fā)送鍵值和定義值interrupt22voidisrKeyBoard(void){uint8value;uint16i;for(i=0;i〈5000;i++);DisableInterrupts;??//關(guān)總中斷KBI1SC&=~(1<〈1);?//屏蔽鍵盤中斷KBI1SC|=KBISC_KBACK_M(jìn)ASK;?//清中斷標(biāo)志位value=KBScanN(10);? //掃描鍵值,存于value中if(value!=0xff){?? //如果不是無效按鍵 SCI1Send1(value);?//發(fā)送鍵值?SCI1Send1(KBDef(value));//鍵值轉(zhuǎn)化為定義值并發(fā)送?SCI1Send1(’\r’);? //發(fā)送一個(gè)回車符作為按鍵鍵值及鍵碼的分界?}PTDD&=0b01110011;PTGD&=0b11100000; //鍵盤初始化鍵盤中斷KBI1SC|=(1〈<1);???//開放鍵盤中斷EnableInterrupts;? ?//開總中斷}通用程序General.c#include”GeneralFun.h”//包含通用函數(shù)頭文件//延時(shí)程序*voidDelay(uint16count){?uint16i,j; for(j=0;j<count;j++)?for(i=0;i<5000;i++);}2.LED數(shù)碼塊顯示程序主程序main.c#include"include.h”voidmain(void){LEDBUF[0]='2';LEDBUF[1]='0’;LEDBUF[2]=’1';LEDBUF[3]=’2’;DisableInterrupts;MCUInit();LEDinit();EnableInterrupts;while(1){LEDshow(LEDBUF);}}LED數(shù)碼塊處理程序:LED.c#include"LED.h"#include"Generalfun.h”//數(shù)碼塊初始化程序:定義LED控制引腳的數(shù)據(jù)口和位選口為輸出voidLEDinit(void){LEDdata=0x00;//LED初始狀態(tài)為全暗LEDcs=0xff;LEDDs=0xff;LEDdata_D=0xff;LEDcs_D=0x33;//位選口為輸出}//數(shù)碼塊顯示程序:在4連排LED上顯示以Buf為首地址的4個(gè)數(shù)據(jù)voidLEDshow(uint8*Buf){uint8i,c;//uint16j;for(i=0;i<=3;i++){if(Buf[i]>=0x30&&Buf[i]〈=0x39)c=Buf[i]—'0';if(Buf[i]>=0x41&&Buf[i]〈=0x46)c=Buf[i]-’A’+10;LEDshow1(3—i,c);Delay(10);}}//一位數(shù)碼塊顯示程序:在第i個(gè)LED上顯示數(shù)字c(要查表轉(zhuǎn)碼)//參數(shù):LED位號(hào)(從右到左0-3),c:要顯示的數(shù)字(0-9,A-F)//顯示碼表(共陰極)constuint8Dtable[16]=//0123456789{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,// A B CDEF0x77,0xff,0x39,0xbf,0x79,0x71};//片選表(電平為低片選)constuint8CStable[4]=//0123{0xDF,0xEF,0xFD,0xFE};voidLEDshow1(uint8i,uint8c){LEDcs=CStable[i];LEDdata=Dtable[c];}LED模塊頭文件LED。h//頭文件#include"MC9S08AW60.h”#include”Type。h"//LED接口宏定義#defineLEDdataPTBD#defineLEDdat(yī)a_DPTBDD#defineLEDdata_PEPTBPE#defineLEDDsPTBDS#defineLEDcsPTDD#defineLEDcs_DPTDDD//內(nèi)部函數(shù)聲明voidLEDinit(void);//4連排LED初始化voidLEDshow(uint8*Buf);//在4連排LED上顯示4個(gè)十進(jìn)制數(shù)voidLEDshow1(uint8i,uint8c);?實(shí)驗(yàn)四鍵盤與LCD綜合實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?1.熟練CodeWarrior集成開發(fā)環(huán)境及C語言程序設(shè)計(jì)方法;2.進(jìn)一步加強(qiáng)對(duì)鍵盤原理的理解熟練鍵盤處理編程方法;3.熟悉LCD控制原理及編程方法;二、實(shí)驗(yàn)要求:1.仔細(xì)閱讀本實(shí)驗(yàn)指導(dǎo)書;2.復(fù)習(xí)有關(guān)的鍵盤中斷和串行通信接口(SCI)的章節(jié);3.熟悉1602BLCD控制原理;4.閱讀并理解實(shí)驗(yàn)指導(dǎo)書中的例程,并按示例程序建立工程、編譯、調(diào)試,觀察實(shí)驗(yàn)結(jié)果,進(jìn)一步理解示例程序,掌握LCD的基本編程方法;三.實(shí)驗(yàn)設(shè)備及其連接1.PC機(jī)? ?一臺(tái)2。飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng) 一臺(tái)3.串行通信線 ????一根四.實(shí)驗(yàn)內(nèi)容系統(tǒng)開始在LCD上顯示“Pressanykeytobeginoperate.。",當(dāng)鍵盤上有鍵按下將輸入字符顯示在LCD上,當(dāng)LCD顯示32個(gè)字符滿屏后,清屏后再?gòu)模藽D最開始位置顯示輸入字符。1.本實(shí)驗(yàn)為驗(yàn)證實(shí)驗(yàn),實(shí)驗(yàn)工程主要包括鍵盤構(gòu)件、LCD構(gòu)件、SCI構(gòu)件,鍵盤構(gòu)件及SCI構(gòu)件硬件原理及程序參考實(shí)驗(yàn)三,LCD硬件連接如圖4-1。2.理解并運(yùn)行示例程序(示例中給出LCD構(gòu)件程序及鍵盤中斷程序,其它程序參考實(shí)驗(yàn)二、實(shí)驗(yàn)三);3.嘗試修改示例程序,只在LCD的第一行顯示信息,第二行固定一直顯示星號(hào)“*”。五.實(shí)驗(yàn)報(bào)告要求1.根據(jù)示例程序,畫出總體程序流程圖及按鍵中斷程序流程圖;2.寫出自己修改的程序并說明。思考題:1.1602LCD顯示信息主要要進(jìn)行哪些控制?舉例說明進(jìn)行程序設(shè)計(jì)的具體步驟、內(nèi)容.2。示例程序中的全局變量bi的作用?它的值在哪里獲利及變化?六.參考例程:1.main.c文件#include"include.h”externuint8bi=0;//定義按鍵序次變量,并給初值0voidmain(void){uint8LCD_Dispbuff[32]=”Pressanykeytobeginoperate.。";//LCD初始顯示信息DisableInterrupts;MCUInit();LCDinit();SCI1Init(SYSTEM_CLOCK,9600);KBInit();KBI1SC|=(1<〈1);EnableInterrupts;LCDshow(LCD_Dispbuff);while(1){}}2.LCD。h文件#include"MC9S08AW60。h"#include"Type.h”#include"Generalfun。h”#defineLCDdat(yī)aPTAD#defineLCDdataDPTADD#defineLCD_RS_WRPTCD#defineLCD_RS_WRDPTCDD#defineLCD_EPTFD#defineLCD_EDPTFDD#defineLCD_RS_MASK0b00010000#defineLCD_WR_MASK0b01000000#defineLCD_E_M(jìn)ASK0b01000000voidLCDinit(void);voidLCDcommand(uint8cmd);voidLCDshow(uint8*sbuf);3.LCD。c文件://本文件為LCD相關(guān)的程序文件//?#include"LCD。h" voidLCDcommand(uint8cmd){uint16i;for(i=0;i〈1000;i++)asm("NOP”);LCDdata=cmd;LCD_E|=LCD_E_(tái)MASK;asm("NOP");asm("NOP”);asm("NOP”);LCD_E&=~LCD_E_MASK;for(i=0;i<1000;i++)asm("NOP”);}voidLCDinit(void){uint16i;LCDdataD=0b11111111;LCD_RS_WRD=LCD_RS_WRD|LCD_RS_M(jìn)ASK|LCD_WR(shí)_M(jìn)ASK;LCD_RS_WR&=~LCD_RS_MASK;LCD_RS_WR&=~LCD_WR_MASK;LCD_ED|=LCD_E_MASK;LCD_E|=LCD_E_M(jìn)ASK;LCDcommand(0b00111000);LCDcommand(0b00001000);LCDcommand(0b00000001);for(i=0;i〈4000;i++)asm("NOP”);LCDcommand(0b00000110);LCDcommand(0b00010100);LCDcommand(0b00001100);}voidLCDshow(uint8*sbuf){uint8i;LCDinit();LCD_RS_WR&=~LCD_RS_M(jìn)ASK;LCD_RS_WR&=~LCD_WR(shí)_MASK;LCDcommand(0b10000000);LCD_RS_WR(shí)|=LCD_RS_MASK;for(i=0;i<16;i++)LCDcommand(sbuf[i]);LCD_RS_WR&=~LCD_RS_MASK;LCDcommand(0b11000000);LCD_RS_WR|=LCD_RS_MASK;for(i=16;i<32;i++)LCDcommand(sbuf[i]);}4.鍵盤中斷isr。c文件#include"Include。h”//中斷函數(shù)中調(diào)用用鍵盤,串口,LCD各模塊相關(guān)程序externuint8bi;//聲明全局變量biinterrupt22voidisrKeyBoard(void){uint8value,tmp,tmp1,tmp2,Ramaddr;uint16i;for(i=0;i<5000;i++);DisableInterrupts;//關(guān)總中斷KBI1SC&=~(1〈<1);//屏蔽鍵盤中斷KBI1SC|=KBISC_KBACK_MASK;//清中斷標(biāo)志位value=KBScanN(10);//掃描鍵值,存于value中while(1){tmp1=PTDD;//讀取鍵列線狀態(tài),等待按鍵釋放tmp2=PTGD;tmp=(tmp1&0x80);tmp1&=0x0C;tmp1=(tmp1<〈3);tmp|=tmp1;tmp|=(tmp2&0x1f);if((tmp&0xF0)==0xF0)break;}if(value?。剑皒ff){ SCI1Send1(value);//發(fā)送鍵值 SCI1Send1(KBDef(value));//鍵值轉(zhuǎn)化為定義值并發(fā)送 SCI1Send1('\r');?if(bi==0){ LCD_RS_WR(shí)&=~LCD_RS_M(jìn)ASK; LCD_RS_WR&=~LCD_RS_M(jìn)ASK; LCDcommand(0b00000001);//清屏,光標(biāo)回原點(diǎn),??地址計(jì)數(shù)器AC=0 LCDcommand(0b00001110);//開顯示,光標(biāo)顯示,閃爍?LCDcommand(0b00000110);//AC自動(dòng)加一,光標(biāo)左移? } if(bi〉=16)Ramaddr=bi+0x30;//確定本次按鍵鍵碼顯示在第一行還是第二行 elseRamaddr=bi+0x00;?Ramaddr|=0b10000000;//合成要寫入的DDRAM地址 LCD_RS_WR&=~LCD_RS_M(jìn)ASK;// LCD_RS_WR&=~LCD_WR(shí)_MASK;// LCDcommand(Ramaddr);//設(shè)置DDRAM地址 LCD_RS_WR|=LCD_RS_MASK;//?LCD_RS_WR&=~LCD_WR_MASK;//?LCDcommand(KBDef(value));//向設(shè)置的DDRAM地址寫入鍵值?bi++;//按鍵序次加一 if(bi==32)bi=0;//如果有效按鍵達(dá)到33次,序次bi歸零?}PTDD&=0b01110011; PTGD&=0b11100000;//0b11101111;//鍵盤初始化鍵盤中斷 KBI1SC|=(1〈〈1);//開放鍵盤中斷 EnableInterrupts;//開總中斷}?實(shí)驗(yàn)五TPM溢出中斷實(shí)驗(yàn)(電子時(shí)鐘)一、實(shí)驗(yàn)?zāi)康?1.熟練運(yùn)用嵌入式開發(fā)系統(tǒng)環(huán)境、C語言及調(diào)試方式;2.理解TPM定時(shí)溢出工作原理;3.初步掌握TPM定時(shí)程序設(shè)計(jì)方法;4.理解LCD顯示編程原理及方法。二、實(shí)驗(yàn)要求:1。仔細(xì)閱讀本實(shí)驗(yàn)指導(dǎo)書;2.復(fù)習(xí)有關(guān)的TPM章節(jié);3。閱讀LCD顯示有關(guān)的章節(jié);4.熟悉TPM模塊的原理及溢出中斷的工作方法及編程.5.根據(jù)實(shí)驗(yàn)內(nèi)容要求編寫好程序,為實(shí)驗(yàn)做充分地準(zhǔn)備。三.實(shí)驗(yàn)設(shè)備及其連接1。PC機(jī)? ? ?一臺(tái)2。飛思卡爾嵌入式實(shí)驗(yàn)開發(fā)系統(tǒng)?一臺(tái)3.串行通信線? ?? 一根四.實(shí)驗(yàn)內(nèi)容1.理解并運(yùn)行TPM溢出中斷樣例程序(利用TPM定時(shí)一秒,接在B口上的LED燈1秒亮1秒暗循環(huán));2。編寫TPM溢出中斷程序,設(shè)計(jì)電子時(shí)鐘程序,時(shí)鐘的時(shí)、分、秒顯示在LCD顯示器上。五.編程提示1、根據(jù)定時(shí)間隔1秒計(jì)算分頻因子和預(yù)置寄存器的值,在TPM初始化子程序里設(shè)置TPM1狀態(tài)和控制寄存器(TPM1SC)以及TPM1模數(shù)寄存器TPM1MODH、TPM1MODL。設(shè)置TPM1計(jì)數(shù)初值0x0000(TPM1CNTH和TPM1CNTL)。在主程序中開TPM溢出中斷.2、在溢出中斷中對(duì)PTB口的狀態(tài)進(jìn)行改變。3、電子時(shí)鐘的TPM溢出中斷中要對(duì)秒、分、時(shí)計(jì)數(shù)(二進(jìn)制數(shù)),并需要將時(shí)、分、秒數(shù)值轉(zhuǎn)換為BCD碼存儲(chǔ)在LCD顯示緩沖區(qū)中,然后運(yùn)用LCD構(gòu)件將時(shí)、分、秒的數(shù)值顯示在LCD上。六.實(shí)驗(yàn)報(bào)告要求1.按實(shí)驗(yàn)報(bào)告格式認(rèn)真完成實(shí)驗(yàn)報(bào)告,要求畫出程序設(shè)計(jì)的總體流程圖以及各構(gòu)件用到的寄存器;回答下列問題:2。回答下列問題(1)通過實(shí)驗(yàn)總結(jié)完全軟件定時(shí)和利用可編程TPM定時(shí)的差異性以及各自優(yōu)缺點(diǎn)?(2)總結(jié)TPM初始化包括哪些內(nèi)容?(3)本實(shí)驗(yàn)中是TPM的間隔為1秒,思考任何獲得更小或更大的定時(shí)間隔?(4)如果時(shí)鐘頻率太高TPM間隔無法設(shè)置到1秒,如何解決這個(gè)問題?(7)如何清TPM溢出標(biāo)志位TOF?七.參考例程:1.main.c文件#include"include。h"//需要定義及賦初值的全局變量不能在頭文件中定義,在main.c中定義//并賦初值,同時(shí)在其使用的函數(shù)中或函數(shù)對(duì)應(yīng)頭文件中聲明externuint8Count_200ms=0; //200ms定時(shí)計(jì)數(shù)變量externuint8Timer[3]={0,0,0};? ?//時(shí)分秒計(jì)數(shù)數(shù)組externuint8LCD_Dispbuff[]="00:00:00”;//LCD初始顯示信息voidmain(void){DisableInterrupts;MCUInit();LCDinit();TPM1Init();LCDshow(LCD_Dispbuff);PTBDD=0xff;PTBD=0xff;EnableInterrupts;while(1){}}2。TPM.c文件#include"TPM1.h”voidTPM1Init(void){TPM1SC=(0|TPM1SC_TOIE_MASK|TPM1SC_CLKSA_MASKTPM1SC_PS2_MASK|TPM1SC_PS1_MASK);//TPM1時(shí)鐘源選擇系統(tǒng)時(shí)鐘(20MHZ),分頻因子64TPM1MODH=0x7A;TPM1MODL=0x12;//根據(jù)時(shí)鐘源及分頻因子,將TPM1的定時(shí)時(shí)間設(shè)定為200msTPM1CNTH=0x00

;TPM1CNTL=0x00

;}3.Isr.c中斷服務(wù)程序interrupt11voidTPM1_200msover(void){uint8temp;DisableInterrupts;Count_200ms++;while(Count_200ms==5){ PTBD=~PTBD;Count_200ms=0;}temp=TPM1SC;TPM1SC&=~TPM1SC_TOF_MASK;EnableInterrupts;}4.LCD構(gòu)件文件(此構(gòu)件用于電子鐘程序中,LED一秒亮暗不用該文件)1)LCD.c#include"LCD.h”voidLCDcommand(uint8cmd){uint16i;for(i=0;i〈1000;i++)asm("NOP");LCDdata=cmd;LCD_E|=LCD_E_MASK;asm("NOP");asm("NOP");asm("NOP”);LCD_E&=~LCD_E_(tái)MASK;for(i=0;i〈1000;i++)asm("NOP");}voidLCDinit(void){uint16i;LCDdataD=0b11111111;LCD_RS_WRD=LCD_RS_WRD|LCD_RS_M(jìn)ASK|LCD_WR_MASK;LCD_RS_WR&=~LCD_RS_MASK;LCD_RS_WR&=~LCD_WR_MASK;LCD_ED|=LCD_E_MASK;LCD_E|=LCD_E_MASK;LCDcommand(0b00110000);//設(shè)置數(shù)據(jù)線寬度為8,顯示1行,5*7點(diǎn)陣LCDcommand(0b00001000);//關(guān)顯示,光標(biāo)不顯示,光標(biāo)不閃爍LCDcommand(0b00000001);//清屏for(i=0;i<4000;i++)asm("NOP");LCDcommand(0b00000110);//AC自動(dòng)加1,光標(biāo)移動(dòng)LCDcommand(0b00010100);//光標(biāo)滾動(dòng),向左LCDcommand(0b00001100);//開顯示,光標(biāo)不顯示,光標(biāo)不閃爍}voidLCDshow(uint8*sbuf){

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論