2017-08-03 11:04:05 mcuwangzai 阅读数 20573
  • 定时器和计数器-第1季第10部分

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

    1965 人正在学习 去看看 朱有鹏
               **菜鸟关于51类单片机的定时器初值计算问题的计算**

首先先来介绍单片机的几个周期:   

1、时钟周期,也称为振荡周期:定义为时钟脉冲的倒数,在单片机中也就等于晶振的倒数。
51单片机中把一个时钟周期定义为一个节拍(用P表示),2个节拍定义为状态周期(用S表示)
时钟周期是单片机中最小的时间单位。
eg:12M晶振的单片机,时钟周期=振荡周期=1/12 us。

2、机器周期:定义为完成一项基本操作所需要的时间,称为机器周期。
在计算机中,为了方便管理,把一条指令的执行过程分为若干个阶段,每个阶段去执行一项基本操作。
如:取指令,存储器读,存储器写等。
在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us
定义机器周期是因为时钟周期时间太短,根本做不了什么。

3、指令周期:定义为执行一条指令所需的时间。
通常,包含一个机器周期的指令称为单周期指令,比如 MOV指令,CLR指令等。
包含两个机器周期的指令称为双周期指令。
另外还有四周期指令。

小伙伴们看完了上面的周期是不是看懵了………hahahahahahaha

不要慌,其实我们这节课要用到的就一句话—— 在51单片机中1个机器周期由6个状态周期组成,也就是12个时钟周期=12 x 1/12 us =1 us

这里我们知道了一个机器周期的时间是1us,所以如果我们要延时1ms就是1000个机器周期;
可能大家我们刚开始了解定时器的时候都会与疑惑,为什么要用定时器这么麻烦的东西,自己用delay()慢慢调一个合适的参数就可以了。 其实如果深入了解定时器真的比delay() 强大太多我先列举几点:
1.就如上面所说用定时器定时1ms,这里就要注意了,这个1ms不是和delay延时1ms一样哦,这个1ms是精确的1ms哦,越往后学需要的定时就要求越高,所以定时器是一定要搞定的。

2.相比于delay计时,delay是要直接让单片机做空循环,死等。而定时器则是利用定时器的溢出间隔,如果时间上不够,可以在溢出中断中配合软件计数器来实现。 前者浪费cpu,后者更高效。

言归正传,现在来计算初值了,直接用例子说明,就比如用定时器0延时50ms

一言不合,先上代码

void main()
{
TOMD|=0x01;         //设置TMOD工作方式寄存器的M0M1为01,对照表格即为定时器/计数器的4种模式中的16位定时器/计数器模式
    TH0=(65536-46080)/256; //装初值11.0592M晶振定时50ms数为46080
    TL0=(65536-46080)%256;
    EA=1;    //中断总开关
    ET0=1;   //开启定时器/计数器的中断允许位置为1
    TR0=1;   //
    return 0;
}
void T0_time() interrupt 1
{
    TH0=(65536-46080)/256;
    TL0=(65536-46080)%256;
    num++;
    if(num==20)
    {
        num=0;
    }
}
首先一个机器周期=12*一个时钟周期=12*(1/晶振)  一般的51晶振频率为11.0592M

    则一个机器周期= 1.085069444444444 us     单位是微秒

所以如果要定时50ms 则要50 000/1.085069444444444~=46080个机器周期

    又因为TOMD|=0x01选择了16位的模式,就是TH0高八位 TL0低八位,所以最大到溢出就是65536

    故初值设为65536-46080即程序运行了大约46080个机器周期即50ms

    而后面的/256 %256就是划分低八位和高八位的

这是我的第一篇博客,就是希望大家有所帮助(虽然有些地方都可以有问题haha),自己的对玩单片机更加的理解,利己利彼。学单片机学acm的都知道,一个点想不清楚的时候网上找到一个好的解答是多么的珍贵。所以希望大家一起加油,在单片机中找到更多的乐趣。。。。。。

2018-11-04 01:44:06 qq_39792671 阅读数 318
  • 定时器和计数器-第1季第10部分

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

    1965 人正在学习 去看看 朱有鹏
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x01, 0x02, 0x04, 0x08};
uchar code ledCode[]= {0xc0,0xf9,0xa4,
	0xb0,0x99,0x92,0x82,0xf8,0x80,
0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
int t0 = 0;
uchar count = 0;
sbit LED = P0^0;
void delay(int z)
{
	int i, j;
	for (i=0; i<z; i++)
		for (j=0; j<110; j++);
}
int main(void)
{
	int i = 0;
	LED = 0;

	TMOD = 0x01;
	TH0 = (65536 - 30)/256;;
	TL0 = (65536 - 30)%256;;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	P2 = 0xff;		//数码管位控制端
	P1 = ledCode[t0];	//数码管段控制
	
	while(1)
	{
		if (t0 == 20)
		{
			t0 = 0;
			P1 = ledCode[count++];
			if (count == 10)
				count = 0;	
		}
	}
	return 0;
}

void timer0() interrupt 1
{
	TH0 = (65536 - 30)/256;
	TL0 = (65536 - 30)%256;
	delay(1000);
	LED = ~LED;
	t0++;
}

如果在定时函数中没有延时函数的话,那么程序应该是LED灯50ms闪烁一次,数码管从0-9变化。
在这个程序当中,首先是定时器装入初值,然后计时开始,执行到if不断判断,然后定时器溢出TF0=1,程序检测到TF0 = 1,进入定时函数,装入初值,进入延时函数,延时结束后,回到定时函数,在延时函数中,不会被定时打断,但是在延时中,TF0 = 1,然后执行剩余的定时函数,回到主函数中,检测到TF0 = 1,进入定时函数,不断循环。
总的来说,执行main函数被打断(TF=1),进入timer0,进入delay,TF0 = 1,但是delay不会被打断,然后回到timer0,再回到main,检测到TF0 = 1,再次进入timer0。

main()timer0()delay()检测到中断信号TF0=1进入延时子函数延时期间TF0=1,但不打断延时程序回到主函数程序检测到TF0 = 1main()timer0()delay()

有错误,请指正
有错误请指正

单片机中断处理时间大于定时器定时时间,在下次中断时间到时,因为中断是同一类型、同一优先级,所以不会马上进入新的中断处理。
而是在本次中断处理结束后,单片机又马上进入新的定时器中断函数,主函数中的语句可能会没有机会运行下去,会影响后面中断的实时性。

如果为了避免中断嵌套(同一优先级不会发生),在中断处理中人为的在进入中断时关中断,处理完中断后开中断,会影响后面中断的实时性。

最安全的处理方式:中断处理时间越短越好,有什么事放外面处理。中断的初衷是为了提高系统实时性,中断处理太长,会影响同级的中断响应,其它中断谈何实时。

2018-10-01 23:58:11 liaoxin401 阅读数 425
  • 定时器和计数器-第1季第10部分

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

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

用PIC16F877A,晶振用4M的做了一个实验如下:
实验通过示波器测得LED的高电平是500MS,低电平是500MS.以下为测试图:
在这里插入图片描述
#include<pic.h>

#define uint unsigned int
#define uchar unsigned char
uint intnum=0;

void init_system()
{
TRISC=0x00;
PORTC=0;
INTCON=0xc0;
PIE1=0x01;
TMR1L=(65536-63000)%256; //并非很多书上定的取50000
TMR1H=(65536-63000)/256;
T1CON=0x31;
}

void interrupt time0() //定时
{
TMR1IF=0;
TMR1L=(65536-63000)%256;
TMR1H=(65536-63000)/256;
intnum++;
}

void main()
{
init_system();
while(1)
{
if(intnum==1)
{
intnum=0;
PORTC=!PORTC;
}
}
}

2016-01-25 11:34:25 baidu_33836580 阅读数 1114
  • 定时器和计数器-第1季第10部分

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

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

6MHz晶振,用定时计数器1,采用中断方式,通过P1.0让一个发光二极管亮100ms、灭300ms,周而复始。
汇编编程实现。

悬赏分:20 - 解决时间:2010-1-10 13:14
;----------------------------------
最佳答案:

;下列程序,经过编译、仿真,符合要求:

    ORG  0000H
    SJMP START
    ORG  000BH
    SJMP T0_INT
START:
    MOV  TMOD, #01H
    MOV  TH0, #03CH
    MOV  TL0, #0B0H   ;100ms@6MHz
    SETB TR0
    SETB ET0
    SETB EA
    MOV  R2, #4
    CLR  P1.0
    SJMP $            ;设置结束,原地转移,等待中断
T0_INT:
    MOV  TH0, #03CH
    MOV  TL0, #0B0H   ;100ms@6MHz
    SETB P1.0         ;100ms就上升为高电平
    DJNZ R2, T0_END   ;不够四次,退出中断
    MOV  R2, #4
    CLR  P1.0         ;每中断四次,输出一次低电平
T0_END:
    RETI

END
;----------------------------------
回答者:   做而论道 - 十二级   2010-1-10 10:37
提问者对于答案的评价:非常感谢!!
原文网址:http://zhidao.baidu.com/question/132749703.html
;----------------------------------

2016-03-10 10:43:08 pfboy 阅读数 1365
  • 定时器和计数器-第1季第10部分

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

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

一般用到的和定时器有关的寄存器有中断允许寄存器IE,定时器工作模式寄存器TMOD,定时器控制寄存器TCON。

TMOD不能进行位寻址,单片机复位时全部清零。

D7

D6

D5

D4

D3

D2

D1

D0

GATE

C/T

M1

M0

GATE

C/T

M1

M0

定时器1

定时器0

定时器有4种工作方式

M1

M0

 

0

0

方式0,   13位定时器

0

1

方式1, 16位定时器

1

0

方式2, 8位初值自动重装定时器

1

1

方式3, 仅用于T0,分2个8位计数器,T1不计数

 

IE里的EA为全局中断总开关,打开后其他中断才能打开,打开方式为EA=1.

D7

D6

D5

D4

D3

D2

D1

D0

EA

。。

ET2

Es

ET1

EX1

ET0

EX0

全局中断

。。

定时器2

串口

定时器1

中断1

定时器0

中断0

 





TCON控制定时器开始工作

D7

D6

D5

D4

D3

D2

D1

D0

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0\

 

定时器1

 

定时器0

中断1

 

中断0

 

 





中断服务函数的写法:

Void name() interrupt 中断号;

中断号1为定时器0,  3是定时器1。

 

一般启动定时器的流程如下:

1.       设置TMOD,设定工作方式,

2.       装入初值TH0/1,TL0/1,

3.       设置IE打开中断。

4.       设置TCON,启动定时器.

 

一个简单的启动例程:

Void main()

{

       TMOD= 0x01;

       TH0=(65536-50000)/256;

       TH1=(65536-50000)%256

       IE=0x82;

       TCON=0x10;


       While(1);

}

 

Void t0ex() interrupt 1

{

       TH0=(65536-50000)/256;

       TH1=(65536-50000)%256

       ….

}

单片机的定时器和中断系统,

博文 来自: qrsxtkf

MSP430单片机定时器

博文 来自: feiyinzilgd
没有更多推荐了,返回首页