T0用来定时,T1用来对1s内外来高电平计数
目前量程为0~65535Hz
可以通过对程序的些许修改使量程达到0~4,294,967,295Hz
本人现在大三,初学单片机
这是一次课程设计
欢迎各位牛人批评指正,传授经验
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /**************************************************************************************
- * 简易频率仪设计 *
- ***************************************************************************************/
- ORG 00H
- LJMP MAIN
- ORG 0BH
- LJMP T0_INT
- ORG 2000H
- T0COUNT EQU 36H
- LCDW EQU 45H
- LCDQ EQU 46H
- LCDB EQU 40H
- LCDS EQU 41H
- LCDG EQU 42H
- TEMP_L EQU 43H
- TEMP_H EQU 44H
- RS EQU P2.6
- RW EQU P2.5
- E EQU P2.7
- ORG 2000H
- MAIN:
- MOV SP,#60H
- LCALL SET_T
- LCALL INIT_LCD
- LCALL LCDDISP1
- SJMP [ DISCUZ_CODE_1 ]nbsp;
- /*****************************T0,T1设置***********************************************/
- SET_T:
- MOV TMOD,#51H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV TH1,#00H
- MOV TL1,#00H
- SETB EA
- SETB TR0
- SETB TR1
- SETB ET0
- RET
- /*****************************LCD初始化***********************************************/
- INIT_LCD:
- MOV P0,#01H ;清屏
- LCALL LcdWriteCom
- MOV P0,#38H ;功能设置,DB4=1为8位数据接口,DB3=1为双行显示 DB2=0为5*7点阵
- LCALL LcdWriteCom
- MOV P0,#0CH ;显示开关控制,DB2=1为开显示,DB1=1为光标开,DB0=0为字符不闪烁
- LCALL LcdWriteCom
- MOV P0,#06H ;输入方式设置,设置光标的移动方向,并指定整体显示是否移动,DB1=1为增量方式,DB0=0为不以为
- LCALL LcdWriteCom
- RET
- /*****************************LCD第一行显示程序***********************************************/
- LCDDISP1:
- MOV P0,#80H ;第一行的开始位置
- LCALL LcdWriteCom
- MOV DPTR,#TABLE1
- MOV R1,#00H ;显示table中的值
- LOOP1: MOV A,R1 ;到table取码
- MOVC A,@A+DPTR
- LCALL LcdWriteData ;显示到LCD
- INC R1
- CJNE A,#00H,LOOP1 ;是否到00H
- RET
- /*****************************LCD第二行显示程序***********************************************/
- LCDDISP2:
- MOV R3,LCDW
- CJNE R3,#30H,GO_W
- MOV LCDW,#20H
- MOV R3,LCDQ
- CJNE R3,#30H,GO_Q
- MOV LCDQ,#20H
- MOV R3,LCDB
- CJNE R3,#30H,GO_B
- MOV LCDB,#20H
- MOV R3,LCDS
- CJNE R3,#30H,GO_S
- MOV LCDS,#20H
- GO_W:
- MOV P0,#0C3H ;第二行的开始位置
- LCALL LcdWriteCom
- MOV A,LCDW
- LCALL LcdWriteData
- GO_Q:
- MOV P0,#0C4H ;第二行的开始位置
- LCALL LcdWriteCom
- MOV A,LCDQ
- LCALL LcdWriteData
- GO_B:
- MOV P0,#0C5H ;第二行的开始位置
- LCALL LcdWriteCom
- MOV A,LCDB
- LCALL LcdWriteData
- GO_S:
- MOV P0,#0C6H
- LCALL LcdWriteCom
- MOV A,LCDS
- LCALL LcdWriteData
- GO_G:
- MOV P0,#0C7H
- LCALL LcdWriteCom
- MOV A,LCDG
- LCALL LcdWriteData
- MOV P0,#0C8H
- LCALL LcdWriteCom
- MOV DPTR,#TABLE2
- MOV R1,#00H ;显示table中的值
- LOOP2: MOV A,R1 ;到table取码
- MOVC A,@A+DPTR
- LCALL LcdWriteData ;显示到LCD
- INC R1
- CJNE A,#00H,LOOP2 ;是否到00H
- RET
-
- /*****************************LCD写入命令***********************************************/
- LcdWriteCom:
- CLR RS
- CLR RW
- CLR E
- LCALL DELAY
- SETB E
- RET
- /*****************************LCD写入数据***********************************************/
- LcdWriteData:
-
- MOV P0,A
- SETB RS
- CLR RW
- CLR E
- LCALL DELAY
- SETB E
- RET
- /*****************************频率计算***********************************************/
- HZ_CAL:
- MOV R5,#00H
- MOV R2,#00H
- MOV R3,TH1
- MOV R4,TL1
- MOV R6,#27H
- MOV R7,#10H
- LCALL DIV_CAL
- MOV A,R4
- ADD A,#30H
- MOV LCDW,A
-
- MOV TEMP_H,R6
- MOV TEMP_L,R7
- MOV R5,#00H
- MOV R2,#00H
- MOV R3,TEMP_H
- MOV R4,TEMP_L
- MOV R6,#03H
- MOV R7,#0E8H
- LCALL DIV_CAL
- MOV A,R4
- ADD A,#30H
- MOV LCDQ,A
- MOV TEMP_H,R6
- MOV TEMP_L,R7
- MOV R5,#00H
- MOV R2,#00H
- MOV R3,TEMP_H
- MOV R4,TEMP_L
- MOV R6,#00H
- MOV R7,#64H
- LCALL DIV_CAL
- MOV A,R4
- ADD A,#30H
- MOV LCDB,A
- MOV TEMP_H,R6
- MOV TEMP_L,R7
- MOV R5,#00H
- MOV R2,#00H
- MOV R3,TEMP_H
- MOV R4,TEMP_L
- MOV R6,#00H
- MOV R7,#0AH
- LCALL DIV_CAL
- MOV A,R4
- ADD A,#30H
- MOV LCDS,A
- MOV A,R7
- ADD A,#30H
- MOV LCDG,A
- MOV T0COUNT,#00H
- RET
- DIV_CAL:
- /**************************************************************************************
- * 双字节无符号除法 *
- R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7
- ***************************************************************************************/
-
- NDIV42:
- MOV A,R1
- PUSH ACC
- MOV B,#00H
- NDV421:
- MOV A,R2
- CLR C
- SUBB A,R7
- MOV R1,A
- MOV A,R5
- SUBB A,R7
- MOV R1,A
- MOV A,R5
- SUBB A,R6
- JC NDV422
- MOV R5,A
- MOV A,R1
- MOV R2,A
- INC B
- SJMP NDV421
- NDV422:
- PUSH B
- MOV B,#10H
- NDV423:
- CLR C
- MOV A,R4
- RLC A
- MOV R4,A
- MOV A,R3
- RLC A
- MOV R3,A
- MOV A,R2
- RLC A
- MOV R2,A
- XCH A,R5
- RLC A
- XCH A,R5
- MOV F0,C
- CLR C
- SUBB A,R7
- MOV R1,A
- MOV A,R5
- SUBB A,R6
- JB F0,NCV424
- JC NDV425
- NCV424:
- MOV R5,A
- MOV A,R1
- MOV R2,A
- INC R4
- NDV425:
- DJNZ B,NDV423
- POP ACC
- CLR OV
- JNZ NDV426
- SETB OV
- NDV426:
- XCH A,R2
- MOV R7,A
- MOV A,R5
- MOV R6,A
- POP ACC
- MOV R1,A
- RET
- /*****************************延时程序***********************************************/
- DELAY: MOV R7,#10
- D1: MOV R6,#0F8H
- D2: DJNZ R6,D2
- DJNZ R7,D1
- RET
- /*****************************T0中断服务程序***********************************************/
- T0_INT:
- MOV TH0,#3CH
- MOV TL0,#0B0H
- INC T0COUNT
- MOV R2,T0COUNT
- CJNE R2,#20,OVER
- CLR TR0
- CLR TR1
- LCALL HZ_CAL
- LCALL LCDDISP2
- MOV T0COUNT,#00H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV TH1,#00H
- MOV TL1,#00H
- SETB TR0
- SETB TR1
- OVER:
- RETI
- TABLE1:
- DB "Frequency:" , 00H
- TABLE2:
- DB "Hz" , 00H
- END
复制代码
所有资料51hei提供下载:
单片机课程设计_4.0.rar
(71.49 KB, 下载次数: 94)
|