闹钟.docx
《闹钟.docx》由会员分享,可在线阅读,更多相关《闹钟.docx(17页珍藏版)》请在冰豆网上搜索。
闹钟
微机原理实验报告
实验名称:
闹钟实验
院系:
物理与机电工程学院
专业班级:
08电子信息工程
学号:
2008041522
学生姓名:
刘月梅
指导教师:
涂二生
完成时间:
报告成绩:
评阅意见:
评阅教师日期
闹钟实验
一、实验目的
1、掌握实时时钟RTC的基本特性和功能;
2、掌握定时器0(中断方式)的使用方法和功能特性;
3、运用两者的功能及GPIO形成闹钟的功能,定时报鸣;
4、熟悉LPC2131内部器件的功能,锻炼自己设计和创造的能力;
二、实验器材
计算机一台,EasyARM2131开发板,AXD仿真软件
三、实验内容
设计并在LPC2131开发板上实现闹钟的功能。
四、实验原理
3、定时器概述
特性:
续上表
5、实时时钟:
1、概述:
2、特性:
3、RTC功能结构图如下所示:
4、使用RTC注意事项
5、万年历显示流程图:
6、电脑上显示的类似结果:
五、实验结果:
经过实验程序的设计,实现了预期的结果,当程序运行时电脑上显示具体的时间(年、月、日等一直到秒),当时间到达预设的时间即闹钟的时间时,蜂鸣器将会报鸣提示(连续响十下后停止报鸣),同时LED1将会闪烁。
闹钟的时间可以根据需要进行修改,报鸣的时间也可以根据需要修改。
六、实验心得
通过这次实验,懂得了实时时钟RTC的用法,并且懂得如何运用所学的知识对程序进行修改,将学到的知识运用到实际中,设计并实现了闹钟的功能,锻炼的自己的创新和应用的能力,能更加熟练的运用所学的知识。
附录:
程序代码:
#include"config.h"
#defineBEEP1<<7/*P0.7控制BEEP,低电平蜂鸣*/
constuint32LED1=(1<<18);
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
for(i=0;i<5000;i++);
}
//定义串口模式设置的数据结构
typedefstructUartMode
{
uint8datab;//字长度5/6/7/8
uint8stopb;//停止位1/2
uint8parity;//奇偶校验0-无校验,1-奇校验,2-偶校验
}UARTMODE;
void__irqIRQ_Timer0(void)
{
if((HOUR==12)&(MIN==0))
IO1CLR=LED1;/*关闭BEEP*/
DelayNS(40);
IO1SET=LED1;
DelayNS(40);
T0IR=0x01;/*清除中断标志*/
VICVectAddr=0x00;/*通知VIC中断处理结束*/
}
/*
*******************************************************************************************************
**函数名称:
UART0_Init()
**函数功能:
初始化串口:
设置工作模式和波特率。
**入口参数:
baud波特率
**set模式设置(UARTMODE数据结构)
**出口参数:
返回1表示成功,0表示参数出错。
*******************************************************************************************************
*/
uint8UART0_Init(uint32baud,UARTMODEset)
{
uint32bak;
//参数过滤
if((0==baud)||(baud>115200))return(0);
if((set.datab<5)||(set.datab>8))return(0);
if((0==set.stopb)||(set.stopb>2))return(0);
if(set.parity>4)return(0);
//设置串口波特率
U0LCR=0x80;//DLAB=1
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
//设置串口模式
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!
=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U0LCR=bak;
return(0);
}
/*
*******************************************************************************************************
**函数名称:
SendByte()
**函数功能:
向串口UART0发送字节数据,并等待发送完毕。
**入口参数:
data要发送的数据
**出口参数:
无
*******************************************************************************************************
*/
voidSendByte(uint8data)
{
U0THR=data;
while((U0LSR&0X20)==0);//等待数据发送
}
/*
*******************************************************************************************************
**函数名称:
PC_DispChar()
**函数功能:
向PC机发送显示字符。
**入口参数:
no显示位置
**char显示的字符,不能为ff
**出口参数:
无
*******************************************************************************************************
*/
voidPC_DispChar(uint8no,uint8chr)
{
SendByte(0xff);
SendByte(0x81);
SendByte(no);
SendByte(chr);
SendByte(0x00);
}
uint8constSHOWTABLE[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*
*******************************************************************************************************
**函数名称:
SendTimeRtc()
**函数功能:
读取RTC的时间值,并将读出的时分秒值通过串口送到上位机显示。
**入口参数:
无
**出口参数:
无
*******************************************************************************************************
*/
voidSendTimeRtc(void)
{
uint32datas;
uint32times;
uint32bak;
times=CTIME0;//读取完整的时钟寄存器
datas=CTIME1;
bak=(datas>>16)&0xfff;//获取年
PC_DispChar(0,SHOWTABLE[bak/1000]);
bak=bak%1000;
PC_DispChar(1,SHOWTABLE[bak/100]);
bak=bak%100;
PC_DispChar(2,SHOWTABLE[bak/10]);
PC_DispChar(3,SHOWTABLE[bak%10]);
bak=(datas>>8)&0x0f;//获取月
PC_DispChar(4,SHOWTABLE[bak/10]);
PC_DispChar(5,SHOWTABLE[bak%10]);
bak=datas&0x1f;//获取日
PC_DispChar(6,SHOWTABLE[bak/10]);
PC_DispChar(7,SHOWTABLE[bak%10]);
bak=(times>>24)&0x07;//获取星期
PC_DispChar(8,SHOWTABLE[bak]);
bak=(times>>16)&0x1f;//获取小时
PC_DispChar(9,SHOWTABLE[bak/10]);
PC_DispChar(10,SHOWTABLE[bak%10]);
bak=(times>>8)&0x3f;//获取分钟
PC_DispChar(11,SHOWTABLE[bak/10]);
PC_DispChar(12,SHOWTABLE[bak%10]);
bak=times&0x3f;//获取秒钟
PC_DispChar(13,SHOWTABLE[bak/10]);
PC_DispChar(14,SHOWTABLE[bak%10]);
}
/*
*******************************************************************************************************
**函数名称:
RTCInit()
**函数功能:
初始化实时时钟
**入口参数:
无
**出口参数:
无
*******************************************************************************************************
*/
voidRTCInit(void)
{
PREINT=Fpclk/32768-1;//设置基准时钟分频器
PREFRAC=Fpclk-(Fpclk/32768)*32768;
CCR=0x00;//禁止时间计数器
YEAR=2010;
MONTH=06;
DOM=03;
DOW=4;
HOUR=11;
MIN=59;
SEC=45;
CIIR=0x01;//设置秒值的增量产生1次中断
CCR=0x01;//启动RTC
}
/*
*******************************************************************************************************
**函数名称:
main()
**函数功能:
读取实时时钟的值,通过串口发送出去。
*******************************************************************************************************
*/
intmain(void)
{uint8i;
UARTMODEuart0_set;
PINSEL0=0x00000005;//连接IO到UART0
PINSEL1=0x00000000;
PINSEL2=PINSEL2&(~0x08);
IO0DIR=BEEP;
IO1DIR=LED1;
uart0_set.datab=8;
uart0_set.stopb=1;
uart0_set.parity=0;
UART0_Init(115200,uart0_set);
U0FCR=0x01;//FIFO使能
IRQEnable();/*IRQ中断使能*/
/*定时器0初始化*/
T0TC=0;/*定时器设置为0*/
T0PR=0;/*时钟不分频*/
T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断*/
T0MR0=Fpclk;/*0.5秒钟定时*/
T0TCR=0x01;/*启动定时器*/
/*设置定时器0中断IRQ*/
VICIntSelect=0x00;/*所有中断通道设置为IRQ中断*/
VICVectCntl0=0x20|0x04;/*设置定时器0中断通道分配最高优先级*/
VICVectAddr0=(uint32)IRQ_Timer0;/*设置中断服务程序地址*/
VICIntEnable=1<<0x04;/*使能定时器0中断*/
RTCInit();
while
(1)
{
while(0==(ILR&0x01));//等待RTC增量中断
ILR=0x01;//清除中断标志
SendTimeRtc();
if(((HOUR==12)&(MIN==0)&(SEC<=9)))
{
IO0SET=BEEP;
DelayNS(10);
IO0CLR=BEEP;
DelayNS(10);
}
elseIOSET=BEEP;
}
return(0);
}