利用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 这样 和你交谈 有利于你的学习 照搬照抄 没意思
求汇编51单片机接两个数码管从00显示到99,外部中断0接一开关用于复位...
CJNEA,#100,UENRET;比较=这里因为只有两位数码管 MOVCNT,#00H;意思跟上面20 的一样,UENRET:POPACC;弹出A保护的值 POPPSW;弹出状态寄寄原值 RETI;中断返回 ;外总中断复位 INT00:PUSHPSW PUSHACC MOVCOUNT,#00H;清COUNT寄存器 MOVCNT,#00H;清CNT寄存器 CALLDELAY POPACC;弹出保护数据 POPPSW ...
51单片机二段数码管如何显示数字并且不闪烁?
你是想小于10时,只显示个位,十位是灭的,只有超过9时,才显示十位吗?显示时,就不用再检查按键了,if(num>=10){ \/\/while(k1==1);\/\/删掉这行 P2=0xfe; \/\/这行和下行交换一下 P0=Dsy_Code[num\/10];下图是仿真的结果,可以正常显示了。但是,在按键的时候,个位会闪一下,这是因为...
...然后在两个数码管(加起来)上显示出来,C语言程序怎么写?
include<reg51.h>#define uchar unsigned char;uchar LED1,LED2,LED3,LED4;uchar keyval,calflag,s_dat,d_dat;uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned int number,r_dat;void delay(unsigned int a...
求两位数码管显示一个倒数时间的单片机程序,比如显示从99到0
\/\/两位数码管显示倒计数99~00,51单片机。include<reg52.h> \/\/ 倒计数 define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar bai,shi;uint a1,a2;sbit D1=P3^...
51单片机数码管怎样才能同时在两个数码管上面显示不同的数字??_百度...
是因为人眼的视觉暂留效应,实际上两个数码管是交替显示的,但是因为交替的速度十分快,所以会有因为视觉暂留效应而看到两个数码管都是同时现实的。视觉暂留现象即视觉暂停现象(Persistence of vision,Visual staying phenomenon,duration of vision)又称“余晖效应”,1824年由英国伦敦大学教授皮特.马克....
51单片机c程序用定时器控制两个数码管显示0到59,一直没弄懂段位和位选...
每个数字 有 八个段 为 a b c d e f g h,(h 为小数点)数码管 有 两位一体的、三位一体的,四位一体的等,如四位一体的数码管有12个脚,分为 a b c d e f g h 八个 段码脚,四个 位码脚(四个数字位)数码管 的 显示 方法 需要 扫描显示,就是...
求用51单片机接两个数码管,0-99动态显示程序(用C语言)
第一个是个位,先显示个位,数组的运用是利用下标控制的,我们用变量b控制下标。第二个是十位,也是利用下标控制数组的。当然这个变量k我们可以先不赋值,让它自增或自减从最大值一直减到最小,就是从99显示到0了,当然你的电路有些浪费I\/O口,两个数码管你把段全部连在一起不就行了,然后把共...
51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。
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"...
用单片机控制两个数码管显示同时控制流水灯?
具体实现时,你可以先初始化数码管和流水灯,然后在主循环中,首先处理数码管的显示,保持相应的IO状态,然后处理流水灯的状态切换。这样可以确保数码管和流水灯能够平稳共存。通过这种方式,你可以有效地控制数码管和流水灯,避免它们之间的冲突,同时保持程序的简洁和高效。希望这些建议对你有所帮助。
...驱动两位共阳数码管编程谁能发几个,我是51单片机初学者
这一信号用于控制数码管的位显示,即确定要显示的是第一位还是第二位。综上所述,通过连接74HC573锁存器,单片机能够更高效地控制两位共阳数码管的显示,节省了宝贵的IO口资源,并简化了编程过程。对于51单片机初学者而言,掌握这一技巧对于实现更复杂的电路控制任务大有裨益。