《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > LCD1602液晶顯示頻率計(源程序)-ME300B型 51

LCD1602液晶顯示頻率計(源程序)-ME300B型 51

2008-12-28
關鍵詞: 液晶顯示 頻率計

使用說明:

頻率計:
LCD1602顯示
在不增加外部計數(shù)硬件的情況下,本試驗軟件可測最高頻率達到460KHz

工作原理:

1S 鐘內對輸入脈沖所計數(shù)的次數(shù)則為頻率值。
16位二進制加法計數(shù)器的最大計數(shù)值為 65535。

設置定時器 0 工作在定時方式1,定時1S。
設置定時器 1 工作在計數(shù)方式1,對輸入脈沖進行計數(shù),溢出產(chǎn)生中斷。
將定時器 1中斷定義為優(yōu)先。在中斷處理程序里對中斷次數(shù)進行計數(shù)。1S到后,將中斷次數(shù)和計數(shù)器里的計數(shù)值取出進行綜合數(shù)據(jù)處理,處理后的數(shù)據(jù)送LCD1602顯示。

信號來源:
1、軟件里對 P1.4定時取反,形成輸出脈沖,接到 P3.5 可自測。
2、可用CD4040 芯片對 ALE 信號進行分頻。
ALE 頻率=11059200Hz ÷ 6 = 1843200 Hz
接 CD4040 芯片 Q2 以后的輸出段均可顯示真實的頻率值。
1843200 Hz ÷ 4 = 460800 Hz
    
顯示結果:
P1.4 → P3.5 顯示:
     
  000010   (Hz) 

CD4040-Q2 → P3.5 顯示:
      
  460806   (Hz)

如果有條件的話,可使用專用設備(信號發(fā)生器和頻率計)進行校正。

;******************************************************************
;*                                                                *
;* ME300B單片機開發(fā)系統(tǒng)演示程序-1602LCD顯示數(shù)字頻率計             *
;*                                                                *
;* 郵箱: gguoqing@willar.com                                     *
;* 網(wǎng)站: http://www.willar.com ;                                  *
;* 作者: gguoqing                                                *
;* 時間: 2006/06/03                                              *
;*                                                                *
;*【版權】COPYRIGHT(C)偉納電子 www.willar.com ALL RIGHTS RESERVED *
;*【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息!      *
;*                                                                *
;******************************************************************


;------------------------------------------------------------
;頻率計的程序
;包含:外部中斷設置,中斷服務程序,定時程序,定時服務程序
;以及數(shù)據(jù)處理,顯示,包括 三位十進制數(shù)轉化為四位BCD碼,
;
;------------------------------------------------------------
        BEEP    BIT  P3.7
        LCD_RS  BIT  P2.0
        LCD_RW  BIT  P2.1
        LCD_EN  BIT  P2.2
        LCD_X   EQU  3FH        ;LCD 地址變量

        TIMER_H   EQU   30H    ;定時器高位字節(jié)單元
        TIMER_L   EQU   31H    ;定時器低位字節(jié)單元
        TIMCOUNT  EQU   32H    ;時間中斷數(shù)


        INT_G     EQU   35H    ;中斷計數(shù)緩沖單元高地址
      INT_H     EQU   34H    ;中斷計數(shù)緩沖單元中地址
      INT_L     EQU   33H    ;中斷計數(shù)緩沖單元低地址


        T_S       EQU   36H    ;數(shù)據(jù)顯示低位
        T_M       EQU   37H    ;數(shù)據(jù)顯示中位
        T_H       EQU   38H    ;數(shù)據(jù)顯示高位
        T_G       EQU   39H    ;數(shù)據(jù)顯示最高位

;----------------------------------------------------------
              ORG 0000H
              JMP MAIN            ;主程序開始
              ORG 000BH
              JMP TIMER_INT        ;定時器T0中斷服務程序
              ORG  001BH           ;定時器T1中斷服務程序
              JMP  TIMER1
              ORG  0030H
;----------------------------------------------------------
   MAIN:
            MOV  SP,#60H          ;設置SP指針
            LCALL PRO_SET         ;初始化
            CALL  SET_LCD
            LCALL TIM_T0
;-----------------------------------------------------------
;LCD1602是慢速顯示器件,故100MS顯示一次。
;-----------------------------------------------------------
MAIN1:
            MOV  R5,40
MAIN2:
            ACALL  DELAY1    ;3ms
            DJNZ  R5,MAIN2
            ACALL  SBIN_SBCD
            CALL  CONV
            JMP MAIN1
;------------------------------------------------------------
;T1計數(shù)器中斷服務子程序
;計T1計數(shù)器溢出次數(shù)
;------------------------------------------------------------
TIMER1:
            INC  2AH
            RETI
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
PRO_SET:  MOV A,#00H
          MOV B,#00H
          MOV  2AH,A
          MOV P0,#0FFH
          MOV P1,#0FFH
          MOV P2,#0FFH
          MOV INT_H,#00H
          MOV INT_L,#00H
          MOV  INT_G,#00H
          MOV  T_S,#00H
          MOV  T_H,#00H
          MOV  T_M,#00H
          MOV  T_G,#00H
          MOV TIMCOUNT,#00H
          MOV TIMER_H,#04CH      ;定時 50 MS
          MOV TIMER_L,#10H       ;
          CLR BEEP
          SETB  P3.5            ;P3.5端口置輸入狀態(tài)
          RET                   ;T1(TIMER1的外部輸入腳)
;-----------------------------------------------------
;LCD 初始化設置
;-----------------------------------------------------
SET_LCD:
          CLR  LCD_EN
          CALL  INIT_LCD     ;初始化 LCD
          CALL  DELAY1
          MOV  DPTR,#INFO1   ;指針指到顯示信息1
          MOV  A,#1          ;顯示在第一行
          CALL  LCD_SHOW
          MOV  DPTR,#INFO2   ;指針指到顯示信息2
          MOV  A,#2          ;顯示在第二行
          CALL  LCD_SHOW
          RET
;-----------------------------------------------------
INFO1:  DB  "    CYMOMETER   ",0  ;LCD 第一行顯示信息
INFO2:  DB  "FREQ:        HZ ",0  ;LCD 第二行顯示信息
;-----------------------------------------------------
;LCD 接口初始化
;8位I/O控制
;-----------------------------------------------------
INIT_LCD:
          MOV  A,#38H     ;雙列顯示,字形5*7點陣
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;雙列顯示,字形5*7點陣
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;雙列顯示,字形5*7點陣
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#0CH     ;開顯示,關光標,
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#01H     ;清除 LCD 顯示屏
          CALL  WCOM
          CALL  DELAY1
          RET
;----------------------------------------------------
LCD_SHOW:       ;在LCD的第一行或第二行顯示信息字符

          CJNE  A,#1,LINE2  ;判斷是否為第一行
  LINE1:  MOV  A,#80H       ;設置 LCD 的第一行地址
          CALL  WCOM        ;寫入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#80H       ;設置 LCD 的第一行地址
          CALL  WCOM        ;寫入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM        ;寫入命令
          CALL  CLR_LINE    ;清除該行字符數(shù)據(jù)
          MOV  A,#0C0H      ;設置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由消息區(qū)取出字符
          CJNE  A,#0,LC1    ;判斷是否為結束碼
          RET
  LC1:    CALL  WDATA       ;寫入數(shù)據(jù)
          INC  DPTR         ;指針加1
          JMP  FILL         ;繼續(xù)填入字符
          RET
;---------------------------------------------------
CLR_LINE:                  ;清除該行 LCD 的字符
          MOV  R0,#24
   CL1:   MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;-----------------------------------------------------
; 寫指令、數(shù)據(jù)使能子程序
;-----------------------------------------------------
ENABLE:                    ;寫指令使能
          CLR LCD_RS           ;RS=L,LCD_RW=L,D0-D7=指令碼,E=高脈沖
          CLR LCD_RW
          SETB LCD_EN
          CALL  DELAY0
          CLR LCD_EN
          RET
ENABLE1:                  ;寫數(shù)據(jù)使能
          SETB  LCD_RS        ;RS=H,RW=L,D0-D7=數(shù)據(jù),E=高脈沖
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DELAY0
          CLR   LCD_EN
          RET

DELAY0:   MOV  R7,#250      ;延時500微秒
          DJNZ  R7,$
          RET
;----------------------------------------------------
;寫入命令子程序
;----------------------------------------------------
WCOM:                     ;以8位控制方式將命令寫至LCD
          MOV  P0,A       ;寫入命令
          CALL  ENABLE
          RET
;----------------------------------------------------
;寫入數(shù)據(jù)子程序
;----------------------------------------------------
WDATA:                    ;以8位控制方式將數(shù)據(jù)寫至LCD
          MOV  P0,A       ;寫入數(shù)據(jù)
          CALL  ENABLE1
          RET
;---------------------------------------------------
;在 LCD 第二行顯示字符
;A=ASC DATA, B=LINE X POS
;---------------------------------------------------
LCDP2:                    ;在LCD的第二行顯示字符
          PUSH  ACC        ;
          MOV  A,B         ;設置顯示地址
          ADD  A,#0C0H     ;設置LCD的第二行地址
          CALL  WCOM       ;寫入命令
          POP  ACC         ;由堆棧取出A
          CALL  WDATA      ;寫入數(shù)據(jù)
          RET
;-------------------------------------------------------
;ASCII 轉換并在第二行顯示數(shù)字子程序
;-------------------------------------------------------
CONV:    ; MOV  A,T_G
          MOV  LCD_X,#6          ;設置位置
         ; CALL  SHOW_DIG2
          MOV  A,T_H
          ;INC  LCD_X             ;加載小時數(shù)據(jù)
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          MOV  A,T_M         ;加載分鐘數(shù)據(jù)
          INC  LCD_X             ;設置位置
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          MOV  A,T_S        ;加載秒數(shù)數(shù)據(jù)
          INC  LCD_X             ;設置位置
          CALL  SHOW_DIG2    ;顯示數(shù)據(jù)
          RET
;----------------------------------------------------
SHOW_DIG2:
          MOV  B,#16
          DIV  AB
          ADD  A,#30H
          PUSH  B
          MOV  B,LCD_X
          CALL  LCDP2
          POP  B
          MOV  A,B
          ADD  A,#30H
          INC  LCD_X
          MOV  B,LCD_X
          CALL  LCDP2
          RET
;-----------------------------------------------------
DELAY1:                    ;延時3MS
         MOV  R6,#15
  D2:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D2
         RET
; -----------------  定時器設置   ------------------------
;設置定時器0工作在定時方式1,定時器1工作在計數(shù)方式1
;---------------------------------------------------------
TIM_T0:   MOV TMOD,#0D1H
          MOV TH0,TIMER_H        ;設置定時初值高位
          MOV TL0,TIMER_L        ;設置定時初值低位
          MOV  TH1,#00H          ;清T1計數(shù)器
          MOV  TL1,#00H
          MOV  IE,#8AH           ;開中斷總允許,允許T0溢出中斷
          SETB  PT1
          SETB  TR1
          SETB  TR0              ;定時器開始工作
          RET
;--------------------------------------------------------
;定時器0中斷服務程序
;--------------------------------------------------------
TIMER_INT:
         CLR TR0             ;關閉定時器
         MOV TL0,TIMER_L     ;重新賦初值
         MOV TH0,TIMER_H                 ;
         INC TIMCOUNT        ;定時1S,時間單位
         MOV A,TIMCOUNT      ;查看數(shù)量值
         CPL  P1.4           ;產(chǎn)生自測信號
         CJNE A,#20,T_END    ;如果沒有到1S返回

         CLR  TR1            ;關閉計數(shù)器T1
         MOV TIMCOUNT,#00H   ;到1S則清零
         MOV INT_L,TL1       ;取出計數(shù)值低位
         MOV INT_H,TH1       ;取出計數(shù)值高位
         MOV INT_G,2AH       ;取出溢出計數(shù)值位
         MOV  TH1,#00H
         MOV  TL1,#00H
         MOV  2AH,#00H
         SETB  TR1
T_END:   SETB TR0            ;重新開始定時操作
         RETI
;---------------------------------------------------------------
;三字節(jié)二進制整數(shù)轉換成四字節(jié)BCD碼子程序
;二進制數(shù)從低位到高位分別存放在INT_L、INT_H、INT_G單元中
;BCD碼從低位到高位分別存放在T_S、T_M、T_H、T_G 單元中
;---------------------------------------------------------------
 SBIN_SBCD:
              PUSH PSW
              SETB PSW.3       ;設置當前寄存器
              CLR PSW.4

              CLR A            ;清累加器
              MOV T_G,A
              MOV T_H,A        ;清除出口單元,準備轉換
              MOV T_M,A
              MOV T_S,A

              MOV  R5,INT_G
              MOV  R7,INT_L    ;設置二進制數(shù)起始地址
              MOV  R6,INT_H
              MOV  R2,#24
              CLR  C
HH1:
              MOV  A,R7
              RLC  A
              MOV  R7,A

              MOV  A,R6
              RLC  A
              MOV  R6,A

              MOV  A,R5
              RLC  A
              MOV  R5,A

              MOV A,T_S        ;得到低位數(shù)據(jù)
              ADDC A,T_S       ;累加
              DA A             ;十進制調整
              MOV T_S,A        ;保存數(shù)據(jù)

              MOV A,T_M        ;得到第二位數(shù)據(jù)
              ADDC A,T_M       ;累加
              DA A             ;十進制調整
              MOV T_M,A        ;保存結果

              MOV A,T_H        ;得到第三位
              ADDC A,T_H       ;累加
              DA  A
              MOV T_H,A        ;保存

              MOV A,T_G        ;得到第四位
              ADDC A,T_G       ;累加
              ;DA  A
              MOV T_G,A

              DJNZ R2,HH1      ;
              POP  PSW
              RET
;----------------------------------------------------------------
  END     ;告訴編譯器本程序到此結束。
;-----------------------------------------------------------------

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。