版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)多功能秒表課程設(shè)計(jì)
- 單片機(jī)多功能秒表課程設(shè)計(jì)--89c51單片機(jī)秒表的設(shè)計(jì)
- 基于單片機(jī)的多功能秒表系統(tǒng)課程設(shè)計(jì)
- 基于單片機(jī)的多功能秒表的課程設(shè)計(jì)
- 單片機(jī)秒表課程設(shè)計(jì)
- 單片機(jī)秒表課程設(shè)計(jì)
- 單片機(jī)秒表課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---秒表
- 單片機(jī)秒表課程設(shè)計(jì)
- 秒表(單片機(jī)課程設(shè)計(jì))
- 單片機(jī)秒表單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---秒表設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-多功能時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)---多功能時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--多功能系統(tǒng)
- 單片機(jī)數(shù)字秒表課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字秒表
- 單片機(jī)課程設(shè)計(jì)-數(shù)字秒表
- 基于單片機(jī)的秒表設(shè)計(jì)單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---單片機(jī)秒表系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論