找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1623|回复: 9
收起左侧

初学单片机,在定时器一个实验中有些不懂得地方

[复制链接]
ID:311807 发表于 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;
}

求各位大佬告知!!!


回复

使用道具 举报

ID:157573 发表于 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闪一次。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:310442 发表于 2018-4-19 18:00 | 显示全部楼层
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单片机定时器的最大计数65536也就是65ms  看不出实验效果

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:261871 发表于 2018-4-19 18:27 | 显示全部楼层
定时器1 的上限
回复

使用道具 举报

ID:261871 发表于 2018-4-19 18:27 | 显示全部楼层
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

定时时间太短了
回复

使用道具 举报

ID:311807 发表于 2018-4-19 18:47 | 显示全部楼层
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

懂了,谢谢大佬
回复

使用道具 举报

ID:311967 发表于 2018-4-19 20:29 | 显示全部楼层
原程序是设计的每进100次中断才进行一次电平翻转,如果按你的改法,就变成了每次进中断都会翻转一次电平了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:46065 发表于 2018-4-19 20:33 | 显示全部楼层
第一次是50次倒计数,之后是100次倒计数,就是定时器每计数100次P1取反一次。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 2018-4-19 20:48 | 显示全部楼层
ltpsweet 发表于 2018-4-19 18:00
因为这个50是让你定时器中断50次的计数   最后总的定时时间就是中断一次的时间乘50.    如果不这样   以单 ...

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

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:293933 发表于 2018-4-20 17:38 | 显示全部楼层
那uchar i的初值为什么不直接设为100呢,有什么意义,会用在什么场景中
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表