1、基于 LPC2103 RTC 的定时铃声控制器设计与实现基本功能要求和实现方法:(1) 用 LPC2103 实时时钟 RTC 作为日期、时间定时器,(2) 根据定时器时间,每天 8:00、12:00、 2:30、5:30 四个时间点,分别输出持续时间为 1 分钟的500hz 方波信号(停 3 秒,响 2 秒);(3) 设置三个按键,分别调节设置 RTC 的小时、分钟和秒数值;(4) 铃声方波信号可以用 GPIO/LED 显示;(5) 频率信号产生可用定时器来实现;(6) 时间数值可通过串口打印到电脑超级终端窗口上;详细设计步骤:(1)定义数据结构数据类型:typedef struct _DAY
2、_ int year; /20002099char mon; /112char day; /131char week;/17 t_day;typedef struct _TIME_ char hor; /023char min; /059char sec; /059 t_time;(2)编写简单串行通信函数 void uart_init()和 void uart_puts(char s),向 LPC2103 串行口打印字符串,通信格式设为 9600bps/8b DATA/1b STOP/无效验位/无硬件流控制;(3)编写 LPC2103 实时时钟控制器(RTC)读取函数;入口参数:时间、日期结
3、构指针; 返回值:通过日期时间结构指针返回 RTC 记录的日期时间(4)把日期时间整数数值用 sprintf 函数转化为字符串,并通过 uart_puts()打印到电脑终端上,测试 RTC 时间是否读取正确。(5)编写 LPC2103 实时时钟控制器(RTC)设置函数,通过 GPIO 输入按键信息。入口参数:已初始化了得日期时间结构,把结构指针传递给函数,使实时时钟记录值设置为给定值。(6)用 LPC2103 定时器产生 500hz 方波信号,用事件匹配方法产生;32 计数器与 0 相等时输出高电平;32 计数器与 0x8000 0000 相等时输出低电平,循环往复即可。(7)响 2 秒停 3
4、 秒用允许、禁止计数来实现,时间长短值直接用实时时钟秒数值来设定。以上每一个独立功能的实现都有参考例程,项目的工作就是整合各个功能,使之按我们的要求来协调配合工作。请详细阅读 LPC2103 实验教程中有关部件文档和功能部件的实验参考程序。整合出一个完整应用程序,功能由少到多逐步添加。最终程序如下。已经测试过。 。可以通过课程设计哦。 。江西理工大学的有福了。 。 。#include “config.h“void Timer1Init(void)T1TCR = 0x02; /* 定时器 0 复位 */T1PR = 0; /* 不设时钟分频 */PWM1CON= 0x0C; /* 使能 PWM
5、输出 */T1MCR = 0x02; /* 设置 T0MR0 匹配后复位 T0TC */T1MR0 = Fpclk / 500; /* 设置 PWM 输出的周期 */T1MR2 = (Fpclk / 500)/2; /* 设置 PWM1.2 输出占空比为 50 */typedef struct UartModeuint8 datab; /* 字长度 5/6/7/8 */ uint8 stopb; /* 停止位 1/2 */uint8 parity; /* 奇偶校验 */ UARTMODE;# define UART_BPS 9600 /* 串口通信波特率 */void UARTInit (vo
6、id)uint16 uiFdiv;PINSEL0 = (PINSEL0 /* 串口引脚设置 */U0LCR = 0x83; /* 允许设置波特率 */uiFdiv = (Fpclk / 16) / UART_BPS; /* 设置波特率 */U0DLM = uiFdiv / 256;U0DLL = uiFdiv % 256; U0LCR = 0x03; /* 锁定波特率 */U0FCR = 0x01; /* FIFO 使能 */void UART0SendByte (uint8 uiDat)U0THR = uiDat; /* 写入数据 */while (U0LSR /* 等待数据发送完毕 */v
7、oid UART0SendStr(uint8 *p)while(*p)U0THR = *(p+); /* 写入数据 */while (U0LSR /* 等待数据发送完毕 */struct DATA uint16 year; uint8 mon; uint8 day; uint8 week; ;struct TIME uint8 hor; uint8 min; uint8 sec; ;uint8 Data = “ 2011.01.04 3 10.23.30 r“;unsigned char *RTC_DataGet(struct DATA *d, struct TIME *t)uint8 *p;
8、uint32 uiTimes = 0;uint32 uiDates = 0;uiTimes = CTIME0;uiDates = CTIME1;p= Data;*(p+) = *;d-year = (uiDates 16)*(p+) = (d-year/1000)+0;*(p+) = (d-year%1000)/100+0;*(p+) = (d-year%100)/10+0;*(p+) = d-year%10+0;*(p+) = .;d-mon = (uiDates 8)*(p+) = d-mon/10 + 0;*(p+) = d-mon%10 + 0;*(p+) = .;d-day = ui
9、Dates*(p+) = d-day/10 + 0;*(p+) = d-day%10 + 0;*(p+) = ;d-week = (uiTimes 24)*(p+) = d-week + 0;*(p+) = ;t-hor = (uiTimes 16)*(p+) = t-hor/10 + 0;*(p+) = t-hor%10 + 0;*(p+) = .;t-min = (uiTimes 8)*(p+) = t-min/10 + 0;*(p+) = t-min%10 + 0;*(p+) = .;t-sec = uiTimes*(p+) = t-sec/10 + 0;*(p+) = t-sec%10
10、 + 0;*(p+) = *;*(p+) = ;p = Data;return(p);void RTCInit (uint32 hour,uint32 min,uint32 sec)PREINT = Fpclk / 32768 - 1; /* 设置基准时钟分频器 */PREFRAC = Fpclk - (Fpclk / 32768) * 32768;CCR = 0x00; /* 禁止时间计数器 */YEAR = 2011; /设置具体的时间日期MONTH = 06;DOM = 07;DOW = 5;HOUR = hour;MIN = min;SEC = sec;CIIR = 0x01; /*
11、设置秒值的增量产生 1 次中断 */CCR = 0x01; /* 启动 RTC */# define LED1 1 0; uiDly-)for(i = 0; i 16) /获取当前时间的 小时值min = (CTIME08) /获取当前时间的 分钟值sec = CTIME0 /获取当前时间的 秒值if(hour=8)|(hour=12)i(5*i+2)*(p+) = (d-year/1000)+0;*(p+) = (d-year%1000)/100+0;*(p+) = (d-year%100)/10+0;*(p+) = d-year%10+0;*(p+) = .;d-mon = (uiDate
12、s 8)*(p+) = d-mon/10 + 0;*(p+) = d-mon%10 + 0;*(p+) = .;d-day = uiDates*(p+) = d-day/10 + 0;*(p+) = d-day%10 + 0;*(p+) = ;d-week = (uiTimes 24)*(p+) = d-week + 0;*(p+) = ;t-hor = (uiTimes 16)*(p+) = t-hor/10 + 0;*(p+) = t-hor%10 + 0;*(p+) = .;t-min = (uiTimes 8)*(p+) = t-min/10 + 0;*(p+) = t-min%10
13、+ 0;*(p+) = .;t-sec = uiTimes*(p+) = t-sec/10 + 0;*(p+) = t-sec%10 + 0;*(p+) = *;*(p+) = ;p = Data;return(p);void RTCInit (uint32 hour,uint32 min,uint32 sec)PREINT = Fpclk / 32768 - 1; /* 设置基准时钟分频器 */PREFRAC = Fpclk - (Fpclk / 32768) * 32768;CCR = 0x00; /* 禁止时间计数器 */YEAR = 2011; /设置具体的时间日期MONTH = 06
14、;DOM = 07;DOW = 5;HOUR = hour;MIN = min;SEC = sec;CIIR = 0x01; /* 设置秒值的增量产生 1 次中断 */CCR = 0x01; /* 启动 RTC */# define LED1 1 0; uiDly-)for(i = 0; i (5*i+2) /获取当前时间的 小时值min = (CTIME08) /获取当前时间的 分钟值sec = CTIME0 /获取当前时间的 秒值switch(hour)case 8: if(min=0)Ring(sec);else T0TCR = 0X00; break;case 12: if(min=0|min=30) Ring(sec);else T0TCR = 0X00;break;case 5: if(min=30) Ring(sec);else T0TCR = 0X00;break;default : T0TCR = 0X00;break;switch(IO0PIN/* case 0x0000c000 : /key 1 pressCCR=0X00;