
从60秒到30秒再到90秒并循环倒计时显示。
----
有点不好理解。
从60秒到30秒,看来,是倒计时。
到了30之后,怎么办?是立即改为90吗?
到了90之后,再怎么办?是立即改为60吗?
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
# include<reg52h>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
uint8 code number[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e,
};
int a[4];
uint16 counter = 0;
sbit ADDR0 = P3^2;
sbit ADDR1 = P3^1;
sbit ADDR2 = P3^0;
sbit ADDR3 = P2^6;
void delay();
void timer1_init()
{
TMOD|= 0x10;
TMOD&=0x10;
TH1 = 0xFC;
TL1 = 0x67;
TR1 = 1;
}
void int_init()
{
ET1 = 1;
EA = 1;
}
void refresh_led( )
{
static uint8 j = 0;
switch(j)
{
case 0:ADDR0 = 1;ADDR1 = 1;ADDR2 = 1;ADDR3 = 0;j++;P1=number[a[0]];break;
case 1:ADDR0 = 1;ADDR1 = 1;ADDR2 = 0;ADDR3 = 1;j++;P1=number[a[1]];break;
case 2:ADDR0 = 1;ADDR1 = 0;ADDR2 = 1;ADDR3 = 1;j++;P1=number[a[2]];break;
case 3:ADDR0 = 0;ADDR1 = 1;ADDR2 = 1;ADDR3 = 1;j=0;P1=number[a[3]];break;
default:break;
}
}
void main()
{
ADDR3 = 1;
timer1_init();
int_init();
while(1);
}
void interrupt_timer1() interrupt 3
{
static uint32 sec = 0;
TH1 = 0xFC;
TL1 = 0x67;
counter++;
if(counter==1000)
{
sec++;
counter=0;
a[0]=sec%10;
a[1]=sec/10%10;
a[2]=sec/100%10;
a[3]=sec/1000%10;
}
refresh_led( );
}
#include <AT89X51H>
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
tcount=0;
second=0;
P0=dispcode[second/10];
P2=dispcode[second%10];
while(1)
{
if(TF0==1)
{
tcount--;
if(tcount==0)
{
tcount=15;
second--;
if(second==0)
{
second=15;
}
P0=dispcode[second/10];
P2=dispcode[second%10];
}
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
}
}
#include<reg51h> // 包含51单片机寄存器定义的头文件
unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned char second; //储存秒
/
函数功能:快速动态扫描延时,延时约06毫秒
/
void delay(void)
{
unsigned char i;
for(i=0;i<200;i++) ;
}
/
函数功能:显示秒
入口参数:k
出口参数:无
/
void DisplaySecond(unsigned char k)
{
P2=Tab[k/10]; //显示十位
P3=0x01; //P30引脚输出高电平, 点亮 十位
delay();
P3=0xfc; //关闭所有数码管
P2=Tab[k%10]; //显示个位
P3=0x02; //P31引脚输出高电平, 点亮 个位
delay();
P3=0xfc; //关闭所有数码管
}
void main(void) //主函数
{
TMOD=0x01; //使用定时器T0
TH0=(65536-5000)/256; //将定时器计时时间设定为50毫秒
TL0=(65536-5000)%256;
EA=1; //开启总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0开始运行
int_time=0; //中断次数初始化
second=99; //秒初始化
while(1)
{
DisplaySecond(second); //调用秒的显示子程序
while(second==0)
DisplaySecond(second);
}
}
//
//函数功能:定时器T0的中断服务程序
//
void interserve(void ) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time ++; //每来一次中断,中断次数int_time自加1
if(int_time==20) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //中断次数清0
second--; //秒减1
}
TH0=(65536-5000)/256; //重新给计数器T0赋初值
TL0=(65536-5000)%256;
TR0=1; //启动定时器T0
if(second==0) //如果 倒计时 0 停止定时器T0
TR0=0;
}
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
#include <at89x52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
#define seg P0
#define sw P2
int tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int dis[]={0,0};
uint X;
uchar Count=0;
uchar sec=60;
void display()
{
int a;
int m=0x01;
dis[0]=sec/10;
dis[1]=sec%10;
for(a=0;a<2;a++)
{
seg=0xff;
seg=tab[dis[a]];
sw=m;
m=_crol_(m,1);
}
}
void TINT0() interrupt 1
{
TL0=-50000%256;
TH0=-50000/256;
if(++Count==20)
{
if(sec>0)sec--;
Count=0;
}
}
void Main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TL0=-50000%256;
TH0=-50000/256;
while(1)
{
if(sec==0)sec=60;
display();
}
}
你把减一的程序弄到主程序main的while里边,在运行while之前加一个while按键判断子程序,将按键与p1口连接,当p10=0时结束while。
while(1)
{
if(p1_0==0)
delay(10); 消抖
if(p1_0==0)
while(p1_0!=0)
break;
}
以上就是关于求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。全部的内容,包括:求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。、设计一个60s倒计时c程序,从60到0逐次递减,谢谢!具体如下图,就是单片机控制两个数码管显示,由、求指点,C语言写的单片机程序,只要能让数码管倒计时就行。。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)