小白求救,51单片机利用两个数码管实现60秒倒计时

小白求救,51单片机利用两个数码管实现60秒倒计时,第1张

我想看看你写的程序!可以就发我一下你的代码和你的那个硬件图吧。

然后下面这个程序你可以参考一下。是符合我的硬件图的。

#include <reg51h>

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

void show(unsigned char n);

void delay(unsigned int k);

void main()

{

unsigned char i;

int j;

while(1)

{

for(i=60;j=60,i>0;i--)

while(j--)

show(i);

}

}

void show(unsigned char n)

{

P0=table[n%10];

P1=0x01;

delay(10);

P1=0xFF;

P0=table[n/10];

P1=0x02;

delay(10);

P1=0xFF;

}

void delay(unsigned int k)

{

unsigned char i,j;

for(i=0;i<100;i++)

for(j=0;j<k;j++);

}

delay(int t)这个是延时子程序,如果采用20M晶振的话,调用一次延时t毫秒。

display()是数码管动态扫描显示子程序,位控位为P30、P31,段码控制为P1。扫描间隔时间为5毫秒左右。

C语言的我这里有。

以下是24倒计时的程序。你修改TABLE: 中的数据内容就可以达到你的要求的了。里面用到了两片7447芯片。。。

ORG 0000h

AJMP START

ORG 0030H

START: CLR P31 ;D1亮

JB P37,START ;按下K1倒计时启动

SETB P31 ;D1灭

CLR P30 ;D2亮

MOV TMOD,#01H ;设定时器TIMER0工作在模式1

MOV DPTR,#TABLE

NEXT: MOV A,#00H

MOVC A,@A+DPTR

MOV P1,A

MOV R3,#20 ;延时1秒

LCALL DELAY

INC DPTR ;数据指针加1

CJNE A,#0FFH,NEXT

MOV P1,#0FFH

SETB P30

LJMP START

; 延时05秒子程序

DELAY: SETB TR0 ;起动TIMER0开始计时

AGAIN: MOV TL0,#LOW(65536-50000) ;设定时器TL0的值

MOV TH0,#HIGH(65536-50000) ;设定时器TH0的值

LOOP2: JBC TF0,LOOP3 ;判断TF=1?,是则跳转至LOOP3,并清除TF0

JMP LOOP2 ;TF0不为1则跳转至LOOP2

LOOP3: DJNZ R3,AGAIN ;R3是否为0?不是则跳转至AGAIN

CLR TR0 ;是则停止TIMER0计数

RET

;显示数码表

TABLE:

DB 24H,23H,22H,21H,20H,19H,18H,17H,16H,15H,14H,13H

DB 12H,11H,10H,09H,08H,07H,06H,05H,04H,03H,02H,01H

DB 0FFH ;结束码

END

#include <reg51h>

typedef unsigned int u16;

typedef unsigned char u8;

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 sec=60,cnt=0;

void delay(u16 i)

{

while(i--);

}

void DigDisplay()

{

u8 i;

for(i=0;i<2;i++)

{

switch(i)  //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=0;LSC=0; //显示第0位

P0=smgduan[sec/10];break;

case(1):

LSA=1;LSB=0;LSC=0; //显示第1位

P0=smgduan[sec%10];break;

}

delay(100); //间隔一段时间扫描

}

}

void t0isr() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

cnt++;

if(cnt>=20)

{

cnt=0;

if(sec>0)sec--;

}

}

void main()

{

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TR0=1;

ET0=1;

EA=1;

while(1)

{

DigDisplay();  //数码管显示函数

}

}

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV P2,#3FH

MOV P0,#3FH

MOV P1,#00H

MOV DPTR,#TAB1

MOV R1,#60

ACALL DPLAY

DPLAY:

MOV R2,#100

MOV TMOD,#01H

MOV TH0,#0D8H

MOV TL0,#0F0H

SETB TR0

LP0:

JBC TF0,LP1

AJMP LP0

LP1:

MOV TH0,#0D8H

MOV TL0,#0F0H

DJNZ R2,LP0

ACALL SSG

CJNE R1,#0FFH,DPLAY

RET

SSG: MOV B,#10

MOV A,R1

DIV AB

MOVC A,@A+DPTR

MOV P2,A

MOV A,B

MOVC A,@A+DPTR

MOV P0,A

DEC R1

RET

TAB1:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

END

以上就是关于小白求救,51单片机利用两个数码管实现60秒倒计时全部的内容,包括:小白求救,51单片机利用两个数码管实现60秒倒计时、关于51单片机60秒倒计时的c语言程序,delay和dispiay部分分别什么意思啊,具体点、51单片机 汇编语言 两个七段共阳数码管 60S倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9301846.html

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

发表评论

登录后才能评论

评论列表(0条)

保存