求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。

求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。,第1张

从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语言写的单片机程序,只要能让数码管倒计时就行。。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/zz/9969055.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存