嵌入式定时器基本功能(定时器中断)c语言代码
- 格式:doc
- 大小:20.00 KB
- 文档页数:2
51单片机定时器c语言51单片机是一款广泛应用于嵌入式系统中的芯片,其具有强大的功能和较高的性能表现。
在51单片机中,定时器是其中一项非常重要的功能,因为它可以帮助我们完成很多任务。
在51单片机中使用定时器,我们需要编写相应的c语言程序。
接下来,我将为大家介绍一些关于51单片机定时器c语言编程的知识。
首先,我们需要了解51单片机定时器的工作原理。
51单片机中的定时器是一个计数器,它的计数值会随着时间的流逝而增加。
当计数值达到了设定的阈值时,定时器就会产生一个中断信号。
我们可以通过对这个中断信号进行相应的处理,来完成各种任务。
为了使用51单片机的定时器,我们需要用c语言编写相应的程序。
比如,我们可以通过以下代码来初始化定时器:void timer_init(int time) {TMOD &= 0xF0; // 设定计数模式TL0 = time; // 设置定时器初值TH0 = time >> 8; // 设置定时器初值TR0 = 1; // 开始定时器}这段代码中,我们首先设定了计数模式,并且通过设置初值来调节定时器的计数时间。
最后,我们开启了定时器,让它开始进行计时。
除了初始化定时器之外,我们还需要为定时器编写中断处理程序。
比如,下面是一个简单的定时器中断处理程序:void timer_interrupt() interrupt 1 {// 处理中断信号}在这个中断处理程序中,我们可以编写相应的代码来完成各种任务。
比如,我们可以通过判断定时器计数的次数来控制LED的闪烁频率,或者通过定时器中断信号来完成数据发送等任务。
总结来说,51单片机定时器是非常重要的一个功能,它可以帮助我们完成很多任务。
要使用定时器,我们需要首先了解定时器的工作原理,并且编写相应的c语言程序实现。
如果我们掌握了这些技能,就可以开发出更加完善的嵌入式系统。
定时器c语言程序#include#define uint unsigned int#define uchar unsigned charsbit gw=P1^4; //数码管各位位选sbit sw=P1^5; //十位位选sbit SPEAK=P1^6; //定义蜂鸣器uchar num,num1,tt,shi,ge,t; //tt为设定值,t为当前计数值uchar code table[]={0x88,0x9F,0xA4,0x85,0x93,0xC1,0xC0,0x8F,0x80,0x81,0x82,0xC8,0xE8,0xA1,0x86,0x8E}; //数码管显示段码void delay(uint z); //延时子函数声明void play(uchar aa); //数码管显示子函数声明void SPK_T est( void ); //蜂鸣器控制子函数void Init(); //初始化子函数声明void KeyScanf(void); // 键盘扫描void main(){Init(); //初始化for(num1=60;num1>0;num1--)play(tt);t=tt;while(1){KeyScanf();while(t==0){TR0=0; //定时时间到停止定时器工作SPK_T est();t=60;break;}play(t); //显示当前剩余定时时间}}/********************************************************** *名称:void Init()*功能:初始化定时器0等***********************************************************/ void Init(){EA=1; //开总中断ET0=1; //开定时器0中断tt=60; //设定默认定时时间(一分钟)num=20;TMOD=0x01; //设置定时器0为工作方式1TH0=(65536-50000)/256; //定时器0设定50ms定时初值TL0=(65536-50000)%256;SPEAK=0;}/*******************************************函数名:按键扫描描述:*******************************************/void KeyScanf(void){if((P1&0x0f)!=0x0f) //检查按键{delay(20);if((P1&0x0f)!=0x0f) //检查按键{delay(20);if(!(P1&0x01))while(1){ TR0=0;play(tt);if(!(P1&0x02)){tt++;play(tt);}else if(!(P1&0x04)){tt--;play(tt);}if(!(P1&0x08)){TR0=1;t=tt;break;}}if((TR0==1)&&(!(P1&0x08))) {if(!(P1&0x08)){TR0=0; //停止delay(20);}}if((TR0==0)&&(!(P1&0x08))){{TR0=1; //启动delay(20);}}}}}/************************************************************** *名称: Delay_NS()*功能: 长软件1ms延时*************************************************************** /void delay(uint ms){uchar i;while(ms--) //ms毫秒软件延时{for(i = 63;i > 1;i--);}}/************************************************************函数名称:定时器0中断服务子程序功能:重装初并重启定时器值,定时中断满20次(1s),计数减1************************************************************/ void time0() interrupt 1 //定时器0中断子函数{if(num>0){num--;}else if(num==0){t--;num=20;}TH0=(65536-50000)/256; //重装定时器初值TL0=(65536-50000)%256;ET0=1;TR0=1; //重新启动T0}/************************************************************** *名称: void play(uchar)*功能: LED数码管显示0-F字符,同时控制2个数码管显示对应的十六进制数*************************************************************** /void play(uchar aa) //数码管显示子函数{shi=aa/10;ge=aa%10;P0=table[ge];gw=0;delay(20); // 延时显示gw=1;P0=table[shi];sw=0;delay(20); // 延时显示sw=1;}/******************************************* 函数名:SPK_test()描述:蜂鸣器控制*******************************************/ void SPK_T est( void ){unsigned int i = 0;unsigned char j,k,m = 34;for(j = 0;j < 8;j ++){m -=1;for(i = 0;i < 2000;i ++ ){SPEAK = ~SPEAK;for(k = m;k > 1;k--);}delay(15);}SPEAK =0;}。
单片机定时器中断原理和C语言代码详解我之前都是用ARM7,单片机基本不会。
但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。
废话不说了,上代码。
#define _1231_C_#include "reg51.h"#include "1231.h"//sbit OE=P2^3;unsigned int SystemTime;void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{TH0 = 0xdb;TL0 = 0xff;// TF0 = 0;SystemTime++;}void main(){TMOD &= 0xF0;TMOD |= 0x01; //TMOD的值表示定时器工作方式选择TH0 = 0xdb; //写入初始值,初始值可以决定定时多久TL0 = 0xff;//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。
//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;//相当于开水龙头,如TR0=0则TH0和TL0不变ET0 = 1; //允许定时器0中断EA=1; //开总中断//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}//运行完中断部分的代码后,接着继续执行死循环里的代码。
51单片机C语言程序定时/计数器中断程序一利用定时/计数器T0从P1.0输出周期为1s的方波,让发光二极管以1HZ闪烁,#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==20){tt=0;P1_0=~P1_0;}}程序二利用定时/计数器T1产生定时时钟,由P1口控制8个发光二极管,使8个指示灯依次一个一个闪动,闪动频率为10次/秒(8个灯依次亮一遍为一个周期),循环。
#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit P1_0=P1^0;uchar tt,a;void main() //主函数{TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0a=0xfe;while(1);//等待中断产生}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==2){tt=0;P1=a;a=_crol_(a,1);}}程序三同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔2s依次输出1,10,50,100,200,400,800,1k(hz)的方波#include<reg52.h> //52单片机头文件#include <intrins.h> //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;uchar tt;uint fre,flag;void main() //主函数{fre=50000;beep=0;TMOD=0x11;//设置定时器0,定时器1为工作方式1TH0=(65536-fre)/256;TL0=(65536-fre)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断ET1=1;TR1=1;TR0=1;//启动定时器0while(1);//等待中断产生}void timer0() interrupt 1 //定时器0中断{TR0=0; //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失TH0=(65536-fre)/256;TL0=(65536-fre)%256;tt++;if(flag<40) //以下几个if分别用来选取不同的频率 if(tt==10){tt=0;fre=50000;beep=~beep;}if(flag>=40&&flag<80){tt=0;fre=50000;beep=~beep;}if(flag>=80&&flag<120){tt=0;fre=10000;beep=~beep;}if(flag>=120&&flag<160){tt=0;fre=5000;beep=~beep;}if(flag>=160&&flag<200){tt=0;fre=2500;beep=~beep;}if(flag>=200&&flag<240){tt=0;fre=1250;beep=~beep;}if(flag>=240&&flag<280){tt=0;fre=625;beep=~beep;}if(flag>=280&&flag<320){tt=0;fre=312;beep=~beep;}if(flag>=320&&flag<360){tt=0;fre=156;beep=~beep;}TR0=1;}void timer1() interrupt 3 //定时器1中断用来产生2秒时间定时{TH1=(65536-50000)/256;TL1=(65536-50000)%256;flag++;if(flag==360){flag=0;fre=50000;}}程序四用定时器以间隔500MS在6位数码管上依次显示0、1、2、3....C、D、E、F,重复。
c51单片机c语言常用指令-回复C51单片机C语言常用指令导语:C51单片机是一种非常常用的微控制器,它广泛应用于许多嵌入式系统和电子设备中。
在单片机的开发过程中,C语言是一种非常常用的编程语言。
本文将介绍C51单片机常用的指令,帮助读者了解这些指令的功能和使用方法。
第一部分:常用的I/O口控制指令I/O口控制指令是C51单片机中非常重要的一部分,因为它们用于控制单片机与外部设备之间的数据交互。
以下是一些常用的I/O口控制指令:- P0:将P0口设置为输入或输出,可以用于与外部设备进行数据通信。
- P1:将P1口设置为输入或输出,可以用于与外部设备进行数据通信。
- P2:将P2口设置为输入或输出,可以用于与外部设备进行数据通信。
- P3:将P3口设置为输入或输出,可以用于与外部设备进行数据通信。
第二部分:常用的中断控制指令中断是C51单片机中实现实时响应的重要机制之一。
以下是一些常用的中断控制指令:- EA:使能所有中断。
- EX0:外部中断0的控制指令,用于外部设备产生中断信号。
- EX1:外部中断1的控制指令,用于外部设备产生中断信号。
- IT0:外部中断0的触发方式,可以设置为电平触发或边沿触发。
- IT1:外部中断1的触发方式,可以设置为电平触发或边沿触发。
第三部分:常用的定时器控制指令定时器是C51单片机中实现时间计数和定时任务的重要模块。
以下是一些常用的定时器控制指令:- TMOD:设置定时器模式,可以选择定时器0/1的工作模式。
- TL0、TL1:定时器0/1的低8位计数器,用于保存定时值的低8位。
- TH0、TH1:定时器0/1的高8位计数器,用于保存定时值的高8位。
- TR0、TR1:定时器0/1的运行控制位,用于启动和停止计时器。
- TF0、TF1:定时器0/1的溢出标志位,用于判断定时器是否溢出。
第四部分:常用的串口通信指令串口通信是C51单片机中常用的通信方式之一,用于与其他设备进行数据交互。
//PC9--PC6接4个位选,PC13接按键,PA0-PA7接段选abcdefgh//动态显示,将秒显示在两位数码管上//按键闭合一次,秒清0,按键再闭合,停止计时#include "stm32f10x.h"u16 seg[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void Delay(vu32 nCount);void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void TIM2_Configuration(void);void display(u8 sec);u8 sec=0;u8 t;u8 num;int main (void){RCC_Configuration(); /* 配置系统时钟,使能外设时钟*/GPIO_Configuration(); /* 配置GPIOC */NVIC_Configuration();TIM2_Configuration();while(1){t = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);if (t==0){Delay(20000);t = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);if (t==0){num++;if (num>=2){num=0;}}while (GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==0);switch(num) {case 0:sec=0x00;TIM_Cmd(TIM2, ENABLE);break;case 1:TIM_Cmd(TIM2, DISABLE); //停止计时break;}}display(sec);}}void RCC_Configuration(void) //配置时钟的函数{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);}void NVIC_Configuration(){NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}void TIM2_Configuration(){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_TimeBaseStructure.TIM_Period = 35999;TIM_TimeBaseStructure.TIM_Prescaler = 1999;TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开定时器溢出中断TIM_Cmd(TIM2, ENABLE); //启动定时器2}void GPIO_Configuration(void) //配置GPIO,PA7-PA0,PC9-PC6推挽输出,PC13上拉输入{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO_InitStructure);}void Delay(u32 nCount) //延时函数{for(; nCount != 0; nCount--);}void TIM2_IRQHandler(void){sec++;if(sec==60){sec=0;}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}void display(u8 sec){u8 a1,a2;a1=sec/10;a2=sec%10;GPIOA->ODR = 0xff; //消隐GPIOC->ODR = 0x0100; //0000 0001 0000 0000,PC8=1,位选GPIOA->ODR = seg[a1]; //输出段码,显示Delay(10000);GPIOA->ODR = 0xff;GPIOC->ODR = 0x0080; //0000 0000 1000 0000, PC7=1GPIOA->ODR = seg[a2];Delay(10000);}。
C标准库定时器函数==========在C标准库中,定时器函数提供了一种在特定时间间隔后触发事件或者在某个时间点执行特定任务的能力。
以下是一些主要的C标准库定时器函数及其功能:1. 创建/删除定时器-----------* `timer_create`:此函数用于创建一个新的定时器。
它需要一个`timer_t`类型的变量来存储定时器的标识符,一个`struct sigevent`结构体来指定定时器的回调函数和参数,以及一个`timer_attr_t`类型的变量来指定定时器的属性。
* `timer_delete`:此函数用于删除一个已创建的定时器。
它需要一个`timer_t`类型的变量来存储定时器的标识符。
2. 定时器控制--------* `timer_settime`:此函数用于设置定时器的运行参数,包括定时器的标识符、定时器类型(周期性或单次)、回调函数、回调函数的参数、初试时间、间隔时间等。
* `timer_gettime`:此函数用于获取定时器的当前状态,包括定时器的标识符、当前时间、剩余时间等。
3. 定时器回调--------* `timer_cb`:此函数是定时器的回调函数,它会在定时器触发时被调用。
在回调函数中,您可以执行任何需要在特定时间执行的任务。
4. 定时器状态获取----------* `timer_status`:此函数用于获取定时器的状态,包括定时器的标识符、当前时间、剩余时间、状态标志等。
这些函数的使用需要结合具体的程序设计和需求来进行。
使用这些函数时需要注意错误处理和异常情况的处理,以确保程序的稳定性和可靠性。
c51定时中断实验报告本文介绍的是C51定时中断实验,利用这个实验可以更好地理解C51的定时器与中断模块,进一步熟悉C语言的使用。
一、实验目的1.掌握C51单片机的定时器模块和中断模块。
2.熟悉定时器与中断的工作原理。
3.掌握利用中断实现定时功能的方法。
4.掌握如何调试程序,发现和解决程序问题。
二、实验装置硬件:STC89C52微控制器、电源、电路板、电路元件等。
软件:Keil C51集成开发环境。
三、实验原理1.定时器模块C51单片机中的定时器模块包含了3种不同的工作方式:工作模式0、模式1和模式2。
这些工作模式拥有不同的计数器范围和计数方式。
在本实验中,将使用工作模式1,因为它适用于大多数定时需求,并且易于编写程序。
工作模式1基本特点如下:(1)Timer1用两个8位计数器(TH1和TL1)组成,当一个计数器溢出时(从FFH计数到00H),计数值自动重装,同时中断请求位TF1被设置。
(2)计数器TH1可以初始值,TL1需要重新初始计数。
(3)Timer1的计数时钟来源可以是外部时钟源或内部时钟源,一般选择内部时钟源。
(4)TH开头的寄存器和TL开头的寄存器合起来组成16位的Timer1计数器,这个计数器的数值大小为TH1-TH1。
(5)x表示H或L。
用C语言对Timer1进行编程,首先需要完成以下配置:TMOD |= 0x10; // 定时器模式选择,使用模式1,TH0和TL0为一组计数器TH1 = (65536 - 50000) / 256; // 定时器初值设置ET1 = 1; // 打开定时器中断其中,TMOD是用来选择定时器工作模式,可以用对应的数值进行配置;TH1和TL1需要根据需要设置计数器初始值,该初值的计算公式为:计数初值 = (65536 - 计数时间/12)。
ET1为定时器1允许中断的位,EA为总中断允许位,TR1为定时器1工作使能位。
2.中断模块中断是一种实时响应外部事件处理的技术手段,当特定的硬件事件发生时,CPU自动调出相应的中断处理程序来响应事件,处理程序完成任务后返回继续程序运行,从而提高了CPU的效率。
cc2530协议栈定时器中断的工作原理1.引言在无线通信领域中,C C2530芯片是一款非常常见的单片机芯片,广泛应用于物联网、智能家居等场景中。
其内部集成了协议栈以实现无线通信功能。
本文将着重介绍c c2530协议栈定时器中断的工作原理。
2.定时器的作用在嵌入式系统中,定时器是一种重要的设备,用于定时操作和任务调度。
在c c2530芯片中,定时器被广泛应用于协议栈的各个模块,实现对通信和维护任务的精准控制。
3. cc2530协议栈定时器的特点c c2530芯片的协议栈中包含多个定时器,其中最重要的是MA C层定时器和P HY层定时器。
这些定时器具有以下特点:-高精度:定时器采用高精度的时钟源,并通过时钟分频技术实现微秒级的时间精度。
-可编程性:用户可以根据自己的需要对定时器进行配置和设置。
-中断触发:定时器可以在达到设定的定时时间时产生中断信号。
4. cc2530协议栈定时器中断的处理流程c c2530协议栈定时器中断的处理流程如下:-初始化定时器:在使用定时器前,需要对其进行初始化设置,包括选择时钟源、设置定时时间等。
-启动定时器:一旦定时器被启动,它便开始计时,并在达到设定的定时时间时触发中断信号。
-中断处理:当定时器中断信号触发时,C P U会进入中断处理程序,并执行相应的中断服务例程。
-中断服务例程:中断服务例程是用来处理定时器中断的代码段,其中包括对定时器的停止、重置等操作,以及其他需要执行的任务。
5.示例代码下面是一个简单的示例代码,演示了如何使用cc2530协议栈定时器中断:#i nc lu de<c c2530.h>//定时器中断服务例程#p ra gm av ec to r=TIM E R1_O VF_V EC TO R__in te rr up tv oi dTi m er1O ve rf lo w(voi d){//中断处理代码//...//定时器重置T1CT L|=0x01;}v o id ma in(v oi d){//初始化定时器T1CT L=0x02;//设置定时时间T1CC0L=0x50;T1CC0H=0x00;//启动定时器T1CT L|=0x04;//启用定时器中断I E N0|=0x80;//全局使能中断E A=1;w h il e(1){//主循环}}6.总结本文介绍了c c2530协议栈定时器中断的工作原理。
定时器基本功能实验(定时器中断)
1.实验内容
使用定时器0 实现1 秒定时,控制蜂鸣器蜂鸣。
采用中断方式实现定时控制。
备注:EasyARM2131实验板上的系统时钟默认为11.0592MHz;系统中已定义了符号常量Fpclk = 11059200 ;
2.实验步骤
①启动ADS 1.2,使用ARM Executable Image for lpc2131工程模板建立一个工程
TimeOut_C。
②在user 组中的main.c 中编写主程序代码。
③主程序中使用IRQEnable( )使能IRQ 中断。
④选用DebugInExram 生成目标,然后编译连接工程。
⑤将LPC2131实验板上的Beep跳线短接到P0.7。
⑥选择【Project】->【Debug】,启动AXD 进行JTAG 仿真调试。
⑦全速运行程序,蜂鸣器会响一秒,停一秒,然后再响一秒……依次循环。
3.实验参考程序
程序清单错误!文档中没有指定样式的文字。
-1 定时器实验参考程序
#include "config.h"
#define BEEP 1 << 7 /* P0.7控制BEEP,低电平蜂鸣 */
/***************************************************************************************** ** 函数名称:IRQ_Timer0()
** 函数功能:定时器0中断服务程序,取反LED9控制口。
** 入口参数:无
** 出口参数:无
****************************************************************************************** */
void __irq IRQ_Timer0 (void)
{
if ((IO0SET & BEEP) == 0)
IO0SET = BEEP; /* 关闭BEEP */
else
IO0CLR = BEEP;
T0IR = 0x01; /* 清除中断标志*/
VICVectAddr = 0x00; /* 通知VIC中断处理结束*/
}
/*
*****************************************************************************************
** 函数名称:main()
** 函数功能:使用定时器实现1秒钟定时,控制LED9闪烁。
中断方式。
** 调试说明:需要将跳线JP11连接BEEP。
***************************************************************************************** */
int main (void)
{
PINSEL1 = 0x00000000; /* 设置管脚连接GPIO */
IO0DIR = BEEP; /* 设置BEEP控制口输出*/
IRQEnable(); /* IRQ中断使能*/
/* 定时器0初始化*/
T0TC = 0; /* 定时器设置为0 */
T0PR = 0; /* 时钟不分频*/
T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志*/
T0MR0 = Fpclk; /* 1秒钟定时;系统中已定义Fpclk = 11059200 */
T0TCR = 0x01; /* 启动定时器*/
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; /* 所有中断通道设置为IRQ中断*/
VICVectCntl0 = 0x20 | 0x04; /* 设置定时器0中断通道分配最高优先级*/
VICVectAddr0 = (uint32)IRQ_Timer0; /* 设置中断服务程序地址*/
VICIntEnable = 1 << 0x04; /* 使能定时器0中断*/
while (1);
return 0;
}。