Ⅰ 用汇编语言在c51单片机上实现6(时分秒)位倒计时程序,能够调节设置时间,并能暂停,终止,继续
ORG0000H
JMPBEGIN
ORG 000BH
LJMP T0INT
ORG 001BH
LJMP T1INT
LEDD EQU 30H
LEDC EQU36H
SECC EQU37H
MINC EQU38H
HOUR EQU39H
TCNT EQU3AH
ORG0030H
;---------------------------------------
TABLE:;共阴极数码管显示代码表
DB0FCH ;"0" 00H
DB60H ;"1" 01H
DB0DAH ;"2" 02H
DB0F2H ;"3" 03H
DB66H ;"4" 04H
DB0B6H ;"5" 05H
DB0BEH ;"6" 06H
DB0E0H ;"7" 07H
DB0FEH ;"8" 08H
DB0F6H ;"9" 09H
DB0EEH ;"A" 0AH
DB3EH ;"B" 0BH
DB9CH ;"C" 0CH
DB7AH ;"D" 0DH
DB9EH ;"E" 0EH
DB8EH ;"F" 0FH
DB00H ;"" 10H
;DB3FH,06H,5BH,4FH,66H;12345
;DB6DH,7DH,07H,7FH,;6789
;---------------------------------------
DELAY:
MOVR6,#25
DLY01:
MOVR7,#100
DJNZR7,$
DJNZR6,DLY01
RET
;---------------------------------------
BEGIN:
MOVSP,#5FH
MOVTMOD,#11H
MOVTH0,#3CH
MOVTL0,#0B0H
MOVTH1,#0F4H
MOVTL1,#48H
MOVLEDC,#6
MOVR0,#LEDD
CLRA
INIT:
MOV@R0,A
INCR0
DJNZLEDC,INIT
SETBET1
SETBTR1
MOVP2,#0
MOVTCNT,#0
MOVHOUR,#0
MOVMINC,#0
MOVSECC,#0
SETBET0
SETBEA
LOOP:
JBP1.0,LOOP1
LCALLDELAY
JBP1.0,LOOP1
JNBP1.0,$
INCHOUR
MOVA,HOUR
CJNEA,#24,LOOPH
LOOPH:
JCLOOPH1
MOVHOUR,#0
LOOPH1:
LCALLDISHOUR
SJMPLOOP
LOOP1:
JBP1.1,LOOP2
LCALLDELAY
JBP1.1,LOOP2
JNBP1.1,$
MOVA,HOUR
JNZLOOPH2
MOVHOUR,#23
SJMPLOOPH3
LOOPH2:
DECHOUR
LOOPH3:
LCALLDISHOUR
SJMPLOOP
LOOP2:
JBP1.2,LOOP3
LCALLDELAY
JBP1.2,LOOP3
JNBP1.2,$
INCMINC
MOVA,MINC
CJNEA,#60,LOOPM
LOOPM:
JCLOOPM1
MOVMINC,#0
LOOPM1:
LCALLDISMIN
SJMPLOOP
LOOP3:
JBP1.3,LOOP4
LCALLDELAY
JBP1.3,LOOP4
JNBP1.3,$
MOVA,MINC
JNZLOOPM2
MOVMINC,#59
SJMPLOOPM3
LOOPM2:
DECMINC
LOOPM3:
LCALLDISMIN
SJMPLOOP
LOOP4:
JBP1.4,LOOP5
LCALLDELAY
JBP1.4,LOOP5
JNBP1.4,$
INCSECC
MOVA,SECC
CJNEA,#60,LOOPS
LOOPS:
JCLOOPS1
MOVSECC,#0
LOOPS1:
LCALLDISSEC
LJMPLOOP
LOOP5:
JBP1.5,LOOP6
LCALLDELAY
JBP1.5,LOOP6
JNBP1.5,$
MOVA,SECC
JNZLOOPS2
MOVSECC,#59
SJMPLOOPS3
LOOPS2:
DECSECC
LOOPS3:
LCALLDISSEC
LJMPLOOP
LOOP6:
JBP3.1,LOOP7
LCALLDELAY
JBP3.1,LOOP7
JNBP3.1,$
CPLTR0
LOOP7:
LJMPLOOP
;---------------------------------------
T1INT:
PUSHACC
CLRTR1
MOVTH1,#0F4H
MOVTL1,#48H
SETBTR1
MOVDPTR,#TABLE
MOVR0,#LEDD
MOVA,LEDC
T1INT0:
JNZT1INT1
MOVP2,#01H
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
SJMPT1INTD
T1INT1:
DECA
JNZT1INT2
MOVP2,#02H
INCR0
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
SJMPT1INTD
T1INT2:
DECA
JNZT1INT3
MOVP2,#04H
INCR0
INCR0
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
SJMPT1INTD
T1INT3:
DECA
JNZT1INT4
MOVP2,#08H
INCR0
INCR0
INCR0
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
SJMPT1INTD
T1INT4:
DECA
JNZT1INT5
MOVP2,#10H
INCR0
INCR0
INCR0
INCR0
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
SJMPT1INTD
T1INT5:
DECA
JNZT1INTD
MOVP2,#20H
INCR0
INCR0
INCR0
INCR0
INCR0
MOVA,@R0
MOVCA,@A+DPTR
CPLA
MOVP0,A
T1INTD:
INCLEDC
MOVA,LEDC
CJNEA,#6,T1INT6
T1INT6:
JCT1INTE
MOVLEDC,#0
T1INTE:
POPACC
RETI
;---------------------------------------
HBCD:
MOVB,#10
DIVAB
SWAPA
ORLA,B
RET
;---------------------------------------
T0INT:
PUSHACC
CLRTR0
MOVTH0,#3CH
MOVTL0,#0B0H
SETBTR0
INCTCNT
MOVA,TCNT
CJNEA,#20,T0INT1
T0INT1:
JCT0INTE
MOVTCNT,#0
MOVA,SECC
ORLA,MINC
ORLA,HOUR
JNZT0INT2
SETBP3.0
CLRTR0
POPACC
RETI
T0INT2:
MOVA,MINC
ORLA,HOUR
JNZT0INT3
MOVA,SECC
CJNEA,#6,T0INT21
T0INT21:
JNCT0INT22
CPLP3.0
T0INT22:
DECSECC
LCALLDISSEC
SJMPT0INTE
T0INT3:
MOVA,SECC
JZT0INT31
DECSECC
LCALLDISSEC
SJMPT0INTE
T0INT31:
MOVSECC,#59
LCALLDISSEC
MOVA,MINC
JZT0INT32
DECMINC
LCALLDISMIN
SJMPT0INTE
T0INT32:
MOVMINC,#59
LCALLDISMIN
DECHOUR
LCALLDISHOUR
T0INTE:
POPACC
RETI
;---------------------------------------
DISSEC:
MOVA,SECC
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV30H,A
POPACC
SWAPA
ANLA,#0FH
MOV31H,A
RET
;---------------------------------------
DISMIN:
MOVA,MINC
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV32H,A
POPACC
SWAPA
ANLA,#0FH
MOV33H,A
RET
;---------------------------------------
DISHOUR:
MOVA,HOUR
LCALLHBCD
PUSHACC
ANLA,#0FH
MOV34H,A
POPACC
SWAPA
ANLA,#0FH
MOV35H,A
RET
;---------------------------------------
END
Ⅱ 单片机时钟和倒计时器的汇编语言代码,哪位大侠能给出每个语句的注释解释,感激不尽
ORG 0000H;程序起始于地址0000H,(一般不这样用)
LJMP MAIN;跳到主程序MAIN
ORG 000BH;外部中断INT0程序的地址,此为规定的
LJMP INTT0;跳到外部中断INTT0程序
ORG 001BH;外部中断INT1程序的地址,此也为规定的
LJMP INTT1;跳到外部中断INTT1程序
ORG 0100H;主程序MAIN地址
MAIN: MOV SP,#60H;给堆栈指针SP附内部数据存储器地址60H
MOV 31H,#0;给31H地址内清零即(31H)=0
MOV 20H,#0FEH ;(20H)=11111110B
MOV 21H,#0FFH;(21H)=11111111B
MOV P1,20H;P1=11111110B
LCALL SHEZHI1;调用程序段SHEZHI1
MOV 20H,#0FDH;(20H)=11111101B
MOV P1,20H;P1=11111101B
MOV 40H,#10;(40H)=0AH
SETB EA;开总中断
SETB ET0;开定时中断T0
MOV TMOD,#11H;设置T0工作于定时方式1
MOV TH0,#3CH;定时初值设置高位
MOV TL0,#0B0H;定时初值设置低位
SETB TR0;允许T0中断
LL: LCALL KEY;调用KEY
LCALL KEYC;调用KEYC
SJMP LL;循环调用回LL
INTT0: PUSH ACC;将ACC值压栈
PUSH PSW;将PSW值继续压栈
SETB RS1;RS1位置1
SETB RS0;RS0位置1,即选中内部数据存储器组的3组
DJNZ 40H,DOWN;判断十次结束否?且计数值自减一,若没有够十次,则转入程序DOWN , 否则顺序执行
MOV 40H,#10;继续在(40H)存入计数值十
MOV R0,#41H;(R0)=41H
MOV A,@R0 ; 判秒是否到60
ADD A,#1;A中值加一
DA A;十进制调整
MOV @R0,A;再送回原单元
CLR C;清进位位
SUBB A,#60H;与60相减
JC DOWN;通过判断进位位看是否到60了,没到就去DOWN,到了就顺序执行
MOV @R0,#0;41H单元清零
INC R0;地址自加一
MOV A,@R0 ; 判分是否到60
ADD A,#1
DA A
MOV @R0,A
CLR C
SUBB A,#60H
JC DOWN
MOV @R0,#0
INC R0
MOV A,@R0 ; 判时是否到24
ADD A,#1
DA A
MOV @R0,A
CLR C
SUBB A,#24H
JC DOWN
MOV @R0,#0
INC R0
MOV A,@R0 ; 判日是否到指定天数
ADD A,#1
DA A
MOV @R0,A
INC R0
MOV A,@R0
MOV R4,A ;月份送R4,本月天数送R5
JNB ACC.4,NEXT2
CLR C
SUBB A,#06H
NEXT2: MOV DPTR,#DAYTAB
DEC A
MOVC A,@A+DPTR
MOV R5,A
CJNE R4,#2,NEXT
JNB 08H,NEXT1
NEXT: INC R5
NEXT1: DEC R0
MOV A,R5
CLR C
SUBB A,@R0
JNC DOWN
MOV @R0,#1
INC R0
MOV A,@R0 ; 判月是否到13
ADD A,#1
DA A
MOV @R0,A
CLR C
SUBB A,#13H
JC DOWN
MOV @R0,#1
INC R0
MOV A,@R0 ;判年低位是否到00
ADD A,#1
DA A
MOV @R0,A
INC R0
MOV A,@R0
ADDC A,#0
DA A
MOV @R0,A
DOWN: MOV A,#42H
CJNE A,4EH,DOWN2
MOV A,#43H
CJNE A,4FH,DOWN2
CLR 07H
DOWN2: JB 06H,DOWN4
DOWN4: CLR TR0
MOV A,#0B7H
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADDC A,TH0
MOV TH0,A
SETB TR0
POP PSW
POP ACC
RETI
DAYTAB: DB 31H,28H,31H,30H,31H,30H,31H,31H,30H,31H,30H,31H
Ⅲ 51单片机汇编语言倒计时60秒循环程序
可以在SJMP $这里改成判断R2是不是为0,如是就重新载入60…如果不是就跳回重新判断R2
Ⅳ 单片机19秒倒数计时器,不要按键的,汇编语言,程序语言简单些
ORG 0000H ;程序开始地址
LJMP MAIN ;跳到主程序
ORG 000BH ;定时器入口地址
LJMP TIME0 ;定时器中断时,跳到TIME0处
ORG 0030H ;主程序地址
MAIN:MOV TMOD,#01H ;设置定时器T0工作模式1
MOV TL0,#0B0H ;赋初值,定时50ms(在晶振为12MHz)
MOV TH0,#3CH
SETB EA ;开总中断
SETB ET0 ;开定时器T0中断
SETB TR0 ;启动T0定时器
MOV R3,#20 ;R3为1s计数单元,计数20次为1S MOV R4,#19 ;19s计数单元
DISP:MOV A,R4 ;显示子程序; MOV B,#10 DIV AB ;计数单元的数除以10,商给A,余数给B
MOV DPTR,#TAB ;DPTR指向编码表位置TAB
MOVC A,@A+DPTR ;根据A中的值调出编码表中的数,并赋给A
MOV P1,A ;把A赋给51H单元 SETB P2.0 LCALL DLL CLR P2.0
MOV A,B ;把B赋给A
MOVC A,@A+DPTR ;根据A中的值调出编码表中的数,并赋给A
MOV P1,A ;把A赋给P1显示 SETB P2.1 LCALL DLL CLR P2.1 LJMP DISP RET ;子程序返回;---定时器中断子程序,定时50ms----;
TIME0:MOV TH0,#03CH ;赋初值
MOV TL0,#0B0H
DJNZ R3,EXT1 ;1s到了?没有转去EXT1
MOV R3,#20 ;1s到了,重新赋值
DEC R4 ;1S到了R4减1CJNE R4,#0,EXT1 ;19s到了吗,没有到则转去EXT1MOV R4,#19 ;19S到了重新赋值EXT1:RETI ;中断返回;----10ms延时子程序-------------;
DLL:MOV R2,#200
D11:MOV R1,#1
DJNZ R1,$
DJNZ R2,D11
RET
;----编码表-------;
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
Ⅳ 51单片机倒计时程序汇编求解,求注释
程序不全,只能望文生义了
RERI:
MOVA,R1;取R1的值
MOVDPTR,#TAB;将表首址送数据指针
MOVP2,#11110001B;送位选码第一位
MOVCA,@A+DPTR;取显示数据
MOVP1,A;送显示段码
LCALLTIME;取时间值
MOVP2,#11110010B;送位选第二位
MOVA,R4;将R4值送A
MOVCA,@A+DPTR;查表得显示段码
MOVP1,A;送显示
LCALLTIME ;取时间值
MOVP2,#11111100B;送位码低三位
MOVA,R2;将R2送A
MOVCA,@A+DPTR;查表取显示段码
MOVP1,A;送显示
LCALLTIME;取时间值
JNBK2,D1;K2减1不为零转D1
JNBK3,D2;K3减1不为0转D2
SJMPRERI;转到RERI
Ⅵ 单片机的倒计时程序
//工程名称:99秒倒计时//功能描述:程序开始显示99秒等待开始倒计时,当再次按下开关后计时//停止,当再按下开关后计时//复位实际上是单片机复位,重新开始!//通过本程序新的认识: 1.BCD数码管的使用 2.十进制到BCD码转化 //3.C51的等待按键作用//2. temp=99;i=temp/10;j=temp%10;i=(i<<4);dis=i+j;P0=dis;//3.while(sw==1){;}// 判按下,下则出 while(sw==0){;}//判松开// ,开则出#includesbit sw=P3^5; //定义开关main(){ unsigned char temp,dis;unsigned int i,j,k,t;// P0=0x88; //初试时检测数码管是否正常// for(k=0;k<40000;k++); temp=99;i=temp/10;j=temp%10;i=(i<<4);dis=i+j;P0=dis;//启动是显示99while(sw==1){;}// 判按下,下则出while(sw==0){;}//判松开 ,开则出 第一次按开关for(t=0;t<5;t++)//循环来减{for(k=0;k<30000;k++);temp--;i=temp/10;j=temp%10;i=(i<<4);dis=i+j;P0=dis;for(k=0;k<30000;k++);if(sw==0) break;// while(sw==1){;}// while(sw==1){;}// break;}while(sw==1){;}// 判按下,下则出while(sw==0){;}//判松开 ,开则出 第一次按开关while(sw==1){;}// 判按下,下则出while(sw==0){;}//判松开 ,开则出 第一次按开关
Ⅶ S52单片机交通信号灯显示倒计时汇编程序
摘要 您好,亲.您所问的S52单片机交通信号灯显示倒计时汇编程序 为您提供答案如下:
Ⅷ 求一个基于单片机的用汇编语言写的倒计时程序
刚写的程序,可以通过S0(功能键),S1(加键),S2(减键)设定初值,倒数为00-00-00时蜂鸣器响,通过八位LED显示;
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位选码表
uchar code an[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选码表
sbit s0=P3^3; //设置功能键
sbit s1=P3^5; //设置‘加’键
sbit s2=P3^6; //设置‘减’键
sbit beep=P3^7; //设置蜂鸣器
void delay(uint z);
void display();
void init();
void keyscan();
uchar shi,fen,miao,nam;
void main()
{
init();
while(1)
{
display();
keyscan();
beep=1;
if (miao==0&&fen==0&&shi==0)//当倒数计时为00-00-00时蜂鸣器响
{
beep=0;
TR0=0;
}
}
}
void delay(uint z)
{
uint i,j;
for (i=z;i>0;i--)
for (j=110;j>0;j--);
}
void display() //我这里P2为位选,P0为段选,显示格式为 时-分-秒
{
uchar s,g;
s=shi/10;
g=shi%10;
P2=wei[7];
P0=an[s];
delay(1);
P2=wei[6];
P0=an[g];
delay(1);
P2=wei[5];
P0=0xbf;
delay(1);
s=fen/10;
g=fen%10;
P2=wei[4];
P0=an[s];
delay(1);
P2=wei[3];
P0=an[g];
delay(1);
P2=wei[2];
P0=0xbf;
delay(1);
s=miao/10;
g=miao%10;
P2=wei[1];
P0=an[s];
delay(1);
P2=wei[0];
P0=an[g];
delay(1);
}
void init()
{
miao=10; //设定初值为 00-01-10
fen=1;
shi=0;
EA=1;
ET0=1;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
}
void timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
nam++;
if (nam==20)
{
nam=0;
if (miao==0)
{
miao=60;
if (fen==0)
{
fen=60;
if (shi==0)
shi=24;
shi--;
}
fen--;
}
miao--;
}
}
void keyscan()
{
uchar key,num;
if (s0==0)
{
delay(5);
if (s0==0)
{
key++;
if (key==4)
key=0;
}
while(!s0)
display();
}
if (s1==0)
{
delay(5);
if (s1==0)
{
num=1;
}
while(!s1)
display();
}
if (s2==0)
{
delay(5);
if (s2==0)
{
num=2;
}
while(!s2)
display();
}
switch(key)
{
case 0:TR0=1;break;
case 1:TR0=0;
if (num==1)
{
num=0;
miao++;
if (miao>=60)
miao=0;
display();
}
if (num==2)
{
num=0;
if (miao==0)
miao=60;
miao--;
display();
}
break;
case 2:
if (num==1)
{
num=0;
fen++;
if (fen>=60)
fen=0;
display();
}
if (num==2)
{
num=0;
if (fen==0)
fen=60;
fen--;
display();
}
break;
case 3:
if (num==1)
{
num=0;
shi++;
if (shi>=24)
shi=0;
display();
}
if (num==2)
{
num=0;
if (shi==0)
shi=24;
shi--;
display();
}
break;
}
}
Ⅸ 8051单片机30秒倒计时程序用汇编语言编写
用STC串口助手吧
里面有例程,你这个是倒计时。
DELAY30000US:
;@11.0592MHz
PUSH
30H
PUSH
31H
MOV
30H,#54
MOV
31H,#194
NEXT:
DJNZ
31H,NEXT
DJNZ
30H,NEXT
POP
31H
POP
30H
RET
Ⅹ 汇编语言 51单片机 倒计时器程序
这是一个倒计时案例,你可以参考一下:
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 EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#9
CLR 00H
CLR 01H
LOOP:
JB P1.0,LP01
JNB P1.0,$
SETB TR0
CLR 01H
SJMP LOOP0
LP01:
JB P1.1,LP02
JNB P1.1,$
SETB 01H
SJMP LOOP0
LP02:
JB P1.2,LOOP0
JNB P1.1,$
CLR TR0
MOV P3,#0FDH
MOV P2,#0
MOV P3,#0FEH
MOV P2,#0
SJMP MAIN
LOOP0:
JB 00H,LOOP1
MOV A,R0
SJMP LOOP2
LOOP1:
MOV A,R1
LOOP2:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
JB 01H,T0C
INC R2
T0C:
CPL 00H
MOV A,R3
JB 00H,T001
MOV P3,#0FDH
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV P2,A
T002:
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 TR0
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789