【Smart-M051】基础实验二 Timer(定时器/计数器)
一、硬件部分:MCU(M052LAN)-->74LS164-->LCD1602
二、软件部分:Just code it.
三、结论:
通过定时器实现准确延时目的;
认识中断服务函数TMR1_IRQHandler()和main()函数的关系;
通过设置断点掌握基本的调试技巧。
/* ------------------------------------ *作 者:SmartM-AX *官 网:www.smartmcu.com *淘 宝:http://smartmcu.taobao.com/ * Q Q :1771744839 *功 能 描 述:通过定时器TMR1周期模式实现1s计数,并延迟3秒将文字显示到LCD1602上. ------------------------------------ */#include "SmartM_M0.h"/*************************************************** * 定义全局变量 ***************************************************/UINT8 __g_bTime1SecCnt = 0; //1s事件计数器VOLATILE BOOL __g_Timer1IRQEvent = FALSE;//中断事件发生标志位VOLATILE BOOL __g_bTime1SecEvent = FALSE;//1s事件发生标志位/***************************************************** 函数名称: itoa* 输 入: val,*str* 输 出: 无* 功能描述: 整型数据转化成字符型*****************************************************/VOID itoa(UINT16 val,UINT8 *str) { str[0] = 'C'; str[1] = 'N'; str[2] = 'T'; str[3] = ':'; str[4] = '0'+val/1000; str[5] = '0'+val%100/10; str[6] = '0'+val/10%10; str[7] = '0'+val%10; str[8] = '\0';}/***************************************************** 函数名称: TMR1Init* 输 入: 无* 输 出: 无* 功能描述: 定时器1初始化*****************************************************/VOID TMR1Init(VOID){ PROTECT_REG(/* 使能TMR1时钟源 */ APBCLK |= TMR1_CLKEN;/* 选择TMR1时钟源为外部晶振12MHz */ CLKSEL1 = (CLKSEL1 & (~TM1_CLK)) | TM1_12M; /* 复位TMR1 */IPRSTC2 |= TMR1_RST;IPRSTC2 &= ~TMR1_RST;/* 选择TMR1的工作模式为周期模式*/TCSR1 &= ~TMR_MODE;TCSR1 |= MODE_PERIOD;/* 溢出周期 = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*//* 溢出周期 = (1/12MHz) * (0 + 1) * (12000*5)=5ms */TCSR1 = TCSR1 & 0xFFFFFF00;// 设置预分频值 [0~255]TCMPR1 = 60000; // 设置比较值 [0~16777215]/* 使能TMR1中断 */TCSR1 |= TMR_IE;NVIC_ISER |= TMR1_INT;/* 复位TMR1计数器 */TCSR1 |= CRST;/* 使能TMR1 */TCSR1 |= CEN;)}INT32 main(VOID){ UINT8 buf[10]={0}; UINT16 TimeCnt=0; PROTECT_REG ( PWRCON |= XTL12M_EN;//默认时钟源为外部晶振 while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定 CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//设置外部晶振为系统时钟 ) LS164Init(); //74LS164初始化 LCD1602Init(); //LCD1602初始化 TMR1Init(); //定时器初始化 while(1) { if(__g_bTime1SecEvent) //1s事件发生 { __g_bTime1SecEvent=FALSE; TimeCnt++; itoa(TimeCnt,buf); LCD1602PrintfString(0,LCD1602_LINE1,buf);//LCD1602第1行显示内容 if(__g_bTime1SecCnt==3) //3s事件发生 { __g_bTime1SecCnt=0; LCD1602PrintfString(0,LCD1602_LINE2,"I am SmartM-AX.");//LCD1602第2行显示内容 } } }}/*****************************************函数名称:TMR1_IRQHandler*输 入:无*输 出:无*功 能:定时器1中断服务函数******************************************/VOID TMR1_IRQHandler(VOID){STATIC UINT8 cnt=0;/* 清除TMR1中断标志位 */TISR1 |= TMR_TIF; __g_Timer1IRQEvent=TRUE;//中断事件发生if(++cnt>=200) { cnt=0; //中断计数器清零 __g_bTime1SecEvent=TRUE; //1s事件发生标志位 __g_bTime1SecCnt++; //1s事件计数器 } }