我想看看你写的程序!可以就发我一下你的代码和你的那个硬件图吧。
然后下面这个程序你可以参考一下。是符合我的硬件图的。
#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倒计时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)