栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单片机的定时器中断

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单片机的定时器中断

一:周期与频率的关系为什么是倒数关系:

周期是一次运动的时间,也就是几秒每次,单位是:秒/次。
而频率是1秒钟多少次,单位是:次/秒。
从单位看便可推断出二者呈倒数关系。
下面以匀速圆周运动为例:做匀速圆周运动的物体运动一周所用的时间叫做周期。
那么周期的倒数就叫做频率。———————源自百度

二:中断程序代码

利用定时器0工作方式1,实现第一个发光管以1s亮灭闪烁。(如下图)

#include 
#define uchar unsigned char 
#define uint unsigned int 
sbit led1=P1^0;
uchar num;
void main()
{
	TMOD=0x01;
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	EA=1;
	ET0=1;
	TR0=1;


	while(1) ;

}
void T0_time() interrupt 1
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num++;
	if(num==20)
	{
		led1=~led1;
		num=0;
	}											
}
三、自己练习途中发现的问题:

1、少打了“while(1)”,结果发现实验板上的led灯并不会进行亮灭。

——原来是实际上没加“while(1)”进行循环,那么主函数只运行一次,中断也只进行一次,未达到次数,led也就没反应。

2、注意:在中断服务程序中一般不要写过多的处理语句,因为如果语句过多,中断服务程序中的代码未执行完毕,而下一次中断来临,这样就会丢失这次中断。

那么我就把if程序块放到了主函数中。结果实验板上的led灯又不会进行亮灭。 (如下图)

#include 
#define uchar unsigned char 
#define uint unsigned int 
sbit led1=P1^0;
uchar num;
void main()
{
	TMOD=0x01;
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	EA=1;
	ET0=1;
	TR0=1;
	if(num==20)
	{
		led1=~led1;
		num=0;
	}											
	while(1) ;

}
void T0_time() interrupt 1
{
	TH0=(65536-45872)/256;
	TL0=(65536-45872)%256;
	num++;
}

——结果翻书才发现,这if程序块,我要放入while语句中,结果成功实现灯的亮灭。(如下图)

	while(1)
	{
		if(num==20)
		{
			led1=~led1;
			num=0;
		}
	}											

后知后觉,发现如果放在while语句外面,则实际if程序也只是执行一次。若放在while语句中,就会一直循环,符合条件即能实现灯的亮灭。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917210.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号