51单片机1602LCD显示数字频率计;硬件连接: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.7LCD_RS BIT P2.0LCD_RW BIT P2.1LCD_EN BIT P2.2LCD_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 0000HJMP MAIN ;主程序开始ORG 000BHJMP TIMER_INT ;定时器T0中断服务程序ORG 001BH ;定时器T1中断服务程序JMP TIMER1ORG 0030H;----------------------------------------------------------MAIN:MOV SP,#60H ;设置SP指针LCALL PRO_SET ;初始化CALL SET_LCDLCALL TIM_T0;-----------------------------------------------------------;LCD1602是慢速显示器件,故100MS显示一次。
;-----------------------------------------------------------MAIN1:MOV R5,40MAIN2:ACALL DELAY1 ;3msDJNZ R5,MAIN2ACALL SBIN_SBCDCALL CONVJMP MAIN1;------------------------------------------------------------;T1计数器中断服务子程序;计T1计数器溢出次数;------------------------------------------------------------TIMER1:INC 2AHRETI;------------------------------------------------------------;初始化程序;------------------------------------------------------------PRO_SET: MOV A,#00HMOV B,#00HMOV 2AH,AMOV P0,#0FFHMOV P1,#0FFHMOV P2,#0FFHMOV INT_H,#00HMOV INT_L,#00HMOV INT_G,#00HMOV T_S,#00HMOV T_H,#00HMOV T_G,#00HMOV TIMCOUNT,#00HMOV TIMER_H,#04CH ;定时50 MSMOV TIMER_L,#10H ;CLR BEEPSETB P3.5 ;P3.5端口置输入状态RET ;T1(TIMER1的外部输入脚);-----------------------------------------------------;LCD 初始化设置;-----------------------------------------------------SET_LCD:CLR LCD_ENCALL INIT_LCD ;初始化LCDCALL DELAY1MOV DPTR,#INFO1 ;指针指到显示信息1MOV A,#1 ;显示在第一行CALL LCD_SHOWMOV DPTR,#INFO2 ;指针指到显示信息2MOV A,#2 ;显示在第二行CALL LCD_SHOWRET;-----------------------------------------------------INFO1: DB " CYMOMETER ",0 ;LCD 第一行显示信息INFO2: DB "FREQ: HZ ",0 ;LCD 第二行显示信息;-----------------------------------------------------;LCD 接口初始化;8位I/O控制;-----------------------------------------------------INIT_LCD:MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#38H ;双列显示,字形5*7点阵CALL WCOMCALL DELAY1MOV A,#0CH ;开显示,关光标,CALL WCOMCALL DELAY1MOV A,#01H ;清除LCD 显示屏CALL WCOMRET;----------------------------------------------------LCD_SHOW: ;在LCD的第一行或第二行显示信息字符CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#0C0H ;设置LCD 的第二行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码RETLC1: CALL WDATA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;---------------------------------------------------CLR_LINE: ;清除该行LCD 的字符MOV R0,#24CL1: MOV A,#’ ’CALL WDATADJNZ R0,CL1RET;-----------------------------------------------------; 写指令、数据使能子程序;-----------------------------------------------------ENABLE: ;写指令使能CLR LCD_RS ;RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲CLR LCD_RWSETB LCD_ENCALL DELAY0CLR LCD_ENRETENABLE1: ;写数据使能SETB LCD_RS ;RS=H,RW=L,D0-D7=数据,E=高脉冲SETB LCD_ENCALL DELAY0CLR LCD_ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET;----------------------------------------------------;写入命令子程序;----------------------------------------------------WCOM: ;以8位控制方式将命令写至LCD MOV P0,A ;写入命令CALL ENABLERET;----------------------------------------------------;写入数据子程序;----------------------------------------------------WDATA: ;以8位控制方式将数据写至LCD MOV P0,A ;写入数据CALL ENABLE1RET;---------------------------------------------------;在LCD 第二行显示字符;A=ASC DATA, B=LINE X POS;---------------------------------------------------LCDP2: ;在LCD的第二行显示字符PUSH ACC ;MOV A,B ;设置显示地址ADD A,#0C0H ;设置LCD的第二行地址CALL WCOM ;写入命令POP ACC ;由堆栈取出ACALL WDATA ;写入数据RET;-------------------------------------------------------;ASCII 转换并在第二行显示数字子程序;-------------------------------------------------------CONV: ; MOV A,T_GMOV LCD_X,#6 ;设置位置; CALL SHOW_DIG2MOV 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,#16DIV ABADD A,#30HPUSH BMOV B,LCD_XCALL LCDP2POP BMOV A,BADD A,#30HINC LCD_XMOV B,LCD_XCALL LCDP2RET;-----------------------------------------------------DELAY1: ;延时3MSMOV R6,#15D2: MOV R7,#100DJNZ R7,$DJNZ R6,D2RET; ----------------- 定时器设置------------------------;设置定时器0工作在定时方式1,定时器1工作在计数方式1;---------------------------------------------------------TIM_T0: MOV TMOD,#0D1HMOV TH0,TIMER_H ;设置定时初值高位MOV TL0,TIMER_L ;设置定时初值低位MOV TH1,#00H ;清T1计数器MOV TL1,#00HMOV IE,#8AH ;开中断总允许,允许T0溢出中断SETB PT1SETB TR1SETB 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 ;关闭计数器T1MOV TIMCOUNT,#00H ;到1S则清零MOV INT_L,TL1 ;取出计数值低位MOV INT_H,TH1 ;取出计数值高位MOV INT_G,2AH ;取出溢出计数值位MOV TH1,#00HMOV TL1,#00HMOV 2AH,#00HSETB TR1T_END: SETB TR0 ;重新开始定时操作RETI;---------------------------------------------------------------;三字节二进制整数转换成四字节BCD码子程序;二进制数从低位到高位分别存放在INT_L、INT_H、INT_G单元中;BCD码从低位到高位分别存放在T_S、T_M、T_H、T_G 单元中;---------------------------------------------------------------SBIN_SBCD:PUSH PSWSETB PSW.3 ;设置当前寄存器CLR PSW.4CLR A ;清累加器MOV T_G,AMOV T_H,A ;清除出口单元,准备转换MOV T_M,AMOV T_S,AMOV R5,INT_GMOV R7,INT_L ;设置二进制数起始地址MOV R6,INT_HMOV R2,#24CLR CHH1:MOV A,R7RLC AMOV R7,AMOV A,R6RLC AMOV R6,AMOV A,R5RLC AMOV R5,AMOV 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 AMOV T_H,A ;保存MOV A,T_G ;得到第四位ADDC A,T_G ;累加;DA AMOV T_G,ADJNZ R2,HH1 ;POP PSWRET;----------------------------------------------------------------END ;告诉编译器本程序到此结束。