1.4 定时器

之前我们一直用的是软件延时,不是很精确


Paste_Image.png

16 位 是 两个字节 TH 和 TL
TH 和 TL 可以放初值
软件延时占用cpu资源,而定时器不占用。
时钟周期 = 1/晶振频率
机器周期 = 12*时钟周期

![Uploading Paste_Image_491757.png . . .]
定时器每经过一个机器周期加一
定时器和计数器其实是一体的,不过是通过TMOD来设置的

Paste_Image.png

假设要定时器0工作模式1
TMOD = 0x01;
定时器1 工作模式1
TMOD=0x10;

定时50ms



实际上也可以这样写
50ms就是 a = 50ms /(1.085 *10^6)
TH = (65536 - (a) )/256
TL = (65536 -(a))%256

显示0-60的每妙加一

#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit we = P2^7;
sbit du = P2^6;
sbit LED1 = P1^0;
uchar counter,time_counter;

uchar code leddata[]={ 
 
                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义
 
};

void delay(uint z)
{
    uint x,y;
    for(x = z; x>0; x--)
        for(y = 114;y>0;y--);
}

void display(uchar i)
{
    uchar shi,ge;
    shi = i/10;
    ge = i%10;
    P0 = 0xff;
    we = 1;
    P0 = 0xfe;
    we = 0;

    du = 1;
    P0 = leddata[shi];
    du = 0;
    delay(1);

    P0 = 0xff;
    we = 1;
    P0 = 0xfd;
    we = 0;

    du = 1;
    P0 = leddata[ge];
    du = 0;
    delay(1);
}



int main()
{
    TMOD = 0x01;
    TH0 = (65536-46082)/256;
    TL0 = (65536-46082)%256;
    TR0 = 1;
    while(1)
    {
        if(TF0==1)
        {
            TF0 = 0;
            TH0 = 0x4b;
            TL0 = 0xfe;
            counter++;
        }
        if(counter == 20)
        {
            counter = 0;
            LED1 = ~LED1;
            time_counter++;
        }
        if(time_counter==60)
        {
            time_counter = 0;
        }
        display(time_counter);
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、MCS-51单片机的定时器/计数器概念 单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的...
    Dorajimmy阅读 5,192评论 0 1
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,850评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,103评论 25 709
  • 你安好,我快乐! 你生病,我忧愁! 你困顿,我难受! 因为我们血脉相连。 时间不是问题, 距离不是问题, 差异不是...
    悠然_3c09阅读 1,748评论 2 3
  • 胡博,骨科博士,安徽医科大学第一附属医院骨科主治医师、德国海德堡大学骨科学博士 髋关节是人体最大的关节,髋关节炎是...
    易舒清阅读 4,310评论 0 0