闹钟.docx

上传人:b****7 文档编号:9250819 上传时间:2023-02-03 格式:DOCX 页数:17 大小:591.87KB
下载 相关 举报
闹钟.docx_第1页
第1页 / 共17页
闹钟.docx_第2页
第2页 / 共17页
闹钟.docx_第3页
第3页 / 共17页
闹钟.docx_第4页
第4页 / 共17页
闹钟.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

闹钟.docx

《闹钟.docx》由会员分享,可在线阅读,更多相关《闹钟.docx(17页珍藏版)》请在冰豆网上搜索。

闹钟.docx

闹钟

微机原理实验报告

 

实验名称:

闹钟实验

院系:

物理与机电工程学院

专业班级:

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);

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1