51单片机 定时器与数码管基础

常见元件符号

定时器三大寄存器:

  1. 存储   寄存器
  2. 控制   寄存器
  3. 模式   寄存器

后缀是0,代表是定时器 0;后缀是1,代表是定时器1

SFR代表特殊功能寄存器,TH0 存储高8位  TL0存储低8位,TL0由0 【0x00】开始自动加1至255  【0xff】 时,在16位中,如再加1,则溢出,产生进位,使TH0变成0x01,自身变成0x00

【即TH0 存储高8位  TL0存储低8位】

硬件置1: 单片机自动置1

软件xx: 由程序xx

TR0 定时器0运行控制位,给1/0,让计数器运行或停止

”INT0“ ———— 以前常用来测量 脉冲宽度

就是放出一条狗,看见人就咬,没看见人就待机

C/T   定时器/计数器选择位 ———— 计数器不常用,直接给0选择 定时器功能即可

重点要掌握的是 M1 / M0 工作模式

第2工作模式:

TL0递增至 255时,再加一就溢出,溢出后由TH0给TL0置数为0x55,然后TL0从0x55继续递增

 模式1 控制电路:

OSC:时钟源 —— 晶振

d : 分频值   一个机器周期 = 12个时钟周期 ——>  d = 12

Tn 是计数器功能,不看

开关打到上方就是 定时器 ,打到Tn  就是计数器

最后的TFn 是 16位定时器的 溢出【可参见 控制寄存器】

 

示例程序:   ——————  利用计时器 精确延时 LED的亮灭

 (1)确定延时时间,设置TH0 TL0的初值

x * 一个机器周期的时间 = 0.02 s   ————>  ,x是多少个机器周期

11059200是晶振周期

T0 是 TH0 TL0的初值 

65536 = 2^16 ,即溢出值

初值 + 延时时间对应的机器周期数 = 溢出值 ————>  从而通过: 达到时间,就发生溢出 来 “定时” ————>  TF0 = 1,溢出一次,就是20ms 

 (2)视频程序如下:

#include <reg52.h>

sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main(){
    unsigned char cnt = 0;
    ENLED = 0;
    ADDR3 = 1;
    ADDR2 = 1;
    ADDR1= 1;
    ADDR0 = 0;
    
    
    TMOD = 0x01;//配置工作模式
    TH0 = 0xB8;//设置初值
    TL0 = 0x00;
    TR0 = 1;//启动定时器
    while(1){
        if(TF0 == 1){ //判断溢出位
            TF0 = 0;
            TH0 = 0xB8;//溢出后,变为0,重新赋值
            TL0 = 0x00;
            cnt++;//溢出一次,20ms,50次,就是1s
            if(cnt >= 50){
                cnt = 0;
                LED = ~LED;
            }
        }
        
    }

}

 

dp 是小数点

 视频示例程序: 数码管显示1

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

void main(){
    ENLED  = 0;
    ADDR3 = 1;

    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0;

     P0 = 0xF9;
    while(1);
}

【视频所用板子 为 共阳极 数码管】

数码管真值表

此节 是 静态显示,下节是 动态显示 

写错了,,,,是“ 节省内存空间”

视频示例程序  ——  静态秒表程序

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED  = P1^4;

unsigned char code LedChar[] = {
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};

void main(){
    unsigned char cnt = 0;
    unsigned char sec = 0;

    ENLED = 0;
    ADDR3 = 1;
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0;
    
    TMOD = 0x01;
    TH0 = 0xB8;
    TL0 = 0x00;
    TR0 = 1;
    
    while(1){
        if(TF0 == 1){
                    TF0 = 0;
                    TH0 = 0xB8;
                    TL0 = 0x00;
                    cnt++;
                    if(cnt >= 50){
                        cnt = 0;
                        P0 = LedChar[sec];
                        sec++;
                        if(sec >= 16){
                        sec = 0;
                        }
                    }
        
        }
    
    }

}
原文地址:https://www.cnblogs.com/expedition/p/11296104.html