51单片机数码管倒计时仿真_51单片机仿真流程
本文内容列表:
- 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单片机
相关文章
- 10-05 Web漏洞-SQL注入(二)
- 10-05 phpunit thinkphp模型单元测试
- 10-05 phpunit selenium 操作 html
- 10-05 【第201期】面试官:String的长度有限制吗?
- 10-05 【第256期】面试官经常测试的21条Linux命令
- 10-05 【第256期】面试官常测试的21条Linux命令
- 10-05 【第368期】为什么阿里巴巴禁止MyBatis使用
- 10-05 【第208期】我们来敲黑板,说说如何设计秒杀系统(
- 10-05 【第208期】我们来敲黑板,说说如何设计秒杀系统(
- 10-05 【344期】面试官:如何设计群聊消息的已读未读功能
- 10-05 【第328期】Spring高频面试题:如何解决循环
- 10-05 【第305期】面试官:你用过Redis吗?那么能否
- 10-05 为什么 C++ 是最难学的编程语言?看看大神的分析
- 10-05 为什么你的设计一次又一次地改变?这4个方法助你顺利
- 10-05 比看书更高效,这4个提高编程能力的方法你知道吗?
- 10-05 总线 Linux下I2C总线的配置和使用(linu
- 10-05 Linux文件夹链接技术指南(Linux文件夹链接
- 10-05 如何导出Oracle中不涉及的表(oracle导出
- 10-05 Linux下如何查找文件中的字符串(Linux文件
- 10-05 Linux:玩的乐趣(Linux好玩吗?)
- 最近发表