定时中断实验【嵌入式系统】

  • 前言
  • 推荐
  • 定时中断实验
  • 实验结果
  • main
  • 注意
  • 最后


前言

2023-6-6 16:25:44

以下内容源自《【嵌入式系统】》
仅供学习交流使用

推荐

GPIO实验【嵌入式系统】

定时中断实验

定时器控制LED按节奏闪烁,要求一个定时器控制三个LED分别以0.1S、0.5S及1S时长闪烁(10分)

实验结果

第一个灯以0.1s闪烁
第二个灯以0.5s闪烁
第三个灯以1s闪烁

5个一闪1个二
2个二闪1个三


嵌入式中断实验


main

//宏定义
#include "lpc213x.h"
#include "TypeDef.h"
#include "IrqFiqCtrl.h"
extern	void IRQEnable(void);
extern	void IRQDisable(void);
extern	void FIQEnable(void);
extern	void FIQDisable(void);

#define KET1 1<<16
#define KEY2 1<<17
#define KEY3 1<<18
#define KEY4 1<<19
#define KEY5 1<<20
#define KEY6 1<<21
#define KEYS 0x3f<<16
volatile uint8 count =0;
uint8 key_value;
volatile uint32 Vkey=0;
#define BEEP  1 << 7	
			/* P0.7控制BEEP,低电平蜂鸣		*/
//#define Fpclk 11059200			
// system clock freq  for ADS
#define Fosc  11059200					// 开发板外时钟频率
#define Fcclk (5*Fosc)				// Keil 默认的CPU时钟设置
#define Fpclk (Fcclk/4)				// Keil 默认的DEV时钟设置
int time_100ms_flag=0;
int time_500ms_flag=0;
int time_1000ms_flag=0;
int time_2000ms_flag=0;
const uint32 LED1 = (1 << 18); // P1.18对应LED1
const uint32 LED2 = (1 << 19);
const uint32 LED3 = (1 << 20);
const uint32 LED4 = (1 << 21);
const uint32 LED5 = (1 << 22);
//const uint32 LED6 = (1 << 23);
//const uint32 LED7 = (1 << 24);
//const uint32 LED8 = (1 << 25);
const uint32 LEDS8 = (0xFF << 18);
//P1[25:18] LED8~LED1
#define HC595_CS	(1 << 29)
//定时器中断部分
void __irq IRQ_Timer0 (void)
{

	count = count+1;
		time_100ms_flag=1;		/*0.1S标志*/
	if ((count %5)==0)
		time_500ms_flag =1;		/*0.5S标志*/
	if ((count %10)==0)
		time_1000ms_flag =1;		/*1S标志*/
	
	/*if ((coumnt %20)==0)
		time_2000ms_fiag =1;	2S标志*/

	T0IR=0x01; //清除中断标志
	VICVectAddr=0x00;//通知VIC中断处理结束
}

//主程序初始化
int main (void)
{
	PINSEL0 = 0x00000000;			// 设置管脚 P0[15:0] 连接 GPIO
	PINSEL1 = 0x00;
	PINSEL2 &=(~0x08);//P1[25:16]  GPIO
	IO1DIR |=LEDS8;//设置P1[25:16 (LED1)输出
	IRQEnable();// IRQ中断使能
	/* 定时器0初始化 */
	T0TC   = 0;						// 定时器设置为0	
	T0PR   = 0;						// 时钟不分频
	T0MCR  = 0x03;				// 设置T0MR0匹配后复位T0TC,并产生中断标志
	T0MR0  = Fpclk/10 ;			// 1秒钟定时 --- 匹配目标值
	T0TCR  = 0x01;				// 启动定时器	
	/*设置定时器0初始化IRQ*/
	VICIntSelect =0x00;//所有中断通道读孟为IQ中新
	VICVectCntl0= 0x20|0x04;//投置定时器0中断通道分配到VIC_slot_0
	VICVectAddr0= (uint32)IRQ_Timer0;//设置中断服务程序地址
	VICIntEnable = 1 << 0x04;//使能定时器0中断
	
	IO0DIR = 0x00000000;
	IO0DIR|=BEEP;
	IO0SET =BEEP;
	while (1)
	{
			Vkey = (IO0PIN&KEYS);
			if(Vkey ==KEYS)
				IO0SET = BEEP;
			else
				IO0CLR = BEEP;
			key_value =0;
			if(time_100ms_flag ==1)
				{	time_100ms_flag =0;
						if((IO1SET & LED1) == 0)
							IO1SET = LED1;//关闭LED1
						else
							IO1CLR = LED1;//点亮LED1
				}

	
			if(time_500ms_flag == 1)
				{time_500ms_flag =0;
						if ((IO1SET & LED2) == 0)
							IO1SET = LED2;//关闭LED2
						else
							IO1CLR = LED2;//点亮LED2
				}
			if(time_1000ms_flag ==1)
				{time_1000ms_flag =0;
						if((IO1SET & LED3) == 0)
							IO1SET = LED3;//关闭LED3
						else
							IO1CLR = LED3; //点亮LED3
				}
	}
}

注意

记得ReBuild一下

定时中断实验【嵌入式系统】_单片机

最后

2023-6-6 16:27:42

你对我百般注视,
并不能构成万分之一的我,
却是一览无余的你。

祝大家逢考必过
点赞收藏关注哦