用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语

用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语,第1张

/ 名称:10s 的秒表

说明:首次按键计时开始,再次按键暂停,第三次按键清零。

/

#include<reg51h>

#define uchar unsigned char

#define uint unsigned int

sbit K1=P3^7;

uchar

i,Second_Counts,Key_Flag_Idx;

bit Key_State;

uchar

DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//延时

void DelayMS(uint ms)

{

uchar t;

while(ms--) for(t=0;t<120;t++);

}

//处理按键事件

void Key_Event_Handle()

{

if(Key_State==0)

{

Key_Flag_Idx=(Key_Flag_Idx+1)%3;

switch(Key_Flag_Idx)

{

case 1: EA=1;ET0=1;TR0=1;break;

case 2: EA=0;ET0=0;TR0=0;break;

case 0: P0=0x3f;P2=0x3f;i=0;Second_Counts=0;

}

}

}

//主程序

void main()

{

P0=0x3f; //显示 00

P2=0x3f;

i=0;

Second_Counts=0;

Key_Flag_Idx=0; //按键次数(取值 0,1,2,3)

Key_State=1; //按键状态

TMOD=0x01; //定时器 0 方式 1

TH0=(65536-50000)/256; //定时器 0:15ms

TL0=(65536-50000)%256;

while(1)

{

if(Key_State!=K1)

{

DelayMS(10);

Key_State=K1;

Key_Event_Handle();

}

}

}

//T0 中断函数

void DSY_Refresh() interrupt 1

{

TH0=(65536-50000)/256; //恢复定时器 0 初值

TL0=(65536-50000)%256;

if(++i==2) //50ms2=01s 转换状态

{

i=0;

Second_Counts++;

P0=DSY_CODE[Second_Counts/10];

P2=DSY_CODE[Second_Counts%10];

if(Second_Counts==100) Second_Counts=0; //满 100(10s)后显示 00

}

}

上传不了……

;================================================================

;功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;

; 计时程序由中断服务程序实现,采用定时计数器T0工作方式1;

; P2口实现对数码管的片选功能

;================================================================

;==========================初始化================================

SHUCHU EQU P2 ;定义P0口为输出口

PIANXUAN EQU P1 ;定义P2口为片选口

MIAO EQU 30H

FEN EQU 31H

MIAO0 EQU 32H

SHUZI EQU 33H

C_0 BIT 20H0

;======================系统程序开始==============================

ORG 00H

LJMP START

ORG 03H

LJMP ON_OFF

ORG 0BH

LJMP T0_1

ORG 13H

LJMP RESET

ORG 30H

START:

CALL INIT

SETB C_0

MOV MIAO,#00

MOV MIAO0,#00

MOV FEN,#00

MOV DPTR,#TAB

MOV R2,#5

MAIN:

JNB C_0,$

CLR C_0

LL: CALL DISPLAY

CALL SHIJIAN

JMP MAIN

;========================时间子程序=============================

;输入:"30H、31H、32H"

;输出:无

;实现的功能:分、秒、百分之秒的计算。

;===============================================================

SHIJIAN:

DJNZ R2,TIAOCHU

MOV R2,#5

INC MIAO0

MOV R3,MIAO0

CJNE R3,#100,TIAOCHU

MOV MIAO0,#00

INC MIAO

MOV R3,MIAO

CJNE R3,#60,TIAOCHU

MOV MIAO,#00

INC FEN

MOV R3,FEN

CJNE R3,#60,TIAOCHU

MOV FEN,#00

TIAOCHU:RET

;========================显示子程序=============================

;输入:"A"

;输出:"P2口"

;实现的功能:显示秒、分、百分之妙

;===============================================================

DISPLAY:MOV SHUZI,MIAO0

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#10H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#20H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,MIAO

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#04H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#08H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

MOV SHUZI,FEN

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示十位

MOV PIANXUAN,#01H ;片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A ;显示个位

MOV PIANXUAN,#02H ;片选

CALL DELAY ;延时

MOV PIANXUAN,#00H

RET

;========================计算子程序=============================

;输入:30H

;输出:"A和B"

;实现的功能:把33H中的数据十位和个位分离出来

;===============================================================

JISUAN:MOV A,SHUZI ;数据放在A中

MOV B,#10 ;除数放在B中

DIV AB ;商放在A中,余数放在B中

RET

;====================复位中断服务程序============================

;输入;无

;输出: 无

;实现的功能:把30H、31H、32H中的数据清零。

;================================================================

RESET:PUSH ACC

MOV 30H,#00H

MOV 3H,#00H

MOV 32H,#00H

CALL DELAY

POP ACC

RETI

;====================启停中断服务程序============================

;输入;无

;输出: 无

;实现的功能:关闭定时器

;================================================================

ON_OFF:CPL TR0

CALL DELAY

RETI

;====================定时中断0服务子程序========================

;输入:无

;输出:无

;实现的功能:实现定时20MS,影响标中断志位C_0

;===============================================================

T0_1:MOV TL0,50H ;设置定时初值

MOV TH0,51H

SETB C_0 ;定时标志位清0

RETI

;========================中断设置子程序=========================

;输入:无

;输出:无

;实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0

;===============================================================

INIT:MOV TMOD,#01H ;定时器0工作方式1

MOV DPTR,#65536-20000

MOV 50H,DPL

MOV 51H,DPH

MOV TL0,50H ;设置定时初值

MOV TH0,51H

MOV IE,#87H ;开定时器中断0

MOV TCON,#15H

RET

;======================延时程序==================================

;输入;无

;输出: 无

;实现的功能:延时一段时间

;================================================================

DELAY:MOV R6,#80

L7:MOV R5,#60

L8:DJNZ R5,$

DJNZ R6,L7

RET

;======================共阳查表数据==============================

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

;===========================结束=================================

END

一秒的速度太慢,我给你设置了001秒

Option Explicit

Dim MinSec As Integer

Dim Sec As Integer

Dim Minute As Integer

Dim Hour As Integer

Private Sub Command1_Click() '开始

Timer1Enabled = True

End Sub

Private Sub Command2_Click() '停止

Timer1Enabled = False

MsgBox "现在是" & Label2Caption

End Sub

Private Sub Command3_Click() '取消

Timer1Enabled = False

Hour = 0

Minute = 0

MinSec = 0

Sec = 0

Label2Caption = Format(Hour, "00") & "时" & Format(Minute, "00") & "分" & Format(Sec, "00") & "秒" & Format(MinSec, "00")

End Sub

Private Sub Form_Load()

Timer1Enabled = False

Timer1Interval = 10

End Sub

Private Sub Timer1_Timer()

MinSec = MinSec + 1

If MinSec = 100 Then

MinSec = 0

Sec = Sec + 1

If Sec = 60 Then

Sec = 0

Minute = Minute + 1

If Minute = 60 Then

Minute = 0

Hour = Hour + 1

Else

End If

Else

End If

Else

End If

Label2Caption = Format(Hour, "00") & "时" & Format(Minute, "00") & "分" & Format(Sec, "00") & "秒" & Format(MinSec, "00")

End Sub

; IC=AT89S52 F=12MHz T=1uS

; WRITER:COCOLI

; 定时器T0、T1溢出周期为50MS(10MS),T0为秒计数用,T1为调整时闪烁用,

; P10、P11、P12为调整按钮,P0口为字符输出口,采用共阳显示管。

; 中断程序入口

ORG 0000H ;程序执行开始地址

LJMP START ;跳到标号START执行

ORG 0003H ;外中断0中断程序入口

RETI ;外中断0中断返回

ORG 000BH ;定时器T0中断程序入口

LJMP INTT0 ;跳到标号INTT0执行

ORG 0013H ;外中断1中断程序入口

RETI ;外中断1中断返回

ORG 001BH ;定时器T1中断程序入口

LJMP INTT1 ;跳到标号INTT1执行

ORG 0023H ;串行口中断程序入口

RETI ;串行口中断程序返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 主程序 ;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 0030H ;

START:LCALL ST ;上电显示年月日及班级学号

MOV R0,#70H ;清70H~7AH共11个内存单元

MOV R7,#0BH ;

CLEARDISP:

MOV @R0,#00H

INC R0

DJNZ R7,CLEARDISP

MOV 20H,#00H ;清20H , 标志用

MOV 7AH,#0AH ;放入“熄灭符”数据

MOV TMOD,#11H ;设T0、T1为16位定时器

MOV TL0,#0B0H ;50MS定时初值,T0计时用

MOV TH0,#3CH ;50MS定时初值

MOV TL1,#0B0H ;50MS定时初值,T1闪烁定时用

MOV TH1,#3CH ;50MS定时初值

SETB EA ;总中断开放

SETB ET0 ;允许T0中断

SETB TR0 ;开启T0定时器

MOV R4,#14H ;1 S定时用初值50MS20

START1:

LCALL DISPLAY ;调用显示子程序

JNB P33,SETMM1 ;P33口为0时,转时间调整程序

JNB P34,FUNSS ;秒表功能,P34按键调时时作减1 *** 作

JNB P35,FUNPT ;STOP,PUSE,CLR

SJMP START1 ;P33口为1时跳回START1

SETMM1:

LJMP SETMM ;转到时间调整程序SETMM

FUNSS:

LCALL DS20MS ;

JB P34,START1 ;

WAIT11: ;

JNB P34,WAIT11 ;

CPL 03H ;

MOV 70H,#00H ;

MOV 70H,#00H ;

MOV 70H,#00H

MOV 70H,#00H ;

MOV 70H,#00H ;

MOV 70H,#00H ;

AJMP START1 ;

FUNPT: ;

LCALL DS20MS ;

JB P35,START1 ;

WAIT22: ;

JNB P35,WAIT21 ;

CLR ET0 ;

CLR TR0 ;

WAIT33: ;

JB P35,WAIT31 ;

LCALL DS20MS ;

JB P35,WAIT33 ;

WAIT66:

JNB P35,WAIT61

MOV R0,#70H ;清70H~79H共10个内存单元

MOV R7,#0AH

CLEARP:

MOV @R0,#00H

INC R0

DJNZ R7,CLEARP

WAIT44:

JB P35,WAIT41

LCALL DS20MS

JB P35,WAIT44

WAIT55:

JNB P35,WAIT51

SETB ET0

SETB TR0

AJMP START1

WAIT21:

LCALL DISPLAY

AJMP WAIT22

WAIT31:

LCALL DISPLAY

AJMP WAIT33

WAIT41:

LCALL DISPLAY

AJMP WAIT44

WAIT51:

LCALL DISPLAY

AJMP WAIT55

WAIT61:

LCALL DISPLAY

AJMP WAIT66

;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;; 1 s计时程式 ;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; T0中断服务程序

INTT0:

PUSH ACC ;累加器入栈保护

PUSH PSW ;状态字入栈保护

CLR ET0 ;关T0中断允许

CLR TR0 ;关定时器T0

JB 03H,FSS ;标志为1转秒表处理程序,,10MS定时

MOV A,#0B7H ;中断响应时间同步修正

ADD A,TL0 ;低8位初值修正

MOV TL0,A ;重装初值,,低8位修正值

MOV A,#3CH ;高8位初值修正

ADDC A,TH0

MOV TH0,A ;重装初值,, 高8位修正值

SETB TR0 ;开启定时器T0

DJNZ R4,OUTT0;20次中断未到中断退出

ADDSS:

MOV R4,#14H ;20次中断到,重赋初值,,1S

MOV R0,#71H ;指向秒计时单元71H~72H

ACALL ADD1 ;调用加1程序,,加1S *** 作

MOV A,R3 ;秒数据放入A,,R3为2位十进制数组合

CLR C ;清进位标志

CJNE A,#60H,ADDMM

ADDMM:

JC OUTT0 ;短于60S时中断退出

ACALL CLR0 ;长于或者等于60S时对秒计数单元清0

MOV R0,#77H ;指向分计时单元,,76H~77H

ACALL ADD1 ;分计时单元加1

MOV A,R3 ;分数据放入A

CLR C ;清进位标志

CJNE A,#60H,ADDHH ;秒表时最大为99

ADDHH:

JC OUTT0 ;短于60min时中断退出

ACALL CLR0 ;长于或者等于60min时对分计数单元清0

MOV R0,#79H ;指向分计时单元,,78H~79H

ACALL ADD1 ;小时计时单元加1h

MOV A,R3 ;时数据放入A

CLR C ;清进位标志

JB 03H,OUTT0 ;秒表时最大为99

CJNE A,#24H,HOUR

HOUR:

JC OUTT0 ;短于24h时中断退出

ACALL CLR0 ;长于或者等于24h时对计时单元清0

OUTT0:

MOV 72H,76H ;中断退出时将分\时计时单元数据移

MOV 73H,77H ;入对应显示单元

MOV 74H,78H

MOV 75H,79H

POP PSW ;恢复状态字出栈

POP ACC ;恢复累加器

SETB ET0 ;开放T0中断

RETI

;秒表计时程序(10min加1),低2位为01、001秒,中间2位为秒,最高2位为分

;最大计数值为99分5999秒

FSS: MOV A,#0F7H

ADD A,TL0

MOV TL0,A

MOV A,#0D8H

ADDC A,TH0

MOV TH0,A

SETB TR0

MOV R0,#71H

ACALL ADD1

CLR C

MOV A,R3

JZ FSS1

SETB C

FSS1: AJMP ADDMM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 闪动调时程式 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; T1中断服务程序,用作时间调整单元闪烁指示

INTT1: PUSH ACC

PUSH PSW

MOV TL1,#0B0H

MOV TH1,#3CH

DJNZ R2,INTT1OUT

MOV R2,#06H

CPL 02H

JB 02H,FLASH1

MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

INTT1OUT:

POP PSW

POP ACC

RETI

FLASH1: JB 01H,FLASH2

MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMP INTT1OUT

FLASH2: MOV 72H,76H

MOV 73H,77H

MOV 74H,78H

MOV 75H,79H

AJMP INTT1OUT

;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 加1子程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

;

ADD1: MOV A,@R0 ;取当前计时单元数据到A

DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换

ORL A,@R0 ;前一地址中数据放入A中低四位

ADD A,#01H ;A加1 *** 作

DA A ;十进制调整

MOV R3,A ;移入R3中暂存数据

ANL A,#0FH ;高四位变0

MOV @R0,A ;数据放入当前地址单元中

MOV A,R3 ;返回

INC R0

SWAP A

ANL A,#0FH

MOV @R0,A

RET

;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 分减1子程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

SUB1: MOV A,@R0 ;取当前计时单元数据到A

DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换

ORL A,@R0 ;前一地址中数据放入A中低四位

JZ SUB11

DEC A ;A减1 *** 作

SUB111: MOV R3,A ;移入R3中暂存数据

ANL A,#0FH ;高四位变0

CLR C ;清进位标志

SUBB A,#0AH

SUB1111:

JC SUB1110

MOV @R0,#09H ;大于等于0AH,为9

SUB110:

MOV A,R3 ;取回R3中暂存数据

INC R0 ;指向当前地址单元

SWAP A ;A中数据高四位与低四位交换

ANL A,#0FH ;高四位变0

MOV @R0,A ;数据放入当前地址单元中

RET ;返回

SUB11: MOV A,#59H

AJMP SUB111

SUB1110:

MOV A,R3 ;移入R3寄存器

ANL A,#0FH

MOV @R0,A

AJMP SUB110

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 时减1子程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

SUBB1: MOV A,@R0 ;取当前计时单元数据到A

DEC R0 ;指向前一地址

SWAP A ;A中数据高四位与低四位交换

ORL A,@R0 ;前一地址中数据放入A中低四位

JZ SUBB11 ;00减1为23H

DEC A ;A减1 *** 作

SUBB111:MOV R3,A ;;移入R3中暂存数据

ANL A,#0FH ;高四位变0

CLR C ;清进位标志

SUBB A,#0AH ;时个位大于9为9

SUBB1111:

JC SUBB1110

MOV @R0,#09H ;大于等于0AH,为9

SUBB110:

MOV A,R3 ;取回R3中暂存数据

INC R0 ;指向当前地址单元

SWAP A ;A中数据高四位与低四位交换

ANL A,#0FH ;高四位变0

MOV @R0,A ;数据放入当前地址单元中

RET ;返回

;

SUBB11:

MOV A,#23H

AJMP SUBB111

SUBB1110:

MOV A,R3 ;时个位小于0A不处理

ANL A,#0FH ;高四位变0

MOV @R0,A ;个位移入

AJMP SUBB110

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 清0程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;对计时单元复0用

CLR0: CLR A ;清累加器

MOV @R0,A ;清当前地址单元

DEC R0 ;指向前一地址

MOV @R0,A ;前一地址单元清0

RET ;子程序返回

;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 时钟调整程序 ;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;当调时按键按下时进入此程序

SETMM: CLR ET0 ;关定时器T0中断

CLR TR0 ;关闭定时器T0

LCALL DL1S ;调用1S延时程序

JB P33,CLOSEDIS ;键按下时间短于1S,关闭显示,,省电

MOV R2,#06H ;进入调时状态,赋闪烁定时初值

SETB ET1 ;允许T1中断

SETB TR1 ;开启T1定时器

SET2:

JNB P33,SET1 ;P33口为0时,等待,,键未释放

SETB 00H ;键释放,分调整闪烁标志置1

SET4: ;等待键按下

JB P33,SET3 ;等待键按下

LCALL DL05S ;有键按下,延时05S

JNB P33,SETHH ;按下时间长于05S,转调小时状态

MOV R0,#77H ;按下时间短于05S,加1min *** 作

LCALL ADD1 ;调用加1子程序

MOV A,R3 ;取调整单元数据

CLR C ;消位标志

CJNE A,#60H,HHH ;调整单元数据与60比较

HHH: JC SET4 ;调整单元数据小于60,转SET4循环

LCALL CLR0 ;调整单元数据大于或等于60时,清0

CLR C ;清进位0

AJMP SET4 ;跳转到SET4循环

CLOSEDIS:

SETB ET0 ;省电状态,开T0中断,,LED灯不显示

SETB TR0 ;开启T0中断

CLOSE:

JB P33,CLOSE ;无键按下,等待

LCALL DISPLAY ;有键按下,调用显示子程序延时消抖

JB P33,CLOSE ;是干扰,返回CLOSE等待

WAITH:

JNB P33,WAITH ;等待键释放

LJMP START1 ;返回主程序,,LED数据显示亮

SETHH: CLR 00H ;分闪烁标志清除,,进入调小时状态

SETHH1: JNB P33,SET5 ;等待键释放

SETB 01H ;小时调整标志置1

SET6: JB P33,SET7 ;等待键按下

LCALL DL05S ;有键按下,延时05S

JNB P33,SETOUT ;按下时间长于05S,退出时间调整

MOV R0,#79H ;按下时间短于05S,加1h *** 作

LCALL ADD1 ;调用加1子程序

MOV A,R3

CLR C

CJNE A,#24H,HOUU ;计时单元数据与24比较

HOUU: JC SET6 ;小于24,转SET6循环

LCALL CLR0 ;大于或等于24时,清0 *** 作

AJMP SET6 ;跳到SET6处循环

SETOUT: JNB P33,SETOUT1 ;调时退出程序等待键释放

LCALL DISPLAY ;延时消抖

JNB P33,SETOUT ;是抖动,返回SETOUT再等待

CLR 01H ;清调小时标志

CLR 00H ;清调分标志

CLR 02H ;清闪烁标志

CLR TR1 ;关闭定时器T1

CLR ET1 ;关定时器T1中断

SETB TR0 ;开启定时器T0

SETB ET0 ;开启定时器T0中断,,计时开始

LJMP START1 ;跳回主程序

SET1: LCALL DISPLAY ;键释放等待调时用显示程序

AJMP SET2 ;防止键按下时无时钟显示

SET3: LCALL DISPLAY ;等待调分按键时时钟显示用

JNB P33,FUNSUB ;减1分 *** 作

AJMP SET4 ;调分等待

SET5: LCALL DISPLAY ;键释放等待调时用显示程序

AJMP SETHH1 ;防止键按下时无时钟显示

SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用

JNB P33,FUNSUBB ;小时减1 *** 作

AJMP SET6 ;调时等待

SETOUT1:LCALL DISPLAY ;退出时钟整时键释放等待

AJMP SETOUT ;防止键按下时无时钟显示

;FUNSUB,分减1程序?

FUNSUB: LCALL DISPLAY ;延时消抖

JB P33,SET41 ;干扰,返回调分等待

FUNSUB1:JNB P33,FUNSUB1 ;等待键放开

MOV R0,#77H

LCALL SUB1 ;分减1程序

LJMP SET4 ;返回调分等待

;

SET41: LJMP SET4

;FUNSUB,时减1程序?

FUNSUBB:LCALL DISPLAY ;消抖动

JB P34,SET61 ;干扰,返回调时等待

FUNSUBB1:JNB P34,FUNSUBB1

MOV R0,#79H

LCALL SUBB1

LJMP SET6

;

SET61: LJMP SET6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; 显示程序 ;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;显示数据在70H~75H单元内,用六位LED共阳数码管显示。

;扫描控制,每个LED数码管亮1mS时间。

DISPLAY:

MOV R1,#70H ;指向显示数据首址

MOV R5,#0DFH ;扫描控制字初值

PLAY: MOV A,R5 ;扫描字放入A

MOV P2,A ;从P2口输出

MOV A,@R1 ;取显示数据到A

MOV DPTR,#TAB ;取段码表地址

MOVC A,@A+DPTR ;查显示数据对应段码

MOV P0,A ;段码放入P0口

MOV A,R5

JB ACC_1,LOOP5 ;小数点处理

CLR P07

LOOP5: JB ACC_3,LOOP6

CLR P07

LOOP6: LCALL DL1MS ;显示1MS

INC R1 ;指向下一地址

MOV A,R5 ;扫描控制字放入A

JNB ACC_0,ENDOUT ;ACC0=0时,一次显示结束

RR A ;A中数据循环左移

MOV R5,A ;放回R5内

MOV P0,#0FFH

AJMP PLAY ;跳回:PLAY循环

ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位

MOV P0,#0FFH ;P0口复位

RET ;子程序返回

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH

;共阳段码表 1、 2、 3、 4、 5、 6、 7、 8、 9、不亮、A、—。

;

;SDISPLAY,上电显示程序

;不带小数点,有A、— 显示功能

SDISPLAY:

MOV R5,#0DFH ;扫描控制字初值

SPLAY: MOV A,R5 ;扫描字放入A

MOV P2,A ;从P2口输出

MOV A,@R1 ;取显示数据到A

MOV DPTR,#TABS ;取段码表地址

MOVC A,@A+DPTR ;查显示数据对应段码

MOV P0,A ;段码放入P0口

MOV A,R5

LCALL DL1MS ;显示1MS

INC R1 ;指向下一地址

MOV A,R5 ;扫描控制字放入A

JNB ACC_0,ENDOUTS ;ACC0=0时,一次显示结束

RR A ;A中数据循环左移

MOV R5,A ;放回R5内

AJMP SPLAY ;跳回:PLAY循环

ENDOUTS:MOV P2,#0FFH ;一次显示结束,P2口复位

MOV P0,#0FFH ;P0口复位

RET ;子程序返回

TABS: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH

;STAB表,启动时显示2003-12-07、A01-2-28

;

STAB: DB 0AH,0AH,0AH,0AH,0AH,0AH,08H,02H,0CH,02H,0CH,01H,00H,0BH,0AH,0AH

DB 07H,00H,0CH

DB 07H,00H,0CH,02H,01H,0CH,03H,00H,00H,02H,0AH,0AH,0AH,0AH,0AH,0AH

;注:0A不亮,0B显示“A”,0C显示“-”

;ST子程序,上电时显示年月日用,采用移动显示

ST: MOV R0,#40H ;将显示内容移入40H~50H单元

MOV R2,#20H

MOV R3,#00H

CLR A

MOV DPTR,#STAB

SLOOP:

MOVC A,@A+DPTR

MOV @R0,A

MOV A,R3

INC A

MOV R3,A

INC R0

DJNZ R2,SLOOP ;移入完毕

MOV R1,#5AH

MOV R3,#1BH ;显示27个单元

SSLOOP:

MOV R2,#32H ;控制移动速度

SSLOOP1:

LCALL SDISPLAY

DJNZ R2,SSLOOP11

MOV A,R1

SUBB A,#07H ;显示首址修正为低1个单元

MOV R1,A

DJNZ R3,SSLOOP

RET

SSLOOP11:

MOV A,R1 ;指针修正为原值

SUBB A,#06H

MOV R1,A

AJMP SSLOOP1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;; 延时程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;1ms延时程序,LED显示程序用

DL1MS: MOV R6,#14H

DL1: MOV R7,#19H

DL2: DJNZ R7,DL2

DJNZ R6,DL1

RET;20MS延时程序,采用调用显示子程序,以改善LED的显示闪烁现象

DS20MS: ACALL DISPLAY

ACALL DISPLAY

ACALL DISPLAY

RET;延时程序,用作按键时间的长短判断

DL1S:

LCALL DL05S

LCALL DL05S

RET

DL05S:

MOV R3,#20H ;8ms32=0196s

DL05S1:

LCALL DISPLAY

DJNZ R3,DL05S1

RET;

END ;程序结束

1,需建立一个1毫秒的中断定时器如timer0()。

2,需建立一个全局变量毫秒变量,在中断里面累计计数,1毫秒加1一次。

3,需建立三个全局变量秒变量,分变量,时变量。

4,需做显示模块的处理。·

秒表开始工作时,毫秒变量在中断里面一直累计,在主循环里面做毫秒变量判断是否大于999 。如果大于999,秒变量加1,毫秒变量清零;如果秒变量大于59,分变量加1,秒变量清零;如果分变量大于59时,时变量加1,分变量清零。如果时变量大于23,时变量清零。秒表停止时,毫秒、秒、时、分变量不在累计。同时将这些变量送到数码管上显示。

以上就是关于用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语全部的内容,包括:用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语、用汇编语言编写一个51单片机程序,实现电子秒表功能、vb 设计新建一个工程,完成“秒表计时”程序的设计,如图13-11所示。具体要求如下:等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10120036.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存