版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> ARM課程設(shè)計(jì)</b></p><p><b> 可調(diào)控萬(wàn)年歷時(shí)鐘</b></p><p> 1.初始化并運(yùn)行RTC,然后讀取時(shí)間值通過(guò)串口向上位機(jī)發(fā)送,并把秒的值輸出到教學(xué)實(shí)驗(yàn)開(kāi)發(fā)平臺(tái)上的LED1~LED4進(jìn)行顯示。</p><p> 2.分析。萬(wàn)年歷顯示時(shí)間包括年、月、日、星期、時(shí)、
2、分和秒,利用EasyARM.exe仿真軟件把結(jié)果發(fā)送到上位機(jī)上顯示。通過(guò)按鍵進(jìn)行上述的顯示調(diào)節(jié),其中月是1~12,日是1~31,星期是1~7,時(shí)是00~23,分是00~59,秒是00~59?,F(xiàn)在時(shí)間顯示2009年5月11日星期一15:23:30。</p><p><b> 3.程序</b></p><p> #include "config.h"
3、;</p><p> #include "stdio.h"</p><p> #include "math.h"</p><p> uint8 time[4];</p><p> /*按鍵 GPIO口*/</p><p> #definekey1 1<&
4、lt;16</p><p> #definekey2 1<<17</p><p> #definekey3 1<<18</p><p> #definekey4 1<<19</p><p> #definekey5 1<<20</p><
5、;p> #definekey6 1<<21 </p><p> #define HC595_CS (1 << 29) // P0.29口為74HC595的片選</p><p> typedef struct UartMode // 定義串口模式設(shè)置的數(shù)據(jù)結(jié)構(gòu)</p><p
6、><b> {</b></p><p> uint8 datab; // 字長(zhǎng)度 5/6/7/8</p><p> uint8 stopb; // 停止位 1/2</p><p> uint8 parity; // 奇
7、偶校驗(yàn) 0-無(wú)校驗(yàn), 1-奇校驗(yàn), 2-偶校驗(yàn)</p><p><b> }</b></p><p><b> UARTMODE;</b></p><p> uint8 rcv_buf[6]; // UART0數(shù)據(jù)接收緩沖區(qū)</p><p> volatile
8、 uint8 rcv_new; // 接收新數(shù)據(jù)標(biāo)志</p><p> /**********************************************************************</p><p> ** 函數(shù)名稱 :DelayNS()</p><p> ** 函數(shù)功能 :長(zhǎng)軟件延時(shí)</p&
9、gt;<p> ** 入口參數(shù) :dly延時(shí)參數(shù),值越大,延時(shí)越久</p><p> ** 出口參數(shù) :無(wú)</p><p> ********************************************************************/</p><p> void DelayNS (uint32 dly)</
10、p><p><b> {</b></p><p><b> uint32 m;</b></p><p> for ( ; dly>0; dly--)</p><p> for (m=0; m<5000; m++);</p><p><b> }&l
11、t;/b></p><p> void MSPI_Init(void)</p><p><b> { </b></p><p> //PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;// 設(shè)置管腳連接SPI</p><p> PINSEL0 = (P
12、INSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;</p><p> SPCCR = 0x52; // 設(shè)置SPI時(shí)鐘分頻</p><p> SPCR = (0 << 3) |// CPHA = 0, 數(shù)據(jù)在SCK 的第一個(gè)時(shí)鐘沿采樣</p><p>
13、 (1 << 4) |// CPOL = 1, SCK 為低有效</p><p> (1 << 5) |// MSTR = 1, SPI 處于主模式</p><p> (0 << 6) |// LSBF = 0, SPI 數(shù)據(jù)傳輸MSB (位7)在先</p><p> (0 << 7);
14、// SPIE = 0, SPI 中斷被禁止</p><p><b> }</b></p><p> /**************************************************************************** 函數(shù)名稱:MSPI_SendData()</p><p> ** 函數(shù)功能:
15、向SPI總線發(fā)送數(shù)據(jù)。</p><p> ** 入口參數(shù):data 待發(fā)送的數(shù)據(jù)</p><p> ** 出口參數(shù):返回值為讀取的數(shù)據(jù)</p><p> *************************************************************************/</p><p> uint8
16、 MSPI_SendData(uint8 data)</p><p><b> { </b></p><p> IOCLR = HC595_CS; // 片選74HC595</p><p> SPI_SPDR = data;</p><p> while( 0 == (SPI_SPSR &
17、amp; 0x80));// 等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢</p><p> IOSET = HC595_CS;</p><p> return(SPI_SPDR);</p><p><b> }</b></p><p> /* 此表為L(zhǎng)ED0~F以及L、P的字模 */</p><p
18、> uint8 const DISP_TAB[19] = {</p><p> 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,</p><p> 0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,</p><p><b> };</b></p>
19、<p> /**************************************************************************** 函數(shù)名稱:main()</p><p> ** 函數(shù)功能:使用硬件SPI,74HC595驅(qū)動(dòng)控制7段數(shù)碼管顯示。 </p><p> ** 先顯示0~F的字模,然后顯示LPC2131字樣。</
20、p><p> **************************************************************************/</p><p> uint8 rcv_data; </p><p> /***************************************************************
21、*******</p><p> ** 函數(shù)名稱 :UART0_Init()</p><p> ** 函數(shù)功能 :初始化串口:設(shè)置工作模式和波特率。</p><p> ** 入口參數(shù) : baud波特率</p><p> ** set模式設(shè)置(UARTMODE數(shù)據(jù)結(jié)構(gòu))</p><p>
22、** 出口參數(shù):返回1表示成功,0表示參數(shù)出錯(cuò)。</p><p> ********************************************************************/</p><p> uint8 UART0_Init (uint32 baud, UARTMODE set)</p><p><b> {<
23、;/b></p><p> uint32 bak;</p><p><b> /* 參數(shù)過(guò)濾*/</b></p><p> if ((0 == baud) || (baud > 115200))return (0);</p><p> if ((set.datab < 5) || (set.d
24、atab > 8))return (0);</p><p> if ((0 == set.stopb) || (set.stopb > 2)) return (0);</p><p> if (set.parity > 4)return (0);</p><p> /* 設(shè)置串口波特率*/</p><p> U0
25、LCR = 0x80;// DLAB=1</p><p> bak = (Fpclk >> 4) / baud;</p><p> U0DLM = bak >> 8;</p><p> U0DLL = bak & 0xff;</p><p> /* 設(shè)置串口模式*/</p><p
26、> bak = set.datab - 5;</p><p> if (2 == set.stopb)bak |= 0x04;</p><p> if (0 != set.parity)</p><p><b> {</b></p><p> set.parity = set.parity - 1;&
27、lt;/p><p> bak |= 0x08;</p><p><b> }</b></p><p> bak |= set.parity << 4;</p><p> U0LCR = bak;</p><p> return (1);</p><p>&
28、lt;b> }</b></p><p> /**********************************************************************</p><p> ** 函數(shù)名稱 :SendByte()</p><p> ** 函數(shù)功能 :向串口UART0發(fā)送字節(jié)數(shù)據(jù),并等待發(fā)送完畢。</p&g
29、t;<p> ** 入口參數(shù) :data要發(fā)送的數(shù)據(jù)</p><p> ** 出口參數(shù) :無(wú)</p><p> ********************************************************************/</p><p> void SendByte (uint8 data)</p>
30、<p><b> {</b></p><p> U0THR = data;</p><p> while ((U0LSR & 0X20) == 0); // 等待數(shù)據(jù)發(fā)送</p><p><b> }</b></p><p> /*****************
31、*****************************************************</p><p> ** 函數(shù)名稱 :PC_DispChar()</p><p> ** 函數(shù)功能 :向PC機(jī)發(fā)送顯示字符。</p><p> ** 入口參數(shù) :no顯示位置</p><p> ** char顯示的字符
32、,不能為ff</p><p> ** 出口參數(shù):無(wú)</p><p> ********************************************************************/</p><p> void PC_DispChar (uint8 no, uint8 chr)</p><p><b&g
33、t; {</b></p><p> SendByte(0xff);</p><p> SendByte(0x81);</p><p> SendByte(no);</p><p> SendByte(chr);</p><p> SendByte(0x00);</p><p&
34、gt;<b> }</b></p><p> uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};</p><p><b> /*</b></p><p> *************************
35、********************************************</p><p> ** 函數(shù)名稱 :SendTimeRtc()</p><p> ** 函數(shù)功能 :讀取RTC的時(shí)間值,并將讀出的時(shí)分秒值通過(guò)串口送到上位機(jī)顯示。</p><p> ** 入口參數(shù) :無(wú)</p><p> ** 出口參數(shù) :無(wú)&l
36、t;/p><p> ********************************************************************/</p><p> void SendTimeRtc (void)</p><p><b> {</b></p><p> uint32 datas;</
37、p><p> uint32 times;</p><p> uint32 bak;</p><p> times = CTIME0; // 讀取完整的時(shí)鐘寄存器</p><p> datas = CTIME1;</p><p> bak = (datas >> 16) &
38、amp; 0xfff; // 獲取 年</p><p> PC_DispChar(0, SHOWTABLE[bak / 1000]);</p><p> bak = bak % 1000;</p><p> PC_DispChar(1, SHOWTABLE[bak / 100]);</p><p> bak = bak %
39、100;</p><p> PC_DispChar(2, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(3, SHOWTABLE[bak % 10]);</p><p> bak = (datas >> 8) & 0x0f; // 獲取 月</p><p> PC_
40、DispChar(4, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(5, SHOWTABLE[bak % 10]);</p><p> bak = datas & 0x1f; // 獲取 日</p><p> PC_DispChar(6, SHOWTABLE[bak / 10]);</p>
41、;<p> PC_DispChar(7, SHOWTABLE[bak % 10]);</p><p> bak = (times >> 24) & 0x07; // 獲取 星期</p><p> PC_DispChar(8, SHOWTABLE[bak]);</p><p> bak = (times >>
42、; 16) & 0x1f; // 獲取 小時(shí)</p><p> PC_DispChar(9, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(10, SHOWTABLE[bak % 10]);</p><p> bak = (times >> 8) & 0x3f; // 獲取 分
43、鐘</p><p> PC_DispChar(11, SHOWTABLE[bak / 10]);</p><p> PC_DispChar(12, SHOWTABLE[bak % 10]);</p><p> bak = times & 0x3f; // 獲取 秒鐘</p><p> PC_DispChar(13,
44、 SHOWTABLE[bak / 10]);</p><p> PC_DispChar(14, SHOWTABLE[bak % 10]);</p><p><b> }</b></p><p> /**********************************************************************&
45、lt;/p><p> ** 函數(shù)名稱 :RTCInit()</p><p> ** 函數(shù)功能 :初始化實(shí)時(shí)時(shí)鐘</p><p> ** 入口參數(shù) :無(wú)</p><p> ** 出口參數(shù) :無(wú)</p><p> ****************************************************
46、****************/</p><p> void RTCInit (void)</p><p><b> {</b></p><p> PREINT = Fpclk / 32768 - 1; // 設(shè)置基準(zhǔn)時(shí)鐘分頻器</p><p> PREFRAC = Fpclk - (Fpclk / 3
47、2768) * 32768;</p><p> CCR = 0x00; // 禁止時(shí)間計(jì)數(shù)器 </p><p> YEAR = 2009; //設(shè)置時(shí)鐘初值</p><p> MONTH = 5;</p><p> DOM = 11;</p>
48、<p> DOW = 1; </p><p> HOUR = 15;</p><p> MIN = 23;</p><p> SEC = 30;</p><p> CIIR = 0x01; // 設(shè)置秒值的增量產(chǎn)生一次中斷</p><p>
49、; ILR = 0x03;// 清除RTC增量和報(bào)警中斷標(biāo)志</p><p> CCR = 0x01; // 啟動(dòng)RTC</p><p><b> }</b></p><p> /*************************************************************
50、*********</p><p> ** 函數(shù)名稱 :IRQ_UART0()</p><p> ** 函數(shù)功能 :串口0接收中斷服務(wù)程序</p><p> ** 入口參數(shù) :無(wú)</p><p> ** 出口參數(shù) :無(wú)</p><p> ************************************
51、********************************/</p><p> void __irq IRQ_UART0 (void)</p><p><b> {</b></p><p><b> uint8 i;</b></p><p> if ((U0IIR & 0x0F
52、) == 0x04)</p><p> rcv_new = 1; // 設(shè)置接收到新的數(shù)據(jù)標(biāo)志</p><p> for (i=0; i<14; i++)</p><p><b> {</b></p><p> rcv_buf[i] = U0RBR; // 讀取FIFO的數(shù)據(jù),并
53、清除中斷</p><p><b> }</b></p><p> /*再次初始化時(shí)鐘*/</p><p> CCR = 0x00; // 禁止時(shí)間計(jì)數(shù)器</p><p> YEAR =(rcv_buf[0]-0x30)*1000+(rcv_buf[1]-0x30)*100+
54、(rcv_buf[2]-0x30)*10+(rcv_buf[3]-0x30);</p><p> MONTH =(rcv_buf[4]-0x30)*10+(rcv_buf[5]-0x30); </p><p> DOM =(rcv_buf[6]-0x30)*10+(rcv_buf[7]-0x30
55、); </p><p> DOW =(rcv_buf[8]-0x30); </p><p> HOUR =(rcv_buf[9]-0x30)*10+(rcv_buf[1]-0x30); </p>
56、<p> MIN =(rcv_buf[11]-0x30)*10+(rcv_buf[3]-0x30); </p><p> SEC =(rcv_buf[13]-0x30)*10+(rcv_buf[5]-0x30); </p
57、><p> CIIR = 0x01; // 設(shè)置秒值的增量產(chǎn)生1次中斷</p><p> CCR = 0x01; // 啟動(dòng)RTC</p><p> VICVectAddr = 0x00; // 中斷處理結(jié)束</p><p><b> }</b&
58、gt;</p><p> /**********************************************************************</p><p> ** 函數(shù)名稱 :SET_TIME()</p><p> ** 函數(shù)功能 :設(shè)置時(shí)間</p><p> ** 入口參數(shù) :無(wú)</p>
59、<p> ** 出口參數(shù) :無(wú)</p><p> ********************************************************************/</p><p> void SET_TIME (void)</p><p> { </p><p> while (
60、(IO0PIN & key1) == 0) // 等待發(fā)送信號(hào)</p><p><b> { </b></p><p> DelayNS(2);</p><p> if ((IO0PIN & key1) == 0)</p><p><b> { <
61、;/b></p><p> YEAR=YEAR+1;</p><p> time[0,1,2,3]=YEAR;</p><p> loop1: while ((IO0PIN & key1) != 0);</p><p> DelayNS(2);</p><p> if ((IO0PIN &am
62、p; key1) == 0) goto loop1; // 等待按鍵恢復(fù)</p><p><b> }</b></p><p><b> } </b></p><p> while ((IO0PIN & key2) == 0) // 等待發(fā)送信號(hào)</p&g
63、t;<p><b> { </b></p><p> DelayNS(2);</p><p> if ((IO0PIN & key2) == 0)</p><p><b> { </b></p><p> if(MONTH>11)</p><
64、p><b> MONTH=1;</b></p><p> else MONTH=MONTH+1;</p><p> time[4,5]=MONTH;</p><p> loop2: while ((IO0PIN & key2) != 0);</p><p> DelayNS(1);</p
65、><p> if ((IO0PIN & key2) == 0) goto loop2; // 等待按鍵恢復(fù)</p><p><b> }</b></p><p> } </p><p> while ((IO0PIN & key3) == 0)
66、 // 等待發(fā)送信號(hào)</p><p><b> { </b></p><p> DelayNS(2);</p><p> if ((IO0PIN & key3) == 0)</p><p><b> { </b></p><p> if(DOM&
67、gt;29)</p><p><b> DOM=0;</b></p><p><b> else</b></p><p> DOM=DOM+1;</p><p> time[6,7]=DOM;</p><p> loop3: while ((IO0PIN &
68、; key3) != 0);</p><p> DelayNS(1);</p><p> if ((IO0PIN & key3) == 0) goto loop3; // 等待按鍵恢復(fù)</p><p><b> }</b></p><p><b> } </b></
69、p><p> while ((IO0PIN & key4) == 0) // 等待發(fā)送信號(hào)</p><p><b> { </b></p><p> DelayNS(2);</p><p> if ((IO0PIN & key4) == 0)</p>
70、<p><b> { </b></p><p><b> if(DOW>5)</b></p><p><b> DOW=0;</b></p><p><b> else</b></p><p> DOW=DOW+1;</p&
71、gt;<p> time[8]=DOW;</p><p> loop4: while ((IO0PIN & key4) != 0);</p><p> DelayNS(2);</p><p> if ((IO0PIN & key4) == 0) goto loop4; // 等待按鍵恢復(fù)</p><
72、p><b> }</b></p><p><b> } </b></p><p> while ((IO0PIN & key5) == 0) // 等待發(fā)送信號(hào)</p><p><b> { </b></p><p&g
73、t; DelayNS(2);</p><p> if ((IO0PIN & key5) == 0)</p><p><b> { </b></p><p> if(HOUR>22)</p><p><b> HOUR=0;</b></p><p>&l
74、t;b> else</b></p><p> HOUR=HOUR+1;</p><p> time[9,10]=HOUR;</p><p> loop5: while ((IO0PIN & key5) != 0);</p><p> DelayNS(2);</p><p> if
75、 ((IO0PIN & key5) == 0) goto loop5; // 等待按鍵恢復(fù)</p><p><b> }</b></p><p><b> }</b></p><p> while ((IO0PIN & key6) == 0) // 等待發(fā)送
76、信號(hào)</p><p><b> { </b></p><p> DelayNS(2);</p><p> if ((IO0PIN & key6) == 0)</p><p><b> { </b></p><p> if(MIN>58)</p&g
77、t;<p><b> MIN=0;</b></p><p><b> else</b></p><p> MIN=MIN+1;</p><p> time[11,12]=MIN;</p><p> loop6: while ((IO0PIN & key6) != 0
78、);</p><p> DelayNS(2);</p><p> if ((IO0PIN & key6) == 0) goto loop6; // 等待按鍵恢復(fù)</p><p><b> }</b></p><p><b> }</b></p><p&g
79、t;<b> }</b></p><p> /************************************************************************ 函數(shù)名稱 :main()</p><p> ** 函數(shù)功能 :讀取實(shí)時(shí)時(shí)鐘的值,通過(guò)串口發(fā)送出去。</p><p> **************
80、******************************************************/</p><p> int main (void)</p><p> { uint8 i; </p><p> UARTMODE uart0_set;</p><p> PINSEL0 = 0x00000005;
81、 // 連接IO到串口UART0</p><p> PINSEL1 = 0x00000000;</p><p> PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]連接GPIO</p><p> //PINSEL1 = 0x00005500; // 設(shè)置S
82、PI管腳連接</p><p> //PINSEL2 = 0x00000000;</p><p> IODIR = HC595_CS;</p><p> uart0_set.datab = 8;</p><p> uart0_set.stopb = 1;</p><p> uart0_set.parity =
83、0;</p><p> UART0_Init(115200, uart0_set);</p><p> U0FCR = 0xc1;// 使能FIFO,并設(shè)置觸發(fā)點(diǎn)為8字節(jié)</p><p> U0IER = 0x01;// 允許RBR中斷,即接收中斷</p><p> MSPI_Init();</p>
84、<p> RTCInit();</p><p> IRQEnable();// 使能IRQ中斷</p><p> /* 使能UART0中斷 */</p><p> VICIntSelect = 0x00000000;// 設(shè)置所有的通道為IRQ中斷</p><p> VICVectCntl0 = 0x
85、20 | 0x06;// UART0分配到IRQ slot0,即最高優(yōu)先級(jí)</p><p> VICVectAddr0 = (uint32)IRQ_UART0;// 設(shè)置UART0向量地址</p><p> VICIntEnable = 1 << 0x06;// 使能UART0中斷</p><p><b> while (1
86、)</b></p><p><b> {</b></p><p> while (0 == (ILR & 0x01)); // 等待RTC增量中斷</p><p> ILR = 0x01;</p><p> for(i=1; i<8; i++)</p><p
87、> {if(DOW==i)</p><p> rcv_data = MSPI_SendData(DISP_TAB[i]);// 發(fā)送顯示數(shù)據(jù)</p><p> } // 清除中斷標(biāo)志</p><p> SET_TIME();</p><p> SendTimeRtc();<
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能萬(wàn)年歷時(shí)鐘電路-電路cad課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)--萬(wàn)年歷電子時(shí)鐘
- 課程設(shè)計(jì)--基于arm7的可調(diào)、準(zhǔn)點(diǎn)報(bào)時(shí)萬(wàn)年歷
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)(論文)數(shù)字萬(wàn)年歷時(shí)鐘電路的設(shè)計(jì)
- 數(shù)字萬(wàn)年歷課程設(shè)計(jì)
- java課程設(shè)計(jì)--萬(wàn)年歷
- java萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì)報(bào)告
- 萬(wàn)年歷課程設(shè)計(jì)論文
- 課程設(shè)計(jì)-萬(wàn)年歷系統(tǒng)
- 萬(wàn)年歷課程設(shè)計(jì)報(bào)告
- 數(shù)碼萬(wàn)年歷課程設(shè)計(jì)
- 萬(wàn)年歷課程設(shè)計(jì).doc
評(píng)論
0/150
提交評(píng)論