版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程設(shè)計(jì)名稱(chēng): 嵌入式技術(shù)基礎(chǔ)與實(shí)踐 </p><p> 系 別: 三 系 </p><p> 學(xué)生姓名: </p><p> 班 級(jí): &
2、lt;/p><p> 學(xué) 號(hào): </p><p> 成 績(jī): </p><p> 指導(dǎo)教師: </p><p> 開(kāi)課時(shí)間: 2010-2011 學(xué)年 2 學(xué)期</p>
3、<p><b> 目 錄</b></p><p> 第一章 系統(tǒng)概要2</p><p> 1.1 系統(tǒng)背景2</p><p> 1.2 系統(tǒng)功能3</p><p> 第二章 系統(tǒng)硬件設(shè)計(jì)3</p><p> 2.1 系統(tǒng)原理圖3</p><p
4、> 2.2 單片機(jī)(MCU)模塊4</p><p> 2.2.1 MC9S08AW60單片機(jī)性能概述4</p><p> 2.2.2 內(nèi)部結(jié)構(gòu)簡(jiǎn)圖5</p><p> 2.3 串行通信模塊5</p><p> 2.3.1 MAX232引腳圖5</p><p> 2.3.2 串行通信的電路原理
5、7</p><p> 2.4 液晶顯示模塊8</p><p> 第三章 系統(tǒng)軟件設(shè)計(jì)9</p><p> 3.1 MCU方(C)程序9</p><p> 3.1.1串行通信子程序16</p><p> 3.1.2 LCD子程序19</p><p> 第四章 系統(tǒng)測(cè)試22
6、</p><p> 第五章 總結(jié)展望22</p><p><b> 5.1 總結(jié)22</b></p><p><b> 5.2 展望22</b></p><p><b> 參考文獻(xiàn)22</b></p><p><b> 第一章
7、 系統(tǒng)概要</b></p><p><b> 1.1 系統(tǒng)背景</b></p><p> 數(shù)字時(shí)鐘,當(dāng)我們聽(tīng)到這幾個(gè)字時(shí),第一反應(yīng)就是我們所說(shuō)的數(shù)字,不錯(cuò)數(shù)字鐘就是以數(shù)字顯示取代模擬表盤(pán)的鐘表,在顯示上它用數(shù)字反應(yīng)出此時(shí)的時(shí)間,相比模擬鐘能給人一種一目了然的感覺(jué),不僅如此它還能同時(shí)顯示時(shí)、分、秒。而且能對(duì)時(shí)、分、秒準(zhǔn)確校時(shí),這是普通鐘所不及的。由于單片
8、機(jī)集成度高、功能強(qiáng)、可靠性高、體積小、功耗地、使用方便、價(jià)格低廉等一系列優(yōu)點(diǎn),目前已經(jīng)滲入到人們工作和生活的方方面面,幾乎“無(wú)處不在,無(wú)所不為”。單片機(jī)的應(yīng)用領(lǐng)域已從面向工業(yè)控制、通訊、交通、智能儀表等迅速發(fā)展到家用消費(fèi)產(chǎn)品、辦公自動(dòng)化、汽車(chē)電子、PC機(jī)外圍以及網(wǎng)絡(luò)通訊等廣大領(lǐng)域。</p><p><b> 1.2 系統(tǒng)功能</b></p><p> 在實(shí)驗(yàn)箱上有
9、一個(gè)啟動(dòng)鍵,當(dāng)按下啟動(dòng)鍵給以一個(gè)低電平,電子時(shí)鐘從當(dāng)前設(shè)定值開(kāi)始走時(shí)。按秒刷新,要求在LCD屏上顯示。若按啟動(dòng)鍵給以高電平,則時(shí)間暫停,再按,時(shí)間繼續(xù)按秒刷新。</p><p> 第二章 系統(tǒng)硬件設(shè)計(jì)</p><p><b> 2.1 系統(tǒng)原理圖</b></p><p> 該系統(tǒng)由AW60最小系統(tǒng)電路為主要結(jié)構(gòu),利用串口進(jìn)行數(shù)據(jù)的控制與采
10、集。首先將開(kāi)關(guān)接在AW60上的PORT_D口上,用于控制數(shù)字時(shí)鐘系統(tǒng)的開(kāi)關(guān)。然后將LCD的數(shù)據(jù)線7-14引腳(D0-D7)分別與MCU的PTA0-PTA7連接,LCD的控制線RS、R/W、E(4、5、6引腳)分別于MCU的PTC4、PTC6、PTF6連接,用于輸出時(shí)間。數(shù)字時(shí)鐘必須要有晶振電路,所以將該晶振電路與AW60的PTG5和PTG6相連,用于時(shí)間的自加。由于在運(yùn)行系統(tǒng)時(shí),以防電流不穩(wěn)定,所以在PTB0端設(shè)置一個(gè)下拉電阻,穩(wěn)定電流
11、。</p><p> 2.2 單片機(jī)(MCU)模塊</p><p> 2.2.1 MC9S08AW60單片機(jī)性能概述</p><p> ?。?)最高達(dá)40MHz的CPU工作頻率和20Hz的內(nèi)部總線工作頻率表;時(shí)鐘源選項(xiàng)包括晶振、諧振器、外部時(shí)鐘或內(nèi)部產(chǎn)生的時(shí)鐘。</p><p> (2)相比HC08 CPU指令集,S08 CPU增加了B
12、GND指令。</p><p> ?。?)單線后臺(tái)調(diào)試模式接口;增強(qiáng)的斷點(diǎn)能力,允許單一的斷點(diǎn)設(shè)置在線調(diào)試(在片內(nèi)調(diào)試的模塊增加了多于兩個(gè)的斷點(diǎn))。</p><p> ?。?)內(nèi)含32個(gè)中斷/復(fù)位源;內(nèi)含2KB的片內(nèi)RAM;內(nèi)含60KB的片內(nèi)在線可編程Flash存儲(chǔ)器,帶有塊保護(hù)和安全選項(xiàng)。</p><p> ?。?)可選的計(jì)算機(jī)正常操作(COP)復(fù)位;低電壓檢測(cè)和復(fù)
13、位或中斷;非法操作碼檢測(cè)與復(fù)位;非法地址檢測(cè)與復(fù)位。</p><p> ?。?)ADC:多達(dá)16個(gè)通道,10位A/D轉(zhuǎn)換器與自動(dòng)比較功能;兩個(gè)串行通信接口SCI模塊與可選的13位中斷;一個(gè)串行外設(shè)接口SPI模塊;集成電路互連總線I2C模塊運(yùn)作高達(dá)100kbps的最高總線負(fù)載;8引腳鍵盤(pán)中斷KBI模塊。</p><p> ?。?)Timers:1個(gè)2通道和1個(gè)6通道16位定時(shí)器/脈沖寬度調(diào)制
14、器模板。具有輸入、捕捉、輸出比較、脈寬調(diào)制功能。</p><p> 2.2.2 內(nèi)部結(jié)構(gòu)簡(jiǎn)圖</p><p><b> 1. 內(nèi)部結(jié)構(gòu)簡(jiǎn)圖</b></p><p> 如圖所示,給出了AW60的內(nèi)部結(jié)構(gòu)圖,它對(duì)于我們理解和應(yīng)用AW60 MCU有重要作用,在學(xué)習(xí)了基本有法后,應(yīng)在反過(guò)來(lái)熟悉這個(gè)內(nèi)部結(jié)構(gòu)圖,以便更好地理解AW60 MCU的基本原
15、理。從內(nèi)部結(jié)構(gòu)圖可以看出,AW60主要有以下幾個(gè)部分:S08 CPU、存儲(chǔ)器、定時(shí)器接口模塊、定時(shí)器模塊、看門(mén)狗模塊、通用IO模塊、串口通信模塊(SCI)、串行外設(shè)接口(SPI)模塊、I2C(IIC)模塊、A/D轉(zhuǎn)換模塊、鍵盤(pán)中斷模塊、時(shí)鐘發(fā)生模塊、復(fù)位與中斷模塊等。</p><p> 2.3 串行通信模塊</p><p> 2.3.1 MAX232引腳圖</p><
16、;p> 在MCU中,若用RS-232總線進(jìn)行串行通信,則需外接電路實(shí)現(xiàn)電平轉(zhuǎn)換。在發(fā)送端,需要用驅(qū)動(dòng)電路將TTL 電平轉(zhuǎn)換成RS-232電平;在接受端,需要用接收電路將RS-232電平。轉(zhuǎn)化為T(mén)TL電平。電平轉(zhuǎn)換器不僅可以由晶振管分立元件構(gòu)成,也可以直接使用集成電路。目前使用MAX232芯片較多,該芯片使用單一+5V電源供電實(shí)現(xiàn)電平轉(zhuǎn)換。如圖所示,給出了MAX232的引腳說(shuō)明。各引腳含義簡(jiǎn)要說(shuō)明如下:</p>&l
17、t;p> Vcc(16腳):正電源端,一般接+5V。</p><p> GND(15腳):地。</p><p> VS+(2腳):VS+=2VCC-1.5V=8.5V。</p><p> VS-(6腳):VS-=-2VCC-1.5V=-11.5V。</p><p> C2+、C2-(4、5腳):一般接1μF的電解電容。<
18、/p><p> C1+、C1-(1、3腳):一般接1μF的電解電容。</p><p> 在正常情況下,(1)T1IN=5V,則T1OUT=-9V;T1IN=0V,則T1OUT=9V。(2)將R1IN與T1OUT相連,令T1IN=5V,則R1OUT=5V;令T1IN=0V,則R1OUT=0V。</p><p> MAX232芯片進(jìn)行電平轉(zhuǎn)換的基本原理:(1)發(fā)送過(guò)程
19、:MCU的TxD(TTL電平)經(jīng)過(guò)MAX232的11腳(T1IN)送到MAX232內(nèi)部,在內(nèi)部TTL電平被“提升”為232電平,通過(guò)14腳(T1OUT)發(fā)送出去。接受過(guò)程:外部232電平經(jīng)過(guò)MAX232的13腳(R1IN)進(jìn)入到MAX232的內(nèi)部,在內(nèi)部232電平被“降低”為T(mén)TL電平,經(jīng)過(guò)12腳(R1OUT送到MCU的RxD,進(jìn)入MCU內(nèi)部。</p><p> 2.3.2 串行通信的電路原理</p>
20、;<p> 從基本原理的角度看,串行通信接口SCI的主要功能是:接收時(shí),把外部的單線輸入的數(shù)據(jù)變成一個(gè)字節(jié)的并行數(shù)據(jù)送入MCU內(nèi)部;發(fā)送時(shí),把需要發(fā)送的一個(gè)字節(jié)的并行數(shù)據(jù)轉(zhuǎn)換為單線輸入。為了設(shè)置波特率,SCI應(yīng)具有波特率寄存器。為了能夠設(shè)置通信格式、是否校驗(yàn)、是否允許中斷等,SCI應(yīng)具有控制寄存器。而要知道串口是否有數(shù)據(jù)可收、數(shù)據(jù)是否發(fā)送出去等,需要有SCI狀態(tài)寄存器。當(dāng)然,若一個(gè)寄存器不夠用,控制與狀態(tài)寄存器可能有多個(gè)
21、。而SCI數(shù)據(jù)寄存器存放要發(fā)送的數(shù)據(jù),也存放接受的數(shù)據(jù),這并不沖突,因?yàn)榘l(fā)送與接收的實(shí)際工作是通過(guò)“發(fā)送移位寄存器”和“接收以為寄存器”完成的。編程時(shí),程序員并不直接與“發(fā)送移位寄存器”和“接收移位寄存器”打交道,只與數(shù)據(jù)寄存器打交道,所以MCU中并沒(méi)有設(shè)置“發(fā)送移位寄存器和“接收移位寄存器”的映像地址。發(fā)送時(shí),程序員通過(guò)判定狀態(tài)寄存器的相應(yīng)位,了解是否可以發(fā)送一個(gè)新的數(shù)據(jù)。若可以發(fā)送,則將待發(fā)送的數(shù)據(jù)放入“SCI數(shù)據(jù)寄存器”中就可以了
22、,剩下的工作由MCU自動(dòng)完成:將數(shù)據(jù)從“SCI數(shù)據(jù)寄存器”送到“發(fā)送移位寄存器”,硬件驅(qū)動(dòng)將“發(fā)送移位寄存器”的數(shù)據(jù)一位一位地按照規(guī)定的波特率移到發(fā)</p><p> 2.4 液晶顯示模塊</p><p> 點(diǎn)陣字符型LCD是專(zhuān)門(mén)用于顯示數(shù)字、字母、圖形符號(hào)及少量自定義符號(hào)的液晶顯示器。這類(lèi)顯示器把LCD控制器、點(diǎn)陣驅(qū)動(dòng)器、字符存儲(chǔ)器、顯示體及少量的阻容元件等集成一個(gè)液晶顯示模塊。鑒于
23、字符型液晶顯示模塊目前在國(guó)際上已經(jīng)規(guī)范化,其電特性及接口特性是統(tǒng)一的,因此,只要設(shè)計(jì)出一種型號(hào)的接口電路,在指令上稍加修改即可使用各種規(guī)格的字符型液晶顯示模塊。</p><p> 點(diǎn)陣字符型液晶顯示模塊的控制器大多數(shù)為日立公司生產(chǎn)的HD44780及其兼容的控制電路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPANRADIO)等。字符型液晶顯示模塊的主
24、要特點(diǎn)如下:</p><p> 液晶顯示屏是以若干5*8或5*11點(diǎn)陣塊組成的顯示字符群。每個(gè)點(diǎn)陣塊為一個(gè)字符位,字符間距和行距都為一個(gè)點(diǎn)的寬度。</p><p> 主控制電路為HD44780(HITACHI)及其他公司的兼容電路。從程序員的角度來(lái)說(shuō),LCD的顯示接口與編程是面向HD44780的,只要了解HD44780的編程結(jié)構(gòu)即可進(jìn)行LCD的顯示編程。</p><
25、p> 內(nèi)部具有字符發(fā)生器ROM,可顯示192種字符(160個(gè)5*7點(diǎn)陣字符和32個(gè)5*10點(diǎn)陣字符)。</p><p> 具有64字節(jié)的字符發(fā)生器RAM,可以定義8個(gè)5*8點(diǎn)陣字符或4個(gè)5*11點(diǎn)陣字符。</p><p> 具有64字節(jié)的數(shù)據(jù)顯示RAM,供顯示編程時(shí)使用</p><p> 標(biāo)準(zhǔn)接口特性,與MC9S08系列MCU容易接口。</p&g
26、t;<p> 模塊結(jié)構(gòu)緊湊、輕巧、裝配容易。</p><p> 單+5V電源供電(寬溫型需要加-7V驅(qū)動(dòng)電源)。</p><p><b> 低功耗、高可靠性。</b></p><p> 第三章 系統(tǒng)軟件設(shè)計(jì)</p><p> 3.1 MCU方(C)程序</p><p>&l
27、t;b> main.c</b></p><p> #include "Includes.h"</p><p> #include "LCD.h"</p><p> #include "SCI.h"</p><p> #include "timer
28、.h"</p><p> #include "GPIO.h"</p><p> //在此添加全局變量定義</p><p> uint8 g_time[8];</p><p> void main(void){</p><p> uint8 g_DispalyInit[]=&quo
29、t;00:00:00";</p><p> uint8 remember;</p><p> uint32 mRuncount=0;</p><p><b> uint8 i;</b></p><p><b> uint8 m;</b></p><p>&l
30、t;b> int n=1;</b></p><p><b> //1 關(guān)總中斷</b></p><p> DisableInterrupt(); //禁止總中斷</p><p><b> //2 芯片初始化</b></p><p> MCUInit();</
31、p><p><b> //3 模塊初始化</b></p><p> Light_Init(Light_Run_PORT,Light_Run,Light_OFF);</p><p> LCDinit();</p><p> TPMinit(TPM_NUM_1);</p><p> SCIIni
32、t(SCI_NUM_1,SYSTEM_CLOCK,9600);</p><p><b> //定時(shí)器</b></p><p><b> //內(nèi)存初始化 </b></p><p> g_time[0]=0;</p><p> g_time[1]=0; </p><p>
33、 g_time[2]=':';</p><p> g_time[3]=0;</p><p> g_time[4]=0;</p><p> g_time[5]=':';</p><p> g_time[6]=0;</p><p> g_time[7]=0;</p>
34、<p> remember=g_time[7];</p><p><b> //開(kāi)放中斷</b></p><p><b> //LCD</b></p><p> LCDshow(g_DispalyInit); </p><p><b> while(n){</b
35、></p><p> if(GPIO_Get(LCD_Run_PORT,0)==LCD_Run){</p><p> remember = g_time[7];</p><p><b> n = 0;</b></p><p> EnableSCIReInt();</p><p>
36、EnableInterrupt();</p><p> EnabletimerInt(TPM_NUM_1);</p><p><b> }</b></p><p><b> //4 主循環(huán)</b></p><p> while (!n){ </p><p>
37、 if(g_time[7]!=remember){</p><p> for(i=0;i<8;i++) {</p><p> if(i==2 || i ==5){</p><p> g_DispalyInit[i] =g_time[i];</p><p><b> } </b></p><
38、;p><b> else{</b></p><p> m=g_time[i];</p><p> g_DispalyInit[i]=m+'0';</p><p><b> }</b></p><p><b> }</b></p>&
39、lt;p> LCDshow(g_DispalyInit);</p><p> SCISendN(SCI_NUM_1,3,g_time);</p><p> remember=g_time[7];</p><p><b> }</b></p><p> if(GPIO_Get(LCD_Run_PORT,0)
40、!=LCD_Run){</p><p> LCDshow(g_DispalyInit); </p><p><b> n = 1;</b></p><p> DisableInterrupt();</p><p> DisableSCIReInt();</p><p> Disablet
41、imerInt(TPM_NUM_1);</p><p><b> } </b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b&
42、gt; isr.c</b></p><p> #include "Includes.h"</p><p> //此處為用戶新定義中斷處理函數(shù)的存放處</p><p> #include "timer.h"</p><p> //此處為用戶新定義中斷處理函數(shù)的存放處</p>
43、;<p> interrupt void isrT1Out(void){</p><p> DisableInterrupt();</p><p> SecAdd1(g_time);</p><p> TPM_CSTR(1) &=~(TPM1SC_TOF_MASK);</p><p> EnableInterr
44、upt();</p><p><b> }</b></p><p> //未定義的中斷處理函數(shù),本函數(shù)不能刪除</p><p> interrupt void isrDummy(void){</p><p><b> }</b></p><p> //中斷處理子程序
45、類(lèi)型定義</p><p> typedef void( *ISR_func_t)(void);</p><p> //中斷矢量表,如果需要定義其它中斷函數(shù),請(qǐng)修改下表中的相應(yīng)項(xiàng)目</p><p> const ISR_func_t ISR_vectors[] @0xFFCC = {</p><p> isrDummy, //
46、 0xFFCC //時(shí)基中斷</p><p> isrDummy, // 0xFFCE //IIC中斷</p><p> isrDummy, // 0xFFD0 //ADC轉(zhuǎn)換中斷</p><p> isrDummy, // 0xFFD2 //鍵盤(pán)中斷</p>
47、<p> isrDummy, // 0xFFD4 //SCI2發(fā)送中斷</p><p> isrDummy, // 0xFFD6 //SCI2接收中斷</p><p> isrDummy, // 0xFFD8 //SCI2錯(cuò)誤中斷</p><p> isrDummy,
48、// 0xFFDA //SCI1發(fā)送中斷</p><p> isrDummy, // 0xFFDC //SCI1接收中斷</p><p> isrDummy, // 0xFFDE //SCI1錯(cuò)誤中斷</p><p> isrDummy, // 0xFFE0 //SPI中斷
49、</p><p> isrDummy, // 0xFFE2 //TPM2溢出中斷</p><p> isrDummy, // 0xFFE4 //TPM2通道1輸入捕捉/輸出比較中斷</p><p> isrDummy, // 0xFFE6 //TPM2通道0輸入捕捉/輸出比較中斷</p>&
50、lt;p> isrT1Out, // 0xFFE8 //TPM1溢出中斷</p><p> isrDummy, // 0xFFEA //TPM1通道5輸入捕捉/輸出比較中斷</p><p> isrDummy, // 0xFFEC //TPM1通道4輸入捕捉/輸出比較中斷</p><p> isr
51、Dummy, // 0xFFEE //TPM1通道3輸入捕捉/輸出比較中斷</p><p> isrDummy, // 0xFFF0 //TPM1通道2輸入捕捉/輸出比較中斷</p><p> isrDummy, // 0xFFF2 //TPM1通道1輸入捕捉/輸出比較中斷</p><p> isrDummy,
52、 // 0xFFF4 //TPM1通道0輸入捕捉/輸出比較中斷</p><p> isrDummy, // 0xFFF6 //ICG的PLL鎖相狀態(tài)變化中斷</p><p> isrDummy, // 0xFFF8 //低電壓檢測(cè)中斷</p><p> isrDummy, // 0xFFFA
53、 //IRQ引腳中斷</p><p> isrDummy // 0xFFFC //SWI指令中斷 </p><p> //RESET是特殊中斷,其向量由開(kāi)發(fā)環(huán)境直接設(shè)置(在本軟件系統(tǒng)的Start08.o文件中)</p><p><b> };</b></p><p><b&g
54、t; timer.c</b></p><p> #include "timer.h"</p><p> void TPMinit(uint8 TPMNo){</p><p> if(TPMNo > 2)</p><p> TPMNo = 2;</p><p> else
55、 if(TPMNo < 1)</p><p><b> TPMNo=1;</b></p><p> TPM_CSTR(TPMNo)=0b00010110;</p><p> TPM_CNTH(TPMNo) = 0x00;</p><p> TPM_CNTL(TPMNo) = 0x00;</p>
56、<p> TPM_MODH(TPMNo) = 0x7A;</p><p> TPM_MODL(TPMNo) = 0x12;</p><p><b> }</b></p><p> void SecAdd1(uint8 *p){</p><p> *(p+7)+=1;</p><p
57、> if(*(p+7)>=10){</p><p> *(p+7) = 0;</p><p> *(p+6)+=1;</p><p> if(*(p+6)>=6){</p><p> *(p+6) = 0;</p><p> *(p+4)+=1;</p><p>
58、 if(*(p+4)>=10){</p><p> *(p+4) = 0;</p><p> *(p+3)+=1;</p><p> if(*(p+3)>=6){</p><p> *(p+3) = 0;</p><p> *(p+1)+=1;</p><p> if(*
59、(p+1)>=9){</p><p> *(p+1) = 0;</p><p><b> *p+=1;</b></p><p><b> } </b></p><p> if((*p*10+*(p+1))>=24)</p><p><b> *
60、p = 0; </b></p><p> *(p+1) = 0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&
61、gt;</p><p><b> }</b></p><p><b> timer.h</b></p><p> #ifndef timeR_H</p><p> #define timeR_H</p><p> #include "MC9S08AW60.
62、h"</p><p> #include "Type.h"</p><p> #define TPM_CSTR(x)(*(vuint8 *)(0x00000020+(x-1)*64))</p><p> #define TPM_CNTH(x)(*(vuint8 *)(0x00000021+(x-1)*64))</p>
63、<p> #define TPM_CNTL(x)(*(vuint8 *)(0x00000022+(x-1)*64))</p><p> #define TPM_MODH(x)(*(vuint8 *)(0x00000023+(x-1)*64))</p><p> #define TPM_MODL(x)(*(vuint8 *)(0x00000024+(x-1)*64))<
64、;/p><p> #define EnabletimerInt(x) TPM_CSTR(x) |= TPM1SC_TOIE_MASK</p><p> #define DisabletimerInt(x) TPM_CSTR(x) &=~TPM1SC_TOIE_MASK</p><p> #define TPM_NUM_1 1</p>
65、<p> #define TPM_NUM_2 2</p><p> #define TPM1_CH_0 0</p><p> #define TPM1_CH_1 1</p><p> #define TPM1_CH_2 2</p><p> #define TPM1_CH_3
66、 3</p><p> #define TPM1_CH_4 4</p><p> #define TPM1_CH_5 5</p><p> #define TPM2_CH_0 0</p><p> #define TPM2_CH_1 1</p><p> void
67、TPMinit(uint8 TPMNo);</p><p> void SecAdd1(uint8 *p);</p><p><b> #endif</b></p><p> 3.1.1串行通信子程序</p><p><b> SCI.c</b></p><p>
68、#include "SCI.h"</p><p> void SCIInit(uint8 SCINo, uint8 sysclk, uint16 baud){</p><p> uint16 ubgs;</p><p><b> ubgs=0;</b></p><p> if(SCINo>
69、;2){</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> ubgs=sysclk*(10000/(baud/100))/16;</p><p> SCI_BDH(SCINo)=(uint8)((ubgs&0xFF00)>
70、;>8);</p><p> SCI_BDL(SCINo)=(uint8)(ubgs&0x00FF);</p><p> SCI_C1(SCINo)=0b00000000;</p><p> SCI_C2(SCINo)=0b00001100;</p><p><b> }</b></p>
71、<p> void SCISend1(uint8 SCINo, uint8 ch) {</p><p> if(SCINo>2){</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> while(!(SCI_S1(
72、SCINo)&0b1000000));</p><p> SCI_D(SCINo)=ch;</p><p><b> }</b></p><p> uint8 SCIRe1(uint8 SCINo, uint8 *p) {</p><p><b> uint16 k;</b><
73、/p><p><b> uint8 i;</b></p><p> if(SCINo>2){</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> for(k=0;k<0xfbbb;
74、k++)</p><p> if((SCI_S1(SCINo)&0b00100000)!=0){</p><p> i=SCI_D(SCINo);</p><p><b> *p=0x00;</b></p><p><b> break;</b></p><p&g
75、t;<b> }</b></p><p> if(k>=0xfbbb){</p><p><b> i=0xff;</b></p><p><b> *p=0x01;</b></p><p><b> }</b></p>&l
76、t;p><b> return i;</b></p><p><b> }</b></p><p> void SCISendN(uint8 SCINo, uint16 n, uint8 ch[]) {</p><p> uint16 i; </p><p&g
77、t; if(SCINo>2) {</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> for(i=0;i<n;i++)</p><p> SCISend1(SCINo,ch[i]);</p><p>
78、;<b> }</b></p><p> uint8 SCIReN(uint8 SCINo, uint16 n, uint8 ch[]) {</p><p><b> uint16 m;</b></p><p><b> uint8 fp;</b></p><p>&l
79、t;b> m=0;</b></p><p> if(SCINo>2) {</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> while(m<n) {</p><p> ch[m
80、]=SCIRe1(SCINo,&fp);</p><p> if(fp==1) {</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> m++;</b></p><p>&
81、lt;b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> void SCISendString(uint8 SCINo, char *p){</p><p><b> uint32 k;
82、</b></p><p> if(SCINo>2) {</p><p><b> SCINo=2;</b></p><p><b> }</b></p><p> if(p==0) return;</p><p> for(k=0;p[k]!=
83、39;\0';++k) {</p><p> SCISend1(SCINo,p[k]);</p><p><b> }</b></p><p><b> }</b></p><p><b> SCI.h</b></p><p> #if
84、ndef SCI_H</p><p> #define SCI_H</p><p> #include "MC9S08AW60.h"</p><p> #include "Type.h"</p><p> #define SCI_BDH(x) (*(vuint8 *)(0x00000038+(x
85、-1)*8))</p><p> #define SCI_BDL(x) (*(vuint8 *)(0x00000039+(x-1)*8))</p><p> #define SCI_C1(x) (*(vuint8 *)(0x0000003A+(x-1)*8))</p><p> #define SCI_C2(x) (*(vuint8 *)(0x0000003B
86、+(x-1)*8))</p><p> #define SCI_S1(x) (*(vuint8 *)(0x0000003C+(x-1)*8))</p><p> #define SCI_S2(x) (*(vuint8 *)(0x0000003D+(x-1)*8))</p><p> #define SCI_C3(x) (*(vuint8 *)(0x000000
87、3E+(x-1)*8))</p><p> #define SCI_D(x) (*(vuint8 *)(0x0000003F+(x-1)*8))</p><p> #define EnableSCIReInt() SCI1C2 |=(SCI1C2_RIE_MASK)</p><p> #define DisableSCIReInt() SCI1C2 &
88、=~(SCI1C2_RIE_MASK)</p><p> #define SCI_NUM_1 1</p><p> #define SCI_NUM_2 2</p><p> void SCIInit(uint8 SCINo,uint8 sysclk,uint16 baud);</p><p> void SCISend1(ui
89、nt8 SCINo,uint8 ch);</p><p> void SCISendN(uint8 SCINo,uint16 n,uint8 ch[]);</p><p> uint8 SCIRe1(uint8 SCINo,uint8 *p);</p><p> uint8 SCIReN(uint8 SCINo,uint16 n,uint8 ch[]);<
90、;/p><p> void SCISendString(uint8 SCINo,char *p);</p><p><b> #endif</b></p><p> 3.1.2 LCD子程序</p><p><b> LCD.c</b></p><p> #includ
91、e "LCD.h"</p><p> #include "GPIO.h"</p><p> void LCDinit(void) {</p><p><b> uint16 i;</b></p><p> LCDdataD = 0b11111111;</p>
92、<p> LCDctrlD1 |= (1 << LcdRS);</p><p> LCDctrlD1 |= (1 << LcdRW);</p><p> LCDctrl1 &=~(1 << LcdRS);</p><p> LCDctrl1 &=~(1 << LcdRW);</p
93、><p> LCDctrlD2 |= (1 << LcdE);</p><p> LCDctrl2 |= (1 << LcdE);</p><p> LCDcommand (0b00111000);</p><p> LCDcommand (0b00001000);</p><p> LC
94、Dcommand (0b00000001);</p><p> for(i=0;i<4000;i++)</p><p> asm("NOP");</p><p> LCDcommand (0b00000110);</p><p> LCDcommand (0b00010100);</p><
95、;p> LCDcommand (0b00001100);</p><p> GPIO_Init(LCD_Run_PORT,0,0,0);</p><p><b> }</b></p><p> void LCDcommand(uint8 cmd){</p><p><b> uint16 i;&
96、lt;/b></p><p> for(i=0;i<1000;i++)</p><p> asm("NOP");</p><p> LCDdata=cmd;</p><p> LCDctrl2 |= (1<<LcdE);</p><p> asm("NOP
97、");</p><p> asm("NOP");</p><p> asm("NOP");</p><p> LCDctrl2 &=~(1<<LcdE);</p><p> for(i=0;i<1000;i++)</p><p> a
98、sm("NOP");</p><p><b> }</b></p><p> void LCDshow(uint8 str[]) {</p><p><b> uint8 i;</b></p><p> LCDinit();</p><p> L
99、CDctrl1 &=~(1<<LcdRS);</p><p> LCDctrl1 &=~(1<<LcdRW);</p><p> LCDcommand (0b10000000);</p><p> LCDctrl1 |=1<<LcdRS;</p><p> LCDctrl1 |=~(
100、1<<LcdRW);</p><p> for(i=0;i<8;i++) {</p><p> LCDcommand(str[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b>
101、LCD.h</b></p><p> #ifndef LCD_H</p><p> #define LCD_H</p><p> #include "MC9S08AW60.h"</p><p> #include "Type.h"</p><p> #inc
102、lude "GeneralFun.h"</p><p> #define LCDdata PTAD</p><p> #define LCDdataD PTADD</p><p> #define LCDctrl1 PTCD</p><p> #define LCDctrlD1 PTCDD</p>&
103、lt;p> #define LCDctrl2 PTFD</p><p> #define LCDctrlD2 PTFDD</p><p> #define LcdRS 4</p><p> #define LcdRW 6</p><p> #define LcdE 6</p><p> #de
104、fine LCD_Run_PORT PORT_E</p><p> #define LCD_Run 1</p><p> void LCDinit(void);</p><p> void LCDcommand(uint8 cmd);</p><p> void LCDshow(uint8 str[]);</p>
105、<p> void LCDshoww(uint8 str[]);</p><p><b> #endif</b></p><p><b> 第四章 系統(tǒng)測(cè)試</b></p><p><b> 調(diào)試界面截圖:</b></p><p><b> 運(yùn)行界
106、面截圖:</b></p><p><b> 第五章 總結(jié)展望</b></p><p><b> 5.1 總結(jié)</b></p><p> 經(jīng)過(guò)了為期一周半的單片機(jī)課程設(shè)計(jì),首先是對(duì)與飛思卡爾的單片機(jī)系統(tǒng)有了一定的了解。由于之前就做過(guò)幾次的實(shí)驗(yàn),而且以前也上過(guò)C語(yǔ)言的課程。這次的課程設(shè)計(jì),思路很清晰。課程是做
107、一個(gè)基于LCD顯示的計(jì)數(shù)器。在原有LCD液晶程序和計(jì)數(shù)器程序修改的基礎(chǔ)上,經(jīng)過(guò)幾次修改和整理,在結(jié)束之前還是完成了此次的設(shè)計(jì)。LCD上能夠顯示計(jì)數(shù)。這次的課程設(shè)計(jì)不一樣。由于是在原有程序的基礎(chǔ)上修改整合,需要對(duì)原有的程序進(jìn)行一個(gè)整體的了解和深入。這對(duì)與實(shí)際的開(kāi)發(fā)很有幫助。能夠深入了解飛思卡爾的設(shè)計(jì)思路。拓展我們的思路。課程設(shè)計(jì)的內(nèi)容雖然沒(méi)有什么太大的實(shí)際意義。但是,我們能夠了解到實(shí)際開(kāi)發(fā)的一些步驟和思路。對(duì)于以后的工作也很有幫助的吧。每
108、一次的課程設(shè)計(jì),都是一次學(xué)習(xí),都是一次進(jìn)步。</p><p><b> 5.2 展望</b></p><p> 對(duì)于此次課程設(shè)計(jì),我們只是做了一些簡(jiǎn)單的工作。雖然有研究過(guò)飛思卡爾的單片機(jī)程序,但是畢竟自己的知識(shí)能力有限。不可能在短短的一周半時(shí)間太過(guò)于深入。這一周半的時(shí)間,了解了單片機(jī)的很多東西吧。對(duì)自己的要求是,要多動(dòng)手,自己動(dòng)手寫(xiě)代碼學(xué)習(xí)的才更快。對(duì)于編程,看別
109、人的百遍不及自己動(dòng)手寫(xiě)一遍。如果可能,希望完全自己動(dòng)手設(shè)計(jì)一個(gè)計(jì)數(shù)器的程序。</p><p><b> 參考文獻(xiàn)</b></p><p> 【1】王宜懷、張書(shū)奎、王林等著,嵌入式技術(shù)基礎(chǔ)與實(shí)踐,清華大學(xué)出版社</p><p> 【2】譚浩強(qiáng)著,C語(yǔ)言程序設(shè)計(jì)(第四版),北京:清華大學(xué)出版社</p><p> 【3
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字時(shí)鐘電子技術(shù)課程設(shè)計(jì)
- 電子技術(shù)課程設(shè)計(jì)-----數(shù)字時(shí)鐘
- 電子技術(shù)課程設(shè)計(jì)---數(shù)字時(shí)鐘
- 電子技術(shù)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 電子技術(shù)課程設(shè)計(jì)--數(shù)字時(shí)鐘
- 電子技術(shù)課程設(shè)計(jì)---數(shù)字時(shí)鐘
- 數(shù)字時(shí)鐘電子技術(shù)課程設(shè)計(jì)
- 電子技術(shù)課程設(shè)計(jì) 數(shù)字時(shí)鐘設(shè)計(jì)
- 數(shù)字電路技術(shù)課程設(shè)計(jì)_之?dāng)?shù)字時(shí)鐘
- 嵌入式技術(shù)課程報(bào)告
- 數(shù)字時(shí)鐘電子技術(shù)課程設(shè)計(jì).doc
- 嵌入式系統(tǒng)開(kāi)發(fā)技術(shù)課程設(shè)計(jì)-嵌入式溫濕度采集系統(tǒng)設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)報(bào)告--數(shù)字相框
- 數(shù)字電子技術(shù)課程設(shè)計(jì)--數(shù)字式電子時(shí)鐘電路設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)--基于lcd的電子時(shí)鐘
- 數(shù)字電子技術(shù)課程設(shè)計(jì)--多功能時(shí)鐘設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)
- 嵌入式課程設(shè)計(jì)--基于lcd的電子時(shí)鐘實(shí)驗(yàn)
- 嵌入式課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論