计数器+按钮控制数码管显示

目录

0x00 前言

0x01 定时器/计数器的控制

一、定时器/计数器的方式控制寄存器(TMOD)

二、定时器/计数器控制寄存器(TCON)

0x02 题目要求与解题

一、题目

二、解题

1、步骤理解

2、代码与成品图

0x03 反思与总结


0x00 前言

  • 抄袭可以得到公之于众的结果,理解过程则可销毁最后的证据。    --涂寐

0x01 定时器/计数器的控制

一、定时器/计数器的方式控制寄存器(TMOD)

定时器/计数器方式寄存器TMOD的格式

位序

B7

B6

B5

B4

B3

B2

B1

B0

位符号

GATE

C/~T

M1

M0

GATE

C/~T

M1

M0

高4位(T1)

低4位(T0)

例:TMOD=0x05(0000 0101),则T1=0,T0=5。在T0中,GATE=0,C/~T=0,M1M2=01

TMOD寄存器的功能理解

位符号

取值

功能

GATE

0

仅受TCON寄存器控制

1

还受外部中断引脚(INT0/INT1)上电平影响

C/~T

0

定时器模式

1

计数器模式

M1M0

00

方式0,13位定时器/计数器。高8位,低5位。2^13=最高计数值8192

01

方式1,16位定时器/计数器。高8位,低8位。2^16=最高计数值65536

10

方式2,带初值自动重装的8位定时器/计数器

11

方式3,仅T0,且T0分成两个独立的8位寄存器,此时T1停止工作

注:

1、TMOD寄存器:特殊功能寄存器,用于控制定时器/计数器T0、T1的工作方式

2、TMOD寄存器的字节地址为89H,只能进行字节操作,即仅能对TMOD寄存器整体赋予初值

二、定时器/计数器控制寄存器(TCON)

定时器/计数器控制寄存器TCON的格式

位地址

8F

8E

8D

8C

8B

8A

89

88

位符号

TF1

TR1

TF0

TR0

TCON寄存器的功能理解

位符号

取值

功能

TF1/TF0

0

定时器/计数器的溢出标志位。溢出时TF*=1,则定时器/计数器中断请求

注:若查询该标志位,当检测到TF*=1时,需要软件清0(TF*=0)

例:while(TF0==0); TF=0;    //不断查询TF0是否为1,来判断时间的到达

1

TR1/TR0

0

定时器/计数器的启动/停止位

启动:TR*=1,若GATE=0,则直接启动;反之(GATE=1),则需要INT*为高电平才能启动

1

0x02 题目要求与解题

一、题目

  1. 选用定时/计数器T0,工作方式1,按键按三次加1。
  2. 选用定时/计数器T1,工作方式2,按键按五次加1。
  3. 仿真原理图:

image.png

二、解题

1、步骤理解

2、代码与成品图

1.选用定时/计数器T0,工作方式1,按键按三次加1

#include <reg51.h>
//要求:选用定时/计数器T0(只用寄存器TMOD的低四位),工作方式1(16位定时器),按键按三次加1
unsigned char num[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //共阳极
unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
unsigned char count=0;
void main(){
    TMOD=0x05; //0000 0101
    TH0=(65536-3)/256; //按三下,即减去3,再右移八位作为最高位
    TL0=(65536-3)%256;
    TR0=1;
    P0=num[count]; 
    P2=s[count];
    
    while(1){
        while(TF0==0);
        TF0=0; 
        count++;
        P0=num[count%10];
        P2=s[count%10];
        TH0=(65536-3)/256;
        TL0=(65536-3)%256;
    }
}

image.png

2.选用定时/计数器T1,工作方式2,按键按五次加1

#include <reg51.h>
//要求:选用定时/计数器T1(只用寄存器TMOD的高四位),工作方式2(8位定时器,初值自动重装载),按键按五次加1
unsigned char num[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09}; //共阳极
unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极
unsigned char count=0;
void main(){
    TMOD=0x60; //0110 0000
    TH1=256-5; //按五下,即减去5得初值
    TL1=256-5;
    TR1=1;
    P0=num[count]; 
    P2=s[count];
    
    while(1){
        while(TF1==0);
        TF1=0; 
        count++;
        P0=num[count%10];
        P2=s[count%10];
    }
}

image.png

0x03 反思与总结

  • 有些IO口的驱动电流不够大,建议接共阳极的数码管
  • 宁愿线路弯曲,也不建议旋转数码管,避免显示结果与预期相反(仅因旋转)
  • 亲手敲击相较于复制粘贴,是截然不同的,它能产生叩击记忆之门的声响。 --涂寐

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值