版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 題 目 定時插座 </p><p> 課 程 名 稱 單片機原理及接口技術(shù)</p><p> 院 部 名 稱 機電工程學(xué)院 </p><p> 專 業(yè)
2、自動化 </p><p> 班 級 09自動化 </p><p> 學(xué) 生 姓 名 </p><p> 學(xué) 號 </p><p> 課程設(shè)計地點 </p><p
3、> 課程設(shè)計學(xué)時 一周 </p><p> 指 導(dǎo) 教 師 </p><p><b> 目錄</b></p><p><b> 一:概述</b></p><p> 二:設(shè)計要求和設(shè)計思路及方案</p&
4、gt;<p><b> 2.1設(shè)計要求</b></p><p><b> 2.2設(shè)計思路</b></p><p><b> 2.3設(shè)計方案</b></p><p><b> 三:硬件電路設(shè)計</b></p><p><b>
5、 3.1按鍵設(shè)計電路</b></p><p> 3.2數(shù)碼管顯示電路</p><p> 3.3 DS1302電路和AT24C02電路</p><p><b> 3.4繼電器電路</b></p><p><b> 四:軟件設(shè)計</b></p><p>
6、五:系統(tǒng)調(diào)試及軟件仿真</p><p><b> 六:總結(jié)</b></p><p><b> 概述</b></p><p> 隨著科學(xué)技術(shù)特別是微型計算機技術(shù)的高速發(fā)展,單片機微機技術(shù)也獲得了飛速發(fā)展。目前,單片機已經(jīng)在日常生活和控制領(lǐng)域等方面得到了廣泛的應(yīng)用,它正為我國經(jīng)濟的快速發(fā)展發(fā)揮著舉足輕重的作用。作為自動化
7、專業(yè)的一名工科學(xué)生應(yīng)該牢牢掌握這一重要技術(shù)。而課程設(shè)計這一環(huán)節(jié)是我們提高單片機應(yīng)用能力的很好機會,也是我們學(xué)好這一課程的必經(jīng)環(huán)節(jié)。通過課程設(shè)計可以進一步鞏固我們前面所學(xué)的理論知識,使我們對單片機理論知識有一個深刻的認識和全面的掌握。另外通過這一真正意義上的實踐活動,我們可以從中發(fā)現(xiàn)自己的不足之處并能夠在自己的深思下和老師的指導(dǎo)下得到及時的解決。再次,它能使我們的應(yīng)用能力和科技創(chuàng)新能力得到較大的提高。</p><p&g
8、t; 單片機作為嵌入式微控制器在工業(yè)測控系統(tǒng),智能儀器和家用電器中得到廣泛應(yīng)用。雖然單片機的品種很多,但MCS-51系列單片機仍不失為單片機中的主流機型。本課程一MCS-51系列以及派生系列單片機芯片為主介紹單片機的原理及應(yīng)用,其特點是由淺入深,注重接口技術(shù)和應(yīng)用。</p><p> 設(shè)計要求和設(shè)計思路及方案</p><p><b> 2.1 設(shè)計要求</b>&
9、lt;/p><p> 本次課程設(shè)計用STC89C52作為主控器做一個定時插座。實現(xiàn)一個具有定時、按鍵設(shè)置及控制、定時時間顯示等功能的定時開關(guān)插座,具體要求和指標(biāo)如下:</p><p> 可以設(shè)定三組定時時間值。</p><p> 設(shè)定的定時可調(diào)整的時間范圍。</p><p> 具有開始/停止操作按鍵。</p><p&g
10、t; 具有定時時間顯示和時鐘顯示。</p><p><b> 2.2設(shè)計思路</b></p><p> 為了確定其設(shè)計方案,首先必須構(gòu)思好初步的設(shè)計思路。根據(jù)設(shè)計要求和實驗仿真條件,初步的設(shè)計思路可以總結(jié)如下:</p><p> 用DS1302芯片處理當(dāng)前時間并用8位數(shù)碼管顯示。</p><p> 用AT24C
11、02芯片存儲預(yù)先設(shè)定好的密碼。</p><p> 設(shè)置模式:常開模式、常閉模式、定時模式</p><p> 設(shè)置開關(guān)時間:先按設(shè)置鍵出現(xiàn)01 on,再按小時和分鐘鍵調(diào)節(jié)時間,調(diào)節(jié)好后再按設(shè)置鍵出現(xiàn)01 off,再調(diào)節(jié)時間,按確認鍵,這樣就設(shè)置好一組定時時間。設(shè)置其他組方法相同。</p><p><b> 2.3設(shè)計方案</b></p
12、><p> 根據(jù)設(shè)計要求和設(shè)計思路,可以確定系統(tǒng)的設(shè)計方案,圖1為該系統(tǒng)設(shè)計的硬件電路圖設(shè)計框圖。硬件主要由6部分組成,即單片機,鍵盤,數(shù)碼管顯示,DS1302芯片,AT24C02芯片,繼電器。</p><p> STC89C52介紹</p><p> VCC:供電電壓。 GND:接地。 </p><p> P0口:P0口為一個8位漏級開
13、路雙向I/O口,每腳可吸收8個TTL門電流。當(dāng)P0口的管腳第一次寫“1”時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。 </p><p> P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4個TTL門電流。P1口管腳寫入“1”后,被內(nèi)部
14、上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p> P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存
15、儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 </p><p> P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于
16、外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口作為AT89C51的一些特殊功能口,管腳 備選功能 </p><p> P3.0 RXD(串行輸入口) </p><p> P3.1 TXD(串行輸出口) </p><p> P3.2 /INT0(外部中斷0) </p><p> P3.3 /INT1(外部中斷1)
17、 </p><p> P3.4 T0(計時器0外部輸入) </p><p> P3.5 T1(計時器1外部輸入) </p><p> P3.6 /WR(外部數(shù)據(jù)存儲器寫選通) </p><p> P3.7 /RD(外部數(shù)據(jù)存儲器讀選通) </p><p> RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳
18、兩個機器周期的高電平時間。 </p><p> ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。 </p><p> 在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想
19、禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。 </p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。/EA / VPP:當(dāng)/EA保持低電平時,則在此期間外部
20、程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 </p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。 </p><p> XTAL2:來自反向振蕩器的輸出。</p><
21、p> 在單片機中,定時功能既可以由硬件(定時/計數(shù)器)實現(xiàn),也可通過軟件定時實現(xiàn)。硬件定時是利用單片機內(nèi)定時器定時,啟動以后定時器可與CPU并行工作,不占用CPU時間,CPU有較高的工作效率。采用硬件定時和軟件定時比用的方式,即用T0溢出中斷功能實現(xiàn)50ms定時,通過軟件延時程序?qū)崿F(xiàn)5s定時。定時器的TMOD用于設(shè)置定時器/計數(shù)器的工作方式,并確定用于定時還是計數(shù)。TCON只要功能是為定時器在溢出時設(shè)定標(biāo)志位,并控制定時器運行或
22、停止。</p><p><b> 圖1:硬件電路設(shè)計</b></p><p><b> 硬件電路設(shè)計</b></p><p><b> 3.1按鍵設(shè)計電路</b></p><p> 對于按鍵電路的設(shè)計可以有2種方式:一種方式是獨立按鍵設(shè)計,這種設(shè)計電路適用于按鍵較少的控
23、制,具有按鍵電路簡單,編程方便等優(yōu)點;另一種方式是矩陣方式鍵盤的設(shè)計,它適用于對控制按鍵較多的電路控制,占用較少的I/O接口,但是按鍵電路復(fù)雜,編程比較復(fù)雜。本課題總共需要6個按鍵,所以采用矩陣式鍵盤,如圖2</p><p><b> 圖2:按鍵電路</b></p><p> 3.2數(shù)碼管顯示電路</p><p> 本課題所采用的是數(shù)碼管
24、作為顯示電路,用來顯示當(dāng)前的時間及密碼門時輸入的密碼。硬件電路連接是單片機P0口接2片74hc573鎖存芯片,兩片芯片的輸出端分別接數(shù)碼管的段選端跟位選端。這樣P0口不斷送出位碼跟斷碼鎖存可以實現(xiàn)數(shù)碼管的動態(tài)顯示。連接方法如圖3所示。</p><p> 圖3:數(shù)碼管顯示電路</p><p> 3.3 DS1302電路和AT24C02電路</p><p> 24
25、C02的SCK,SDA,WP引腳分別接單片機的P2.0,P2.1引腳和地。DS1302的RST,SCLK,I/O引腳分別接單片機的P1.3,P1.7和P2.3引腳。電路圖如圖4所示。</p><p> 圖4:DS1302和24C02連接電路</p><p><b> 3.4繼電器電路</b></p><p> 繼電器的線圈一端接電源vcc
26、一端接ULN2003的12腳。ULN2003是8個非門,可以耐高壓等,用來驅(qū)動繼電器。電路連接圖如圖5所示。</p><p> 圖5:繼電器連接電路</p><p> 軟件設(shè)計主程序流程圖</p><p><b> N</b></p><p><b> Y</b></p>&l
27、t;p> 五、系統(tǒng)調(diào)試和軟件仿真</p><p> 5.1程序調(diào)試部分:</p><p> uVsion3先新建一個工程,選擇芯片為AT89C52然后點擊是,然后彈出來是否加入標(biāo)準(zhǔn)啟動文件,點擊否,然后新建一個文件,保存為“main.c”。然后雙擊工程窗口的Target選擇添加文件到工程,選剛才新建的文件然后點擊OK,輸入程序,點擊工程選擇,選中Output中的Creat He
28、x File,然后編譯,連接生成Hex文件,有錯誤修改后再編譯連接。當(dāng)編譯結(jié)果中不出現(xiàn)錯誤時說明已經(jīng)沒有語法錯誤,但是否能完成課題所需要的功能則需要進行仿真。5.2軟件仿真部分:</p><p> 運行proteus的ISIS后進入仿真界面將所需元件選擇好,根據(jù)原理圖畫出仿真圖,待仿真圖畫好后雙擊AT89C52導(dǎo)入Keil所產(chǎn)生的后綴名為.HEX文件。按開始鍵進行仿真。</p><p>
29、;<b> 實驗程序:</b></p><p> #include<reg52.h></p><p> #include<intrins.h></p><p> #include"display.h"</p><p> #include"ds1302.h&q
30、uot;</p><p> #include"key.h"</p><p> #include"24c02.h"</p><p> #include"uln2003.h"</p><p> sbit buzz=P0^6;</p><p> sbit
31、relay=P0^4;</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p> typedef struct SYSTEMTIME</p><p><b> { </b></p><p
32、> uchar min;</p><p> uchar hour;</p><p> uchar sec;</p><p><b> };</b></p><p> struct SYSTEMTIME clock,time;</p><p> uchar tempdata[8]
33、,temp[8],disTime[8];</p><p> uchar keynum,n,setflag,modeflag,hour_temp,min_temp;</p><p> bit flag,onflag,offflag;</p><p> void read_time(struct SYSTEMTIME *p) //結(jié)構(gòu)體形參</p>
34、<p><b> {</b></p><p> p->hour = read_DS1302(0x85);</p><p> p->min = read_DS1302(0x83);</p><p> p->sec = read_DS1302(0x81);</p><p><b&
35、gt; }</b></p><p><b> main()</b></p><p><b> {</b></p><p> uchar i,j;</p><p> buzz=0;relay=0;</p><p> ULN2003_Latch();<
36、;/p><p> buzz=0;relay=0;</p><p> ULN2003_Latch();</p><p> DS1302_init(); //初始化,第一次下載后將其屏蔽</p><p><b> while(1)</b></p><p><b> {</b
37、></p><p> read_time(&clock);</p><p> disTime[0] = clock.hour>>4; //時十位</p><p> disTime[1] = clock.hour&0x0f; //時個位 </p><p> disTime[2] = 10;
38、</p><p> disTime[3] = clock.min>>4; //分十位</p><p> disTime[4] = clock.min&0x0f; //分個位 </p><p> disTime[5] = 10;</p><p> disTime[6] = clock.sec>>4;
39、 //秒十位</p><p> disTime[7] = clock.sec&0x0f; //秒個位 </p><p> hour_temp=disTime[0]*10+disTime[1]; //轉(zhuǎn)換成十進制小時</p><p> min_temp=disTime[3]*10+disTime[4]; //轉(zhuǎn)換成十進制分鐘</p&g
40、t;<p> keynum=KeyPro();</p><p> switch(keynum)</p><p><b> {</b></p><p><b> case 0:{</b></p><p> setflag++;</p><p> if(
41、setflag==2)</p><p><b> {</b></p><p> wrbyte_24c02(n*2,time.hour);</p><p> wrbyte_24c02(n*2+1,time.min);</p><p><b> n++;</b></p><p
42、><b> }</b></p><p> time.hour=0;</p><p> time.min=0;</p><p><b> flag=0;</b></p><p><b> break;</b></p><p><b&g
43、t; }</b></p><p><b> case 1:{</b></p><p> time.hour++;</p><p> if(time.hour==24)</p><p> time.hour=0;</p><p><b> flag=1;</b
44、></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 2:{</b></p><p> time.min++;</p><p> if(time.min==60)&l
45、t;/p><p> time.min=0;</p><p><b> flag=1;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 3:{</b&g
46、t;</p><p> wrbyte_24c02(n*2,time.hour);</p><p> wrbyte_24c02(n*2+1,time.min);</p><p><b> flag=0;</b></p><p> setflag=0;</p><p><b> n
47、++;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> case 4:{</b></p><p> modeflag++;</p><p> if(modef
48、lag==3)</p><p> modeflag=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 5:{</b></p><p><b> flag=0
49、;</b></p><p> setflag=0;</p><p> modeflag=0;</p><p><b> onflag=0;</b></p><p> offflag=0;</p><p> while(n!=0)</p><p><
50、;b> {</b></p><p> wrbyte_24c02((n-1)*2,0);</p><p> wrbyte_24c02((n-1)*2+1,0);</p><p><b> n--;</b></p><p><b> }</b></p><
51、p><b> break;</b></p><p><b> }</b></p><p> default:break;</p><p><b> }</b></p><p> switch(setflag)</p><p><b
52、> {</b></p><p><b> case 1:{</b></p><p> temp[0]=(n/2+1)/10;</p><p> temp[1]=(n/2+1)%10;</p><p> temp[2]=11;</p><p> temp[3]=0;&l
53、t;/p><p> temp[4]=13;</p><p> temp[5]=11;</p><p> temp[6]=11;</p><p> temp[7]=11;</p><p><b> break;</b></p><p><b> }<
54、/b></p><p><b> case 2:{</b></p><p> temp[0]=(n/2+1)/10;</p><p> temp[1]=(n/2+1)%10;</p><p> temp[2]=11;</p><p> temp[3]=0;</p>&
55、lt;p> temp[4]=14;</p><p> temp[5]=14;</p><p> temp[6]=11;</p><p> temp[7]=11;</p><p><b> break;</b></p><p><b> }</b></p
56、><p> default:break;</p><p><b> }</b></p><p> switch(modeflag)</p><p><b> {</b></p><p><b> case 0:{</b></p>&l
57、t;p> buzz=0;relay=0;</p><p> ULN2003_Latch();</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 1:{</b></p><
58、p> buzz=0;relay=1;</p><p> ULN2003_Latch();</p><p><b> break;</b></p><p><b> }</b></p><p><b> case 2:{</b></p><p&
59、gt; for(j=0;j<n/2;j++)</p><p><b> {</b></p><p> if(hour_temp==read(4*j)&&min_temp==read(4*j+1))</p><p><b> {</b></p><p><b>
60、 onflag=1;</b></p><p> offflag=0;</p><p><b> }</b></p><p> if(hour_temp==read(4*j+2)&&min_temp==read(4*j+3))</p><p><b> {</b>
61、</p><p><b> onflag=0;</b></p><p> offflag=1;</p><p><b> }</b></p><p><b> }</b></p><p> if(onflag)</p><p
62、><b> {</b></p><p> buzz=0;relay=1;</p><p> ULN2003_Latch();</p><p><b> }</b></p><p> if(offflag)</p><p><b> {</b&
63、gt;</p><p> buzz=0;relay=0;</p><p> ULN2003_Latch();</p><p><b> }</b></p><p> if(!offflag&&!onflag)</p><p><b> {</b>&l
64、t;/p><p> buzz=0;relay=0;</p><p> ULN2003_Latch();</p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p>
65、<p> default:break;</p><p><b> }</b></p><p> if(!setflag&&!flag)</p><p><b> {</b></p><p> for(i=0;i<8;i++)</p><
66、p> tempdata[i]=disTime[i];</p><p><b> }</b></p><p> if(setflag&&!flag)</p><p><b> {</b></p><p> for(i=0;i<8;i++)</p>&
67、lt;p> tempdata[i]=temp[i];</p><p><b> }</b></p><p> if(setflag&&flag)</p><p><b> {</b></p><p> tempdata[0]=time.hour/10;</p&g
68、t;<p> tempdata[1]=time.hour%10;</p><p> tempdata[2]=10;</p><p> tempdata[3]=time.min/10;</p><p> tempdata[4]=time.min%10;</p><p> tempdata[5]=10;</p>
69、<p> tempdata[6]=0;</p><p> tempdata[7]=0;</p><p><b> }</b></p><p> display(tempdata);</p><p><b> }</b></p><p><b&g
70、t; REG52.H</b></p><p> Header file for generic 80C52 and 80C32 microcontroller.</p><p> Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.</p><p> All ri
71、ghts reserved.</p><p> --------------------------------------------------------------------------*/</p><p> #ifndef __REG52_H__</p><p> #define __REG52_H__</p><p>
72、/* BYTE Registers */</p><p> sfr P0 = 0x80;</p><p> sfr P1 = 0x90;</p><p> sfr P2 = 0xA0;</p><p> sfr P3 = 0xB0;</p><p> sfr PSW = 0xD
73、0;</p><p> sfr ACC = 0xE0;</p><p> sfr B = 0xF0;</p><p> sfr SP = 0x81;</p><p> sfr DPL = 0x82;</p><p> sfr DPH = 0x83;</p><p&
74、gt; sfr PCON = 0x87;</p><p> sfr TCON = 0x88;</p><p> sfr TMOD = 0x89;</p><p> sfr TL0 = 0x8A;</p><p> sfr TL1 = 0x8B;</p><p> sfr TH0 = 0x8
75、C;</p><p> sfr TH1 = 0x8D;</p><p> sfr IE = 0xA8;</p><p> sfr IP = 0xB8;</p><p> sfr SCON = 0x98;</p><p> sfr SBUF = 0x99;</p><p&
76、gt; /* 8052 Extensions */</p><p> sfr T2CON = 0xC8;</p><p> sfr RCAP2L = 0xCA;</p><p> sfr RCAP2H = 0xCB;</p><p> sfr TL2 = 0xCC;</p><p> sfr T
77、H2 = 0xCD;</p><p> /* BIT Registers */</p><p> /* PSW */</p><p> sbit CY = PSW^7;</p><p> sbit AC = PSW^6;</p><p> sbit F0 = PSW^5;<
78、;/p><p> sbit RS1 = PSW^4;</p><p> sbit RS0 = PSW^3;</p><p> sbit OV = PSW^2;</p><p> sbit P = PSW^0; //8052 only</p><p> /* TCON */</p&g
79、t;<p> sbit TF1 = TCON^7;</p><p> sbit TR1 = TCON^6;</p><p> sbit TF0 = TCON^5;</p><p> sbit TR0 = TCON^4;</p><p> sbit IE1 = TCON^3;</p>&
80、lt;p> sbit IT1 = TCON^2;</p><p> sbit IE0 = TCON^1;</p><p> sbit IT0 = TCON^0;</p><p> /* IE */</p><p> sbit EA = IE^7;</p><p> sbit ET
81、2 = IE^5; //8052 only</p><p> sbit ES = IE^4;</p><p> sbit ET1 = IE^3;</p><p> sbit EX1 = IE^2;</p><p> sbit ET0 = IE^1;</p><p> sbit EX0
82、 = IE^0;</p><p> /* IP */</p><p> sbit PT2 = IP^5;</p><p> sbit PS = IP^4;</p><p> sbit PT1 = IP^3;</p><p> sbit PX1 = IP^2;</p><
83、;p> sbit PT0 = IP^1;</p><p> sbit PX0 = IP^0;</p><p> /* P3 */</p><p> sbit RD = P3^7;</p><p> sbit WR = P3^6;</p><p> sbit T1 = P3
84、^5;</p><p> sbit T0 = P3^4;</p><p> sbit INT1 = P3^3;</p><p> sbit INT0 = P3^2;</p><p> sbit TXD = P3^1;</p><p> sbit RXD = P3^0;</p>
85、<p> /* SCON */</p><p> sbit SM0 = SCON^7;</p><p> sbit SM1 = SCON^6;</p><p> sbit SM2 = SCON^5;</p><p> sbit REN = SCON^4;</p><p> sb
86、it TB8 = SCON^3;</p><p> sbit RB8 = SCON^2;</p><p> sbit TI = SCON^1;</p><p> sbit RI = SCON^0;</p><p> /* P1 */</p><p> sbit T2EX = P1^1
87、; // 8052 only</p><p> sbit T2 = P1^0; // 8052 only</p><p> /* T2CON */</p><p> sbit TF2 = T2CON^7;</p><p> sbit EXF2 = T2CON^6;</p><p> sbi
88、t RCLK = T2CON^5;</p><p> sbit TCLK = T2CON^4;</p><p> sbit EXEN2 = T2CON^3;</p><p> sbit TR2 = T2CON^2;</p><p> sbit C_T2 = T2CON^1;</p><p>
89、 sbit CP_RL2 = T2CON^0;</p><p><b> #endif</b></p><p><b> INTRINS.H</b></p><p> Intrinsic functions for C51.</p><p> Copyright (c) 1988-2004
90、 Keil Elektronik GmbH and Keil Software, Inc.</p><p> All rights reserved.</p><p> --------------------------------------------------------------------------*/</p><p> #ifndef __
91、INTRINS_H__</p><p> #define __INTRINS_H__</p><p> extern void _nop_ (void);</p><p> extern bit _testbit_ (bit);</p><p> extern unsigned char
92、_cror_ (unsigned char, unsigned char);</p><p> extern unsigned int _iror_ (unsigned int, unsigned char);</p><p> extern unsigned long _lror_ (unsigned long, unsigned char);</p>
93、;<p> extern unsigned char _crol_ (unsigned char, unsigned char);</p><p> extern unsigned int _irol_ (unsigned int, unsigned char);</p><p> extern unsigned long _lrol_ (unsi
94、gned long, unsigned char);</p><p> extern unsigned char _chkfloat_(float);</p><p> extern void _push_ (unsigned char _sfr);</p><p> extern void _pop_ (un
95、signed char _sfr);</p><p><b> #endif</b></p><p> #ifndef __DISPLAY_H__</p><p> #define __DISPLAY_H__</p><p> #define uchar unsigned char</p><
96、p> #define uint unsigned int</p><p> //0 1 2 3 4 5 6 7 8 9- 滅 _</p><p> unsigned char code DuanMa[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf
97、,0xff,0xf7,0xab,0x8e};//共陽 </p><p> unsigned char code WeiMa[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//分別對應(yīng)相應(yīng)的數(shù)碼管點亮,即位碼 </p><p> #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0替換</p>
98、;<p> void SEG_Latch(void) //段碼鎖存子程序 </p><p><b> {</b></p><p> P2 |= 0xe0;//P2.7~P2.5=111,Y7=0,Y7C=1,即U7的LE=1,段碼數(shù)據(jù)選通 </p><p><b> _nop_();</b><
99、;/p><p> P2 &= 0x1f;//P2.7~P2.5=000,Y7=1,Y7C=0,即U7的LE=0,段碼數(shù)據(jù)被鎖存 </p><p><b> }</b></p><p> void BIT_Latch(void) //位碼鎖存子程序 </p><p><b> {</b>
100、</p><p> P2 |= 0xC0; //P2.7~P2.5=110,Y6=0,Y6C=1,即U8的LE=1,位碼數(shù)據(jù)選通 </p><p><b> _nop_();</b></p><p> P2 &= 0x1f; //P2.7~P2.5=000,Y6=1,Y6C=0,即U8的LE=0,位碼數(shù)據(jù)被鎖存 </
101、p><p><b> }</b></p><p> void delay_50us(uint t) //50us 延時 </p><p><b> {</b></p><p> uchar j; </p><p> for(;t>0;t--) </
102、p><p> for(j=19;j>0;j--) </p><p><b> ;</b></p><p><b> } </b></p><p> void display(uchar *point)</p><p><b> {</b>&l
103、t;/p><p> unsigned char i=0;</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> DataPort=WeiMa[i]; //取位碼 </p><p> BIT_Latch();//數(shù)據(jù)鎖存 &
104、lt;/p><p> DataPort=DuanMa[*(point+i)]; //取顯示數(shù)據(jù),段碼 </p><p> SEG_Latch();//數(shù)據(jù)鎖存 </p><p> delay_50us(30); // 掃描間隙延時,時間太長會閃爍,太短不亮 </p><p> DataPort=0xff; //關(guān)顯示,消除重
105、影 </p><p> SEG_Latch(); //數(shù)據(jù)鎖存 </p><p><b> }</b></p><p><b> }</b></p><p><b> #endif</b></p><p> #ifndef __DS13
106、02_H__</p><p> #define __DS1302_H__</p><p> #include <intrins.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> #
107、define nop _nop_()</p><p> sbit DS1302_CLK = P1^7;</p><p> sbit DS1302_IO = P2^3;</p><p> sbit DS1302_RST = P1^3;</p><p> uchar NowTime[8]={0x12,0x5,0x26,0x6,0x00,
108、0x00,0x00};//年,月,日,星期,時,分,秒</p><p> /*****************************************************************************</p><p> 函數(shù)功能:寫DS1302一個字節(jié)子程序</p><p><b> 入口參數(shù):</b><
109、;/p><p><b> 出口參數(shù):</b></p><p> *****************************************************************************/</p><p> void sendbyte(uchar a)</p><p><b>
110、 {</b></p><p><b> uchar i;</b></p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p> DS1302_CLK=0;</p><p><b>
111、; nop;</b></p><p> DS1302_IO = a & 0x01;</p><p><b> a >>= 1;</b></p><p> DS1302_CLK=1;</p><p><b> nop; </b></p>
112、<p><b> }</b></p><p><b> } </b></p><p> /*****************************************************************************</p><p> 函數(shù)功能:讀DS1302一個字節(jié)子程序
113、</p><p><b> 入口參數(shù):</b></p><p><b> 出口參數(shù):</b></p><p> *****************************************************************************/</p><p> uc
114、har readbyte(void)</p><p><b> {</b></p><p> uchar i,dat=0;</p><p> for(i=8;i>0;i--) </p><p><b> {</b></p><p> DS1302_CLK=1
115、;</p><p><b> nop;</b></p><p> DS1302_CLK=0;</p><p> dat>>=1;</p><p> if(DS1302_IO)</p><p> dat|=0x80;</p><p>
116、;<b> }</b></p><p> DS1302_IO=0;</p><p> return dat;</p><p><b> } </b></p><p> /***********************************************************
117、******************</p><p> 函數(shù)功能:寫DS1302地址子程序 </p><p><b> 入口參數(shù):add</b></p><p><b> 入口數(shù)據(jù):dat</b></p><p> **************************************
118、***************************************/</p><p> void write_DS1302(uchar address,uchar dat)</p><p><b> {</b></p><p> DS1302_RST=0;</p><p><b> nop;
119、</b></p><p> DS1302_CLK=0;</p><p><b> nop;</b></p><p> DS1302_RST=1;</p><p><b> nop;</b></p><p> sendbyte(address);</
120、p><p><b> nop;</b></p><p> sendbyte(dat);</p><p><b> nop;</b></p><p> DS1302_RST=0;</p><p><b> nop;</b></p>&l
121、t;p> DS1302_CLK=0;</p><p><b> }</b></p><p> /*****************************************************************************</p><p> 函數(shù)功能:讀DS1302地址子程序 </p>&
122、lt;p><b> 入口參數(shù):add</b></p><p> 出口參數(shù):readtimeR[]</p><p> *****************************************************************************/</p><p> uchar read_DS1302(uc
123、har address)</p><p><b> {</b></p><p> uchar timer;</p><p> DS1302_RST=0;</p><p><b> nop;</b></p><p> DS1302_CLK=0;</p>
124、<p><b> nop;</b></p><p> DS1302_RST=1;</p><p><b> nop;</b></p><p> sendbyte(address); </p><p> timer=readbyte();</p><p>
125、 DS1302_RST=0;</p><p><b> nop;</b></p><p> DS1302_CLK=0;</p><p> return timer;</p><p><b> }</b></p><p> /*********************
126、********************************************************</p><p> 函數(shù)功能:初始化DS1302子程序</p><p> 入口參數(shù):wr_data[](全局變量)</p><p><b> 出口參數(shù):</b></p><p> ***********
127、******************************************************************/</p><p> void DS1302_init()</p><p><b> {</b></p><p> write_DS1302(0x8e,0x00); //關(guān)閉保護,若寫0x80,則開啟保護 &
128、lt;/p><p> write_DS1302(0x8c,NowTime[0]);//年 </p><p> write_DS1302(0x88,NowTime[1]);//月 </p><p> write_DS1302(0x86,NowTime[2]);//日 </p><p> write_DS1302(0x8A
129、,NowTime[3]);//星期 </p><p> write_DS1302(0x84,NowTime[4]);//時 </p><p> write_DS1302(0x82,NowTime[5]);//分 </p><p> write_DS1302(0x80,NowTime[6]);//秒 </p><p
130、> write_DS1302(0x8e,0x80); //開寫保護</p><p><b> }</b></p><p> //=======================時鐘開啟,可省略==================================</p><p> void clock_start(void)<
131、/p><p><b> {</b></p><p> uchar val;</p><p> val = read_DS1302(0x81); //讀秒寄存器 </p><p> val &= 0x7f; //最高位CH,振蕩器工作允許 </p><p> write_DS13
132、02(0x8e,0x00); //關(guān)寫保護 </p><p> write_DS1302(0x80,val);</p><p> write_DS1302(0x90,0xa5);//使能涓電流充電,DS=01:選擇一個二極管,RS=01:R1=2k</p><p> write_DS1302(0x8e,0x80);//開寫保護 </p><
133、p><b> }</b></p><p><b> #endif</b></p><p> #ifndef __KEY_H__</p><p> #define __KEY_H__</p><p> #define KeyPort P3</p><p> /
134、*------------------------------------------------</p><p> 將跳線帽套在J5的BIN針上</p><p> 獨立按鍵掃描函數(shù),返回掃描鍵值</p><p> 左邊一列從上向下對應(yīng)P30,P31,P32,P33</p><p> 分別是0,1,2,3號鍵</p>&
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機定時鬧鐘課程設(shè)計
- 定時鬧鐘—單片機課程設(shè)計
- 單片機定時鬧鐘課程設(shè)計
- 單片機課程設(shè)計—定時鬧鐘設(shè)計
- 單片機課程設(shè)計---定時鬧鐘設(shè)計
- 單片機課程設(shè)計--定時鬧鐘設(shè)計
- 單片機課程設(shè)計—定時鬧鐘設(shè)計
- 單片機課程設(shè)計---定時鬧鈴lcd
- 單片機課程設(shè)計--基于51單片機的定時鬧鐘設(shè)計
- 課程設(shè)計--單片機定時鬧鐘設(shè)計報告
- 單片機課程設(shè)計---定時鬧鐘的設(shè)計
- 單片機課程設(shè)計——定時鬧鐘的設(shè)計
- 單片機課程設(shè)計--簡單定時鬧鐘系統(tǒng)
- 單片機課程設(shè)計--秒表定時器
- 單片機課程設(shè)計--定時器實驗
- 單片機課程設(shè)計---加熱定時器
- 單片機課程設(shè)計智能定時器
- 單片機課程設(shè)計---- lcd電子定時鬧鐘設(shè)計
- 單片機課程設(shè)計---基于單片機的定時控制器設(shè)計
- 基于單片機的定時鬧鐘課程設(shè)計
評論
0/150
提交評論