应广单片机 PMS150、FPC161 基础例子【T16定时器】

文章主要记录芯片T16定时器的使用例子

如图,定时器的模块框图

 

定时器寄存器的解析和实例

下面就直接参考MiniC编程助手测试例子

//======================================//
//				T16定时
//案例为:
//利用T16计数器来计时,计时两秒后控制LED灯由亮变灭
//======================================//
#include	"extern.h"

bit		LED		:	PA.0		//定义LED灯的引脚
byte	time_10ms;
word	reload_T16;

void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;

	$ LED out,high;				//初始把灯点亮(高电平点灯)

	$ T16M SYSCLK,/16,bit10;	//T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
								//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, 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,当计数器累加超过设定中断源时产生中断;
	$ INTRQ T16;				//中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
								//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。
	$ INTEGS BIT_R;				//T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
	//	设定INTEN、INTRQ的初始值
	INTEN.T16 = 1;				//中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
//	INTEN.T16 = 0;				//关T16中断
	INTRQ.T16 = 0;				//清零INTRQ寄存器。
	ENGINT;						//打开全局中断

	time_10ms = 0;

	while (1)
	{
		nop;
	}
}


void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	//	T16 Trig
		//	User can add code
		stt16 reload_T16;		//设定计数器初始值reload_T16
		time_10ms++;
		if(time_10ms > 200)		//定时两秒
		{
			time_10ms = 0;
			//$ LED out,low;		//关灯
            $ LED toggle;   //可以使用示波器 验证LED引脚的输出信号
		}
		Intrq.T16	=	0;
	}

	popaf;
}

 接下来使用示波器查看LED 波形

 

好的,这个需求也可以用树莓派的GPIO口控制实现。我们需要连接一个按键和一个LED灯,按键连接GPIO口18,LED灯连接GPIO口21。按键按下时,LED灯亮度增加一档,每档亮度变化可以通过修改LED灯占空比实现。代码如下: ```python import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) # 设置GPIO口编号模式为BCM GPIO.setwarnings(False) # 忽略GPIO口警告信息 # 定义LED灯的GPIO控制口 led_pin = 21 # 初始化LED灯的GPIO口状态 GPIO.setup(led_pin, GPIO.OUT, initial=GPIO.LOW) # 定义按键的GPIO控制口 button_pin = 18 # 初始化按键的GPIO口状态 GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 定义LED灯的初始亮度档位和每次亮度增加的步长 brightness = 0 step = 25 # 循环执行LED灯控制程序 while True: # 监听按键状态,按下后LED灯亮度增加一档 if not GPIO.input(button_pin): brightness += step if brightness > 100: brightness = 0 # 控制LED灯的亮度 p = GPIO.PWM(led_pin, 1000) p.start(brightness) time.sleep(0.1) p.stop() ``` 上述代码中,我们使用了树莓派的PWM(脉冲宽度调制)功能控制LED灯的亮度。通过不停的循环,我们可以实时监听按键的状态,按下时增加LED灯的亮度档位,最高档位为100,再按一下则回到初始状态,即灯灭。在控制LED灯亮度时,我们使用了 PWM 的方式,通过改变占空比实现LED灯亮度的变化。其中,占空比的范围是0-100,步长为25,即每次增加或减少25。同时,由于 PWM 控制需要不停地输出高低电平,我们使用了 `time.sleep()` 函数来控制 PWM 输出时间的长度,以避免对 CPU 的占用过高。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值