• 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;
                            }
                        }
            
            }
        
        }
    
    }
  • 相关阅读:
    个体户、独资公司、有限公司、股份公司、控股公司、集团公司
    个人所得税
    移动端下拉滚动刷新
    web页面引入字体
    Flex布局
    NodeJS包管理器之Yarn
    域名、顶级域名、一级域名、二级域名、子域名
    JVM线程状态Running、Sleeping、Wait、Park、Monitor
    Java虚拟机解释器与JIT编译器
    ASP.NET之Cookie(坑爹的Response.Cookies.Remove)
  • 原文地址:https://www.cnblogs.com/expedition/p/11296104.html
Copyright © 2020-2023  润新知