找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2615|回复: 8
收起左侧

单片机定时器0中断 控制LED亮灭 有几个问题想不清楚!求解答

[复制链接]
ID:645415 发表于 2020-7-25 17:47 | 显示全部楼层 |阅读模式
疑问:
1.模块一不是给定时器设定了初值了嘛?模块三的重新设定是在中断之后将溢出的数值重新设定????
2.去除模块三的定时器赋初值为什么下载程序后不能达到LED亮灭??
3.主函数中的while(1)是让程序停在那里一直扫描???


#include"reg52.h"                        //此文件中定义了单片机的一些特殊功能寄存器

typedefunsigned int u16;          //对数据类型进行声明定义
typedef unsignedchar u8;

sbitled=P2^0;         //定义P20口是led



/*******************************************************************************
模块一
* 函 数 名         : Timer0Init
* 函数功能        :定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


voidTimer0Init()  //外部中断0的函数
{
TMOD|=0X01;  //选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC;        //给定时器赋初值,定时1ms
TL0=0X18;     
ET0=1;//打开定时器0中断允许
EA=1; //打开总中断
        TR0=1;//打开定时器        //定时器0的运行开关               
}


/*******************************************************************************
模块二:主函数
* 函 数 名       : main
* 函数功能                : 主函数
* 输    入       : 无
* 输    出            : 无
*******************************************************************************/

void main()
{        
Timer0Init(); //定时器0初始化
while(1);        //  等待中断发生????     
}

  
/*******************************************************************************
模块三:中断服务函数
* 函 数 名         : void Timer0()interrupt 1
* 函数功能                   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


void Timer0()interrupt 1
{
staticu16 i;
TH0=0XFC;        //给定时器赋初值,定时1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;        
}        
}

回复

使用道具 举报

ID:332444 发表于 2020-7-25 23:59 | 显示全部楼层
1不要把函数称为模块,2应该去学一下定时器内容,3除去中断重新赋值会使计时变得很长,4while(1);无限空循环,因为不需要做任何事情。
回复

使用道具 举报

ID:332444 发表于 2020-7-26 05:39 | 显示全部楼层
补充一下while(1);空循环不做任何别的事情,只负责让单片机运行起来。
回复

使用道具 举报

ID:782419 发表于 2020-7-26 10:17 | 显示全部楼层
你可能是从PLC转过来的吧!模块的概念用于理解程序还行,与大家沟通就不太方便了,定时器每次溢出进入中断都会让定时器寄存器的值清零,即TL0,TH0=0,如果要保证下次定时器进入中断的时间,需要再次给TH0和TH0赋值。你也可以理解为定时器在工作模式1时的记性不太好,一进入中断就忘了自己在哪儿了,你需要提醒它一下,也就是通过TH0和TH1的赋值实现。
回复

使用道具 举报

ID:782419 发表于 2020-7-26 10:20 | 显示全部楼层
你需要对中断的概念加深一下理解。
while(1);你也可以理解为无条件等待,直到发生中断并执行中断程序。执行完中断继续等待。
回复

使用道具 举报

ID:395706 发表于 2020-7-26 11:14 | 显示全部楼层
你对中断的应有还有点不熟悉,可以加深学习一下。
while(1); 对于MCU来讲,只是在等待,不处理任何事务,直到发生中断并执行中断程序。执行完中断继续等待。
回复

使用道具 举报

ID:716656 发表于 2020-7-26 15:50 | 显示全部楼层
http://www.51hei.com/bbs/dpj-103111-1.html
我觉得还是把这篇文章细研究下。要不以后遇到定时中断还是不会。要每一句都知道怎么回事
回复

使用道具 举报

ID:808700 发表于 2020-7-28 09:58 | 显示全部楼层
while(1),这个是等待,如果没有这个,程序很可能只执行一次
回复

使用道具 举报

ID:645415 发表于 2020-7-28 16:06 | 显示全部楼层
压着我头发啦 发表于 2020-7-26 15:50
http://www.51hei.com/bbs/dpj-103111-1.html
我觉得还是把这篇文章细研究下。要不以后遇到定时中断还是不 ...

谢谢!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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