标题: 初学单片机,在定时器一个实验中有些不懂得地方 [打印本页]

作者: 黄思辰    时间: 2018-4-19 17:22
标题: 初学单片机,在定时器一个实验中有些不懂得地方
这是我的原码:
#include <reg52.h>
#define uchar unsigned char
uchar i=50;

void main(void)
{   
   TMOD=0x01;
   TH0=0xee;
   TL0=0x00;
   EA=1;
   ET0=1;
   P1=0;
   TR0=1;
   while(1);//循环等待中断,让cpu一直执行当前程序。
}

void int0() interrupt 1
{
   TH0=0xee;
   TL0=0x00;
   i--;
   if(i<=0)
   {
           P1=~P1;
           i=100;
   }
}

这是我不懂的地方:
i--;
   if(i<=0)
   {
           P1=~P1;
           i=100;
   }
为什么要设置一个i的变量去控制P1的值,而不是直接将中断函数写成这样:
void int0() interrupt 1
{
   TH0=0xee;
   TL0=0x00;
   P1=~P1;
}

求各位大佬告知!!!



作者: ltpsweet    时间: 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单片机定时器的最大计数65536也就是65ms  看不出实验效果
作者: 13780702550    时间: 2018-4-19 18:27
定时器1 的上限

作者: 13780702550    时间: 2018-4-19 18:27
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

定时时间太短了
作者: 黄思辰    时间: 2018-4-19 18:47
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

懂了,谢谢大佬

作者: mohua    时间: 2018-4-19 20:04
初学一般是点亮LED灯,这里就当是点亮LED灯。首先,人眼有滞留效应,正如电影播放时每隔40ms播放一幅图片,但是人眼看上去却是连续的。同理,如果你的目的是做出“LED灯一闪一闪”的效果,通常理解,我点亮一下,再熄灭一下,在点亮一下,再……,以此循环就可以达到效果了,但是两次点亮中间间隔要多长时间呢?如果太小(比如小于40ms),那么你看到的是一直亮着,跟放电影原理一样。程序中,TMOD=1;是设置为16位计数器,从TH0与TL0知,程序设置从0计数到0xee00,十进制就是0到60928,若使用晶振为12MHz,则计数器每计数一次为1us,那么一次中断计数60928次,则一次中断间隔时间为60928us,约为60ms,间隔时间太短,人眼是看不到它闪的。中间计数50次,就是增加时间间隔,50*60=3000ms=3s,所以你看到大约3s闪一次。
作者: yuxfdnan    时间: 2018-4-19 20:29
原程序是设计的每进100次中断才进行一次电平翻转,如果按你的改法,就变成了每次进中断都会翻转一次电平了
作者: wxxl    时间: 2018-4-19 20:33
第一次是50次倒计数,之后是100次倒计数,就是定时器每计数100次P1取反一次。
作者: wulin    时间: 2018-4-19 20:48
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

这样设置定时器是5ms中断一次,i--;   if(i<=0) 是为了得到500ms  P1翻转一次。

作者: xy07580782    时间: 2018-4-20 17:38
那uchar i的初值为什么不直接设为100呢,有什么意义,会用在什么场景中




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1