STOP按下一次K++;
if(CLEAR==0) {K=0;T=0;} 这个要写在计时器中断程序里
if(K==0)不计时
if(K==1)启动计时器开始计时 设计时时间为T
if(K==2)计数器停止计时 这三行写在主程序死循环里
再加上显示程序就可以了
#include<reg51h>
#define uschar unsigned char
#define usint unsigned int
uschar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//0-f
uschar code tab[]={0xfe,0xfd,0xfb};//1-3
sbit wele=P2^7;
sbit dule=P2^6;
usint t;
uschar a,b,c,i,j,n;
void init();
void display(usint x);
void delay(uschar z);
void main()
{
init();
while(1)
{
a=t/100;
b=t%100/10;
c=t%10;
wele=1;
P0=tab[0];
wele=0;
dule=1;
P0=table[a];//10s
delay(5);
wele=1;
P0=tab[1];
wele=0;
dule=1;
P0=table[b];//1s
delay(5);
wele=1;
P0=tab[2];
wele=0;
dule=1;
P0=table[c];//100ms
delay(5);
}
}
void init()
{
a=0;
b=0;
c=0;
n=0;
t=0;
TMOD=0x01;
TH0=(65535-46080)/256;
TL0=(65535-46080)%256;//110592M 50ms
EA=1;
ET0=1;
TR0=1;
}
void timer0() interrupt 1
{
TH0=(65535-46080)/256;
TL0=(65535-46080)%256;
n++;
if(n==2)
{
n=0;
t++;
if(t==600)
t=0;
}
}
void delay(uschar z)
{
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
方法:首先:要学会数码管的显示程序
然后:按键的 *** 作,注意软件的消抖(具体的是延时,10ms左右)。
假设有k1~停表,k2~复位,k3~继续运行
先说停表和继续运行的
停表:如果k1按下,TR0=0;
继续运行:如果k3按下,TR0=1;
复位:直接用硬件复位单片机或者k2按下,数据清零。
要实现数据的循环:只要定时器计数到最大值时,再把最小值赋给它!
以下程序使用定时器1计数,定时10ms,60H为妙计数单元,4FH单元为秒标示位,一秒时间到,置位4FH ORG 0000H ;程序从0地址开始
LJMP MAIN ;跳到STRAT处执行
ORG 001BH
LJMP JIA1
ORG 0030H
MAIN:MOV TMOD,#01H ;设置T1工作在模式1
MOV TH1,#068H ;赋初值,定时10ms
MOV TL1,#0F0H
MOV IE,#88H ;开CPU中断,开定时器1中断
SETB TR1 ;启动T1定时器工作
MOV 60H,#100 ;给60H单元赋初值
CLR 4FH ;清零4FH单元
DISPLAY: ;显示子程序
MOV DPTR,#TAB ;DPTR指向编码表位置
MOV A,R3 ;将R3的内容复制到A
MOV B,#10
DIV AB ;A除B,商给A,余数给B
MOVC A,@A+DPTR ;根据A的值取出编码表中的编码
MOV P1,A ;由P1口输出A的内容
SETB P20 ;置位P20
CLR P20 ;清零P20
MOV A,B
MOVC A,@A+DPTR ;根据A的值取出编码表中的编码
MOV P1,A ;由P1口输出A的内容
SETB P21 ;置位P21
CLR P21 ;清零P21
JNB 4FH,DISPLAY ;判断1秒时间是否到,没有到,则跳转到DIAPLAY处
CLR 4FH ;1秒到,清4FH
LJMP DISPLAY ;调用显示子程序 JIA1:MOV TH1,#068H ;赋初值
MOV TL1,#0F0H
DJNZ 60H,TT ;60H单元自减1,判断是否为0,不为0则跳转到TT处
MOV 60H,#100 ;60H单元为0,则重新给其赋值100
SETB 4FH ;同时置位4FH单元
INC R3 ;R3自加1
CJNE R3,#60,TT ;判断R3是否为60,否则跳转TT处
MOV R3,#0 ;R3为60,则给R3赋0
TT:RETITAB: ;编码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;编码
END ;程序结束
K1 EQU P10
K2 EQU P11
K3 EQU P12
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB TR0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#99
CLR 00H
CLR 01H
LOOP:
JB K1,LP01
JNB K1,$
CLR 01H
INC R3
CJNE R3,#100,LOOP0
MOV R3,#0
SJMP LOOP0
LP01:
JB K2,LP02
JNB K2,$
CLR 01H
CJNE R3,#0,LP011
MOV R3,#99
SJMP LOOP0
LP011:
DEC R3
SJMP LOOP0
LP02:
JB K3,LOOP
JNB K3,$
SETB 01H
SJMP LOOP
LOOP0:
MOV A,R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV DPTR,#TABLE
T0C:
CPL 00H
JB 00H,T001
MOV P3,#0FDH
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
T002:
JNB 01H,T0E
INC R2
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR 01H
MOV R4,#16
T005:
CPL P00
LCALL DELAY
DJNZ R4,T005
RETI
DELAY:
MOV R6,#200
DLY:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY
RET
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
以上就是关于STC单片机的秒表设计c语言怎么写,要求第一次按下STOP开始计时,当再次按下STOP时,秒表为计全部的内容,包括:STC单片机的秒表设计c语言怎么写,要求第一次按下STOP开始计时,当再次按下STOP时,秒表为计、跪求各位大神给我写一个51单片机电子秒表的程序、51单片机的定时器程序,c语言编写,使用内部定时器设计一个三位秒表 (秒,十秒,分),显示秒位的变动,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)