欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > 51单片机数码管倒计时仿真_51单片机仿真流程

51单片机数码管倒计时仿真_51单片机仿真流程

日期:2023-09-29 08:30

本文内容列表:

  • 1.如何使用单片机制作一个简单的倒计时器
  • 2、使用51单片机C语言版设计一个秒表倒计时。
  • 3、51单片机数码管倒计时程序从999999开始倒计时,由定时器T1的中断完成。
  • 4、利用51单片机和4个数码管设计一个定时器。要求数码管上显示的数据从0开始,每秒增加1。

如何使用微控制器制作简单的倒计时器

51单片机实现数码管99秒倒计时。其实很简单,利用定时器中断来实现即可。目的是学习如何用单片机实现倒计时,从而实现一些延时控制的东西。 99秒只是一个例子。您可以进行任何倒计时,例如 10 秒倒计时程序。定时器计时时间计算公式为:初始值X=M(最大计时)-计数值。

初始值,转换为十六进制,如果使用定时器0,则高位给TH0,低位给TL0。

M(最大时序)如果是16位的话,就是2的16次方。最大计时为 65535 微秒。要实现1秒计时,可以计时10毫秒,然后改变秒值100次。 10*100毫秒=1S

计数值:您要计时多长时间?如果时间为1毫秒,则为1000微秒(单位为微秒)。如果时间为10毫秒,则为10000(微秒)。当然,最大计时是由定时器本身决定的。位数有限,最大为2的16次方(16位计时计数器),只能计时65.535毫秒。当然,1S定时器是不可能中断1S定时器的。

以下是实现99秒倒计时的C语言源程序

/*了解定时器,这样的话就可以做一些基础实验了,比如定时炸弹~~,10秒后打开、关闭继电器*/

/*数码管、12M晶振*/

#include reg52.h

#define uchar 无符号字符

sbit p11=P1^1; //继电器已连接。 。

代码 unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar shiwei;

uchar gewei;

无效延迟(unsigned int cnt)

{

while(--cnt);

}

void main()

{

TMOD|=0x01; /*定时器0 16位定时器X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms

*/

TH0=0xd8;

TL0=0xf0;

IE=0x82; //这里是中断优先级控制EA=1(开启总中断),ET0=1(定时器0允许中断),这里使用定时器0进行计时

TR0=1; //开启定时器0

同时(1)

{

P0=室韦; //99

的十位数

P2=0; //99的个位,

延迟(300); //动态扫描数码管延时

P0=格味;

P2=1;

延迟(300);

}

}

void tim(void) 中断 1 使用 1 //定时器 0 中断

{

静态uchar秒=99,计数; //99只是一个数字,可以任意改变,因为这里我们只学习如何实现倒计时

TH0=0xd8; //定时10毫秒

TL0=0xf0;

计数++;

if(count==100) //10毫秒计时,10*100=1000(毫秒)=1秒

{

计数=0;

第二--;

if(第二==0)

{

p11=0; //让继电器在这里动作。当然,它动作之后,需要重置之后,才能在下一次倒计时再次动作。

第二=99; //返回99并循环。当然还可以做其他控制,

}

shiwei=tab[秒/10]; //数码管10位数

gewei=tab[第二%10]; //数字一位数

}

使用51单片机C语言版设计秒表倒计时

K1 EQU P1.0

K2 EQU P1.1

K3 EQU P1.2

ORG 0000H

LJMP 主

ORG 000BH

LJMP T0ISR

ORG 0030H

主要:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-10000)

MOV TL0,#低(65536-10000)

SETB ET0

SETB TR0

SETB EA

MOV R0,#9

MOV R1,#9

MOV R2,#0

MOV R3,#99

CLR 00H

CLR 01H

循环:

JB K1,LP01

JNB K1,$

CLR 01H

INC R3

CJNE R3,#100,LOOP0

MOV R3,#0

SJMP LOOP0

LP01:

JB K2,LP02

JNB K2,$

CLR 01H

CJNE R3,#0,LP011

MOV R3,#99

SJMP LOOP0

LP011:

DEC R3

SJMP LOOP0

LP02:

JB K3,循环

JNB K3,$

SETB 01H

SJMP循环

LOOP0:

MOV A,R3

MOV B,#10

DIV AB

MOV R0,B

MOV R1,A

SJMP循环

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-10000)

MOV TL0,#低(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:

JNB 01H,T0E

INC R2

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 01H

MOV R4,#16

T005:

CPL P0.0

LCALL 延迟

DJNZ R4,T005

RETI

延迟:

MOV R6,#200

DLY:

MOV R7,#250

DJNZ R7,$

DJNZ R6,DLY

RET

表:;共阴数码管显示代码表

DB 3FH,06H,5BH,4FH,66H;01234

DB 6DH,7DH,07H,7FH,6FH;56789

51单片机数码管倒计时程序,从999999开始倒计时,利用定时器T1的中断完成

#includereg51.h

#define uchar 无符号字符

uchar代码ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9

uchar 秒=0,分钟=0,小时;

uchar时间;

uchar disdat[6];

无效延迟(unsigned int x)

{

无符号整数 i,j;

for(i=0;ix;i++)

for(j=0;j120;j++);

}

void dischg()

{

disdat[0]=sec%10;

disdat[1]=秒/10;

disdat[2]=min%10;

disdat[3]=min/10;

disdat[4]=小时%10;

disdat[5]=小时/10;

}

void t0isr() 中断 1 //秒计数

{

TH0=0x3c;

TL0=0xb0;

时间++;

if(时间==20)

{

时间=0;

if(sec0)sec--;

else if(min0){sec=99;min--;}

else if(hour0){sec=99;min=99;hour--;}

}

dischg();

}

void t1isr() 中断 3 // 显示

{

TH1=0xec;

TL1=0x78;

开关(已扫描)

{

案例0:

P2=0x20;

P0=~ledtab[disdat[5]];

打​​破;

案例1:

P2=0x10;

P0=~ledtab[disdat[4]];

打​​破;

案例2:

P2=0x08;

P0=~ledtab[disdat[3]];

打​​破;

案例3:

P2=0x04;

P0=~ledtab[disdat[2]];

打​​破;

案例4:

P2=0x02;

P0=~ledtab[disdat[1]];

打​​破;

案例5:

P2=0x01;

P0=~ledtab[disdat[0]];

打​​破;

默认:中断;

}

已扫描++;

扫描%=6;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

TR1=1;

TR0=0;

ET0=1;

ET1=1;

EA=1;

fmq=0;

扫描=0;

时间=0;

模式=1;

dischg();

同时(1)

{

if(keyhu==0)

{

while(keyhu==0);

TR0=0;

小时++;

小时%=24;

}

if(keyhd==0)

{

while(keyhd==0);

TR0=0;

if(hour0)小时--;

if(小时==0)小时=23;

}

if(keymu==0)

{

while(keymu==0);

TR0=0;

分钟++;

min%=60;

}

if(keymd==0)

{

while(keymd==0);

TR0=0;

if(min0)min--;

if(min==0)min=59;

}

if(keysu==0)

{

while(keysu==0);

TR0=0;

秒++;

秒%=60;

}

if(keysd==0)

{

while(keysd==0);

TR0=0;

if(sec0)sec--;

if(sec==0)sec=59;

}

if(keyst==0)

{

while(keyst==0);

TR0=~TR0;

}

dischg();

}

}

使用51单片机和4个数码管设计一个定时器。要求数码管上显示的数据从0开始,每秒增加1。

共阳数码管中断程序:

#includereg52.h

#define uint 无符号整数

#define uchar 无符号字符

uchar码表[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

uint num,a;

uchar bai,shi,ge;

void init();

无效延迟(uint);

无效显示(ucharbai,ucharshi,ucharge);

uint fb();

uint fs();

uint fg();

void main()

{

init();

同时(1)

{

显示(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

无效显示(ucharbai,ucharshi,ucharge)

{

P1=0xfd;

P0=桌子[bai];

延迟(1);

P1=0xfb;

P0=表[shi];

延迟(1);

P1=0xf7;

P0=表[ge];

延迟(1);

}

void timeoff() 中断 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%20==0)

{

num++;

if(num==999)

{

num=0;

}

}

}

无效延迟(uint z)

{

uint x,y;

对于(x=z;x0;x--)

for(y=110;y0;y--);

}

uint fb()

{

bai=num/100;

归bai;

}

uint fs()

{

shi=num%100/10;

归石;

}

uint fg()

{

年龄=num%100%10;

返回ge;

}

扩展资料

2个定时定时/成分·5个中断源,2个优先级(52有6个)

一个全双工串行通信口

外部数据仓库空间为64kB

外部程序仓库空间为64kB

逻辑操作位锁定功能·双列直插40PinDIP封装

单一+5V电源供电

CPU:由侵犯和控制逻辑组成,同时还包括中断系统和部分外部特殊功能注册;

RAM:搭建可以读取的数据,如破坏的中间结果、最终结果以及想要显示的数据;

ROM:用于存储程序、一些原始数据和表格;

I/O口:4个8位并行I/O口,可作为输入或输出

T/C:两个定时器/计数器,可工作在计时模式或计数模式;

中断控制系统,具有五个中断源;

全双工UART(通用异步收发器)串行I/O口,用于实现单片机之间或单片机与单片机之间的串行通信;

片内振荡器和时钟发生电路、石英晶体和微调电容需要外接。最佳振荡频率为6M-12M。

参考来源:百度百科-51单片机

关灯