課程設(shè)計-- 數(shù)字秒表_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  計算機控制技術(shù)綜合應(yīng)用設(shè)計</p><p>  題目 數(shù)字秒表 </p><p>  二級學院 電子信息與自動化學院 </p><p>  專 業(yè) 電氣工程及其自動化 </p><p>  班 級

2、 </p><p>  學生姓名 學號 </p><p>  學生姓名 學號 </p><p>  學生姓名 學號 </p><p>  指導教師 </p><p>  時間: 2013年12月16日

3、 </p><p><b>  摘要</b></p><p>  隨著電子科技的飛速發(fā)展,單片機在日常生活中應(yīng)用的越來越廣泛。本文以STC89C52單片機為核心器件,利用了單片機定時器具有精確定時的特點,制作了一個簡易的數(shù)字秒表,可計時范圍為0至59分59秒990毫秒,計時精度達到了0.01秒。該秒表的功能包括起停、復位、切換顯示界面以及記錄時間。在秒表的

4、顯示上,使用了LCD1602液晶顯示屏,這樣使結(jié)果更加清楚直觀。而當前時間與所記錄時間則是分開在兩個不同的界面上,利用按鍵來選擇察看某一個界面,操作方便而且結(jié)果精確。</p><p>  關(guān)鍵字: 單片機 秒表 LCD1602液晶顯示</p><p><b>  目錄</b></p><p>  一 問題重述.........

5、....................................1</p><p>  1.1 設(shè)計要求..................................................1</p><p>  1.2 拓展要求..................................................1</p><p&g

6、t;  二 設(shè)計方案與論證.......................................1</p><p>  2.1 方案比較..................................................1</p><p>  2.2 方案論證..................................................1<

7、;/p><p>  2.3 方案選擇..................................................1</p><p>  2.4 總方案設(shè)計框圖............................................2</p><p>  三 單元模塊設(shè)計...............................

8、..........2</p><p>  3.1 按鍵控制電路..............................................2</p><p>  3.2 單片機最小系統(tǒng)電路........................................3</p><p>  3.3 LCD1602顯示電路..............

9、............................4</p><p>  3.4 總電路仿真圖..............................................5</p><p>  四 軟件模塊設(shè)計流程圖...................................6</p><p>  4.1 主循環(huán)函數(shù)的流程圖.....

10、...................................6</p><p>  4.2 定時器0的中斷服務(wù)子程序..................................7</p><p>  4.3 定時器1的中斷服務(wù)子程序..................................8</p><p>  4.4 兩個顯示函數(shù)的子程

11、序......................................9</p><p>  4.5 外部中斷0和外部中斷1的中斷服務(wù)子程序....................9</p><p>  五 軟件系統(tǒng)測試.........................................10</p><p>  5.1 系統(tǒng)仿真效果圖.....

12、.......................................10</p><p>  六 實物圖及測試分析.....................................10 </p><p>  6.1 實物效果圖................................................10</p><p> 

13、 6.2 測試結(jié)果及誤差分析........................................11</p><p>  七 設(shè)計總結(jié).............................................12</p><p>  八 參考文獻.............................................12</p>

14、<p>  九 附錄.................................................13</p><p>  9.1 元件清單..................................................13</p><p>  9.2 源程序代碼.......................................

15、.........13</p><p><b>  1、問題重述</b></p><p><b>  1.1 設(shè)計要求:</b></p><p>  ⑴制作簡易秒表,最小顯示位10ms,計時范圍0~59分59秒990毫秒</p><p> ?、埔绘I控制三種工作狀態(tài):清零、計時、停止</p>

16、;<p> ?、窍到y(tǒng)工作符合一般秒表要求</p><p><b>  1.2 拓展要求:</b></p><p><b>  ⑴可記錄多個成績</b></p><p><b>  ⑵秒表精度0.1s</b></p><p><b>  2、設(shè)計方案與論證

17、</b></p><p>  在MCU的選擇上直接選取物美價廉的STC89C52型號的單片機,雖然它是一款較低級的單片機,但是用于制作秒表來說已經(jīng)足夠了。在這里主要討論顯示電路的選擇</p><p><b>  2.1 方案比較:</b></p><p>  方案一:選用七段數(shù)碼管做顯示設(shè)備</p><p>

18、  方案二:選用LCD1602液晶顯示屏做顯示設(shè)備</p><p><b>  2.2 方案論證:</b></p><p>  方案一:七段數(shù)碼管操作方便,并且顯示效果良好價格也低廉。但是在界面切換到記錄數(shù)據(jù)的時候并不是十分直觀,在與單片機相接的時候還要在加驅(qū)動,加大了工作量,并且數(shù)碼管的耗能較大。</p><p>  方案二:LCD1602液

19、晶顯示屏顯示清晰,切換顯示界面也很直觀,可直接與單片機相連,方便快捷且耗能較少。但是價格較高,操作起來較復雜。</p><p>  2.3方案選擇:綜合各個方面,選擇LCD1602作為顯示設(shè)備。</p><p>  2.4 總方案設(shè)計框圖:</p><p><b>  圖1 總方案設(shè)計圖</b></p><p><

20、b>  3、單元模塊設(shè)計</b></p><p>  3.1 按鍵控制電路</p><p>  圖2 按鍵控制電路圖</p><p>  放置四個按鍵開關(guān),分別接在單片機的P3.1~P3.4上,另一端接地。如圖2所示,單片機檢測這幾個引腳的高低電平狀態(tài)即可知道是否按下了開關(guān)。而這四個開關(guān)分別控制記錄、起停、復位以及界面切換的功能,通過單片機對四個

21、按鍵狀態(tài)檢測的反饋來分別實現(xiàn)這四個功能。</p><p>  3.2 單片機最小系統(tǒng)電路</p><p>  圖3 單片機最小系統(tǒng)圖</p><p>  單片機的最小系統(tǒng)(如圖3)就是單片機能夠正常工作所必須具備的部分。包括三個部分,分別是復位電路、晶振電路和電源電路。</p><p>  3.2.1 復位電路</p><

22、p>  在單片機系統(tǒng)中,復位電路是非常關(guān)鍵的,當程序跑飛(運行不正常)或死機(停止運行)時,就需要進行復位。MCS-5l 系列單片機的復位引腳RST( 第9 管腳) 出現(xiàn)2個機器周期以上的高電平時,單片機就執(zhí)行復位操作。如果RST 持續(xù)為高電平,單片機就處于循環(huán)復位狀態(tài)。復位操作通常有兩種基本形式:上電自動復位和開關(guān)復位。而在本文中采用的為上電復位,即每次上電的瞬間給單片機復位。</p><p>  3.2

23、.2 晶振電路</p><p>  XTAL1(19 腳):芯片內(nèi)部振蕩電路輸入端;XTAL2(18 腳):芯片內(nèi)部振蕩電路輸出端;XTAL1 和XTAL2 是獨立的輸入和輸出反相放大器,它們可以被配置為使用石英晶振的片內(nèi)振蕩器,或者是器件直接由外部時鐘驅(qū)動。本文中采用的是內(nèi)時鐘模式,即采用利用芯片內(nèi)部的振蕩電路,在XTAL1、XTAL2 的引腳上外接定時元件(一個石英晶體和兩個電容),內(nèi)部振蕩器便能產(chǎn)生自激振蕩

24、。以此來提供給單片機工作信號脈沖。</p><p>  3.2.3 電源電路:</p><p>  電源電路即為單片機提供電源的電路,20腳接地,40教接電源,一般選擇5V。51 單片機的EA/VPP(31 腳) 是內(nèi)部和外部程序存儲器的選擇管腳。當EA 保持高電平時,單片機訪問內(nèi)部程序存儲器;當EA 保持低電平時,則不管是否有內(nèi)部程序存儲器,只訪問外部存儲器。對于現(xiàn)今的絕大部分單片機來說

25、,其內(nèi)部的程序存儲器(一般為flash)容量都很大,因此基本上不需要外接程序存儲器,而是直接使用內(nèi)部的存儲器。 </p><p>  3.2.4 P0口外接上拉電阻:</p><p>  51 單片機的P0 端口為開漏輸出,內(nèi)部無上拉電阻,為了能使P0 口在輸出時能驅(qū)動NMOS 電路和避免輸入時讀取數(shù)據(jù)出錯,需外接上拉電阻。一般選擇4.7K~10K的上拉電阻即可。本文中選取的是4.7K的上

26、拉電阻。</p><p>  3.3 LCD1602顯示電路</p><p>  圖4 LCD1602液晶顯示屏接線圖</p><p>  1602液晶也叫1602字符型液晶(如圖4),它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊,顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個字符液晶模塊(顯示字符和數(shù)字)。</p><p> 

27、 如圖4所示,1腳為電源地;2腳為5V電源正極;3腳為調(diào)節(jié)背光引腳,此處接10K滑動變阻器來調(diào)節(jié)背光,以便能夠能清楚的看到液晶屏所顯示的字符;</p><p>  第4腳:RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。本文中接在單片機的P1.0端口上;第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。本文中接在單片機的P1.1端口上;第6腳:E端為使能端,高電平時讀取信息,

28、負跳變時執(zhí)行指令。本文中接在單片機的P1.5端口上;第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。本文中接在單片機的P0端口上;</p><p>  3.4 總電路仿真圖</p><p><b>  圖5 總電路圖</b></p><p><b>  4、軟件模塊設(shè)計</b></p><p>  4.1

29、 主循環(huán)函數(shù)的流程圖如下:</p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N&l

30、t;/b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  圖6 主循環(huán)流程圖</b></p><p>  4.2 定時器0

31、的中斷服務(wù)子程序</p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b&

32、gt;</p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  圖7</b>&

33、lt;/p><p>  圖7 定時中斷0的中斷子程序流程圖</p><p>  4.3 定時器1的中斷服務(wù)子程序</p><p><b>  N</b></p><p><b>  Y</b></p><p><b>  N</b></p>&

34、lt;p><b>  Y</b></p><p><b>  N</b></p><p><b>  Y</b></p><p>  圖8定時中斷1的中斷子程序流程圖</p><p>  4.4 兩個顯示函數(shù)的子程序</p><p>  圖10 顯

35、示函數(shù)2的流程圖</p><p>  圖9 顯示函數(shù)1的流程圖</p><p>  4.5 外部中斷0和外部中斷1的中斷服務(wù)子程序</p><p>  NN</p><p><b>  Y</b></p><p><b>  Y</b></p&g

36、t;<p>  圖11 外部中斷0的中斷子程序流程圖</p><p>  圖12 外部中斷0的中斷子程序流程圖</p><p><b>  5、軟件系統(tǒng)測試:</b></p><p><b>  5.1 仿真效果圖</b></p><p>  圖13 未計數(shù)時界面1顯示圖

37、圖14未計數(shù)時界面2顯示圖</p><p>  圖13為未開始計時時顯示界面一的顯示值。</p><p>  圖14為未開始計時時顯示界面二的顯示值。</p><p>  圖15 計數(shù)時界面1顯示圖 圖16 計數(shù)時界面2顯示圖</p><p>  圖15為開始計時并已記錄了兩次時的顯示界面一的顯示值 。</p&g

38、t;<p>  圖16為開始計時并已記錄了兩次時的顯示界面二的顯示值 。</p><p><b>  實物圖及測試分析</b></p><p><b>  6.1 實物效果圖</b></p><p>  圖17未計數(shù)時界面1顯示圖</p><p>  圖17表示為開始計時時,界面一的顯

39、示如圖所示,顯示值全部為0。</p><p>  圖18計數(shù)時界面1顯示圖</p><p>  圖18表示開始計時,并且已經(jīng)完成兩次記錄時界面一的顯示值,如圖所示,RECORD等于2,表示已經(jīng)完成了兩次記錄。</p><p>  圖19 計數(shù)時界面2顯示圖</p><p>  圖19表示界面二的顯示值,即顯示已經(jīng)記錄下的兩個數(shù)據(jù),如圖所示第一

40、行為第一個數(shù)據(jù),第二行為第二個數(shù)據(jù)。</p><p>  6.2 測試結(jié)果及誤差分析</p><p>  6.2.1 測試結(jié)果</p><p><b>  表1 測試記錄表</b></p><p>  6.2.2 誤差分析</p><p>  雖然是利用單片機的定時器做了精確定時,但是其實單片機

41、每次進出中斷都是有一定的時間損耗的,因此事實上并不是百分之百精確,還是會產(chǎn)生一定的誤差。如果通過多次測試,然后對定時器的初值做一個修正,這樣會再次提高精確度,但是并不存在絕對的精確,只能將誤差減小。如果要求更精確的秒表,那么就不是簡單的單片機定時器就可以解決的,需要采用更精準的時鐘及高速芯片來完成精度要求了。</p><p><b>  七、設(shè)計總結(jié)</b></p><p

42、>  在緊張的兩個星期中,我們實驗小組終于排除了困難,完成了秒表系統(tǒng)的設(shè)計與制作。在實驗中,我們用上了平時上課老師教給我們的知識,讓我們的設(shè)計有了更多的思路,讓我們學到了很多書本上沒有的知識,同時也讓我們學習了許多課外的知識,不僅檢驗了我所學習的知識,也培養(yǎng)了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在設(shè)計過程中,與同學分工設(shè)計,和同學們相互探討,相互學習,相互監(jiān)督。學會了合作,學會了運籌帷幄,學會了寬容,學會了

43、理解,也學會了做人與處世。在發(fā)現(xiàn)問題和解決問題后,最終我們的設(shè)計還是成功了。 </p><p>  本次課程設(shè)計主要從硬件和軟件兩個方面結(jié)合說明設(shè)計的總體思路和實現(xiàn)過程,預(yù)期的設(shè)計目的是:能夠?qū)崿F(xiàn)計時的基本功能,正常顯示計時。在設(shè)計過程中,曾經(jīng)遇到很多的障礙,設(shè)計圖經(jīng)過許多次的修改最后才定下來,但在調(diào)試的過程中又出現(xiàn)了問題需要修改原理圖;在編程那里花費的時間是最多的,編程的過程是要考慮到程序的可行性和是

44、否與硬件兼容。而能否接好線是本試驗的一大難題!在設(shè)計中有好多問題都是因為理論知識不扎實,在有些管腳的置零置一上,概念的模糊,還有就是對單片機的指令不夠熟悉。通過此次課程設(shè)計我們有了更深的認識,只有在設(shè)計制作的過程中不斷的學習才能有更新的進步。不論在什么地方、什么崗位我門都要不斷學習,學以致用。才能把我們的工作做的更好。</p><p><b>  八、參考文獻</b></p>

45、<p>  [1] 劉樂善.微型計算機接口技術(shù)及應(yīng)用[M].北京:北京航空航天大學出版社,2001</p><p>  [2] 王東峰 ,《單片機C語言應(yīng)用100例》,北京,電子工業(yè)出版社,2009</p><p>  [3] 禹言春 ,《單片機的多機通信》,安徽,安徽農(nóng)學通報,2007 </p><

46、;p>  [4] 陳海宴 ,《51單片機原理及應(yīng)用》,北京,北京航空航天大學出版社,2010</p><p>  [5] 李平 ,《單片機入門與開發(fā)》北京,機械工業(yè)出版社,2008</p><p><b>  九、附錄</b></p><p><b>  9.1 元件清單</b&g

47、t;</p><p>  9.2 源程序代碼</p><p>  #include<reg51.h> //包含51頭文件</p><p>  #include<intrins.h>//包含空操作頭文件</p><p>  /***************************************

48、*********</p><p>  兩個宏定義類型,方便操作</p><p>  *************************************************/</p><p>  typedef unsigned char uint8;//宏定義</p><p>  typedef unsigned int ui

49、nt16;</p><p>  #define count0 10000 //設(shè)置定時器0定時時間為10ms</p><p>  #define TH_0 (65536-count0)/256 //給定時器賦初值</p><p>  #define TL_0 (65536-count0)%256</p><p>  #defi

50、ne count1 15000 //設(shè)置定時器1定時時間為15ms</p><p>  #define TH_1 (65536-count1)/256 //給定時器賦初值</p><p>  #define TL_1 (65536-count1)%256</p><p>  /*************************************

51、*************</p><p><b>  單片機位定義</b></p><p>  ***************************************************/</p><p>  sbit RS=P1^0; //LCD1602寄存器選擇</p><p>  sbit

52、RW=P1^1; //LCD1602讀寫選擇位</p><p>  sbit EN=P1^5; //LCD1602使能信號位</p><p>  sbit Busy=P0^7; //忙碌標志位,將BF位定義為P0.7</p><p>  sbit KEY1=P3^1; //定義按鍵1為P31口 用于記錄當下的時間</p

53、><p>  sbit KEY2=P3^2;//定義按鍵2為P32口 用于控制秒表的開始與暫停</p><p>  sbit KEY3=P3^3; //定義按鍵3為P33口 用于清零所有記錄及當前計時</p><p>  sbit KEY4=P3^4; //定義按鍵4為P34口 用于切換當前計時與記錄計時的界面</p>&

54、lt;p>  /***************************************************</p><p><b>  設(shè)置一些全局變量</b></p><p>  ****************************************************/</p><p>  uint8 num

55、=0,sec=0,min=0,rec=0,flag=0; //num表示以10ms單位計時 sec表示秒 </p><p>  //min表示分鐘 rec表示記錄的次數(shù) flag作為切換顯示的標志位</p><p>  uint8 code dis2[]={"0123456789"}; //定義記錄顯示數(shù)組</p><p>  uint8

56、 code dis1[]={"0123456789"}; //定義秒表的顯示數(shù)組</p><p>  uint8 num1[2]={0,0}; //定義記錄數(shù)據(jù)的數(shù)組,用以保存記錄的數(shù)據(jù)</p><p>  uint8 sec1[2]={0,0}; // 此處只設(shè)置記錄兩次</p><p>  uint8 min1[2

57、]={0,0}; </p><p>  uint8 KEY1Status = 0;//定義KEY1的狀態(tài)位</p><p>  uint8 KEY4Status = 0;//定義KEY4的狀態(tài)位</p><p>  void Delay(uint8 n) //短延時 初始化LCD1602所用</p><p>&l

58、t;b>  {</b></p><p>  uint8 a,b,c;</p><p>  for(c=n;c>0;c--)</p><p>  for(b=142;b>0;b--)</p><p>  for(a=2;a>0;a--);</p><p><b>  }<

59、;/b></p><p>  void Busy_Test() //忙檢驗</p><p><b>  {</b></p><p>  P0 = 0xff;</p><p><b>  do</b></p><p><b>  {</b><

60、;/p><p><b>  RS = 0;</b></p><p><b>  RW = 1;</b></p><p><b>  EN = 0;</b></p><p><b>  EN = 1;</b></p><p><b&

61、gt;  }</b></p><p>  while(Busy==1);</p><p><b>  EN = 0;</b></p><p><b>  }</b></p><p>  /**************************************************

62、***</p><p>  函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊</p><p>  入口參數(shù):dictate</p><p>  ***************************************************/</p><p>  void Write_Cmd (uint8 Dictate)</p&g

63、t;<p><b>  { </b></p><p>  Busy_Test(); //如果忙就等待</p><p><b>  EN = 0;</b></p><p>  P0 = Dictate; </p><p>  RS = 0;

64、//RS和R/W同時為低電平時,可以寫入指令</p><p>  RW = 0; </p><p>  _nop_(); _nop_(); //空操作兩個機器周期,給硬件反應(yīng)時間</p><p>  //將數(shù)據(jù)送入P0口,即寫入指令或地址</p><p>  _nop_(); _nop_();_nop_();_nop_();

65、 //空操作四個機器周期,給硬件反應(yīng)時間</p><p>  EN = 1; //E置高電平</p><p>  _nop_(); _nop_(); _nop_(); _nop_(); //空操作四個機器周期,給硬件反應(yīng)時間</p><p>  EN = 0; //當E由高電平跳變成低電平時,液晶模塊

66、開始執(zhí)行命令</p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊</p><p>  入口參數(shù):x(為字符常量)</p&g

67、t;<p>  ***************************************************/</p><p>  void Write_Data(uint8 x)</p><p><b>  {</b></p><p>  Busy_Test(); </p><p><b

68、>  EN = 0;</b></p><p><b>  P0 = x; </b></p><p>  RS = 1; //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)</p><p><b>  RW = 0;</b></p><p>  //E置低電平(寫指

69、令時,E為高脈沖,</p><p>  // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"</p><p>  //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊</p><p>  _nop_();_nop_();_nop_();_nop_();//空操作四個機器周期,給硬件反應(yīng)時間</p><p>  EN = 1;

70、 //E置高電平</p><p>  _nop_();_nop_();_nop_();_nop_(); //空操作四個機器周期,給硬件反應(yīng)時間</p><p>  EN = 0; //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令</p><p><b>  }</b></p><p> 

71、 /*****************************************************</p><p>  函數(shù)功能:指定字符顯示的實際地址</p><p><b>  入口參數(shù):x</b></p><p>  ***************************************************/<

72、;/p><p>  void Write_Addr(uint8 x)</p><p><b>  {</b></p><p>  Write_Cmd(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"</p><p><b>  }</b></p>&l

73、t;p>  /*****************************************************</p><p>  函數(shù)功能:對LCD的顯示模式進行初始化設(shè)置</p><p>  ***************************************************/</p><p>  void Init_LCD16

74、02()</p><p><b>  {</b></p><p>  Delay(10); //延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間</p><p>  Write_Cmd(0x38); //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口</p><

75、p>  Delay(2); //延時5ms </p><p>  Write_Cmd(0x0c); //顯示模式設(shè)置:顯示開,有光標,光標閃爍</p><p><b>  Delay(2);</b></p><p>  Write_Cmd(0x06); //顯示模式設(shè)置:光標右移,字符不移</

76、p><p><b>  Delay(2);</b></p><p>  Write_Cmd(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除</p><p><b>  Delay(2);</b></p><p><b>  }</b></p><p&g

77、t;  /**************************************************************</p><p>  LCD頁面一的顯示函數(shù) </p><p>  主要顯示秒表及是否記錄到數(shù)據(jù)</p><p>  *********************************************************

78、******/</p><p>  void Display1()//顯示函數(shù)1 顯示秒表以及記錄情況</p><p><b>  {</b></p><p>  uint8 i,j,k,m,n,o,p,q;</p><p><b>  i=num/10;</b></p>

79、<p><b>  j=num%10;</b></p><p><b>  k=sec/10;</b></p><p><b>  m=sec%10;</b></p><p><b>  n=min/10;</b></p><p><b&g

80、t;  o=min%10;</b></p><p>  Write_Addr(0x00); //設(shè)置從第一行的第一格開始顯示</p><p>  Write_Data('T'); //寫入字母T </p><p>  Write_Data('I');</p><p>  Write_Dat

81、a('M');</p><p>  Write_Data('E');</p><p>  Write_Data(':'); </p><p>  Write_Data(dis1[n]); //寫入min的最高位</p><p>  Write_Data(dis1[o]); <

82、/p><p>  Write_Data(':');</p><p>  Write_Data(dis1[k]);</p><p>  Write_Data(dis1[m]); </p><p>  Write_Data('.');</p><p>  Write_Data(dis1[i]);

83、</p><p>  Write_Data(dis1[j]); </p><p>  Write_Data(dis1[0]); </p><p><b>  p=rec/10;</b></p><p>  q=rec%10; </p><p>  Write_Addr(0x40); /

84、/設(shè)置從第二行的第一格開始顯示</p><p>  Write_Data('R'); </p><p>  Write_Data('E');</p><p>  Write_Data('C');</p><p>  Write_Data('O');</p><

85、p>  Write_Data('R');</p><p>  Write_Data('D');</p><p>  Write_Data(':'); </p><p>  Write_Data(dis1[p]);</p><p>  Write_Data(dis1[q]);

86、 </p><p><b>  }</b></p><p>  /**************************************************************</p><p>  LCD頁面二的顯示函數(shù)</p><p>  主要顯示已經(jīng)記錄的兩個數(shù)據(jù)</p&g

87、t;<p>  ***************************************************************/</p><p>  void Display2()//顯示函數(shù)2 顯示記錄</p><p><b>  {</b></p><p>  Write_Addr(0x00);

88、 //設(shè)置從第一行的第一格開始顯示記錄的第一個數(shù)據(jù)</p><p>  Write_Data('R'); //寫入字母T </p><p>  Write_Data('E');</p><p>  Write_Data(':');</p><p>  Write_Data('1&

89、#39;);</p><p>  Write_Data(','); </p><p>  Write_Data(dis1[min1[0]/10]); //寫入min的最高位</p><p>  Write_Data(dis1[min1[0]%10]); </p><p>  Write_Data(':&#

90、39;);</p><p>  Write_Data(dis1[sec1[0]/10]);</p><p>  Write_Data(dis1[sec1[0]%10]); </p><p>  Write_Data('.');</p><p>  Write_Data(dis1[num1[0]/10]);</p>

91、<p>  Write_Data(dis1[num1[0]%10]); </p><p>  Write_Data(dis1[0]); </p><p>  Write_Addr(0x43); //設(shè)置從第二行的第三格開始顯示已經(jīng)記錄的第二個數(shù)據(jù)</p><p>  Write_Data('2');</p><p

92、>  Write_Data(','); </p><p>  Write_Data(dis1[min1[1]/10]); //寫入min的最高位</p><p>  Write_Data(dis1[min1[1]%10]); </p><p>  Write_Data(':');</p><p&

93、gt;  Write_Data(dis1[sec1[1]/10]);</p><p>  Write_Data(dis1[sec1[1]%10]); </p><p>  Write_Data('.');</p><p>  Write_Data(dis1[num1[1]/10]);</p><p>  Write_Data

94、(dis1[num1[1]%10]); </p><p>  Write_Data(dis1[0]); </p><p><b>  }</b></p><p>  void Init_Timer0()//定時器0初始化</p><p><b>  {</b></p><p&

95、gt;  TH0=TH_0; //設(shè)置定時器初值</p><p><b>  TL0=TL_0;</b></p><p>  EA=1;//打開總終端允許位</p><p>  ET0=1; //打開定時器0的中斷允許位</p><p>  TR0=0; //選擇關(guān)閉定時器0<

96、/p><p>  TMOD|=0x01; //設(shè)置工作方式1</p><p><b>  }</b></p><p>  void Init_Timer1()//定時器1初始化</p><p><b>  {</b></p><p>  TH1=TH_1;

97、//設(shè)置定時器初值</p><p><b>  TL1=TL_1;</b></p><p>  EA=1;//打開總終端允許位</p><p>  ET1=1; //打開定時器1的中斷允許位</p><p>  TR1=1; //選擇打開定時器1</p><p>  T

98、MOD|=0x10; //設(shè)置工作方式1</p><p><b>  }</b></p><p>  void Init_Int0_1() //外部中斷0和1的初始化</p><p><b>  {</b></p><p>  EX0=1; //打開外部中斷的允許位</

99、p><p><b>  EX1=1;</b></p><p>  IT0=0; //設(shè)置外部中斷的觸發(fā)方式為低電平觸發(fā)</p><p><b>  IT1=0;</b></p><p><b>  }</b></p><p>  void xiao

100、dou() //用于按鍵消抖的短延時函數(shù),大概8ms</p><p><b>  {</b></p><p>  uint8 i,j;</p><p>  for(i=0;i<8;i++)</p><p>  for(j=0;j<110;j++);</p><p>

101、<b>  }</b></p><p>  main() //主函數(shù)</p><p><b>  {</b></p><p>  Init_LCD1602();//初始化LCD1602</p><p>  Init_Timer0();//初始化定時器0</p><

102、;p>  Init_Timer1();//初始化定時器1</p><p>  Init_Int0_1();//初始化外部中斷0和1</p><p>  while(1); //主循環(huán)</p><p><b>  }</b></p><p>  void Timer0() interrupt 1 /

103、/定時器0中斷函數(shù) 用于精確定時</p><p><b>  {</b></p><p>  TH0=TH_0; //進入中斷則重新給定時器賦初值</p><p><b>  TL0=TL_0;</b></p><p>  num=num+1; //num自加1,進入一次表示1

104、0ms</p><p>  if(num==100)//如果自加100次,則表示1s</p><p><b>  {</b></p><p>  sec=sec+1;//因此表示秒的變量加1</p><p>  num=0;//并且把num清0 </p><p>  if

105、(sec==60)//如果自加60s,則表示1分鐘</p><p><b>  {</b></p><p>  min=min+1;//因此表示分鐘的變量加1</p><p>  sec=0;//清零秒變量</p><p>  if(min==60) //滿60分鐘后清零分鐘位</p&g

106、t;<p><b>  {</b></p><p><b>  min=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&g

107、t;<p><b>  }</b></p><p>  void Timer1() interrupt 3 //定時1的中斷子程序 用于掃描按鍵1和按鍵4的狀態(tài)</p><p><b>  {</b></p><p>  TH1=TH_1; //此處設(shè)置為15ms中斷,進入中斷則重裝載定時器初值

108、</p><p><b>  TL1=TL_1;</b></p><p>  /*******************************************************</p><p>  此處檢測按鍵1的狀態(tài),以及實現(xiàn)其功能</p><p>  **************************

109、******************************/</p><p>  switch(KEY1Status)//利用狀態(tài)的方法來達到對按鍵消抖的目的</p><p><b>  {</b></p><p><b>  case 0:</b></p><p><b>  

110、{</b></p><p><b>  if(!KEY1)</b></p><p><b>  {</b></p><p>  KEY1Status=1;</p><p><b>  }</b></p><p><b>  bre

111、ak;</b></p><p><b>  }</b></p><p>  case 1:</p><p><b>  {</b></p><p><b>  if(!KEY1)</b></p><p><b>  {<

112、/b></p><p>  if(rec<=1)//表示如果記錄次數(shù)未達到2次,則繼續(xù)記錄</p><p>  // 滿了兩次則 此次不進入記錄</p><p><b>  {</b></p><p>  rec=rec+1;//如果按下一次按鍵1,則rec加1 </p><p>

113、;  //表示已經(jīng)記錄了一次</p><p>  num1[rec-1]=num; //將記錄到的數(shù)據(jù)存入數(shù)組</p><p>  sec1[rec-1]=sec;</p><p>  min1[rec-1]=min;</p><p>  KEY1Status=2;</p><p><b>  }<

114、;/b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 2:</b></p><p><b>

115、  {</b></p><p><b>  if(KEY1)</b></p><p><b>  {</b></p><p>  KEY1Status=0;</p><p><b>  }</b></p><p><b>  bre

116、ak;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /*******************************************************</p><p>  此處檢測按鍵4的狀態(tài),以及實現(xiàn)其功能&

117、lt;/p><p>  ********************************************************/</p><p>  switch(KEY4Status)</p><p><b>  {</b></p><p><b>  case 0:</b></p&g

118、t;<p><b>  {</b></p><p><b>  if(!KEY4)</b></p><p><b>  {</b></p><p>  KEY4Status=1;</p><p><b>  }</b></p>

119、<p><b>  break;</b></p><p><b>  }</b></p><p>  case 1:</p><p><b>  {</b></p><p><b>  if(!KEY4)</b></p>&

120、lt;p><b>  {</b></p><p>  flag=~flag;//如果按下按鍵4 則flag取反,起到切換顯示的作用</p><p>  Write_Cmd(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除</p><p>  KEY4Status=2;</p><p><b>

121、  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  case 2:</b></p><p><b>  {</b></p><p><

122、;b>  if(KEY4)</b></p><p><b>  {</b></p><p>  KEY4Status=0;</p><p><b>  }</b></p><p><b>  break;</b></p><p><

123、;b>  }</b></p><p><b>  }</b></p><p>  /*******************************************************</p><p>  此處為顯示屏的切換選擇控制</p><p>  ********************

124、************************************/</p><p>  if(flag==0) //切換顯示標志位,如果為0則顯示1</p><p><b>  {</b></p><p>  Display1(); //調(diào)用顯示函數(shù)1</p><p><b>  }</

125、b></p><p><b>  else</b></p><p><b>  { </b></p><p>  Display2(); //調(diào)用顯示函數(shù)2</p><p><b>  }</b></p><p><b>

126、;  }</b></p><p>  void Int0() interrupt 0 //INT0的中斷函數(shù),用于控制秒表的暫停與開始</p><p><b>  {</b></p><p><b>  if(!KEY2)</b></p><p><b>  {</

127、b></p><p>  xiaodou();//調(diào)用消抖函數(shù)</p><p><b>  if(!KEY2)</b></p><p><b>  {</b></p><p>  TR0=~TR0; //打開或暫停定時器0 </p><p><b&

128、gt;  }</b></p><p>  while(!KEY2); //松手檢驗</p><p><b>  }</b></p><p><b>  } </b></p><p>  void Int1() interrupt 2 //INT1的中斷函數(shù),用于控制秒表的

129、歸零</p><p><b>  {</b></p><p><b>  if(!KEY3)</b></p><p><b>  {</b></p><p>  xiaodou();</p><p>  if(!KEY3) //若按下按鍵3,則

130、將所有的記錄清零</p><p><b>  {</b></p><p><b>  TR0=0;</b></p><p>  num=0;sec=0;min=0;rec=0;flag=0;</p><p>  num1[2]=0;sec1[2]=0;min1[2]=0;</p>&l

131、t;p><b>  TH0=TH_0;</b></p><p><b>  TL0=TL_0;</b></p><p><b>  }</b></p><p>  while(!KEY2); //松手檢驗</p><p><b>  }</b&g

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論