單片機(jī)課程設(shè)計(jì)----多功能秒表_第1頁(yè)
已閱讀1頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  單片機(jī)報(bào)告</b></p><p>  —————多功能秒表</p><p><b>  一、實(shí)驗(yàn)要求</b></p><p>  1.硬件電氣原理圖一張(含元器件清單一份;所有引腳標(biāo)注清楚)</p><p>  2、軟件程序清單一套(含主要程序流程圖,全部源程序及詳細(xì)

2、的注釋)</p><p>  3、使用功能說(shuō)明書一份(含功能描述及操作指南和收獲體會(huì))</p><p>  4、軟件在開(kāi)發(fā)板上調(diào)試成功,并能成功表演,達(dá)到設(shè)計(jì)課題的要求</p><p><b>  二、實(shí)現(xiàn)要求</b></p><p><b>  秒表功能</b></p><p&

3、gt;  1、設(shè)計(jì)可以顯示0.1—100s的秒表,最小單位為毫秒;</p><p>  2、通過(guò)按鍵控制秒表清零、暫停、繼續(xù)、退出等功能;</p><p>  3、具有倒計(jì)時(shí)功能;</p><p>  4、秒表可以分組存儲(chǔ),批量顯示;</p><p><b>  5、顯示北京時(shí)間;</b></p><

4、p>  6、可利用蜂鳴器添加提示音。</p><p><b>  附加功能</b></p><p>  1、利用實(shí)時(shí)鐘芯片,顯示年月日以及星期;</p><p>  2、選擇蜂鳴器電路,實(shí)現(xiàn)鬧鐘設(shè)置和報(bào)警功能;</p><p>  3、可以通過(guò)按鍵調(diào)整日期、時(shí)間;</p><p>  4、可

5、以設(shè)置兩組鬧鐘,鬧鐘時(shí)間到,蜂鳴器響;</p><p>  5、利用蜂鳴器實(shí)現(xiàn)整點(diǎn)報(bào)時(shí)。</p><p><b>  三、硬件原理:</b></p><p>  1.ADUC848管腳圖</p><p>  ADUC848管腳圖如下圖所示。</p><p>  Pin1~4:(P1.0~P1.3)

6、作為矩陣式鍵盤或獨(dú)立按鍵的輸入,P1口只能用于輸入,默認(rèn)用于模擬輸入,作為數(shù)字輸入使用時(shí)應(yīng)先往P1口相應(yīng)引腳寫0,這里可以用P0&=0xf0。若P2、P3、P0口要作為輸入,則應(yīng)往相應(yīng)引腳寫1。</p><p>  Pin5、6:AVDD、AGND,模擬電源輸入。</p><p>  Pin7、8:外部參考電壓接入,Pin7接AGND。片內(nèi)DAC有2.5V內(nèi)部參考,ADC有1.25

7、V內(nèi)部參考。</p><p>  Pin9、10:(P1.4、P1.5)兩路AD輸入,可做差分輸入,需要設(shè)置ADC的寄存器。</p><p>  Pin11、12:(P1.6、P1.7)各200uA激勵(lì)電流源,可配合RTD等</p><p><b>  做應(yīng)用。</b></p><p>  Pin13:兩路AD輸入做普通

8、輸入時(shí)的電壓參考端,AD輸入電壓不能低于此引腳電壓。</p><p>  Pin14:片內(nèi)DAC輸出。</p><p>  Pin15:復(fù)位引腳。</p><p>  Pin16、17:?jiǎn)纹瑱C(jī)RS232接口的RXD(P3.0) TXD(P3.1)。</p><p>  Pin18:(P3.2) 外部中斷0,用于紅外接收和PS/2接口。<

9、/p><p>  Pin19:(P3.3)LCD1602,LCD12864A的EN引腳,控制第一位數(shù)碼管。</p><p>  Pin20、21:DVDD、DGND數(shù)字電源輸入。</p><p>  Pin22:(P3.4)PS/2接口的data信號(hào)。</p><p>  Pin23:(P3.5)LCD1602和LCD12864A的RW。<

10、/p><p>  Pin24:(P3.6)LCD1602和LCD12864A的RS。</p><p>  Pin25:LCD12864A的CS1。</p><p>  Pin26:IIC接口時(shí)鐘信號(hào)。</p><p>  Pin27:IIC接口data信號(hào)。</p><p>  Pin28:(P2.0)SPI接口時(shí)鐘信號(hào)。

11、</p><p>  Pin29:(P2.1)SPI接口MOSI信號(hào)、控制第6位數(shù)碼管的位碼。</p><p>  Pin30:(P2.2)SPI接口MISO信號(hào)、控制第7位數(shù)碼管的位碼。</p><p>  Pin31:(P2.3)SPI接口SS信號(hào)、控制第8位數(shù)碼管的位碼;P2.0~3也作為4X4矩陣式鍵盤的掃描輸出信號(hào)、步進(jìn)電機(jī)的控制信號(hào)、數(shù)碼管第數(shù)碼管第6、

12、7、8位位碼。但是SPI、4X4矩陣式鍵盤、步進(jìn)電機(jī)、數(shù)碼管第6、7、8位功能不能同時(shí)實(shí)現(xiàn)。</p><p>  Pin32、Pin33:接外部32.768KHz晶振。</p><p>  Pin34、Pin35:DVDD、DGND。</p><p>  Pin36:(P2.4)LCD12864A的CS2。</p><p>  Pin37:(

13、P2.5)內(nèi)部PWM模塊輸出,控制紅外LED。</p><p>  Pin38:(P2.6)內(nèi)部PWM模塊輸出,控制蜂鳴器。</p><p>  Pin39:(P2.7)內(nèi)部PWM模塊的外部時(shí)鐘輸入(也可以用內(nèi)部時(shí)鐘)。</p><p>  Pin40:EA,低電平有效,正常使用時(shí)拉低。</p><p>  Pin41:PSEN,在此引腳電平

14、為低時(shí)按復(fù)位鍵進(jìn)入debug模式,可以下載和調(diào)試程序。</p><p>  Pin42:ALE。</p><p>  Pin47、Pin48:DGND、DVDD。</p><p>  Pin43、44、45、46、49、50、51、52:P0口、LCD1602和LCD12864的數(shù)據(jù)總線,數(shù)碼管的段碼。</p><p><b>  

15、2. 電源模塊 </b></p><p><b>  電源模塊原理圖如圖</b></p><p>  本學(xué)習(xí)板共有如下3種供電方式: </p><p>  (1)5V電源適配器供電(開(kāi)關(guān)往上撥、插針1下面兩腳接跳線帽)。</p><p>  將開(kāi)關(guān)sw4第2、3腳接通(開(kāi)關(guān)往上撥),電源網(wǎng)絡(luò)DVDD連接到插針

16、1第2腳的輸出,將插針1的第1、2腳(插針1下面兩腳)接跳線帽,DVDD直接連接到電源適配器輸入端,即為5V電源適配器供電模式。</p><p> ?。?)7~12V電源適配器供電(開(kāi)關(guān)往上撥、插針1上面兩腳接跳線帽) </p><p>  將開(kāi)關(guān)sw4第2、3腳接通(開(kāi)關(guān)往上撥),電源網(wǎng)絡(luò)DVDD連接到插針1第2腳的輸出,將插針1的第2、3腳(插針1上面兩腳)接跳線帽,DVDD連接到穩(wěn)壓

17、芯片7805的輸出,而7805的輸入端連接到電源適配器輸入端,即為7~12V的電源適配器經(jīng)7805給學(xué)習(xí)板供電的模式。</p><p>  (3)USB供電(開(kāi)關(guān)往下?lián)埽?lt;/p><p>  將開(kāi)關(guān)sw4第1、2腳接通(開(kāi)關(guān)往下?lián)埽?,電源網(wǎng)絡(luò)DVDD連接到USB電源輸入端。</p><p><b>  3.數(shù)碼管</b></p>

18、<p><b>  該模塊原理如圖</b></p><p> ?。?)DS0~7:數(shù)碼管段碼。</p><p>  (2)BIT0~7:數(shù)碼管位碼。</p><p> ?。?)MOTORA~D:步進(jìn)電機(jī)驅(qū)動(dòng)信號(hào)。</p><p>  (4)DISCTRL0~4:顯示控制信號(hào),控制數(shù)碼管低5位。</p&g

19、t;<p> ?。?)D0~8:?jiǎn)纹瑱C(jī)P0口。</p><p>  本設(shè)計(jì)采用共陰極數(shù)碼管,段碼由PNP三極管驅(qū)動(dòng),位碼由NPN型三極管驅(qū)動(dòng)。</p><p><b>  引腳復(fù)用: </b></p><p>  數(shù)碼管低5位(板上為右邊5位)的位碼由DISCTRL0~4控制,可單獨(dú)使用,高3位的位碼控制信號(hào)與SPI信號(hào),電機(jī)驅(qū)動(dòng)

20、信號(hào),4X4矩陣式鍵盤復(fù)用,使用數(shù)碼管高3位時(shí)參與復(fù)用的其他功能則不能使用。</p><p><b>  插針配置: </b></p><p>  (1)若要使用數(shù)碼管第4~0位(板上為右邊5位),可以接通插針8。</p><p>  (2)若要使用數(shù)碼管第7~5位(板上為左邊3位),可以分別接通插針5~7和9。</p><

21、p>  4. RS232串口 </p><p>  該模塊中采用maxin公司的max232作電平轉(zhuǎn)換,為方便調(diào)試硬件,對(duì)RXD,TXD信號(hào)設(shè)測(cè)試點(diǎn)和LED。</p><p><b>  5.8路LED </b></p><p><b>  該模塊原理如圖</b></p><p>  8個(gè)LE

22、D接P0口,低電平時(shí)LED亮,這樣不會(huì)影響P0口邏輯電平。LED限流電阻取4.7K,通過(guò)LED電流約為0.8mA,在P0口驅(qū)動(dòng)能力范圍之內(nèi)。插針配置: 使用該模塊,可以接通插針2,</p><p><b>  6. 蜂鳴器 </b></p><p>  該模塊原理圖如圖1.10所示。</p><p>  本設(shè)計(jì)中采用無(wú)源電磁式蜂鳴器,蜂鳴器由P

23、WM1(P2.6)控制。PWM1和PWM0均為片內(nèi)PWM模塊的輸出。蜂鳴器采用普通NPN三極管。插針配置: 使用蜂鳴器,可以接通插針3。</p><p><b>  7.按鍵模塊 </b></p><p><b>  該模塊原理如圖</b></p><p>  由于P1口(用于行掃描)內(nèi)部無(wú)上拉電阻,為使無(wú)鍵按下時(shí)行信號(hào)為

24、高電平,故將行信號(hào)接上拉電阻,電阻大小10K即可。</p><p><b>  引腳復(fù)用:</b></p><p>  P2.0~P2.3為4X4矩陣式鍵盤列掃描信號(hào),又復(fù)用作步進(jìn)電機(jī)控制信號(hào),SPI信號(hào)、P2.1~P2.3還復(fù)用為數(shù)碼管第5、6、7位位碼控制信號(hào)。參與復(fù)用的一項(xiàng)功能使用時(shí),其他參與復(fù)用的功能則不能使用。</p><p><

25、;b>  插針配置: </b></p><p> ?。?)插針10上面兩腳接跳線帽,4X4矩陣式鍵盤輸入,行掃描信號(hào)為P1.0~P1.3,列掃描信號(hào)為P2.0~2.3。</p><p> ?。?)插針10下面兩腳接跳線帽,獨(dú)立按鍵輸入,該模式有4個(gè)獨(dú)立按鍵可用,按鍵掃描所用端口為P1.0~P1.3。這4個(gè)按鍵為4X4矩陣鍵盤的左邊4個(gè)按鍵。</p><

26、p><b>  8. 復(fù)位與下載 </b></p><p><b>  復(fù)位與下載電路如圖</b></p><p>  進(jìn)入下載或調(diào)試模式的步驟為: </p><p> ?。?)按住BTN1(down or debug按鍵)不要放開(kāi); </p><p>  (2)按下BTN2(reset按鍵)

27、,然后放開(kāi)BTN2(reset按鍵);</p><p>  (3)放開(kāi)BTN1(down or debug按鍵)。</p><p>  這樣單片機(jī)就進(jìn)入了調(diào)試模式,可以下載或調(diào)試程序。</p><p><b>  四、流程圖</b></p><p><b>  1、主程序:</b></p>

28、;<p><b>  3、倒計(jì)時(shí)子程序</b></p><p><b>  五、主程序</b></p><p>  miao_biao:</p><p>  #include<aduc848.h></p><p>  #include"keypp.h"&

29、lt;/p><p>  #include"iic.h"</p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  unsigned char b[7]={50,59,10,3,22,6,11},clock[2]={2,

30、11}; //日期和時(shí)間初值</p><p>  code unsigned char tab[]= {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19,0x00}; </p><p>  //共陰數(shù)碼管 0-9</p><p>  unsigned char time[7];</p><p

31、>  code unsigned char tab2[]={0x39,0xff}; //鬧鐘顯示</p><p>  void delay(unsigned int cnt);</p><p>  unsigned char getkey1(); //讀鍵盤</p><p>  void tim(void); /

32、/中斷</p><p>  void KeyDelay(unsigned int KeyJsTime); //鍵盤掃描延時(shí)</p><p>  void display(uchar bit7,uchar bit6,uchar bit5,uchar bit4,</p><p>  uchar bit3,uchar bit2,uchar bit1,uchar bit0

33、); //顯示子程序</p><p>  void ReadTime(unsigned char TIME[7]); //DS1307讀時(shí)間</p><p>  void SetTime(unsigned char TIME[7]); //設(shè)置時(shí)間初值</p><p>  void SwitchRTC(unsigned char SWITCH);

34、//秒最高位設(shè)置</p><p>  uchar dis_num_h; //顯示記錄數(shù)據(jù)的組別十位</p><p>  uchar dis_num_l; //顯示記錄數(shù)據(jù)的組別個(gè)位</p><p>  uchar dis_min_h; //要顯示的分的十位;</p><p>  uchar dis_min_l; //要顯示的分

35、的個(gè)位;</p><p>  uchar dis_sec_h; //要顯示的秒的十位;</p><p>  uchar dis_sec_l; //要顯示的秒的個(gè)位;</p><p>  uchar dis_dsec; //要顯示的0.1秒;</p><p>  uchar min=0x00;</p><p&g

36、t;  uchar sec=0x00;</p><p>  uchar dsec=0x00;</p><p>  uchar en,i,clocken=0; </p><p><b>  main()</b></p><p><b>  {</b></p><p>

37、  unsigned char quzhi,xianzhi,symbol=0x55,set,set1=0x55,ce;</p><p>  unsigned char c[30];</p><p>  unsigned char num,num1,j,k,stop=1;</p><p>  PLLCON&=0xf8;//設(shè)置頻率為12.58MHz</p

38、><p>  TMOD=0x01;//定時(shí)器工作模式設(shè)置 </p><p>  TH0=0x3c; //初值 </p><p><b>  TL0=0x00;</b></p><p>  IE= 0x82; //中斷控制,10000010,EA=1開(kāi)總中斷,ET0=1:定時(shí)器0中斷允許 </p

39、><p>  I2CCON=0xE8; //開(kāi)啟iic通信;</p><p>  SetTime(b); //設(shè)定初始時(shí)間;</p><p>  SwitchRTC(1);</p><p><b>  while(1)</b></p><p><b>  {</b>

40、</p><p>  ReadTime(time);</p><p>  if(((clock[0]==time[1])&&(clock[1]==time[2])&&(clocken==0)&&stop))</p><p><b>  {</b></p><p>  PW

41、M0H=205;PWM1L=500;PWMCON=0x21; //蜂鳴器響</p><p>  KeyDelay(333); //延時(shí)</p><p>  PWM1H=0;PWM1L=0;PWMCON=0x00;</p><p>  KeyDelay(333);</p><p>  if(getkey1()!=0x55)<

42、/p><p><b>  {</b></p><p><b>  stop=0;</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  if(time[1]==clock[

43、0]+1) stop=1; //鬧鐘響一分鐘</p><p>  if((time[0]==0)&&(time[1]==0))// 整點(diǎn)報(bào)時(shí)</p><p><b>  {</b></p><p><b>  i=1;</b></p><p><b>  while(

44、i)</b></p><p><b>  {</b></p><p>  PWM0H=50;PWM1L=100;PWMCON=0x21; //蜂鳴器響</p><p>  KeyDelay(333); //延時(shí)</p><p>  PWM1H=0;PWM1L=0;PWMCON=0x00;</

45、p><p>  KeyDelay(333);</p><p><b>  i++;</b></p><p><b>  if(i==20)</b></p><p><b>  {</b></p><p><b>  i=0;</b>&

46、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  en=getkey1();</p><p>  if((en==0x80)||(en==0x55)) /

47、/無(wú)效鍵或無(wú)鍵</p><p><b>  {</b></p><p>  en=symbol;</p><p><b>  }</b></p><p>  if(xianzhi==8)</p><p><b>  {</b></p>&l

48、t;p>  display(dis_num_h,dis_num_l,dis_min_h,dis_min_l,</p><p>  dis_sec_h,dis_sec_l,0xff,dis_dsec) ; //顯示已記錄的值</p><p><b>  }</b></p><p>  ///////////////////////////

49、////////////////////////////////////////////////////////</p><p>  if(en==1) //顯示北京時(shí)間,年月日星期</p><p><b>  {</b></p><p><b>  symbol=1;</b></p>

50、<p>  display(tab[time[6]/10],tab[time[6]%10],tab[time[5]/10],tab[time[5]%10],</p><p>  tab[time[4]/10],tab[time[4]%10],0xff,tab[time[3]%10]); </p><p><b>  }</b></p>&

51、lt;p>  ////////////////////////////////////////////////////////////////////////////////////</p><p>  if(en==2) //顯示北京時(shí)間,鬧鐘開(kāi)關(guān)標(biāo)志和時(shí)分秒</p><p><b>  {</b></p><p>

52、;  symbol=2 ;</p><p>  display(tab2[clocken],0xff,tab[time[2]/10],tab[time[2]%10],tab[time[1]/10],</p><p>  tab[time[1]%10],tab[time[0]/10],tab[time[0]%10]);</p><p><b>  }<

53、/b></p><p>  ////////////////////////////////////////////////////////////////////////////////////</p><p>  else if(en==3) //秒表正常工作:正計(jì)時(shí)</p><p><b>  {</b></

54、p><p><b>  min=0;</b></p><p><b>  sec=0;</b></p><p><b>  dsec=0;</b></p><p><b>  symbol=3;</b></p><p><b>

55、;  while(1)</b></p><p><b>  {</b></p><p>  quzhi=getkey1();</p><p>  if(num<11)</p><p>  display(dis_min_h,dis_min_l,0xff,0xff,dis_sec_h,dis_sec_l,

56、0xff,dis_dsec);</p><p><b>  else</b></p><p>  display(0x71,0x83,0xe3,0xe3,0xff,0xff,0xff,0xff); //顯示full</p><p>  if(quzhi==5)</p><p><b>  {</b>

57、;</p><p>  quzhi=0x55;</p><p><b>  num=1;</b></p><p>  if(TR0==1)TR0=0;</p><p>  else TR0=1;</p><p>  }else if(quzhi==6)//秒表讀值,按鍵6</

58、p><p><b>  {</b></p><p>  quzhi=0x55;</p><p>  c[3*(num-1)+2]=dsec; //讀出的值放在c[]中</p><p>  c[3*(num-1)+1]=sec;//每四位為一段,依次時(shí)取值的順序、分、秒、0.1秒</p><p&g

59、t;  c[3*(num-1)+0]=min;</p><p><b>  num++;</b></p><p>  }else if(quzhi!=0x55)//任意鍵按下,表示計(jì)時(shí)結(jié)束</p><p><b>  {</b></p><p><b>  TR0=0;</b

60、></p><p><b>  num1=1;</b></p><p>  symbol=0x55;</p><p><b>  min=0;</b></p><p><b>  sec=0;</b></p><p><b>  dsec

61、=0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  i

62、f(getkey1()==8)</p><p><b>  {</b></p><p>  display(dis_num_h,dis_num_l,dis_min_h,dis_min_l,</p><p>  dis_sec_h,dis_sec_l,0xff,dis_dsec) ; //顯示已記錄的值</p><p>

63、<b>  }</b></p><p>  //////////////////////////////////////////////////////////////////////////////////////</p><p>  else if(en==4) //秒表倒計(jì)時(shí)</p><p><b>  {</b&

64、gt;</p><p><b>  symbol=4;</b></p><p><b>  j=0;</b></p><p>  for(i=0;i<=30;i++)c[i]=0;</p><p><b>  while(1)</b></p><p&g

65、t;<b>  {</b></p><p>  display(dis_min_h,dis_min_l,0xff,0xff,dis_sec_h,dis_sec_l,0xff,dis_dsec);</p><p>  set=getkey1();</p><p>  while(j<5)</p><p><b&

66、gt;  {</b></p><p>  ce=getkey1();</p><p>  display(tab[c[0]],tab[c[1]],0xff,0xff,tab[c[2]],tab[c[3]],0xff,tab[c[4]]);</p><p>  if((ce!=0x55)&&(ce!=0x80))</p>&l

67、t;p><b>  {</b></p><p>  if(ce>9)ce=0;</p><p><b>  c[j]=ce;</b></p><p><b>  j++;</b></p><p><b>  }</b></p>

68、<p>  min=c[0]*10+c[1];</p><p>  sec=c[2]*10+c[3];</p><p>  dsec=c[4];</p><p><b>  }</b></p><p>  dis_min_h=tab[min/10]; //分、秒及0.1秒顯示值的處理</p

69、><p>  dis_min_l=tab[min%10];</p><p>  dis_sec_h=tab[sec/10];</p><p>  dis_sec_l=tab[sec%10];</p><p>  dis_dsec=tab[dsec];</p><p>  if(set==5)

70、//倒計(jì)時(shí)開(kāi)始</p><p><b>  {</b></p><p><b>  set=0x55;</b></p><p><b>  TR0=1;</b></p><p><b>  TF0=1;</b></p><p>&

71、lt;b>  }</b></p><p>  if((min==0)&&(sec==0)&&(dsec==0)) //倒計(jì)時(shí)結(jié)束</p><p><b>  {</b></p><p><b>  while(i)</b></p><p>&

72、lt;b>  {</b></p><p>  PWM0H=50;PWM1L=100;PWMCON=0x21; //蜂鳴器響</p><p>  KeyDelay(333); //延時(shí)</p><p>  PWM1H=0;PWM1L=0;PWMCON=0x00;</p><p>  KeyDelay(333);&l

73、t;/p><p><b>  i++;</b></p><p>  if(i==200)</p><p><b>  {</b></p><p><b>  i=0;</b></p><p><b>  break;</b></

74、p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(set!=0x55) </p><p><b>  {</b></p>&

75、lt;p>  symbol=0x55;</p><p><b>  min=0;</b></p><p><b>  sec=0;</b></p><p><b>  dsec=0;</b></p><p>  for(i=0;i<30;i++)c[i]=0;<

76、;/p><p><b>  ce=0x55;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b

77、></p><p>  else if(en==8)</p><p><b>  {</b></p><p>  symbol=0x55;</p><p>  xianzhi=8;</p><p>  dis_num_h=tab[num1/10];</p><p> 

78、 dis_num_l=tab[num1%10];</p><p>  dis_min_h=tab[c[(num1-1)*3+0]/10];</p><p>  dis_min_l=tab[c[(num1-1)*3+0]%10];</p><p>  dis_sec_h=tab[c[(num1-1)*3+1]/10];</p><p>  

79、dis_sec_l=tab[c[(num1-1)*3+1]%10];</p><p>  dis_dsec=tab[c[(num1-1)*3+2]];</p><p><b>  num1++;</b></p><p>  if(num1>num)</p><p><b>  {</b><

80、;/p><p>  xianzhi=0x55;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(en==9) //進(jìn)入北京時(shí)間設(shè)置</p><p><b>  {</b>

81、;</p><p>  symbol=0x55;</p><p><b>  j=0;</b></p><p>  for(i=0;i<=6;i++)b[i]=0;</p><p>  for(i=0;i<=30;i++)c[i]=0;</p><p><b>  while

82、(1)</b></p><p><b>  {</b></p><p>  while(j<=13)</p><p><b>  {</b></p><p>  ce=getkey1();</p><p><b>  if(j<=5)<

83、;/b></p><p>  display(tab[b[2]/10],tab[b[2]%10],0xff,tab[b[1]/10],</p><p>  tab[b[1]%10],0xff,tab[b[0]/10],tab[b[0]%10]);</p><p>  else if(j<=13)</p><p>  display

84、(tab[b[6]/10],tab[b[6]%10],tab[b[5]/10],</p><p>  tab[b[5]%10],tab[b[4]/10],tab[b[4]%10],0xff,tab[b[3]%10]);</p><p>  if(ce==10)break; //中途退出設(shè)置</p><p>  else if((ce!=0

85、x55)&&(ce!=0x80))</p><p>  {if(ce>9) ce=0;</p><p><b>  c[j]=ce;</b></p><p><b>  j++;</b></p><p><b>  }</b></p>&

86、lt;p>  b[2]=c[0]*10+c[1];</p><p>  b[1]=c[2]*10+c[3];</p><p>  b[0]=c[4]*10+c[5];</p><p>  b[6]=c[6]*10+c[7];</p><p>  b[5]=c[8]*10+c[9];</p><p>  b[4]=

87、c[10]*10+c[11];</p><p>  b[3]=c[12];</p><p><b>  }</b></p><p>  ReadTime(time);</p><p>  c[13]=time[2]/10;</p><p>  c[14]=time[2]%10;</p>

88、;<p>  c[15]=time[1]/10;</p><p>  c[16]=time[1]%10;</p><p>  c[17]=time[0]/10;</p><p>  c[18]=time[0]%10;</p><p>  c[19]=time[6]/10;</p><p>  c[20]=

89、time[6]%10;</p><p>  c[21]=time[5]/10;</p><p>  c[22]=time[5]%10;</p><p>  c[23]=time[4]/10;</p><p>  c[24]=time[4]%10;</p><p>  c[25]=time[3]%10;</p>

90、;<p>  for(k=j;k<=12;k++)</p><p><b>  {</b></p><p>  c[k]=c[k+13];</p><p><b>  }</b></p><p>  b[2]=c[0]*10+c[1];</p><p> 

91、 b[1]=c[2]*10+c[3];</p><p>  b[0]=c[4]*10+c[5];</p><p>  b[6]=c[6]*10+c[7];</p><p>  b[5]=c[8]*10+c[9];</p><p>  b[4]=c[10]*10+c[11];</p><p>  b[3]=c[12];&

92、lt;/p><p>  SetTime(b);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  }else if(en==13)</p><p><b>  {</b></p>&l

93、t;p>  if(clocken==0) clocken=1;</p><p>  else if(clocken==1) clocken=0;</p><p>  }else if(en==14)</p><p><b>  {</b></p><p>  symbol=0x55;</p><

94、p><b>  j=0;</b></p><p>  for(i=0;i<=30;i++)c[i]=0;</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  while(j<=4)</p&g

95、t;<p><b>  {</b></p><p>  ce=getkey1();</p><p>  display(tab[clock[1]/10],tab[clock[1]%10],0xff,0xff,</p><p>  tab[clock[0]/10],tab[clock[0]%10],0xff,0xff);</p

96、><p>  if((ce!=0x55)&&(ce!=0x80))</p><p><b>  {</b></p><p>  if(ce>9)ce=0; //輸入0~9有效</p><p><b>  c[j]=ce;</b></p><p&g

97、t;<b>  j++;</b></p><p><b>  }</b></p><p>  clock[1]=c[0]*10+c[1];</p><p>  clock[0]=c[2]*10+c[3];</p><p><b>  }</b></p><

98、;p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p>&l

99、t;p>  /********************************/</p><p>  /* 延時(shí)函數(shù)程序 */</p><p>  /********************************/</p><p>  void delay(unsigned int cnt) //用于動(dòng)態(tài)掃描

100、數(shù)碼管的延時(shí)程序</p><p><b>  {</b></p><p>  while(--cnt);</p><p><b>  }</b></p><p>  /********************************/</p><p>  /* 數(shù)碼

101、管顯示函數(shù) */</p><p>  /********************************/</p><p>  void display(uchar bit7,uchar bit6,uchar bit5,</p><p>  uchar bit4,uchar bit3,uchar bit2,uchar bit1,uchar bit0

102、)</p><p><b>  {</b></p><p><b>  P2=0x08;</b></p><p><b>  P0=bit7;</b></p><p>  delay(500);</p><p><b>  P2=0x04;&l

103、t;/b></p><p><b>  P0=bit6;</b></p><p>  delay(500);</p><p>  P2=0x02; //顯示秒表計(jì)時(shí)的時(shí)間</p><p>  P0=bit5; </p><p>  delay(500);</p>&

104、lt;p><b>  P2=0x10;</b></p><p><b>  P0=bit4;</b></p><p>  delay(500);</p><p><b>  P2=0x00;</b></p><p><b>  P3=0x80;</b>

105、;</p><p><b>  P0=bit3;</b></p><p>  delay(500);</p><p><b>  P3=0x40;</b></p><p><b>  P0=bit2;</b></p><p>  delay(500);&

106、lt;/p><p>  P3=0x20;</p><p><b>  P0=bit1;</b></p><p>  delay(500);</p><p>  P3=0x08;</p><p><b>  P0=bit0;</b></p><p>

107、  delay(500);</p><p><b>  P3=0x00;</b></p><p><b>  }</b></p><p>  /****************************************/</p><p>  /* 定時(shí)中斷函數(shù)程序

108、 */</p><p>  /****************************************/</p><p>  void tim(void) interrupt 1 using 1</p><p><b>  {</b></p><p>  unsigned int count;</

109、p><p>  TH0=0x3c;//重新賦值,200分之1定時(shí)</p><p><b>  TL0=0x00;</b></p><p>  IE= 0x82; //中斷控制,EA=1開(kāi)總中斷,ET0=1:定時(shí)器0中斷允許</p><p><b>  TR0=1;</b></p&g

110、t;<p><b>  count++;</b></p><p>  if(en==3) //正常計(jì)數(shù)</p><p><b>  {</b></p><p>  if(count>=20)</p><p><b>  {</b></p&

111、gt;<p><b>  count=0;</b></p><p><b>  dsec++;</b></p><p>  if(dsec==10)</p><p><b>  {</b></p><p><b>  dsec=0;</b>&

112、lt;/p><p><b>  sec++;</b></p><p>  if(sec==60)</p><p><b>  {</b></p><p><b>  sec=0;</b></p><p><b>  min++;</b>

113、</p><p>  if(min==60)</p><p><b>  {</b></p><p><b>  min=0;</b></p><p><b>  }</b></p><p><b>  }</b></p>

114、;<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else //倒計(jì)時(shí)</p><p><b>  {</b></p><

115、p>  if(count>=20)</p><p><b>  {</b></p><p><b>  count=0;</b></p><p><b>  dsec--;</b></p><p>  if(dsec==-1)</p><p>

116、;<b>  {</b></p><p><b>  dsec=9;</b></p><p><b>  sec--;</b></p><p>  if(sec==-1)</p><p><b>  {</b></p><p>&l

117、t;b>  sec=59;</b></p><p><b>  min--;</b></p><p>  if(min==-1)</p><p><b>  {</b></p><p><b>  min=59;</b></p><p>

118、;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if((min==0)&&(sec==0)&&(dsec=

119、=0))</p><p><b>  {</b></p><p><b>  TR0=0;</b></p><p><b>  en=0x55;</b></p><p><b>  i=1;</b></p><p><b>

120、;  }</b></p><p><b>  }</b></p><p>  dis_min_h=tab[min/10]; //分、秒及0.1秒顯示值的處理</p><p>  dis_min_l=tab[min%10];</p><p>  dis_sec_h=tab[sec/10];</p&

121、gt;<p>  dis_sec_l=tab[sec%10];</p><p>  dis_dsec=tab[dsec]; </p><p><b>  }</b></p><p>  /*****************************************/</p><p>  /*

122、 讀時(shí)間程序 **/</p><p>  /*******************************************/</p><p>  void ReadTime(unsigned char TIME[7])</p><p><b>  { </b></p><

123、p>  bit EATemp;</p><p>  unsigned char temp;</p><p>  EATemp=EA;</p><p>  CFG848|=0x01;//使用片內(nèi)xram </p><p>  iicstart();</p><p>  iicwriteda(0xd0);</p

124、><p>  iicreadack();</p><p>  iicwriteda(0x00);</p><p>  iicreadack();</p><p>  iicstop(); </p><p>  iicdelay(1);</p><p>  iicstart();</p

125、><p>  iicwriteda(0xd1);</p><p>  iicreadack(); </p><p>  TIME[0]=iicreadda();</p><p><b>  iicack();</b></p><p>  TIME[1]=iicreadda();</p>

126、<p><b>  iicack();</b></p><p>  TIME[2]=iicreadda();</p><p><b>  iicack();</b></p><p>  TIME[3]=iicreadda();</p><p><b>  iicack();<

127、;/b></p><p>  TIME[4]=iicreadda();</p><p><b>  iicack();</b></p><p>  TIME[5]=iicreadda();</p><p><b>  iicack();</b></p><p>  TI

128、ME[6]=iicreadda();</p><p>  iicnack(); </p><p>  iicstop(); </p><p>  iicdelay(1); </p><p>  TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f); //second</

129、p><p>  TIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f); //minute</p><p>  if(TIME[2]&0x40)</p><p><b>  {</b></p><p>  if(TIME[2]&0x20) t

130、emp=0x80; else temp=0x40;</p><p>  TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f); //hour</p><p>  TIME[2]|=temp; </p><p><b>  } </b>&l

131、t;/p><p><b>  else</b></p><p><b>  {</b></p><p>  TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f);</p><p><b>  }</b></p&

132、gt;<p>  TIME[3]=TIME[3]&0x07; //week</p><p>  TIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f); //date</p><p>  TIME[5]=((TIME[5]&0x1f)>&

133、gt;4)*10+(TIME[5]&0x0f); //month</p><p>  TIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f); //year</p><p>  EA=EATemp;</p><p><b>  }</b></p><p>

134、;  /*****************************************/</p><p>  /* 設(shè)置時(shí)間程序 **/</p><p>  /*******************************************/</p><p>  void SetTime(unsigned cha

135、r TIME[7])</p><p><b>  {</b></p><p>  bit EATemp;</p><p>  unsigned char temp=0;</p><p>  unsigned char TimeTemp[7];</p><p>  EATemp=EA;</p&

136、gt;<p>  CFG848|=0x01;//使用片內(nèi)xram</p><p>  for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp];</p><p><b>  temp=0;</b></p><p>  TimeTemp[6]=((TimeTemp[6]/10)<

137、;<4)+(TimeTemp[6]%10);</p><p>  TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10);</p><p>  TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10);</p><p>  TimeTemp[3]=

138、((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10);</p><p>  if((TimeTemp[2]&0xc0)==0x00)</p><p><b>  {</b></p><p>  TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%1

139、0);</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if((TimeTemp[2]&0xc0)==0x01)temp=0x40;else temp=0x60;</

140、p><p>  TimeTemp[2]&=0x3f;</p><p>  TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10);</p><p>  TimeTemp[2]|=temp; </p><p><b>  }</b></p>

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論