2019-07-09 19:40:39 weixin_42048463 阅读数 545
  • 定时器和计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1965 人正在学习 去看看 朱有鹏

 8051内部集成了2个16bits的计数器, 可以根据需要将其作为定时器使用. 这时, 定时器的计数频率为系统CLK/12. 如果CPU的晶振频率为12MHz, 那么定时器信号源的频率固定为12MHz/12 = 1MHz. 如果定时器的定时周期设定为50ms, 则需要50000个脉冲. 由于单片机定时器为加1计数器, 所以, 计数器初始值应设为65536 - 50000 = 15536 = 3CB0H. 另外, 还需要设置定时器工作模式寄存器TMOD, 如果使用定时器0, 16bits定时器方式, 则TMOD = 0x01.

定时器初始值计算解析:

若系统晶振频率为12MHz, 那么定时器信号源的频率固定为1MHz, 即每隔1 * 10^-6 s, 定时器内的值加1. 若定时器定时周期为50ms(=5*10^-2s), 那么这50ms就需要(5*10^-2)/(1*10^-6)=50000次加1计数.

#include <STC89C5xRC.H>

void delay()//用定时器0实现10ms精准定时
{
	TMOD = 0x01;
	TH0 = 0xd8;
	TL0 = 0xf0;//65536 - 10000 = 55536

	TF0 = 0;//置溢出标志位为0
	TR0 = 1;//开启定时器0
	while(TF0 == 0);
	TR0 = 0;//暂停定时器0
}

void disp_digit()
{
	int d = 60;//要显示的数字
	unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
	while(1)
	{
		//显示个位数
		P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮
		P0 = DIG_CODE[d % 10];
		delay();//10ms精准定时
		//显示十位数
		P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮
		P0 = DIG_CODE[d / 10];
		delay();//10ms精准定时
	}
}

int main()
{
	disp_digit();
	return 0;
}

 

2019-05-26 11:59:28 Goal_zhuimeng 阅读数 2247
  • 定时器和计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1965 人正在学习 去看看 朱有鹏

代码已吃,真香!以后会注意的,感谢提醒。

2019-05-14 23:28:39 weixin_38679924 阅读数 341
  • 定时器和计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1965 人正在学习 去看看 朱有鹏
/*------------------------------------------
功能:使用51单片机内部定时器0,从P1^0口输出
周期位2ms的方波
Author: Zhang Kaizhou
Date: 2019-5-14 22:44:19
------------------------------------------*/
#include <reg52.h>
sbit state = P1^0;

void main()
{
	TMOD = 0x01; // 设置定时器工作方式寄存器,使用定时器0,非门控方式启动,工作于方式1(16位定时器)
	TR0 = 1; // 启动定时器0
	
	while(1)
	{
		TH0 = (65536 - 1000) / 256; // 设置定时器初值
		TL0 = (65536 - 1000) % 256;
		while(!TF0); // 当定时器0定时时间到时,由硬件自动将TF0置位,并由此标志向CPU请求中断,CPU响应中断后,TF0自动清零
		state = !state; // P1^0口状态翻转
		TF0 = 0; // 将定时器0溢出中断
	}
}
2018-04-08 18:52:29 qq_31900497 阅读数 1524
  • 定时器和计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1965 人正在学习 去看看 朱有鹏

如果单片机的晶振是12MHz时,假设你要定时50ms,采用定时器0,方式1时,此时为16位定时,最大值为65536。

    设X,由X*12/fsoc=50000us(50ms),算出X=50000,用65536-50000=15536,把十进制15536转换为16进制得3CB0。

    把3CB0的高8位放到TH0,低8位放到TL0。则可以知道初值为:TH0=3C,TL0=B0,也可以直接在程序中采用直接方式,只是其中的原理要弄懂:TH0=(65536-50000)/255(数据的高8位)、TL0=(65536-50000)%255(数据的低8位);(其中12/fsoc,为一个机器周期,即初值跳变一下需要1us)。

2019-02-28 16:15:02 imxlw00 阅读数 301
  • 定时器和计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1965 人正在学习 去看看 朱有鹏

在这里插入图片描述

设系统时钟频率为12MHZ,编程实现从P1。1输出周期为1s的方波。

由于定时时间较长,一个定时/计数器不能直接实现,可以定时/计数器T0产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数50次或定时/计数器T1对10ms计数50次实现。

系统时钟为12MHZ,定时/计数器T0定时10ms,计数值N为1000,只能选择方式1,方式控制字为00000001B(01H) ,初值X:

X=65536-10000 =55536 =1101 1000 1111 0000B,

则TH0=1101 1000B=D8H TL0=1111 0000=F0H

用某变量i对计数器溢出中断次数进行软件计数
在这里插入图片描述

没有更多推荐了,返回首页