编一个AT89C51单片机00 —99 秒的汇编程序,要求有循环和暂停,用两个独立数码管显示
ORG 0000H
LJMP MAIN
ORG 030H
MAIN:
MOV R2,#0FFH
MOV R5,#0AH
D0: INC R2
MOV R4,#64H
MOV R1,#0FFH
D1: MOV R3,#0FFH
INC R1
D2: MOV A,R1
DA A
MOV R1,A
ANL A,#0FH
ACALL CHA
MOV P2,#0EBH
ACALL DELAY
MOV A,R1
SWAP A
ANL A,#0FH
ACALL CHA
MOV P2,#0E7H
ACALL DELAY
MOV A,R2
ACALL CHA
MOV P2,#0E3H
ACALL DELAY
DJNZ R3,D2
DJNZ R4,D1
DJNZ R5,D0
LJMP MAIN
CHA: MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
RET
DELAY: MOV R6,#0FH
D4:MOV R7,#0FH
DJNZ R7,$
DJNZ R6,D4
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
我的是000--999的,用38译码器控制数码管的3个共阴端,楼主自己修改一下吧!祝楼主好运了!
你好,因为是手机,所以无法贴出程序,但是你的要求很容易实现,我先给你点提示,自己先做一下,不行再回复我。
首先呢,定义两个全局变量,以作十与个并赋值为0,然后编写一个独立键盘函数,分别用于判断SB1~4,若 SB1==0,TR0=1,若SB2==0,TR0=0,若SB3==0,SHI ,若SB4==0,FEN 。主要功能就这样,当然这个并不完美,需要你自己去添加一些功能,然后再编写中断函数。
希望我的回答能帮助到你。
;利用中断的99秒计时器 ,动态扫描两位数码管
;P0口接J3,数据端口
;P2.2接 J2 B端子,表示段码锁存
;P2.3接 J2 A端子,标志位码锁存
LATCH1 BIT P2.2
LATCH2 BIT P2.3
ORG 00H
JMP START
ORG 0BH
JMP TIM0
START:MOV R3,#00 ;中断循环次数
MOV R4,#0 ;时间初值
MOV DPTR,#TABLE
MOV SP,#40H
MOV TMOD,#01H ;定时器工作方式
MOV TH0,#HIGH(65536-3800)
MOV TL0,#LOW(65536-3800) ;初值4MS
SETB TR0
MOV IE,#82H ;开中断
TIM0:
MOV TH0,#HIGH(65536-3800)
MOV TL0,#LOW(65536-3800)
INC R3
CJNE R3,#250,X1 ;1S
MOV R3,#0
MOV A,R4 ;十进制转换
MOV B,#10
DIV AB
MOV 20H,B ; 个位
MOV 21H,A ; 十位
INC R4
CJNE R4,#100,LEDSCAN ;到100则清零
MOV R4,#0
LEDSCAN: CALL SCAN ;调用数码管扫描
X1: PUSH ACC
PUSH PSW
CALL SCAN
POP PSW
POP ACC
RETI
SCAN:
MOV A,21H
MOVC A,@A+DPTR
MOV P0,A
SETB LATCH1
CLR LATCH1
MOV P0,#11111110B ;扫描子程序
SETB LATCH2
CLR LATCH2
CALL DELAY1
MOV A,20H
MOVC A,@A+DPTR
MOV P0,A
SETB LATCH1
CLR LATCH1
MOV P0,#11111101B ;0代表选通该位数码管
SETB LATCH2
CLR LATCH2
CALL DELAY1
RET
DELAY:MOV R5,#50 ;典型延时程序
D1: MOV R6,#40
D2: MOV R7,#248
CALL SCAN
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DELAY1:MOV R6,#4 ;扫描延时
D3: MOV R7,#248
DJNZ R7,$
DJNZ R6,D3
RET
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共阴字码表
END
是用动态扫描的方法显示的,用了2个锁存器,8个数码管的。
附上电路图
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
SETB 00H
LOOP:
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:
INC R2
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
INC R0
CJNE R0,#9,T0E
MOV R0,#0
INC R1
CJNE R1,#9,T0E
MOV R1,#0
T0E:
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
这个就可以:
http://zhidao.baidu.com/question/156237554.html?push=core
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/295f9639bccb7c2f96ddd86f.html
wo lai bangzhu ni
求用单片机设计一个秒表AT89C51
ORG 0000H AJMP MAIN ORG 0003H AJMP X0_INT ORG 000BH AJMP T0_INT ORG 0013H AJMP X1_INT MAIN:MOV TMOD,#01H ;T0定时方式1 MOV TH0, #(65536-50000) \/ 256 ;50ms@12MHz MOV TL0, #(65536-50000) MOD 256;SETB TR0 SETB ET0 ;开启定时中断 SETB EX0 SET...
单片机做数字时钟,有两个芯片,一个是AT89C51,一个是74LS245,将程序烧录...
把程序烧录到AT89C51芯片就可以了,74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
at89c51单片机的累计器A只有一个吗? 还有寄存器R可以用CLR CPL RL RR...
A是只有一个。工作寄存器有4组,每组8个,R0-R7 CPL, CLR ,RL, RR 只能对A操作,不能用Rn作为操作数。
编一个AT89C51单片机00 —99 秒的汇编程序,要求有循环和暂停,用两个...
SETB LATCH1 CLR LATCH1 MOV P0,#11111101B ;0代表选通该位数码管 SETB LATCH2 CLR LATCH2 CALL DELAY1 RET DELAY:MOV R5,#50 ;典型延时程序 D1: MOV R6,#40 D2: MOV R7,#248 CALL SCAN DJNZ R7,DJNZ R6,D2 DJNZ R5,D1 RET DELAY1:MOV R6,#4 ;扫描延时 D3: ...
用C语言编写AT89C51单片机程序,设计一个智能数字钟。
sbit s4=P2^1; \/\/s4按键,减1 sbit led1=P0^0;sbit led2=P0^1;sbit led3=P0^2;uchar count;uchar sec,minu,hour,day,week,mon;uchar n_sec,n_minu,n_hour;uint year;uchar set_2=1,set_1=1;uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg,nss=0,nsg=0;uchar ms,mg,...
在AT89C51单片机中,如果采用6MHz晶振,一个机器周期为()。
在AT89C51单片机中,如果采用6MHz晶振,一个机器周期为()。A.1us B.2us C.4us D.8us 正确答案:B
求一个AT89C51闪烁灯C语言程序
sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;然后写一个延时函数,来调节流水灯的时间间隔 void mdelay(unsigned int t){ unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;} } 下面就是主函数,包括流水灯的反复...
跪求一个at89c51单片机的c语言程序
date=1;month=1;year=1;flag=0;wela1=0;wela2=0;EA=1;ET0=1;TMOD=0x01;TH0=(65536-50000)\/256;TL0=(65536-50000)%256;TR0=1;} void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);} void second_display(){ int sec_shi,sec_ge;sec_shi=sec\/10...
编写一段程序,要求用at89c51控制四个led灯,是他们逐个亮以后在逐个灭...
LED 灯逐个亮起来然后再逐个灭掉的效果。其中,sbit 定义了四个位于 P2 口的 LED 灯,而 delay 函数则是一个延时函数,可以用来控制 LED 灯亮起和灭掉的时间。注意:在编译运行上述代码前,请确保你已经安装了编译器和相应的驱动软件,并且按照规定的方式将代码下载到 AT89C51 微控制器上。
89c51和89c52可以用同一个代码
可以。AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。与89c52代码是可以通用的,是一种低功耗、高性能 CMOS8位微控制器,具有8K在系统可编程Flash存储器。
冀轰邦瑞: display(second)子函数与两个数码管的连接方式有关 void main(void )//主程序 { TMOD=0x01;// 定时器1工作方式一 ET0=1; EA=1; TH0=(65536-10000)/256;//定时10ms TL0=(65536-10000)%256; TR0=0;//上电先不启动 while(1) { if(key1==0)//判...
南涧彝族自治县13347843772: 写一个有关单片机AT89C51的程序?
冀轰邦瑞: ORG 0000H ;单片机上电后从0000H地址执行 AJMP START ;跳转到主程序存放地址处 ORG 0030H ;设置主程序开始地址 START:MOV SP,#60H ;设置堆栈起始地址为60H MOV A,#0FEH ;ACC中先装入LED1亮的数据(二进制的...
南涧彝族自治县13347843772: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. - ?
冀轰邦瑞: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.
南涧彝族自治县13347843772: 请大神们帮我编个简单的AT89C51单片机的c语言程序 - ?
冀轰邦瑞: #include "reg51.h" void main(void) {P1=P1 | 0X40;//P1.6=1P1=P1 & 0X7F;//P1.7=0P0=P0 | 0X07;//P0.0=1,P0.1=1,P0.2=1while(1){if((P1 & 0X40)==0)//P1.6=0{P0=P0 & 0XF8;//P0.0=0,P0.1=0,P0.2=0}if((P1 & 0X80)>0)//P1.7=1{PCON=PCON | 2;//睡眠}} }
南涧彝族自治县13347843772: 单片机编程AT89C51 初始时数码管显示0000,按一次KEY1,数码管显示内容加1,按一次K - ?
冀轰邦瑞: #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit wela=P2^7; sbit dula=P2^6; sbit key1=P3^4;//独立键盘,看你自己需要按哪个键 sbit key2=P3^5;//独立键盘 sbit key3=P3^6;//独立键盘 uint qian,bai,shi,ge,num; ...
南涧彝族自治县13347843772: 用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续 - ?
冀轰邦瑞: #include<reg51.h>#define uchar unsigned char; uchar LED1,LED2; uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar num=0;sec,key; void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } void ...
南涧彝族自治县13347843772: 用单片机c51,c语言编00 - 99计数器程序!谢谢!! - ?
冀轰邦瑞: 这个以前做过,给:#include <AT89X51.H> unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char Count;void delay10ms(void) { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); }void main(void) { ...
南涧彝族自治县13347843772: 关于单片机AT89C51程序,利用两个数码管,利用按键控制实现“数字减一”显示99到00. - ?
冀轰邦瑞: #include "reg52.h" #include<intrins.h> #define uchar unsigned char uchar code LED_TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int x=9999; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>...
南涧彝族自治县13347843772: 单片机at89c51程序 - ?
冀轰邦瑞: #include<reg51.h> void delay(int a) { while(a--); } main() { int i; for(i=0;i<3;i++) { P1=0x16; delay(30000); P1=0x00; delay(30000); } P1=0x16; P2=0x35; while(1); }
南涧彝族自治县13347843772: AT89C51单片机设计一个简易秒表? - ?
冀轰邦瑞: 定时器10ms中断 检测按键且10ms位加一 若10ms=10,100ms位加一 若10ms=10,1000ms位加一 以此内推 显示最好用LCD的 用数码管的也行 有疑问mail:290765583@163.com