应广单片机_呼吸灯理解

计数器的介绍

对于应广单片机来说,它提供了3种计数器,分别为 TM2\TM3\T16
其中对于TM2\TM3来说,是属于PWM计数器,用法是简单的,但是要求比较高,需要对应的引脚来达到它的要求
从芯片手册上,可以看到有且最多只能是6个引脚受到TM2\TM3控制,这时候就需要用到T16时钟进行计时,
控制芯片引脚传出PWM波形,控制灯的明暗呼吸效果!!!
在这里插入图片描述

T16的优劣

T16的精度是没有TM2和TM3的精度高,但是普通使用,是完全可以使用的
对于控制灯光效果,在时间和占空比的配合控制下,一样的可以达到完美的效果
T16可以和中断进行配合使用,做计数器。
应广已经为自家的IDE软件,集成了一款通用的软件设备,所以说,关于计数器都是现成的软件,只需要知道怎么使用就可以了!!

T16软件

$ T16M SYSCLK,/16,bit10;	//T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
								//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, EOSC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64
								//中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
	reload_T16 = 1024 - 625;	//每次进中断为10ms;
				//计算公式为	[1/(时钟源/分频器)]*(中断源-reload_T16)=[1/(1M/16)]*(2^10-(1024-625))=0.01s

	stt16 reload_T16;			//设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;
	$ INTEN T16;				//中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
	$ INTRQ T16;				//中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
								//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。
	$ INTEGS BIT_R;				//T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
	//	设定INTEN、INTRQ的初始值
	INTEN.T16 = 1;				//开T16中断
//	INTEN.T16 = 0;				//关T16中断
	INTRQ.T16 = 0;				//清零INTRQ寄存器。
	ENGINT;						//打开全局中断
//	DISGINT;					//关闭全局中断

	time = 0;

这是T16的函数块
对时间的控制需要更改下面的参数

reload_T16 = 1024 - 625;

1024:是系统中断源的BIT10的2进制换算
625:是T16配置选择对时间的修改

[1/(时钟源/分频器)](中断源-reload_T16)=[1/(1M/1)](2^10-(1024-625))

.ADJUST_IC	SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;

这里系统时钟可以算出是1MHZ
根据上面的公式算出,最后的时间是由625换算的时间进行计数,时间可以得出是625us的时间点!
每次计数一次的时间是625us,**可以根据需求进行修改! **

中断中的计时器配置

void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	
		stt16 reload_T16;		//设定计数器初始值reload_T16
		time=1;
		Intrq.T16	=	0;
	}
	popaf;
}

这些软件也是系统自动生成的,从题目中,可以算出的时间节点是625us*1的计数一次,根据需要修改!

void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/4		//	SYSCLK=IHRC/4
	T16_Time();//T16计时器的调用
	IO_Init();//引脚的调用

	while (1)
	{
		if(time==1)//计时器运行一次,调用的程序运行一次!
		{
			times=0;
			taskloop();//调用的程序,我这里采用的对呼吸的程序的调用!
		}
	}
}

接下来只需要每次定时一次,运行一下程序就可以玩成时间的定时!
但是对于计数器的使用,是采用在程序的主程序中进行调用的!

呼吸灯程序

首先采用T16做计时器设计PWM脉冲波形,然后通过输出引脚给灯。通过亮暗的变化,就可以形成一种忽明忽暗的柔和的类似呼吸效果!

1、如果亮度时间小于占空比,则灯亮;否则,灯灭;
2、在相同的时间下(周期相同),占空比逐渐增加,表示为呼吸变亮;占空比逐渐减小,表示为呼吸边暗。

void Led_Breath(void)
{
	pwm_time++;
	breath_time++;

	if(pwm_time<=pwm)//比占空比低的时候,灯亮;否则,灯灭
	{
		led1=0;
	}
	else 
	{
		led1=1;
	}
	if(pwm_time>50)
	{
		led1=1;
		pwm_time=0;
	}


	if(breath_time==100)//当呼吸时间到达这个值的时候
	if(action==0)//且指示方向指向0(表示占空比增加还是降低的方向)
	{
		breath_time=0;
		pwm++;
		if(pwm==100)//占空比自加
		{
			action=1;
			pwm_time=0;
		}
	}

	if(breath_time==100)//当呼吸时间到达这个值的时候
	if(action==1)//且指示方向指向0
	{
		breath_time=0;
		pwm--;
		if(pwm==0)//占空比自减
		{
			action=0;
			pwm_time=0;
		}
	}
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值