标题:
新手关于单片机中断和定时计数器有几个问题搞不懂,请教一下大家!
[打印本页]
作者:
tanghao8887
时间:
2018-11-5 13:18
标题:
新手关于单片机中断和定时计数器有几个问题搞不懂,请教一下大家!
下面这段程序,我提出几点我搞不懂的地方!
第一就是,为何非要让中断参与到这个函数里?我的意思是,我只想要一个延时效果,我如果不想要中断参与进去,同样。我需要这个led灯延时一秒闪烁,这程序应该怎么修改?
第二就是,用的12mhz晶振,既然一秒=1000毫秒,1毫秒=1000微秒,那么,为何在程序中我设置1000微秒而实际得到的闪烁效果是1秒,要知道一秒=1000000微秒啊!我就搞不明白!
第三就是,这个程序,我设置的是定时1毫秒后溢出触发中断,也就是if(i==1000)过后,TF0就为1了,向cpu请求中断,为何我if(i==500)的时候,没有溢出,他也会执行中断函数!
第四就是,TMOD|=0x01; 我的理解是这样的:TMOD=TMOD|0x01 也就是:00000001|00000001=00000001 我理解的正确吗?这样的目的是否可以防止TMOD这个寄存器高四位出错?
第五就是,为何需要第二次给定时计数器赋初值,他的意义是什么!谢谢大家!
以下是程序:
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led=P2^0;
void Timer0Init()
{
TMOD|=0X01;
TH0=0XFC;
TL0=0X18;
ET0=1;
EA=1;
TR0=1;
void main()
{
Timer0Init();
while(1);
}
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC;
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
作者:
黄煌皇
时间:
2018-11-5 17:56
1、让中断参与进来计数是为了更加的准确,如果对时间要求不是很严格的话,可以让单片机执行一些重复的语句(例如int i = 40000; while(i--;)以消耗时间,但具体消耗了多少时间要进入软件调试才能得知。
2、进入中断的时间由TH0,TL0的值来决定(也就是定时器的初值),举个例子:当你所有的定时器设置正确,初值为TH0 = 0XFC;TL0 = 0X18;,这样就是1ms进入一次中断,每次进入中断后,中断函数的静态变量i就自加一次(也就是相当于进入了多少次中断),当i = 1000时(也就是相当于进入了1000次中断了),1ms进入一次,进入了1000次,是不是就等于1ms*1000=1s?
3、如果进入中断时间不对(也就是触发TF0的时间不对),请确认定时器初值是否设置正确(也就是TH0与TL0的值是否正确)。
4、TMOD=TMOD|0x01;这句语句的意思是 TMOD的前7位不变,最后一位置1(如果是设置定时器0的工作模式1的话TMOD应如下设置:TMOD = TMOD & 0XF0;TMOD = TMOD | 0X01;)这样就不会影响到TMOD的高4位(也就是设置定时器1的那4位)。
5、假如不给TH0/TL0重新赋值的话,那么将会导致TH0/TL0溢出,表现出来的结果就是定时时间不准确;举个例子:假如TH0 = 0XFC;TL0 = 0X18;当定时时间到了1ms之后,立马给TH0/TL0重新赋值,这样定时器下一次进入中断的时间又会变成1ms进入一次,如果不重新赋值,那么进入中断的时间不能确定(也就是定时时间不确定)。
6、以下为个人看法:
(1)能将不懂的事情问出来是好事,就怕不懂又不问。
(2)视频教程不能只看一遍就过了,多看几次,直到彻底理解为止,不然视频中总有遗漏的地方,
(3)我不是大神,我只是一个正在学习51单片机的人,所以,以上观点我不敢保证一定没问题。如有发现不对的地方请不吝赐教。
作者:
g08970
时间:
2018-11-5 21:30
这样的回复太牛啦 我顶你 我也学习了
作者:
tanghao8887
时间:
2018-11-6 07:04
黄煌皇 发表于 2018-11-5 17:56
1、让中断参与进来计数是为了更加的准确,如果对时间要求不是很严格的话,可以让单片机执行一些重复的语句 ...
听君一席话,胜读十年书啊!非常感谢大神的回答!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1