嵌入式技術課程設計--數(shù)字時鐘_第1頁
已閱讀1頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  課 程 設 計 報 告</p><p>  課程設計名稱: 嵌入式技術基礎與實踐 </p><p>  系 別: 三 系 </p><p>  學生姓名: </p><p>  班 級: &

2、lt;/p><p>  學 號: </p><p>  成 績: </p><p>  指導教師: </p><p>  開課時間: 2010-2011 學年 2 學期</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)硬件設計3</p><p>  2.1 系統(tǒng)原理圖3</p><p

4、>  2.2 單片機(MCU)模塊4</p><p>  2.2.1 MC9S08AW60單片機性能概述4</p><p>  2.2.2 內部結構簡圖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)軟件設計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)測試22

6、</p><p>  第五章 總結展望22</p><p><b>  5.1 總結22</b></p><p><b>  5.2 展望22</b></p><p><b>  參考文獻22</b></p><p><b>  第一章

7、 系統(tǒng)概要</b></p><p><b>  1.1 系統(tǒng)背景</b></p><p>  數(shù)字時鐘,當我們聽到這幾個字時,第一反應就是我們所說的數(shù)字,不錯數(shù)字鐘就是以數(shù)字顯示取代模擬表盤的鐘表,在顯示上它用數(shù)字反應出此時的時間,相比模擬鐘能給人一種一目了然的感覺,不僅如此它還能同時顯示時、分、秒。而且能對時、分、秒準確校時,這是普通鐘所不及的。由于單片

8、機集成度高、功能強、可靠性高、體積小、功耗地、使用方便、價格低廉等一系列優(yōu)點,目前已經(jīng)滲入到人們工作和生活的方方面面,幾乎“無處不在,無所不為”。單片機的應用領域已從面向工業(yè)控制、通訊、交通、智能儀表等迅速發(fā)展到家用消費產品、辦公自動化、汽車電子、PC機外圍以及網(wǎng)絡通訊等廣大領域。</p><p><b>  1.2 系統(tǒng)功能</b></p><p>  在實驗箱上有

9、一個啟動鍵,當按下啟動鍵給以一個低電平,電子時鐘從當前設定值開始走時。按秒刷新,要求在LCD屏上顯示。若按啟動鍵給以高電平,則時間暫停,再按,時間繼續(xù)按秒刷新。</p><p>  第二章 系統(tǒng)硬件設計</p><p><b>  2.1 系統(tǒng)原理圖</b></p><p>  該系統(tǒng)由AW60最小系統(tǒng)電路為主要結構,利用串口進行數(shù)據(jù)的控制與采

10、集。首先將開關接在AW60上的PORT_D口上,用于控制數(shù)字時鐘系統(tǒng)的開關。然后將LCD的數(shù)據(jù)線7-14引腳(D0-D7)分別與MCU的PTA0-PTA7連接,LCD的控制線RS、R/W、E(4、5、6引腳)分別于MCU的PTC4、PTC6、PTF6連接,用于輸出時間。數(shù)字時鐘必須要有晶振電路,所以將該晶振電路與AW60的PTG5和PTG6相連,用于時間的自加。由于在運行系統(tǒng)時,以防電流不穩(wěn)定,所以在PTB0端設置一個下拉電阻,穩(wěn)定電流

11、。</p><p>  2.2 單片機(MCU)模塊</p><p>  2.2.1 MC9S08AW60單片機性能概述</p><p>  (1)最高達40MHz的CPU工作頻率和20Hz的內部總線工作頻率表;時鐘源選項包括晶振、諧振器、外部時鐘或內部產生的時鐘。</p><p>  (2)相比HC08 CPU指令集,S08 CPU增加了B

12、GND指令。</p><p> ?。?)單線后臺調試模式接口;增強的斷點能力,允許單一的斷點設置在線調試(在片內調試的模塊增加了多于兩個的斷點)。</p><p> ?。?)內含32個中斷/復位源;內含2KB的片內RAM;內含60KB的片內在線可編程Flash存儲器,帶有塊保護和安全選項。</p><p>  (5)可選的計算機正常操作(COP)復位;低電壓檢測和復

13、位或中斷;非法操作碼檢測與復位;非法地址檢測與復位。</p><p> ?。?)ADC:多達16個通道,10位A/D轉換器與自動比較功能;兩個串行通信接口SCI模塊與可選的13位中斷;一個串行外設接口SPI模塊;集成電路互連總線I2C模塊運作高達100kbps的最高總線負載;8引腳鍵盤中斷KBI模塊。</p><p>  (7)Timers:1個2通道和1個6通道16位定時器/脈沖寬度調制

14、器模板。具有輸入、捕捉、輸出比較、脈寬調制功能。</p><p>  2.2.2 內部結構簡圖</p><p><b>  1. 內部結構簡圖</b></p><p>  如圖所示,給出了AW60的內部結構圖,它對于我們理解和應用AW60 MCU有重要作用,在學習了基本有法后,應在反過來熟悉這個內部結構圖,以便更好地理解AW60 MCU的基本原

15、理。從內部結構圖可以看出,AW60主要有以下幾個部分:S08 CPU、存儲器、定時器接口模塊、定時器模塊、看門狗模塊、通用IO模塊、串口通信模塊(SCI)、串行外設接口(SPI)模塊、I2C(IIC)模塊、A/D轉換模塊、鍵盤中斷模塊、時鐘發(fā)生模塊、復位與中斷模塊等。</p><p>  2.3 串行通信模塊</p><p>  2.3.1 MAX232引腳圖</p><

16、;p>  在MCU中,若用RS-232總線進行串行通信,則需外接電路實現(xiàn)電平轉換。在發(fā)送端,需要用驅動電路將TTL 電平轉換成RS-232電平;在接受端,需要用接收電路將RS-232電平。轉化為TTL電平。電平轉換器不僅可以由晶振管分立元件構成,也可以直接使用集成電路。目前使用MAX232芯片較多,該芯片使用單一+5V電源供電實現(xiàn)電平轉換。如圖所示,給出了MAX232的引腳說明。各引腳含義簡要說明如下:</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芯片進行電平轉換的基本原理:(1)發(fā)送過程

19、:MCU的TxD(TTL電平)經(jīng)過MAX232的11腳(T1IN)送到MAX232內部,在內部TTL電平被“提升”為232電平,通過14腳(T1OUT)發(fā)送出去。接受過程:外部232電平經(jīng)過MAX232的13腳(R1IN)進入到MAX232的內部,在內部232電平被“降低”為TTL電平,經(jīng)過12腳(R1OUT送到MCU的RxD,進入MCU內部。</p><p>  2.3.2 串行通信的電路原理</p>

20、;<p>  從基本原理的角度看,串行通信接口SCI的主要功能是:接收時,把外部的單線輸入的數(shù)據(jù)變成一個字節(jié)的并行數(shù)據(jù)送入MCU內部;發(fā)送時,把需要發(fā)送的一個字節(jié)的并行數(shù)據(jù)轉換為單線輸入。為了設置波特率,SCI應具有波特率寄存器。為了能夠設置通信格式、是否校驗、是否允許中斷等,SCI應具有控制寄存器。而要知道串口是否有數(shù)據(jù)可收、數(shù)據(jù)是否發(fā)送出去等,需要有SCI狀態(tài)寄存器。當然,若一個寄存器不夠用,控制與狀態(tài)寄存器可能有多個

21、。而SCI數(shù)據(jù)寄存器存放要發(fā)送的數(shù)據(jù),也存放接受的數(shù)據(jù),這并不沖突,因為發(fā)送與接收的實際工作是通過“發(fā)送移位寄存器”和“接收以為寄存器”完成的。編程時,程序員并不直接與“發(fā)送移位寄存器”和“接收移位寄存器”打交道,只與數(shù)據(jù)寄存器打交道,所以MCU中并沒有設置“發(fā)送移位寄存器和“接收移位寄存器”的映像地址。發(fā)送時,程序員通過判定狀態(tài)寄存器的相應位,了解是否可以發(fā)送一個新的數(shù)據(jù)。若可以發(fā)送,則將待發(fā)送的數(shù)據(jù)放入“SCI數(shù)據(jù)寄存器”中就可以了

22、,剩下的工作由MCU自動完成:將數(shù)據(jù)從“SCI數(shù)據(jù)寄存器”送到“發(fā)送移位寄存器”,硬件驅動將“發(fā)送移位寄存器”的數(shù)據(jù)一位一位地按照規(guī)定的波特率移到發(fā)</p><p>  2.4 液晶顯示模塊</p><p>  點陣字符型LCD是專門用于顯示數(shù)字、字母、圖形符號及少量自定義符號的液晶顯示器。這類顯示器把LCD控制器、點陣驅動器、字符存儲器、顯示體及少量的阻容元件等集成一個液晶顯示模塊。鑒于

23、字符型液晶顯示模塊目前在國際上已經(jīng)規(guī)范化,其電特性及接口特性是統(tǒng)一的,因此,只要設計出一種型號的接口電路,在指令上稍加修改即可使用各種規(guī)格的字符型液晶顯示模塊。</p><p>  點陣字符型液晶顯示模塊的控制器大多數(shù)為日立公司生產的HD44780及其兼容的控制電路,如SED1278(SEIKO EPSON)、KS0066(SAMSUNG)、NJU6408(NER JAPANRADIO)等。字符型液晶顯示模塊的主

24、要特點如下:</p><p>  液晶顯示屏是以若干5*8或5*11點陣塊組成的顯示字符群。每個點陣塊為一個字符位,字符間距和行距都為一個點的寬度。</p><p>  主控制電路為HD44780(HITACHI)及其他公司的兼容電路。從程序員的角度來說,LCD的顯示接口與編程是面向HD44780的,只要了解HD44780的編程結構即可進行LCD的顯示編程。</p><

25、p>  內部具有字符發(fā)生器ROM,可顯示192種字符(160個5*7點陣字符和32個5*10點陣字符)。</p><p>  具有64字節(jié)的字符發(fā)生器RAM,可以定義8個5*8點陣字符或4個5*11點陣字符。</p><p>  具有64字節(jié)的數(shù)據(jù)顯示RAM,供顯示編程時使用</p><p>  標準接口特性,與MC9S08系列MCU容易接口。</p&g

26、t;<p>  模塊結構緊湊、輕巧、裝配容易。</p><p>  單+5V電源供電(寬溫型需要加-7V驅動電源)。</p><p><b>  低功耗、高可靠性。</b></p><p>  第三章 系統(tǒng)軟件設計</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 關總中斷</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>  //定時器</b></p><p><b>  //內存初始化 </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>  //開放中斷</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、類型定義</p><p>  typedef void( *ISR_func_t)(void);</p><p>  //中斷矢量表,如果需要定義其它中斷函數(shù),請修改下表中的相應項目</p><p>  const ISR_func_t ISR_vectors[] @0xFFCC = {</p><p>  isrDummy, //

46、 0xFFCC //時基中斷</p><p>  isrDummy, // 0xFFCE //IIC中斷</p><p>  isrDummy, // 0xFFD0 //ADC轉換中斷</p><p>  isrDummy, // 0xFFD2 //鍵盤中斷</p>

47、<p>  isrDummy, // 0xFFD4 //SCI2發(fā)送中斷</p><p>  isrDummy, // 0xFFD6 //SCI2接收中斷</p><p>  isrDummy, // 0xFFD8 //SCI2錯誤中斷</p><p>  isrDummy,

48、// 0xFFDA //SCI1發(fā)送中斷</p><p>  isrDummy, // 0xFFDC //SCI1接收中斷</p><p>  isrDummy, // 0xFFDE //SCI1錯誤中斷</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 //低電壓檢測中斷</p><p>  isrDummy, // 0xFFFA

53、 //IRQ引腳中斷</p><p>  isrDummy // 0xFFFC //SWI指令中斷 </p><p>  //RESET是特殊中斷,其向量由開發(fā)環(huán)境直接設置(在本軟件系統(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)測試</b></p><p><b>  調試界面截圖:</b></p><p><b>  運行界

106、面截圖:</b></p><p><b>  第五章 總結展望</b></p><p><b>  5.1 總結</b></p><p>  經(jīng)過了為期一周半的單片機課程設計,首先是對與飛思卡爾的單片機系統(tǒng)有了一定的了解。由于之前就做過幾次的實驗,而且以前也上過C語言的課程。這次的課程設計,思路很清晰。課程是做

107、一個基于LCD顯示的計數(shù)器。在原有LCD液晶程序和計數(shù)器程序修改的基礎上,經(jīng)過幾次修改和整理,在結束之前還是完成了此次的設計。LCD上能夠顯示計數(shù)。這次的課程設計不一樣。由于是在原有程序的基礎上修改整合,需要對原有的程序進行一個整體的了解和深入。這對與實際的開發(fā)很有幫助。能夠深入了解飛思卡爾的設計思路。拓展我們的思路。課程設計的內容雖然沒有什么太大的實際意義。但是,我們能夠了解到實際開發(fā)的一些步驟和思路。對于以后的工作也很有幫助的吧。每

108、一次的課程設計,都是一次學習,都是一次進步。</p><p><b>  5.2 展望</b></p><p>  對于此次課程設計,我們只是做了一些簡單的工作。雖然有研究過飛思卡爾的單片機程序,但是畢竟自己的知識能力有限。不可能在短短的一周半時間太過于深入。這一周半的時間,了解了單片機的很多東西吧。對自己的要求是,要多動手,自己動手寫代碼學習的才更快。對于編程,看別

109、人的百遍不及自己動手寫一遍。如果可能,希望完全自己動手設計一個計數(shù)器的程序。</p><p><b>  參考文獻</b></p><p>  【1】王宜懷、張書奎、王林等著,嵌入式技術基礎與實踐,清華大學出版社</p><p>  【2】譚浩強著,C語言程序設計(第四版),北京:清華大學出版社</p><p>  【3

溫馨提示

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

評論

0/150

提交評論