利用51单片机,通过两位数码管显示秒,按键实现计时和停止计时 具体内容内详
KEYVAL EQU 30HDAT EQU 33HSCANLED EQU 39HCLK EQU 77HSEC EQU 78HSEC1 EQU 79HSEC2 EQU 7AHDOT BIT 00HORG 0000HLJMP MAINORG 0003HLJMP EXTINT0ORG 000BHLJMP T0ISR ;50ms定时ORG 001BHLJMP T1ISR ;扫描显示ORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#11HMOV TH0,#03CHMOV TL0,#0B0HMOV TH1,#0ECHMOV TL1,#078HMOV KEYVAL,#2MOV 33H,#10HMOV 34H,#10HMOV 35H,#10HMOV 36H,#10HMOV CLK,#0SETB IT0SETB EX0CLR TR0CLR ET0MOV R2,#0SETB TR1SETB ET1SETB EALOOP:MOV A,KEYVALLOOP1:JNZ LOOP2 ;启动SETB TR0SETB ET0SJMP LOOPLOOP2:DEC AJNZ LOOP3 ;暂停CLR TR0CLR ET0SJMP LOOPLOOP3:DEC AJNZ LOOP ;清零MOV 36H,#0MOV 35H,#0MOV 34H,#0MOV 33H,#0SJMP LOOPEXTINT0:PUSH ACCINC KEYVALMOV A,KEYVALCJNE A,#3,EXT00EXT00:JC EXT01MOV KEYVAL,#0EXT01:POP ACCRETIT0ISR:PUSH ACCCLR TR0MOV TH0,#3CHMOV TL0,#0B0HSETB TR0INC CLKMOV A,CLKCJNE A,#2,T0ISREMOV CLK,#0INC 36HMOV A,36HCJNE A,#10,T0ISREMOV 36H,#0INC 35HMOV A,35HCJNE A,#10,T0ISREMOV 35H,#0INC 34HMOV A,34HCJNE A,#6,T0ISREMOV 34H,#0INC 33HMOV A,33HCJNE A,#10,T0ISREMOV 33H,#0T0ISRE:POP ACCRETIT1ISR:PUSH ACCCLR TR1MOV TH1,#0ECHMOV TL1,#78HSETB TR1MOV DPTR,#LEDTABT100:MOV R0,#DATMOV A,SCANLEDADD A,R0MOV R0,AMOV A,SCANLEDJNZ T101MOV P2,#01HSETB DOTSJMP T1DIST101:DEC AJNZ T102MOV P2,#02HCLR DOTSJMP T1DIST102:DEC AJNZ T103MOV P2,#04HSETB DOTSJMP T1DIST103:MOV P2,#08HCLR DOTT1DIS:MOV A,@R0MOVC A,@A+DPTRJNB DOT,T1DIS1ORL A,#01HT1DIS1:CPL AMOV P0,AINC SCANLEDMOV A,SCANLEDCJNE A,#4,T1ENDMOV SCANLED,#0T1END:POP ACCRETILEDTAB: DB 0FCH ;"0" 00HDB 60H ;"1" 01HDB 0DAH ;"2" 02HDB 0F2H ;"3" 03HDB 66H ;"4" 04HDB 0B6H ;"5" 05HDB 0BEH ;"6" 06HDB 0E0H ;"7" 07HDB 0FEH ;"8" 08HDB 0F6H ;"9" 09HDB 0EEH ;"A" 0AHDB 3EH ;"B" 0BHDB 9CH ;"C" 0CHDB 7AH ;"D" 0DHDB 9EH ;"E" 0EHDB 8EH ;"F" 0FHDB 00H ;" " 10H
END
并用一个按键啥? 51单片机我没设计过电路,用的学习板是现成的,对着电路图。 那个学习板上没有锁存器啥的,只能靠扫描来显示2个数字(就是两个数码管轮流显示数字,因为轮流速度非常快人眼看不出来一次其实只有一个在显示) 思路的话,按键和计时器都用中断控制会比较方便, 1个全局变量代表当前剩余秒数,一个全局变量代表当前剩余分钟数(或者你要一个16位变量代表秒数也行) 因为计时器无法定时1秒所以还要一个变量来辅助计时器实现每1秒引发一次事件的操作。 加上按键,这样就有2个事件:一个是1秒引发一次,一个是按钮引发 按钮作用是什么我不知道,你自己看着办 计时器就是全局变量的秒数减去1 这两个事件实现以后,主程序逻辑就是一开始启用中断、启用定时器、初始化全局变量, 然后就开始死循环,循环里的功能是把全局变量里的数字显示到数码管上,只管显示不管别的的话还是很容易的,别的(计时、按钮)全部交给中断去完成,即可。
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,#0
MOV R1,#0
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
INC R0
CJNE R0,#10,T0E
MOV R0,#0
INC R1
CJNE A,#10,T0E
MOV R1,#0
T0E:
RETI
T004:
CLR TR0
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
可以参考:
http://hi.baidu.com/do_sermon/item/a30d88dbc3404148ddf9be99
空间中,还有多种不同类型的时钟、秒表,正、倒计时的,都有。
这个很简单的 你QQ好友吧 我班全部的资料传给你 我的是C语言 25502840 这样 和你交谈 有利于你的学习 照搬照抄 没意思
答:MOV 31H,#00H MOV 32H,#00H MOV 33H,#01H MOV 34H,#06H MOV 35H,#03H MOV 36H,#02H ACALL D0 JMP $-2 D0: MOV R0,#31H MOV R2,#11111110B MOV DPTR,#TAB D1: ORL P1,#00111111B MOV A,@R0 MOVC A,@A+DPTR MOV R3,#8 D2...
答:KEYVAL EQU 30HDAT EQU 33HSCANLED EQU 39HCLK EQU 77HSEC EQU 78HSEC1 EQU 79HSEC2 EQU 7AHDOT BIT 00HORG 0000HLJMP MAINORG 0003HLJMP EXTINT0ORG 000BHLJMP T0ISR ;50ms定时ORG 001BHLJMP T1ISR ;扫描显示ORG 0030HMAIN:MOV SP,#5FHMOV TMOD,#11HMOV TH0,#03CHMOV TL0,...
答:ORG 0000H JMP BEGIN ORG000BH LJMPT0INT ORG001BH LJMPT1INT LEDDEQU30H LEDCEQU 36H SECCEQU 37H TCNTEQU 3AH ORG 0030H ;--- TABLE: ; 共阴极数码管显示代码表 DB 0FCH;"0"00H DB 60H;"1"01H DB 0DAH;"2"02H DB 0F2H;"3"03H DB 66H;"4"04H DB 0B6H;"5"...
答:CJNEA,#100,UENRET;比较=这里因为只有两位数码管 MOVCNT,#00H;意思跟上面20 的一样,UENRET:POPACC;弹出A保护的值 POPPSW;弹出状态寄寄原值 RETI;中断返回 ;外总中断复位 INT00:PUSHPSW PUSHACC MOVCOUNT,#00H;清COUNT寄存器 MOVCNT,#00H;清CNT寄存器 CALLDELAY POPACC;弹出保护数据 POPPSW ...
答:uchar number,dat=29;void t0isr() interrupt 1 case 0:P2=0x02;P0=distab[dat/10];break;case 1:P2=0x01;P0=distab[dat%10];TMOD=0x01;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TR0=1;ET0=1;EA=1;while(1);} 分类 数码管也称LED数码管,不同行业人士对数码管的称呼不一样...
答:帮你分析一下:该题是用单片机的串口,传送数据送给2位数码管显示,串口要选择工作在方式0,即做同步移位寄存器使用,工作在发送状态,用RXD做数据线,TXD做同步时钟使用。然后可以编程,发送如上数据为11111110B,测试数码管a段是否正常能亮。程序就不帮你写了,做为学生要自己动手,考试题要自己答才行...
答:main(){ a=1;b=2;while(1){ for(c;c<5;c++){ aa=0; //打开第一个数码管 P0=table[a];delay(20);P0=0xff;aa=1;bb=0; //打开第二个数码管 P0=table[b];delay(20);P0=0xff;bb=1;a++;b++;} a=1;b=2;c=0;} } ...
答:是因为人眼的视觉暂留效应,实际上两个数码管是交替显示的,但是因为交替的速度十分快,所以会有因为视觉暂留效应而看到两个数码管都是同时现实的。视觉暂留现象即视觉暂停现象(Persistence of vision,Visual staying phenomenon,duration of vision)又称“余晖效应”,1824年由英国伦敦大学教授皮特.马克....
答:这个我仿真过了 是有用的,,,是从00开始显示 到了99会从新开始从00开始加 include<reg51.h> define uchar unsigned char define uint unsigned int uchar code disp[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code bit_tab[]={0xfe,0xfd};uchar disp_buf[...
答:为您推荐: 单片机原理及应用 单片机有什么用 51单片机 单片机是什么 单片机和plc的区别 单片机编程 单片机论坛 单片机原理及接口技术 单片机$ 废物利用手工制作大全 其他类似问题2012-10-02 基于AT89C51单片机,利用定时器设计一个两位数码管显示电... 2012-04-25 基于AT89C51单片机,利用定时器设计一个...