單片機計時秒表程序方案設計書_第1頁
單片機計時秒表程序方案設計書_第2頁
單片機計時秒表程序方案設計書_第3頁
單片機計時秒表程序方案設計書_第4頁
單片機計時秒表程序方案設計書_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、pic 單片機計時秒表程序設計 (時鐘顯示范圍 00.00 99.99 秒,分辨度為0.01 秒 )作者:來源:本站原創(chuàng)點擊數(shù):1676 更新時間: 2008 年 07 月 12 日/ 此程序實現(xiàn)計時秒表功能,時鐘顯示范圍00.00 99.99 秒,分辨度 :0.01 秒#include "p18f458.h"unsigned char s4 。 /定義 0.01 秒、 0.1 秒、 1 秒、 10 秒計時器unsigned char k, data, sreg。unsigned int i 。const table11=0xc0 , 0xf9 , 0xa4, 0xb0,

2、0x99, 0x92, 0x82, 0XD8 , 0x80,0x90 。/不帶小數(shù)點的顯示段碼表const table010=0X40 , 0X79 , 0X24 , 0X30 , 0X19 , 0X12 , 0X02 ,0X78 , 0X00 , 0X10 。/帶小數(shù)點的顯示段碼表void clkint(void) 。/TMR0 初始化子程序void tmint()T0CON=0XCF 。 /設定 TMR0L 工作于 8 位定時器方式/內部時鐘, TMR0 不用分頻INTCON=0X20 。 /總中斷禁止,TMR0 中斷允許,清除TMR0 的中斷標志INTCON2bits.TMR0IP=1。

3、 /TMR0 中斷高優(yōu)先級RCONbits.IPEN=1 。 /使能中斷優(yōu)先級/系統(tǒng)其它部分初始化子程序void initial()TRISA=0x00 。 /A 口設置為輸出TRISB=0XF0 。 /RB1 輸出, RB4 輸入TRISC=0x00 。 /SDO 引腳為輸出, SCK 引腳為輸出TRISE=0x00 。 /E 口設置為輸出SSPCON1=0x30 。 /SSPEN=1 。 CKP=1 , FOSC/4SSPSTAT=0xC0 。 /時鐘下降沿發(fā)送數(shù)據(jù)PIR1=0 。 /清除 SSPIF 標志data=0X00 。 /待顯示的寄存器賦初值PORTBbits.RB1=0 。PO

4、RTAbits.RA3=0 。PORTE=0。 /將 K1 ,K2 ,K3 , K4 四條列線置0/SPI 傳輸數(shù)據(jù)子程序void SPILED(char data)SSPBUF=data。 /啟動發(fā)送do。while(PIR1bits.SSPIF=0)。PIR1bits.SSPIF=0 。/顯示子程序,顯示4 位數(shù)void dispaly()PORTAbits.RA5=0 。 /準備鎖存for(k=0 。 k<4。 k+)data=sk 。if(k=2) data=table0data 。 /個位需要顯示小數(shù)點else data=tabledata。SPILED(data) 。 /發(fā)送

5、顯示段碼for(k=0 。 k<4。 k+)data=0xFF。SPILED(data) 。 /連續(xù)發(fā)送4 個 DARK ,使顯示好看一些PORTAbits.RA5=1 。 /最后給鎖存信號,代表顯示任務完成/軟件延時子程序void DELAY()for(i = 3553 。 -i 。 )continue。/鍵掃描子程序void KEYSCAN()while(1)dispaly() 。 /調用一次顯示子程序while(PORTBbits.RB4=0)DELAY() 。 /若有鍵按下,則軟件延時break。if (PORTBbits.RB4=0) break 。 /若還有鍵按下,則終止循環(huán)

6、掃描,返回/等鍵松開子程序void keyrelax()while(1)dispaly() 。 /調用一次顯示子程序if (PORTBbits.RB4=1) break 。 /為防止按鍵過于靈敏,每次等鍵松開才返回/* 高優(yōu)先級中斷向量*/#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void)_asmgoto clkint / 跳到中斷程序_endasm/中斷服務程序#pragma code#pragma interrupt clkintvoid clkint()TMR0=0X13 。 /對 TMR0寫入一個調整

7、值。因為寫入TMR0后接著的/兩個周期不能增量,中斷需要3 個周期的響應時間,/以及 C 語言自動進行現(xiàn)場保護要消耗周期INTCONbits.T0IF=0 。 /清除中斷標志sreg=sreg+1。 /中斷計數(shù)器加1if(sreg=40) / 中斷次數(shù)為40 后,才對S0, S1, S2, S3 操作sreg=0。s0=s0+1 。if(s0=10)s0=0 。s1=s1+1 。if(s1=10)s1=0 。s2=s2+1 。if(s2=10)s2=0 。s3=s3+1 。if(s3=10) s3=0 。/主程序提供此單片機程序有問題請聯(lián)系main()tmint() 。 /TMR0 初始化in

8、itial() 。 /spi 顯示初始化及系統(tǒng)其它部分初始化INTCONbits.GIE=0 。 /總中斷禁止while(1)for(k=0 。 k<4。 k+)sk=0 。sreg=0。 /賦顯示初值dispaly() 。 /調用一次顯示子程序KEYSCAN() 。 /鍵掃描,直到開始鍵按下keyrelax() 。 /等鍵松開INTCONbits.GIE=1 。 /總中斷允許KEYSCAN() 。 /鍵掃描直到停止鍵按下,在鍵掃描時有顯示keyrelax() 。 /等鍵松開INTCONbits.GIE=0 。 /總中斷禁止KEYSCAN() 。 /鍵掃描到清0 鍵按下,在鍵掃描時有顯示

9、keyrelax() 。 /等鍵松開-匯編語言版本的pic 單片機計時秒表程序設計-。此程序實現(xiàn)計時秒表功能。時鐘顯示范圍:00.00 秒 -99.99 秒,分辨度: 0.01 秒。通過按鍵來啟動計時、停止計時及清0。即第一次按下任意鍵開始計時,第二次按下任意鍵停止計時。第三次按下任意鍵使LED清 0,等待下一次計時開始LIST P=18F458INCLUDE "P18F458.INC"S0 EQU 0X20 。 0.01 秒計時器S1 EQU S0+1 。 0.1 秒計時器S2 EQU S0+2 。 1 秒計時器S3 EQU S0+3 。 10 秒計時器XW_TEMP E

10、QU S0+6。用于中斷中保護W 的值XHOSTS EQU S0+7 。用于中斷中保護STATUS 的值DEYH EQU S0+8DEYL EQU S0+9。以上兩個寄存器用于軟件延時HOSTF EQU S0+0A 。用于中斷中保護FSR0L 的值TEMP EQU S0+0B 。用于存放臨時值ORG 0X00GOTO MAINORG 0X08GOTO CLKINT。轉向中斷服務程序ORG 0X30。數(shù)字到段碼的轉換子程序 (最好放在程序開頭,避免超過2K 的空間發(fā)生跨頁讀表 )。*不帶小數(shù)點的共陽極碼表 *CONVERT ADDWF PCL , 1RETLW 0XC0 。 0,顯示段碼與具體的

11、硬件連接有關RETLW 0XF9 。 1RETLW 0XA4。 2RETLW 0XB0。 3RETLW 0X99 。 4RETLW 0X92。 5RETLW 0X82。 6RETLW 0XD8。 7RETLW 0X80。 8RETLW 0X90 。 9RETLW 0X88 。 ARETLW 0X83 。 BRETLW 0XC6 。 CRETLW 0XA1。 DRETLW 0X86 。 ERETLW 0X8E 。 FRETLW 0X7F 。 "."RETLW 0XBF。"-"RETLW 0X89 。 HRETLW 0XFF 。 DARKRETURN。 *

12、帶小數(shù)點的共陽極碼表 *CONVERT2 ADDWF PCL,1RETLW 0X40 。 0RETLW 0X79 。 1RETLW 0X24 。 2RETLW 0X30 。 3RETLW 0X19 。 4RETLW 0X12 。 5RETLW 0X02 。 6RETLW 0X78 。 7RETLW 0X00 。 8RETLW 0X10 。 9RETURN。*SPI發(fā)送顯示子模塊*TRANSMITCLRF PORTA 。 LACK 送低電平,為鎖存做準備MOVWF SSPBUF。啟動發(fā)送WAIT NOPBTFSS PIR1 , SSPIFGOTO WAIT 。等待發(fā)送結束BCF PIR1 ,SS

13、PIF 。清除中斷標志RETURN。 *顯示子程序模塊 *DISPLAYMOVLW 0X01MOVWF LEDFMOVLW 0XA0MOVWF FSR0LAGAINXIANMOVF LEDF , WSUBLW 0X03BTFSS STATUS , ZGOTO XIANBMOVF INDF0 , WCALL CONVERT2。若是個位,則查帶小數(shù)點的碼表GOTO TRANXIANB MOVF INDF0, WCALL CONVERTTRAN CALL TRANSMIT。發(fā)送一個顯示數(shù)據(jù)INCF FSR0LINCF LEDFMOVF LEDF , WSUBLW 0X05BTFSS STATUS ,

14、 ZGOTO AGAINXIANMOVLW 0X01MOVWF LEDFXIANDARKMOVLW 0X27CALL CONVERTCALL TRANSMITINCF LEDFMOVF LEDF , WSUBLW 0X05BTFSS STATUS , ZGOTO XIANDARK。顯示 4 個 "DARK"BSF PORTA , 5 。最后給一個鎖存信號,代表一次顯示任務完成RETURN。* S0計數(shù)溢出處理子程序*CS0CLRF S0INCF S1RETURN。* S1計數(shù)溢出處理子程序*CS1CLRF S1INCF S2RETURN。* S2計數(shù)溢出處理子程序*CS2C

15、LRF S2INCF S3RETURN。* S3計數(shù)溢出處理子程序*CS3CLRF S3RETURN。 *時鐘中斷服務程序 *CLKINTMOVWF XW_TEMP。保存 W 的值SWAPF STATUS , WMOVWF XHOSTS。暫存 STATUS 的值MOVF FSR0L , WMOVWF HOSTF 。保存 FSR0L 的值。以上程序為中斷現(xiàn)場保護 MOVLW 0X13MOVWF TMR0L。對 TMR0L 寫入一個調整值,因為寫入。TMR0L 后接著的兩個周期不能增量BCF INTCON , T0IF 。清除中斷標志INCF SREGMOVF SREG , WSUBLW 0X28

16、 。 TMR0L 每 250us 中斷一次BTFSS STATUS , Z。其中斷40 次后才執(zhí)行對S0 S1 S2 S3 的操作GOTO TIFANCLRF SREGINCF S0MOVF S0 ,WSUBLW 0X0ABTFSC STATUS , ZCALL CS0MOVF S1 ,WSUBLW 0X0ABTFSC STATUS , ZCALL CS1MOVF S2 ,WSUBLW 0X0ABTFSC STATUS , ZCALL CS2MOVF S3 ,WSUBLW 0X0ABTFSC STATUS , ZCALL CS3TIFANMOVF HOSTF , W 。以下為中斷現(xiàn)場恢復MOV

17、WF FSR0L?;謴烷g接尋址指針FSR0L 的值SWAPF XHOSTS ,WMOVWF STATUS?;謴?STATUS 的值SWAPF XW_TEMP , 1SWAPF XW_TEMP , W ?;謴?W 的值RETFIE。 * TMR0初始化子程序 *CLKINSUBMOVLW 0XCFMOVWF T0CON。設定 TMR0L 工作于 8 位定時器方式。內部時鐘, TMR0 不用分頻BCF INTCON , TMR0IF 。清除 TMR0 的中斷標志BCF INTCON , GIE ??傊袛嘟笲SF INTCON , TMR0IE 。TMR0 中斷允許BSF INTCON2 , 2

18、。TMR0 中斷高優(yōu)先級BSF RCON , 7 。使能中斷優(yōu)先級RETURN。*系統(tǒng)初始化子程序*MAINSUBBCF TRISA ,5 。置 RA5 為輸出方式,以輸出鎖存信號BCF TRISB ,1BCF TRISA ,3BCF TRISE , 0BCF TRISE , 1BSF TRISB , 4 。設置與鍵盤有關的各口的輸入輸出方式BCF TRISC ,5BCF TRISC ,3 。設置 SCK 與 SDO 為輸出方式BCF INTCON , GIE 。關閉所有中斷MOVLW 0XC0MOVWF SSPSTAT 。設置 SSPSTAT 寄存器MOVLW 0X30MOVWF SSPCO

19、N1。設置 SPI 的控制方式,允許SSP 方式,。并且時鐘下降沿發(fā)送,與"74HC595當。其SCLK從低到高平跳變時,串行輸入數(shù)據(jù)。(DI) 移入寄存器" 的特點相對應RETURN。返回。*鍵掃描子程序*KEYSCANBCF PORTB , 1BCF PORTA , 3BCF PORTE , 0BCF PORTE , 1 。送低電平至K1 ,K2, K3,K4RETURN。 * 鍵盤去抖子程序 (8ms 的延時 )*KEYDELAYMOVLW 0X0AMOVWF DEYHAGAIN2 MOVLW 0XFFMOVWF DEYLAGAIN1 DECFSZ DEYL, 1GO

20、TO AGAIN1DECFSZ DEYH , 1GOTO AGAIN2。具體程序語句參考3.2節(jié)RETURN。*顯示緩沖區(qū)處理子程序*XIANHUANMOVLW 0XA0MOVWF FSR0LRLNCF S0 , 0MOVWF TEMPINCF TEMP , 0MOVWF INDF0INCF FSR0LRLNCF S1 , 0MOVWF TEMPINCF TEMP , 0MOVWF INDF0INCF FSR0LRLNCF S2 , 0MOVWF TEMPINCF TEMP , 0MOVWF INDF0INCF FSR0LRLNCF S3 , 0MOVWF TEMPINCF TEMP , 0M

21、OVWF INDF0RETURN。 *主程序 *MAIN NOPCALL MAINSUB。系統(tǒng)初始化CALL CLKINSUB。調用時鐘初始化子程序DENJIAN BCF INTCON, GIECLRF S0CLRF S1CLRF S2CLRF S3CLRF SREGCLRF LEDF 。 S0=S1=S2=S3=0CALL XIANHUAN。把 S3、 S2、 S1、 S0 的值裝入顯示緩沖區(qū)CALL DISPLAY。顯示DENAN BCF INTCON, GIE 。關中斷CALL KEYSCAN。進行鍵掃描BTFSS PORTB , 4GOTO XIAODOU1。如起始鍵按下,則消抖動GOTO DENAN。如起始鍵沒按下,則繼續(xù)等待XIAODOU1CALL KEYDELAY。延時消抖動CALL KEYSCAN。再次進行鍵掃描BTFSC PORTB ,4GOTO DENAN。若為干擾,則再次等待鍵按下CLRF S0CLRF S1CLRF S2CLRF S3CLRF SREG 。設置新一次計時的初始條件WAIT

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論