历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2018年01月07日 | 51单片机1602LCD显示数字频率计

2018-01-07 来源:eefocus

;硬件连接:1602LCD 显示000000Hz 短接p1.4--p3.5则显示0000010hz               
;LCD1602显示在不增加外部计数硬件的情况下,本试验软件可测最高频率达到460KHz
;工作原理:                          

;1S 钟内对输入脉冲所计数的次数则为频率值。   
;16位二进制加法计数器的最大计数值为 65535。       
;设置定时器 0 工作在定时方式1,定时1S。                           
;设置定时器 1 工作在计数方式1,对输入脉冲进行计数,溢出产生中断。    
;将定时器 1中断定义为优先。在中断处理程序里对中断次数进行计数。1S到后,  
;将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送LCD1602显示? 
;信号来源:                                                       
;1、软件里对 P1.4定时取反,形成输出脉冲,接到 P3.5 可自测。
 ;  显示结果:P1.4 → P3.5 显示:    000010   (Hz)        
;如果有条件的话,可使用专用设备(信号发生器和频率计)进行校正。


;频率计的程序
;包含:外部中断设置,中断服务程序,定时程序,定时服务程序
;以及数据处理,显示,包括 三位十进制数转化为四位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    ;定时器高位字节单元 
        TIMER_L   EQU   31H    ;定时器低位字节单元 
        TIMCOUNT  EQU   32H    ;时间中断数 


        INT_G     EQU   35H    ;中断计数缓冲单元高地址 
         INT_H     EQU   34H    ;中断计数缓冲单元中地址 
         INT_L     EQU   33H    ;中断计数缓冲单元低地址 


        T_S       EQU   36H    ;数据显示低位 
        T_M       EQU   37H    ;数据显示中位 
        T_H       EQU   38H    ;数据显示高位 
        T_G       EQU   39H    ;数据显示最高位 

;---------------------------------------------------------- 
              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计数器中断服务子程序 
;计T1计数器溢出次数 
;------------------------------------------------------------ 
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端口置输入状态 
          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    ;清除该行字符数据 
          MOV  A,#80H       ;设置 LCD 的第一行地址 
          CALL  WCOM        ;写入命令 
          JMP  FILL 
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址 
          CALL  WCOM        ;写入命令 
          CALL  CLR_LINE    ;清除该行字符数据 
          MOV  A,#0C0H      ;设置 LCD 的第二行地址 
          CALL  WCOM 
  FILL:   CLR  A            ;填入字符 
          MOVC  A,@A+DPTR   ;由消息区取出字符 
          CJNE  A,#0,LC1    ;判断是否为结束码 
          RET 
  LC1:    CALL  WDATA       ;写入数据 
          INC  DPTR         ;指针加1 
          JMP  FILL         ;继续填入字符 
          RET 
;--------------------------------------------------- 
CLR_LINE:                  ;清除该行 LCD 的字符 
          MOV  R0,#24 
   CL1:   MOV  A,#’ ’ 
          CALL  WDATA 
          DJNZ  R0,CL1 
          RET 
;----------------------------------------------------- 
; 写指令、数据使能子程序 
;----------------------------------------------------- 
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:                  ;写数据使能 
          SETB  LCD_RS        ;RS=H,RW=L,D0-D7=数据,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 
;---------------------------------------------------- 
;写入数据子程序 
;---------------------------------------------------- 
WDATA:                    ;以8位控制方式将数据写至LCD 
          MOV  P0,A       ;写入数据 
          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      ;写入数据 
          RET 
;------------------------------------------------------- 
;ASCII 转换并在第二行显示数字子程序 
;------------------------------------------------------- 
CONV:    ; MOV  A,T_G 
          MOV  LCD_X,#6          ;设置位置 
         ; CALL  SHOW_DIG2 
          MOV  A,T_H 
          ;INC  LCD_X             ;加载小时数据 
          CALL  SHOW_DIG2    ;显示数据 
          MOV  A,T_M         ;加载分钟数据 
          INC  LCD_X             ;设置位置 
          CALL  SHOW_DIG2    ;显示数据 
          MOV  A,T_S        ;加载秒数数据 
          INC  LCD_X             ;设置位置 
          CALL  SHOW_DIG2    ;显示数据 
          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工作在计数方式1 
;--------------------------------------------------------- 
TIM_T0:   MOV TMOD,#0D1H 
          MOV TH0,TIMER_H        ;设置定时初值高位 
          MOV TL0,TIMER_L        ;设置定时初值低位 
          MOV  TH1,#00H          ;清T1计数器 
          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      ;查看数量值 
         CPL  P1.4           ;产生自测信号 
         CJNE A,#20,T_END    ;如果没有到1S返回 

         CLR  TR1            ;关闭计数器T1 
         MOV TIMCOUNT,#00H   ;到1S则清零 
         MOV INT_L,TL1       ;取出计数值低位 
         MOV INT_H,TH1       ;取出计数值高位 
         MOV INT_G,2AH       ;取出溢出计数值位 
         MOV  TH1,#00H 
         MOV  TL1,#00H 
         MOV  2AH,#00H 
         SETB  TR1 
T_END:   SETB TR0            ;重新开始定时操作 
         RETI 
;--------------------------------------------------------------- 
;三字节二进制整数转换成四字节BCD码子程序 
;二进制数从低位到高位分别存放在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    ;设置二进制数起始地址 
              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        ;得到低位数据 
              ADDC A,T_S       ;累加 
              DA A             ;十进制调整 
              MOV T_S,A        ;保存数据 

              MOV A,T_M        ;得到第二位数据 
              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     ;告诉编译器本程序到此结束。 
;----------------------------------------------------------------- 


推荐阅读

史海拾趣

Gennum ( Semtech )公司的发展小趣事
如果电路不工作,可以逐步断开或替换部分元件,以确定问题所在。
Amveco Toroidal Power Products公司的发展小趣事

品质是企业的生命线。Amveco公司深知这一点,因此始终将品质管理放在企业发展的首位。公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加行业会议等方式提升品牌知名度和美誉度。这些努力使得Amveco公司的环形变压器在市场上树立了良好的品牌形象。

BOOKHAM公司的发展小趣事

随着市场的不断扩大,BOOKHAM公司意识到单打独斗难以取得更大的突破。于是,公司开始积极寻求与其他企业的战略合作。通过与一家知名电子设备制造商的合作,BOOKHAM公司成功将其光学元件产品集成到对方的产品中,共同开拓市场。这种合作不仅提升了BOOKHAM公司的市场份额,还为其带来了更多的商业机会和合作伙伴。

岑科(CENKER)公司的发展小趣事

为了实现更长远的发展,岑科在2004年决定进军生产制造领域。公司在深圳和广西设立了工厂,开始了自主生产制造之路。在这一过程中,岑科严格控制生产流程,灵活配置资源,并建立了严格的质量管理体系,以确保产品的高水平交付。通过自主研发和创新,岑科逐渐在生产制造领域取得了显著的成果,产品线不断扩展,市场份额也逐渐增加。

Elec & Eltek公司的发展小趣事

随着全球对环境保护和可持续发展的重视日益加深,Eltek公司也积极响应这一趋势。在产品研发和生产过程中,Eltek公司始终坚持环保理念,采用环保材料和工艺,减少对环境的影响。同时,Eltek公司还加大了在可再生能源领域的投入力度,积极研发具有更高效率和更低成本的电力电子产品。此外,Eltek公司还积极参与各种环保活动和公益事业,为推动全球可持续发展贡献自己的力量。

以上五个故事虽然是虚构的,但其中所蕴含的发展思路、创新精神和国际化视野是电子行业公司普遍需要关注和借鉴的。希望这些故事能为您提供一些启示和灵感。

Desco Tools公司的发展小趣事

随着技术的不断进步,Desco Tools公司不断进行技术创新和产品升级。公司投入大量研发资源,开发出了更加高效、可靠的防静电工具,如新型防静电工作服、无尘室专用工具等。这些产品不仅满足了市场对防静电工具日益增长的需求,还进一步巩固了公司在该领域的领先地位。

问答坊 | AI 解惑

ARM培训视频-dsp-CPLD-FPGA开发视频-嵌入式系统开发-单片机开发视频

ARM培训视频-dsp-CPLD-FPGA开发视频-嵌入式系统开发-单片机开发视频 ------------------------------------------------------------------ 【ARM培训视频】课程主要内容 1.概念和基本工具: 嵌入式系统基本概念、嵌入式操作系统介绍 嵌入式系 ...…

查看全部问答>

汽车伴我行——京郊另类玩家经典路线、汽车新科技、经典车型大罗列

汽车伴我行 1. 京郊另类玩家经典路线推荐 https://bbs.eeworld.com.cn/thread-2611-1-40.html 2. 智能车赛道记忆算法的研究 https://bbs.eeworld.com.cn/thread-9739-1-18.html 3. 汽车新科技 https://bbs.eeworld.com.cn/thread-7089-1-17.html ...…

查看全部问答>

推荐FPGA+单片机开发板。。。

联华众科FPGA开发板 FA130 北京联华众科科技有限公司 http://www.lianhua-zhongke.com.cn Abstract  摘 要:联华众科FPGA开发板FA130核心器件为 Altera Cyclone系列的EP1C3,配置芯片为EPCS1,FA130上可以运行SOPC Bui ...…

查看全部问答>

STC单片机实现阀值的设置和显示功能, 不知道怎么做.请教大家给个方法!

STC单片机实现阀值的设置和显示功能, 不知道怎么做.请教大家给个方法! 描述:有两个按钮,分别设置阀值的+和-,一个LED用来显示当前设置值.…

查看全部问答>

关于wince5.0 的IE支持flash的问题。

如何让wince5.0的IE支持flash呢?在adobe的网站上找到了用于ppc的flash插件,但不能用于wince, 听说,有人把ppc相应的dll考到了wince里,wince就可以用ppc的软件了,真的可能吗? 还有我的硬件是x86的,能否找到用于x86的ppc系统文件呢(dll), ...…

查看全部问答>

各位高手大虾帮帮忙!关于串口

各位高手大虾,我的开发板上有3个串口,串口1用来调试,串口2没有用,串口3接红外,由于我要加接GPS,又不想占用调试串口,就想把串口2打通, 在BSP中添加了相关代码后,在CE注册表下可以看到串口2,可是接上GPS线却什么反应的都没有,而串口1就可 ...…

查看全部问答>

CE下怎么得到当前进程所占内存呢?

如题,好像CE下不支持GetProcessMemoryInfo()API 还有别的方法可以吗? 我想把当前应用所占内在实时的显示在界面上…

查看全部问答>

同步电路,post_sta和post_sim不同结果,谁碰到过?

post_sta全通过,analysis_coverage分析基本都覆盖了,post_sim报setup违反,谁碰到过类似问题?用的是smic sc-m库   请各位高手支招!…

查看全部问答>

求助!附程序!MSP430F169用I2C控制ADV7183写数据程序调试不成功!!急!!

#include "io430.h" #include "In430.h" int tx_count; volatile unsigned char I2CBuffer[3]; void Init_Port(void) { P1DIR=0xFF; P2DIR=0XFF; P3DIR=0xFF; P4DIR=0xFF; P5DIR=0xFF; P6DIR=0xFF; P1SEL = 0; } void ...…

查看全部问答>