导航:首页 > 操作系统 > 单片机99秒表

单片机99秒表

发布时间:2022-12-31 10:27:32

⑴ 编一个AT89C51单片机00 —99 秒的汇编程序,要求有循环和暂停,用两个独立数码管显示

;利用中断的99秒计时器,动态扫描两位数码管

;P0口接J3,数据端口

;P2.2接J2B端子,表示段码锁存

;P2.3接J2A端子,标志位码锁存

LATCH1BITP2.2

LATCH2BITP2.3

ORG00H

JMPSTART

ORG0BH

JMPTIM0

START:MOVR3,#00;中断循环次数

MOVR4,#0;时间初值

MOVDPTR,#TABLE

MOVSP,#40H

MOVTMOD,#01H;定时器工作方式

MOVTH0,#HIGH(65536-3800)

MOVTL0,#LOW(65536-3800);初值4MS

SETBTR0

MOVIE,#82H;开中断

TIM0:

MOVTH0,#HIGH(65536-3800)

MOVTL0,#LOW(65536-3800)

INCR3

CJNER3,#250,X1;1S

MOVR3,#0

MOVA,R4;十进制转换

MOVB,#10

DIVAB

MOV20H,B;个位

MOV21H,A;十位

INCR4

CJNER4,#100,LEDSCAN;到100则清零

MOVR4,#0

LEDSCAN:CALLSCAN;调用数码管扫描

X1:PUSHACC

PUSHPSW

CALLSCAN

POPPSW

POPACC

RETI

SCAN:

MOVA,21H

MOVCA,@A+DPTR

MOVP0,A

SETBLATCH1

CLRLATCH1

MOVP0,#11111110B;扫描子程序

SETBLATCH2

CLRLATCH2

CALLDELAY1

MOVA,20H

MOVCA,@A+DPTR

MOVP0,A

SETBLATCH1

CLRLATCH1

MOVP0,#11111101B;0代表选通该位数码管

SETBLATCH2

CLRLATCH2

CALLDELAY1

RET

DELAY:MOVR5,#50;典型延时程序

D1:MOVR6,#40

D2:MOVR7,#248

CALLSCAN

DJNZR7,$

DJNZR6,D2

DJNZR5,D1

RET

DELAY1:MOVR6,#4;扫描延时

D3:MOVR7,#248

DJNZR7,$

DJNZR6,D3

RET

TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;共阴字码表

是用动态扫描的方法显示的,用了2个锁存器,8个数码管的。

附上电路图

⑵ 求大神写一下单片机at89c52控制秒表电路循环显示0到99的程序

我写的是共阳极,你想共阴极,自己改RXD和TDX输入电平以及P2码值就好。

根据你题目要求连接的。两个LED动态显示,交替间隔时间常量stime我设的50ms,因为我是仿真软件,间隔太短显示不出交替效果,你用板子测试的话,可以把间隔调小。

另外你题目暂停按钮连在普通引脚, 如果按钮直接连外部中断0来实现暂停会更敏感。

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

#define an P2

#define stime 50 //LED交替闪烁间隔时间

void init();

void pause();

sbit wei1=P3^0;

sbit wei2=P3^1;

sbit s2=P1^4;

sbit s3=P1^6;

//共阳极

void delay(uint xms);

uint g=0;

uint s=0;

uint count=0;

uint ispause=0;

void main()

{

uchar nums[10]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};

init();

while(1)

{

if(s2==0 && ispause==0)

{

if(s2==0)

{

while(s2==0);

ispause=1;

pause();

}

}

else if(s3==0 && ispause==1)

{

if(s3==0)

{

while(s3==0);

ispause=0;

pause();

}

}

if(s==0)

{

an=nums[g];

wei1=0;

wei2=1;

}

else

{

an=nums[s];

wei1=1;

wei2=0;

delay(stime);

an=nums[g];

wei1=0;

wei2=1;

delay(stime);

}

}

}

void pause()

{

EA=~EA;

}

void init()

{

TMOD=0x02; //T0 工作模式2 自动装填8位 200us

TH0=0x38;

TL0=0x38;

EA=1;

ET0=1;

TR0=1;

}

void ct() interrupt 1

{

if(count<5000)

count++;

else

{

count=0;

if(g==9)

{

g=0;

if(s==9)

s=0;

else

s++;

}

else

g++;

}

}

void delay(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=112;j>0;j--);

}

⑶ 单片机99秒倒计时

用定时器,很简单的,我这里有个程序你可以参考一下
#include "clock.h"

void delay(uint t)
{
uint i;
while(t--)
{
/* 对于12M时钟,约延时1ms */
for (i=0;i<100;i++)
{}
}
}

void main()
{
initial();
P0=0x00;
sec=min=hour=0;
flag=1;

while(1)
{
while(flag)
{
display(0,hour/10);
display(1,hour%10);
//display(2,3);
display(3,min/10);
display(4,min%10);
//display(5,6);
display(6,sec/10);
display(7,sec%10);
flag=0;
}
}
}

void display(uchar digit,uchar num)
{
P2=0x00;
P1=n[num];
P2=m[digit];
delay(1);
}

void initial(void)
{
//--INT0的配置----------
IT0=1; // INT0为0低电平触发(为1则为下降沿触发)
EX0=1; // INT0中断开,允许INT0中断

//--T0的配置:定时器------------
TMOD = 0x11; //定时器0,1 定时,工作方式1(16位装载方式)

TH0 = 0x3c;//定时50ms,12M晶体振荡器
TL0 = 0xb0;
TR0 = 1; //允许T0中断
ET0 = 1;

EA=1; // CPU所有中断开(IE最高位MSB)
}

void timer_0() interrupt 1 using 2
{
FT0++;
if(FT0==20)
{
sec++;
FT0=0;
}

if(sec>59)
{
min++;
sec=0;
}

if(min>59)
{
hour++;
min=0;
}

if(hour>24)hour=0;

TH0 = 0x3c;//定时50ms,12M晶体振荡器
TL0 = 0xb0;

flag=1;
}

//INT0中断 由P3.2引脚产生
void int_0() interrupt 0 using 0
{
if(key1==0)hour++;
if(key2==0)hour--;
if(key3==0)min++;
if(key4==0)min--;
if(hour<0)hour=0;
if(min<0)min=0;
}

#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int

uchar n[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar m[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar FT0,sec,min,hour,flag;

sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^6;
sbit key4=P3^7;

void display(uchar,uchar);
void timer_0();
void initial(void);
void int_0(); //外部中断0

⑷ 怎么用c语言写单片机89C51的程序,要写的程序是,0~99秒的秒表,到99s停止,并且有滴的一声

可根据以下程序修改:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a , b=0;
sbit wei1=P1.0;
sbit wei2=P1.1;
//共阴数码管七段码
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void display( uchar a)) //显示程序
{
P0= table[a/10];//十位
wei1=1;
Delay1ms(2) ;
wei1=0;
P0= table[a%10];//个位
wei2=1;
Delay1ms(2) ;
wei2=0;
}
void main(void )//主程序
{
TMOD=0x01;// 定时器1工作方式一
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
display(b);
}
}

//中断子程序
//因为 中断程序很短,只花不到1ms,而中断间隔50ms,完全没必要关中断
void Timer0(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==100)//100次是5 秒
{ a=0;b++;}
if(b==100)
{ b=0;}
}

⑸ 单片机 0-99秒表程序 求解答!!

你在中断函数里面把定时器中断和定时器给禁止了,出来的时候没有开,在中断程序里后面的两句改为tr0=1;et0=1;就会跑了,希望答案对你有帮助

⑹ 单片机两位秒表0-99

用定时器产生1秒中断,在中断里计时变量(全局)递增,大于99时,清零。

⑺ 51单片机制作一个秒表

//功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int

uchar count=0;//对50ms定时时间进行计数
uchar miao=0; //秒计数器

//函数名:timer_1()
//函数功能:定时器T1的中断函数,T1在工作方式1下每50秒产生中断,执行该中断函数
//形式参数:无
//返回值:无
void timer_1() interrupt 3 //T1的中断类型号为3
{
TH1=(65536-50000)/256; //重新设置T1计数初值高8位
TL1=(65536-50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
if(count==20) //1s时间到
{
count=0; //50ms计数器清0
miao++; //秒计数器加1
if(miao==100)miao=0; //miao计数到100,则从0开始计数
}
}

bit b=0;
void int_0() interrupt 0
{
if(b == 0){TR1 = 0;b = 1;}
else
{
b = 0;
TR1 = 1;
}
}

void int_1() interrupt 2
{
miao=0;
count = 0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
}

//函数名:disp
//函数功能:将i的值显示在两个静态连接的数码管上
//形式参数:i,取值范围0~99
//返回值:无
void disp(uchar i)
{
uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//定义0~9显示码,共阳极数码管
P1=led[i/10]; //显示i高位
P2=led[i%10]; //显示i地位
}
void main()
{
TMOD=0x10;//设置T1在工作方式1
TH1=(65536-50000)/256;//设置T1计数初值高8位,定时时间50ms
TL1=(65536-50000)%256;//设置T1计数初值低8位
ET1=1;//开放T1中断允许
EX0 = 1;
IT0 = 1;
EX1 = 1;
IT1=1;
EA=1;//开放总中断允许
TR1=1;//启动T1开始计时
while(1)
{
disp(miao);//显示秒计数器值
}
}

⑻ 用51单片机0-99位的秒表,为什么后三位也会显示比较暗的数呢

“锅派”视频看多了吧?
估计LZ说的东西,是不开启的位,也有微亮的效果。这是典型的残影,从程序看得出来,LZ应该去了解过残影,或者说,教这个程序的人,比以前增加了残影改善。但那都是乱来的,因为他根本不明白残影产生的原理。
除了残影,难道LZ就没发现,按住按键,整个显示就没了吗??这才是这个程序最致命的地方。残影,只能算个瑕疵,而这个却叫“系统崩溃”。
还有,且不论你的命名规则乱来,就说这个 ge、shi、与 temp的使用,就可以知道LZ 对C语音的掌握远远没有理解就开始乱用了。

⑼ ‘求助’用51单片机定时器实现99秒表倒计时

K1EQUP1.0
K2EQUP1.1
K3EQUP1.2
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVTMOD,#01H
MOVTH0,#HIGH(65536-10000)
MOVTL0,#LOW(65536-10000)
SETBET0
SETBTR0
SETBEA
MOVR0,#9
MOVR1,#9
MOVR2,#0
MOVR3,#99
CLR00H
CLR01H
LOOP:
JBK1,LP01
JNBK1,$
CLR01H
INCR3
CJNER3,#100,LOOP0
MOVR3,#0
SJMPLOOP0
LP01:
JBK2,LP02
JNBK2,$
CLR01H
CJNER3,#0,LP011
MOVR3,#99
SJMPLOOP0
LP011:
DECR3
SJMPLOOP0
LP02:
JBK3,LOOP
JNBK3,$
SETB01H
SJMPLOOP
LOOP0:
MOVA,R3
MOVB,#10
DIVAB
MOVR0,B
MOVR1,A
SJMPLOOP
T0ISR:
CLRTR0
MOVTH0,#HIGH(65536-10000)
MOVTL0,#LOW(65536-10000)
SETBTR0
MOVDPTR,#TABLE
T0C:
CPL00H
JB00H,T001
MOVP3,#0FDH
MOVA,R1
MOVCA,@A+DPTR
MOVP2,A
SJMPT002
T001:
MOVP3,#0FEH
MOVA,R0
MOVCA,@A+DPTR
MOVP2,A
T002:
JNB01H,T0E
INCR2
MOVA,R2
CJNEA,#100,T0E
MOVR2,#0
MOVA,R0
JZT003
DECR0
SJMPT0E
T003:
MOVA,R1
JZT004
DECR1
MOVR0,#9
T0E:
RETI
T004:
CLR01H
MOVR4,#16
T005:
CPLP0.0
LCALLDELAY
DJNZR4,T005
RETI
DELAY:
MOVR6,#200
DLY:
MOVR7,#250
DJNZR7,$
DJNZR6,DLY
RET
TABLE:;共阴极数码管显示代码表
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,6FH;56789

END

⑽ 单片机秒表

用定时器加数码管做就可以了吧

阅读全文

与单片机99秒表相关的资料

热点内容
业务逻辑程序员 浏览:657
addto新建文件夹什么意思 浏览:158
有服务器地址怎么安装软件 浏览:659
安卓如何完全清除数据 浏览:690
安卓安卓证书怎么信任 浏览:53
服务器被攻击如何解决 浏览:221
学霸变成程序员 浏览:881
c语言编译错误fatalerror 浏览:441
ipv4内部服务器地址怎么分配 浏览:463
java线程安全的方法 浏览:950
重复命令画梯形 浏览:164
在疫情就是命令 浏览:328
自己搭建一个什么服务器好玩 浏览:253
java基础马士兵 浏览:823
完美世界手游如何查看服务器 浏览:859
光遇安卓与ios什么时候互通 浏览:598
js如何运行时编译 浏览:917
引力app在哪里下载 浏览:609
编写app如何得到钱 浏览:801
吉利汽车软件放哪个文件夹安装 浏览:224