博主福利:100G+电子设计学习资源包!

​http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect​​ --------------------------------------------------------------------------------------------------------------------------

 

1、定时器和计数器

时钟周期:单片机时序中的最小单位,集体计算的放法就是时钟源分之一

机器周期:单片机完成一个操作的最短时间,=12个时钟周期

定时器:打开定时器后,定时器“存储寄存器”的值经过一个机器周期自动加1,也就是说,机器周期是定时器的计数周期。

 

2、定时器的寄存器

 

51单片机入门 - 定时器的使用技巧_寄存器

51单片机入门 - 定时器的使用技巧_初值_02

51单片机入门 - 定时器的使用技巧_寄存器_03

 

TMOD —— 工作模式选择寄存器——常用模式1和模式2.

TCON —— 控制寄存器(TRn定时器开关)

TH/TL —— 定时计数器

 

3、定时器应用

 

第一步:设置特殊功能寄存器 TMOD,配置好工作模式。第二步:设置计数寄存器TH0和TL0的初值。第三步:设置TCON,通过TR0置 1来让定时器开始计数。第四步:判断TCON  寄存器的TF0 位,监测定时器溢出情况。

写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是 11.0592M,时钟周期就是 1/11059200,机器周期是12/11059200,时器定时值最大也就是 71ms 左右。

(65536-N)*12/11.0592M = time ---计算出N转换成十六进制

1ms的例子:

TMOD = 0X01;

TH0 = 0XFC;

TL0 = 0X67;

TR0 = 1; 

#include<reg52.h>



typedef unsigned char uchar;



sbit LED = P0^0;



int main(void)

{

uchar cnt = 0; //定义一个计数变量,记录T0溢出次数



TMOD = 0x01; //设置T0为模式1

TH0 = 0xFC; //为T0赋初值0xB800

TL0 = 0x67;

TR0 = 1; //启动T0



while (1)

{

if (1 == TF0) //判断T0是否溢出

{

TF0 = 0; //T0溢出后,清零中断标志

TH0 = 0xFC; //并重新赋初值

TL0 = 0x67;

cnt++; //计数值自加1

if (cnt >= 1000) //判断T0溢出是否达到50次

{

cnt = 0; //达到50次后计数值清零

LED = ~LED; //LED取反:0-->1、1-->0

}

}

}



return 0;

}

 

4、数码管

 

共阴与共阳数码管 ——8个LED灯

位选——控制选择多个数码管中的哪一个

段选——选择数码管显示的值

 

// 秒定时器:

#include<reg52.h>



typedef unsigned int uint;

typedef unsigned char uchar;



uchar code count[] =

{

0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E

};



int main(void)

{

uchar cnt = 0; //记录T0中断次数

uchar sec = 0; //记录经过的秒数



TMOD = 0x01; //设置T0为模式1

TH0 = 0xFC; //为T0赋初值0xB800

TL0 = 0x67;

TR0 = 1; //启动T0



while (1)

{

if (TF0 == 1) //判断T0是否溢出

{

TF0 = 0; //T0溢出后,清零中断标志

TH0 = 0xFC; //并重新赋初值

TL0 = 0x67;

cnt++; //计数值自加1

if (cnt >= 1000) //判断T0溢出是否达到1000次

{

cnt = 0; //达到1000次后计数值清零

P0 = count[sec]; //当前秒数对应的真值表中的值送到P0口

sec++; //秒数记录自加1

if (sec >= 16) //当秒数超过0x0F(15)后,重新从0开始

{

sec = 0;

}

}

}

}



return 0;

}