1、10.2.3 定时溢出中断编程C语言程序例 (1)定时溢出中断编程C语言程序例主程序 实例编号:C05_1 路径:\C\C05_1定时器溢出中断 (Timer1.prj) /*-----------------------------------------------------* *工 程 名:Timer1.prj * *硬件连接:无 * *程序描述:1.从串口接收表示时间的3字节数据 * *
2、 2.利用定时器溢出中断修改时间,并发送新时间 * *目 的:学习定时器基本功能 * *---------《嵌入式应用技术基础教程》教学实例----------*/ //头文件 #include "GP32C.H" #include "SCI.h" //串行通信子程序头文件 //有关寄存器位定义 #define TSTOPBit 5 //定时器计数停止位 #define TOFBit 7 //定时器溢出标志位 //函数声明 ex
3、tern void SCIInit(void); extern void SCISendN(unsigned char n,unsigned char ch[]); void Timer1init(void); unsigned char time[3]; //存放时、分、秒 //*====================================================* //*[主程序] void main() { unsigned char i; unsigned char j; asm("SEI");
4、 //关总中断 SCIInit(); Timer1init(); //调定时器1初始化子程序 SCC2|=(1<<5); //令SCC2.5=1,允许接收中断 asm("CLI"); //开总中断 //给时分秒赋初始值 time[0]=0; time[1]=0; time[2]=0; i=time[2]; while(1) { j=time[2]; if (i!=j) //数组已经更新
5、 {SCISendN(3,time); i=j;} //发送新数据 } } /*[内部直接调用子程序存放处]*/ /*Timer1init:定时器1初始化子程序-----------------------* *功能:对定时器1初始化 * *参数:无 * *返回:无 * *--------------
6、/ void Timer1init(void) { //允许溢出中断、不启动计数、分频因子=64 T1SC=0b01100110; //计数寄存器初值=0x0000 T1CNTH=0x00; T1CNTL=0x00; //1秒产生1次溢出中断,计数寄存器=1×(2457600/64)=9600 T1MODH=0x96; T1MODL=0x00; //允许定时器1计数寄存器计数 T1SC&=~(
7、1< 8、clude "GP32C.H"
#include "SCI.h" //串行通信头文件
/*[相应寄存器定义]*/
#define TSTOPBit 5 //定时器计数停止位
#define TOFBit 7 //定时器溢出标志位
/*isrTIMER1:定时器溢出中断处理函数---------------------*
*功 能:给内存单元Time[0-2](时分秒)赋值 *
*-----------------------------------------------------*/ 9、
extern unsigned char time[3]; //H M S
#pragma interrupt_handler isrTIMER1
void isrTIMER1(void)
{
unsigned char i;
asm("SEI"); //关总中断
//------------------------------
time[2]++; //秒数加1
if (time[2]!=60) goto isrTIMER1_exit; //秒数未增加到60,转
time[2]= 10、0; time[1]++; //秒数增加到60,清0,分钟数加1
if (time[1]!=60) goto isrTIMER1_exit; //分钟数未增到60,转
time[1]=0; time[0]++; //分钟数增加到60,清0,小时数加1
if (time[0]!=24) goto isrTIMER1_exit; //小时数未增到24,转
time[0]=0; //时数增加到24,清0
isrTIMER1_exit:
//------------------------------
//清除定时 11、器溢出标志位
T1SC&=~(1< 12、//禁止所有中断
//接收数据
SCIReN(3,time);
asm("CLI"); //开放总中断
}
//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}
#pragma abs_address:0xffdc //中断向量表起始地址
void (* const _vectab[])(void) = {
isrDummy, //时基中断
isrDummy, 13、 //AD转换中断
isrDummy, //键盘中断
isrDummy, //SCI TC/TE
isrRe, //SCI RF/IDLE
isrDummy, //SCI PE/FE/NF/OR
isrDummy, //SPI TE
isrDummy, //SPI MOD/OVR/RF
isrDummy, //TIM2溢出中断
isrDummy, //TIM2通道1
isrDummy, //TIM2通道0
isrTIMER1, //TIM1溢出中断
isrDummy, //TIM1通道1
isrDummy, //TIM1通道0
isrDummy, //CGM
isrDummy, //IRQ
isrDummy //SWI
//RESET也是中断,定义在 crt08.o中
};
#pragma end_abs_address






