⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 counter.src

📁 外部计数+显示程序 , 单片机外部输入脉冲信号
💻 SRC
字号:
; .\counter.SRC generated from: counter.c
; COMPILER INVOKED BY:
;        E:\Program Files\C51\BIN\C51.EXE counter.c BROWSE DEBUG OBJECTEXTEND SRC(.\counter.SRC)

$NOMOD51

NAME	COUNTER

P0	DATA	080H
P1	DATA	090H
P2	DATA	0A0H
P3	DATA	0B0H
T0	BIT	0B0H.4
AC	BIT	0D0H.6
T1	BIT	0B0H.5
T2	BIT	090H.0
EA	BIT	0A8H.7
IE	DATA	0A8H
EXF2	BIT	0C8H.6
RD	BIT	0B0H.7
ES	BIT	0A8H.4
IP	DATA	0B8H
RI	BIT	098H.0
INT0	BIT	0B0H.2
CY	BIT	0D0H.7
TI	BIT	098H.1
INT1	BIT	0B0H.3
RCAP2H	DATA	0CBH
PS	BIT	0B8H.4
SP	DATA	081H
T2EX	BIT	090H.1
OV	BIT	0D0H.2
RCAP2L	DATA	0CAH
C_T2	BIT	0C8H.1
WR	BIT	0B0H.6
RCLK	BIT	0C8H.5
TCLK	BIT	0C8H.4
SBUF	DATA	099H
PCON	DATA	087H
SCON	DATA	098H
TMOD	DATA	089H
TCON	DATA	088H
IE0	BIT	088H.1
IE1	BIT	088H.3
B	DATA	0F0H
CP_RL2	BIT	0C8H.0
ACC	DATA	0E0H
ET0	BIT	0A8H.1
ET1	BIT	0A8H.3
TF0	BIT	088H.5
ET2	BIT	0A8H.5
TF1	BIT	088H.7
TF2	BIT	0C8H.7
RB8	BIT	098H.2
TH0	DATA	08CH
addr0	BIT	090H.4
EX0	BIT	0A8H.0
IT0	BIT	088H.0
TH1	DATA	08DH
addr1	BIT	090H.5
TB8	BIT	098H.3
EX1	BIT	0A8H.2
IT1	BIT	088H.2
TH2	DATA	0CDH
addr2	BIT	090H.6
P	BIT	0D0H.0
addr3	BIT	090H.7
SM0	BIT	098H.7
TL0	DATA	08AH
SM1	BIT	098H.6
TL1	DATA	08BH
SM2	BIT	098H.5
TL2	DATA	0CCH
PT0	BIT	0B8H.1
PT1	BIT	0B8H.3
RS0	BIT	0D0H.3
PT2	BIT	0B8H.5
TR0	BIT	088H.4
RS1	BIT	0D0H.4
TR1	BIT	088H.6
TR2	BIT	0C8H.2
PX0	BIT	0B8H.0
PX1	BIT	0B8H.2
DPH	DATA	083H
DPL	DATA	082H
EXEN2	BIT	0C8H.3
REN	BIT	098H.4
T2CON	DATA	0C8H
RXD	BIT	0B0H.0
TXD	BIT	0B0H.1
F0	BIT	0D0H.5
PSW	DATA	0D0H
?PR?_delay?COUNTER   SEGMENT CODE 
?PR?initial?COUNTER  SEGMENT CODE 
?PR?feedbuffer?COUNTER                   SEGMENT CODE 
?PR?vLedKey_Scan?COUNTER                 SEGMENT CODE 
?PR?main?COUNTER     SEGMENT CODE 
?PR?int50ms?COUNTER  SEGMENT CODE 
?CO?COUNTER          SEGMENT CODE 
?DT?COUNTER          SEGMENT DATA 
	EXTRN	CODE (?C?UIDIV)
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	dispbuf
	PUBLIC	count
	PUBLIC	table
	PUBLIC	scan
	PUBLIC	int50ms
	PUBLIC	main
	PUBLIC	vLedKey_Scan
	PUBLIC	feedbuffer
	PUBLIC	initial
	PUBLIC	_delay

	RSEG  ?DT?COUNTER
          count:   DS   2
        dispbuf:   DS   8

	RSEG  ?CO?COUNTER
scan:
	DB	0FEH
	DB	0FDH
	DB	0FBH
	DB	0F7H
	DB	0EFH
	DB	0DFH
	DB	0BFH
	DB	07FH

table:
	DB	0C0H
	DB	0F9H
	DB	0A4H
	DB	0B0H
	DB	099H
	DB	092H
	DB	082H
	DB	0F8H
	DB	080H
	DB	090H
	DB	088H
	DB	083H
	DB	0C6H
	DB	0A1H
	DB	086H
	DB	08EH
	DB	0BFH
	DB	0FFH

; /*****************************************************************/ 
; /*                                                               */                                                                
; /*名称:                   外部计数+显示程序                     */                                                                                                                                                                           
; /*功能:           单片机外部输入脉冲信号,定时器参与计数        */
; /*                   计数值由数码管显示出来。                      */                                                    
; /*难度等级:                   中                                */                                                                     
; /* 作者:                  zengrenliang                          */
; /* 版权:           http://www.51kaifa.com                       */
; /*编写日期:        2006.05.19                                   */                                                                                                                                                                                                             
; /*****************************************************************/
; 
; 
; 
; #include<reg52.h>
; #define  uchar  unsigned char
; 
; 
; sbit addr0 = P1^4;//系统片选地址线0
; sbit addr1 = P1^5;//系统片选地址线1
; sbit addr2 = P1^6;//系统片选地址线2
; sbit addr3 = P1^7;//系统片选地址线3
; 
; //行扫描数组
; uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
; //数码管显示的段码表
; uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
;                        0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
;                        0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
; 
; uchar dispbuf[8]; //显示缓冲区   
; unsigned int count;                      
; 
; /*****************************延时函数**************************/
; 
; void delay (unsigned int us)  

	RSEG  ?PR?_delay?COUNTER
_delay:
	USING	0
			; SOURCE LINE # 35
;---- Variable 'us?040' assigned to Register 'R6/R7' ----
; {
			; SOURCE LINE # 36
?C0001:
;   while(us--);
			; SOURCE LINE # 37
	MOV  	A,R7
	DEC  	R7
	MOV  	R4,AR6
	JNZ  	?C0017
	DEC  	R6
?C0017:
	ORL  	A,R4
	JNZ  	?C0001
; }
			; SOURCE LINE # 38
?C0003:
	RET  	
; END OF _delay

; 
; void initial()

	RSEG  ?PR?initial?COUNTER
initial:
	USING	0
			; SOURCE LINE # 40
; { uchar j;
			; SOURCE LINE # 41
;   count=0;//秒清零
			; SOURCE LINE # 42
	CLR  	A
	MOV  	count,A
	MOV  	count+01H,A
;   for(j=0;j<6;j++)
			; SOURCE LINE # 43
;---- Variable 'j?141' assigned to Register 'R7' ----
?C0004:
;     dispbuf[j] = 0;//清数码管显示缓冲区
			; SOURCE LINE # 44
	MOV  	R7,#06H
	MOV  	R0,#LOW (dispbuf)
	CLR  	A
?C0018:
	MOV  	@R0,A
	INC  	R0
	DJNZ 	R7,?C0018
?C0005:
;   TMOD = 0x05;//T0 T1工作于方式1
			; SOURCE LINE # 45
	MOV  	TMOD,#05H
;   TL0 = 0xff;
			; SOURCE LINE # 46
	MOV  	TL0,#0FFH
;   TH0 = 0xff;//50ms定时初值
			; SOURCE LINE # 47
	MOV  	TH0,#0FFH
; 
;   ET0 = 1;//允许T1中断
			; SOURCE LINE # 49
	SETB 	ET0
;   PT0 = 1;//T1中断优先级高
			; SOURCE LINE # 50
	SETB 	PT0
; 
;   EA = 1;//开中断
			; SOURCE LINE # 52
	SETB 	EA
;   TR0 = 1;//T1开始计时
			; SOURCE LINE # 53
	SETB 	TR0
;  }
			; SOURCE LINE # 54
	RET  	
; END OF initial

; 
; 
; /*************************************填充显示缓冲区****************************/
; 
; void  feedbuffer()

	RSEG  ?PR?feedbuffer?COUNTER
feedbuffer:
	USING	0
			; SOURCE LINE # 59
; {
			; SOURCE LINE # 60
; unsigned int temp;
;  
;  temp = count;
			; SOURCE LINE # 63
;---- Variable 'temp?242' assigned to Register 'R2/R3' ----
	MOV  	R3,count+01H
	MOV  	R2,count
;  dispbuf[5] = temp % 10;//分个位
			; SOURCE LINE # 64
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	dispbuf+05H,R5
;  temp = temp / 10;
			; SOURCE LINE # 65
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	R2,AR6
	MOV  	R3,AR7
;  dispbuf[4] = temp % 10;//分十位
			; SOURCE LINE # 66
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	dispbuf+04H,R5
;  
;  temp = temp / 10;
			; SOURCE LINE # 68
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	R2,AR6
	MOV  	R3,AR7
;  dispbuf[3] =temp % 10;//时百位
			; SOURCE LINE # 69
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	dispbuf+03H,R5
;  temp = temp / 10;
			; SOURCE LINE # 70
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	R2,AR6
	MOV  	R3,AR7
;  dispbuf[2] =temp % 10;//时千位
			; SOURCE LINE # 71
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	dispbuf+02H,R5
; 
;  temp = temp / 10;
			; SOURCE LINE # 73
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
	MOV  	R2,AR6
	MOV  	R3,AR7
;  dispbuf[1] =temp % 10;//时万位
			; SOURCE LINE # 74
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	dispbuf+01H,R5
;  temp = temp / 10;
			; SOURCE LINE # 75
	MOV  	R4,#00H
	MOV  	R5,#0AH
	MOV  	R7,AR3
	MOV  	R6,AR2
	LCALL	?C?UIDIV
;  dispbuf[0] =temp % 10;//时十万位
			; SOURCE LINE # 76
	MOV  	R4,#00H
	MOV  	R5,#0AH
	LCALL	?C?UIDIV
	MOV  	dispbuf,R5
; 
; }
			; SOURCE LINE # 78
	RET  	
; END OF feedbuffer

; 
; 
; 
; 
; /******************************显示+读键*************************/
; 
; void vLedKey_Scan()

	RSEG  ?PR?vLedKey_Scan?COUNTER
vLedKey_Scan:
	USING	0
			; SOURCE LINE # 85
; {  unsigned char i,value;  
			; SOURCE LINE # 86
; 
;     for(i=0;i<8;i++){
			; SOURCE LINE # 88
;---- Variable 'i?343' assigned to Register 'R5' ----
	CLR  	A
	MOV  	R5,A
?C0009:
;        addr3 = 0;
			; SOURCE LINE # 89
	CLR  	addr3
;        addr0 = 0;
			; SOURCE LINE # 90
	CLR  	addr0
;        addr1 = 1;
			; SOURCE LINE # 91
	SETB 	addr1
;        addr2 = 0;//开发板上U4(74HC574)的片选地址
			; SOURCE LINE # 92
	CLR  	addr2
;        value =table[dispbuf[i]]; //取一行显示数据 
			; SOURCE LINE # 93
	MOV  	A,#LOW (dispbuf)
	ADD  	A,R5
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	DPTR,#table
	MOVC 	A,@A+DPTR
;---- Variable 'value?344' assigned to Register 'R3' ----
	MOV  	R3,A
;        P0 = value;
			; SOURCE LINE # 94
	MOV  	P0,A
;        addr3 = 1; 
			; SOURCE LINE # 95
	SETB 	addr3
;        addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
			; SOURCE LINE # 96
	CLR  	addr3
;        P2 = scan[i];//取row0--row7行扫描数据
			; SOURCE LINE # 97
	MOV  	A,R5
	MOV  	DPTR,#scan
	MOVC 	A,@A+DPTR
	MOV  	P2,A
;        delay(50); //延时50us
			; SOURCE LINE # 98
	MOV  	R7,#032H
	MOV  	R6,#00H
	LCALL	_delay
;        P2 = 0xff;//关显示
			; SOURCE LINE # 99
	MOV  	P2,#0FFH
;        }
			; SOURCE LINE # 100
	INC  	R5
	CJNE 	R5,#08H,?C0009
;  }
			; SOURCE LINE # 101
?C0012:
	RET  	
; END OF vLedKey_Scan

; 
; /*******************************主函数***********************/
; 
; main()

	RSEG  ?PR?main?COUNTER
main:
	USING	0
			; SOURCE LINE # 105
; { 
			; SOURCE LINE # 106
;   initial();
			; SOURCE LINE # 107
	LCALL	initial
?C0013:
;   while(1){
			; SOURCE LINE # 108
;       vLedKey_Scan(); //显示,读键扫描 
			; SOURCE LINE # 109
	LCALL	vLedKey_Scan
;   }
			; SOURCE LINE # 110
	SJMP 	?C0013
; END OF main

CSEG	AT	0000BH
	LJMP	int50ms

; }
; 
; 
; 
; //计数中断服务
; void  int50ms() interrupt 1

	RSEG  ?PR?int50ms?COUNTER
	USING	0
int50ms:
	PUSH 	ACC
	PUSH 	B
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 116
; { 
;   TR0=0;//关定时器T0
			; SOURCE LINE # 118
	CLR  	TR0
;   TL0= 0xff;
			; SOURCE LINE # 119
	MOV  	TL0,#0FFH
;   TH0= 0xff;//赋定时初值
			; SOURCE LINE # 120
	MOV  	TH0,#0FFH
;   TR0=1;//开定时器T0
			; SOURCE LINE # 121
	SETB 	TR0
;   count++;//50ms计数加1
			; SOURCE LINE # 122
	INC  	count+01H
	MOV  	A,count+01H
	JNZ  	?C0019
	INC  	count
?C0019:
;   feedbuffer();
			; SOURCE LINE # 123
	LCALL	feedbuffer
; }
			; SOURCE LINE # 124
	POP  	AR7
	POP  	AR6
	POP  	AR5
	POP  	AR4
	POP  	AR3
	POP  	AR2
	POP  	AR0
	POP  	PSW
	POP  	B
	POP  	ACC
	RETI 	
; END OF int50ms

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -