09.定时器02

#include "reg52.h"

sbit led = P3^6;

void delay10ms()
{
//1. 配置定时器0工作模式位16位计时
	TMOD = 0x01;
	//2. 给初值,定一个10ms出来
	TL0=0x00;
	TH0=0xDC;
	//3. 开始计时
	TR0 = 1;
	TF0 = 0;
} 

void main()
{
	int cnt = 0;
	led = 1;

	
	
	while(1){
		if(TF0 == 1)//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1
		{
			TF0 = 0;//不用中断,必须软件清零
			cnt++;  //统计爆表的次数
			//重新给初值
			TL0=0x00;
			TH0=0xDC;
			if(cnt == 100){//爆表100次,经过了1s
				cnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1s
				led = !led;//每经过1s,翻转led的状态
			}
		}
	}
}

补充一下

void Timer0Init(void)		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

口诀:清0用&(与),置1用 | (或)  

这里的与运算(&)可以看作乘法,或运算( | )可以看作加法

可以看到与运算(&)后,高四位没有改变,把低四位清零了,我们使用0加上与运算(&)就可以清零

然后或运算( | )后,高四位没有改变,而低四位因为给了一个1值,所以改变了

AUXR 

也是有八位,默认值是xxxx xx00

它的高六位都是空的,赋值也没有意义,但是B1和B0是有值的

B0(ALEOFF)位置1,禁止ALE信号输出,提升系统的EMI功能,复位后为0,ALE信号正常输出

也就是提升时钟对外电磁辐射的性能

上面7F,前面的7随便写的,F也可以写成01

步进电机需要按照特定的顺序来控制电机旋转,可以使用定时器来实现这种控制方式。下面是一个使用STM32定时器控制28BYJ-48步进电机的示例代码: ```c #include "stm32f4xx.h" #define STEPPER_PORT GPIOA #define STEPPER_PIN1 GPIO_Pin_0 #define STEPPER_PIN2 GPIO_Pin_1 #define STEPPER_PIN3 GPIO_Pin_2 #define STEPPER_PIN4 GPIO_Pin_3 /* 步进电机的控制顺序 */ const uint8_t STEPPER_SEQUENCE[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09}; uint8_t stepper_index = 0; void stepper_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = STEPPER_PIN1 | STEPPER_PIN2 | STEPPER_PIN3 | STEPPER_PIN4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(STEPPER_PORT, &GPIO_InitStructure); } void stepper_set_sequence(uint8_t index) { GPIO_WriteBit(STEPPER_PORT, STEPPER_PIN1, (STEPPER_SEQUENCE[index] & 0x01) ? Bit_SET : Bit_RESET); GPIO_WriteBit(STEPPER_PORT, STEPPER_PIN2, (STEPPER_SEQUENCE[index] & 0x02) ? Bit_SET : Bit_RESET); GPIO_WriteBit(STEPPER_PORT, STEPPER_PIN3, (STEPPER_SEQUENCE[index] & 0x04) ? Bit_SET : Bit_RESET); GPIO_WriteBit(STEPPER_PORT, STEPPER_PIN4, (STEPPER_SEQUENCE[index] & 0x08) ? Bit_SET : Bit_RESET); } void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { stepper_set_sequence(stepper_index); stepper_index = (stepper_index + 1) % 8; TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } } void stepper_rotate(int steps, int delay_ms) { int i; for (i = 0; i < steps; i++) { stepper_set_sequence(stepper_index); stepper_index = (stepper_index + 1) % 8; delay_ms(delay_ms); } } int main(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 8399; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); stepper_init(); stepper_rotate(512, 5); while (1) { } } ``` 在这个示例中,我们使用TIM3定时器来控制电机的旋转。TIM3定时器的时钟频率为84MHz,我们将TIM3的时钟分频为8400,这样TIM3的计数器每计数一次就需要10us。我们将TIM3的周期设置为999,这样TIM3的中断每隔1ms就会被触发一次。在TIM3的中断中,我们通过修改GPIO口的输出状态来控制电机的旋转。我们可以通过调整delay_ms函数的参数来控制电机旋转的速度。 在main函数中,我们调用stepper_rotate函数来控制电机的旋转。该函数的第一个参数是电机旋转的步数,第二个参数是电机每步旋转的时间间隔。在该函数中,我们循环调用stepper_set_sequence函数来控制电机旋转的方向和步数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值