单片机60秒计时器的程序,用AT89C51实现

单片机60秒计时器的程序,用AT89C51实现,第1张

//1:用AT89C51单片机的定时/计数器T0产生一秒脊陆侍的

//定时时间悉陵,作为秒计数时间,当一秒产生时,秒

//计数加1,秒计数到60时,自动从0开始。单片机

//晶振频率为12MHZ

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f}

void display(uchar fen,uchar miao)

uchar a,fen,miao,shu

void delay(uint z)

void init()

void main()

{

init()

while(1)

{

display(fen,miao)

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

a++

if(a==20)

{

a=0

shu++

fen=shu/10

miao=shu%10

if(shu==60)

shu=0

}

}

void init()

{

TMOD=0x01

TH0=(65536-50000)/樱吵256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void display(uchar fen,uchar miao)

{

P1=0xFe

P2=table[fen]

delay(5)//延时5毫秒

P1=0xFf

P2=table[miao]

delay(5)//延时5毫秒

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

0x6f}

void display(uchar fen,uchar miao)

uchar a,fen,miao,shu

void delay(uint z)

void init()

void main()

{

init()

while(1)

{

display(fen,miao)

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

a++

if(a==20)

{

a=0

shu++

fen=shu/10

miao=shu%10

if(shu==60)

shu=0

}

}

void init()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void display(uchar fen,uchar miao)

{

P1=0xFe

P2=table[fen]

delay(5)//延含旁时5毫秒

P1=0xFf

P2=table[miao]

delay(5)//谈腊橡延时局物5毫秒

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

ORG 0000H 从地址0开始执行

JMP START跳转到START处

orG 000BHTIMER0 的中断慧斗向量

LJMP TIMER_0 跳转到TIMER—0

START:

MOV P0, #0FFH

MOV P1, #0FFH

MOV P2, #0FFH

MOV P3, #0FFH

MOV R4 , #40 R4=40

MOV IE , #10000010B开中断

MOV TMOD , #00000001B设定定时方式

MOV SP , #30H 移开堆栈

MOV TH0, #75 设定定时初值

MOV TL0, #234 设定定时初值

NOP

NOP

MOV DPTR , #TABLE 表首地址

MOV 50H, #0 50H=0

MOV 51H, #0 51H=0

MOV 52H, #0 52H=0

MOV 53H, #0 53H=0

NOP

NOP

SETB TR0 启动T0

LOOP_1:

MOV A , 50HA=(R0)

MOVC A, @A+DPTR读取数据

MOV P0,A 把数据赋给P0口

CLR P2.7 打开位码

CALL DELAY

SETB P2.7 关闭位码

NOP

NOP

MOV A,51H A=(R1)

MOVC A,@A+DPTR 读取第二位7---SEGMENT----- LED的数据

MOV P0, A 把读取的数据送入P0口

NOP

NOP

CLR P2.6 打开第二个数码管的位码

CALL DELAY

SETB P2.6 关闭位码

MOV A, 52H A=(R2)

MOVC A, @A+DPTR 读取第三位7---SEGMENT----- LED的数据

MOV P0, A 把读取的数据送入P0口

NOP

NOP

CLR P2.5 打开第三位的位码

CALL DELAY

SETB P2.5 关闭位码

MOV A , 53HA=(R3)

MOVC A , @A+DPTR 读清团取第四位7---SEGMENT----- LED的数据

MOV P0, A 把读取的前正磨数据送入P0口

CLR P2.4 打开第四位的位码

CALL DELAY

SETB P2.4 关闭位码

NOP

NOP

JMP LOOP_1 跳转到LOOP-1

//*******************以下是TIMER0的中断服务子程序***********************//

TIMER_0:

PUSH PSW

CLR TR0

DJNZ R4, NEXT 不够一秒就继续执行

MOV A,50H

CJNE A, #9, LOOP_2 所要显示的数字是否达到9?若未达到,就跳转到LOOP-2

MOV 50H,#0 (50H)=0

MOV A ,51H A=(50H)

CJNE A,#9,LOOP_4 所要显示的数字是否达到9?若未达到,就跳转到LOOP-4

MOV 51,#0 (51H)=0

MOV A ,52H A=(52H)

CJNE A,#9,LOOP_5 所要显示的数字是否达到9?若未达到,就跳转到LOOP-5

MOV 52H ,#0 (52H)=0

MOV A ,53H A=(53H)

CJNE A ,#9,LOOP_6 所要显示的数字是否达到9?若未达到,就跳转到LOOP-6

MOV 53H,#0(53H)=0

JMP LOOP_3 跳转到LOOP--3

LOOP_2:

INC 50H50H的数据增加1

JMP LOOP_3 跳转到LOOP--3

LOOP_4:

INC 51H51H的内容增加1

JMP LOOP_3 跳转到LOOP--3

LOOP_5:

INC 52H52H的内容增加1

JMP LOOP_3跳转到LOOP--3

LOOP_6:

INC 53H53H的内容增加1

LOOP_3:

MOV R4, #40 R4=40

NEXT:

MOV TH0,#75 设定定时初值

MOV TL0,#234设定定时初值

SETB TR0启动TIMER0

POP PSW

RETI 返回

DELAY: 100MS?????

MOV R7,#2

D1: MOV R6,#25

D2: DJNZ R6,D2

DJNZ R7,D1

RET

TABLE: DB 03FH,06H,5BH,4FH

DB 66H,6DH,7DH,07H

DB 7FH,6FH

END这是以前做过的,硬件电路图找不到了,仔细看一看引脚的I/O,可以参考用的


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

原文地址: http://outofmemory.cn/yw/12296532.html

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

发表评论

登录后才能评论

评论列表(0条)

保存