实验报告4万年历综合实验.docx
《实验报告4万年历综合实验.docx》由会员分享,可在线阅读,更多相关《实验报告4万年历综合实验.docx(27页珍藏版)》请在冰豆网上搜索。
实验报告4万年历综合实验
实验报告
班级学号姓名同组人
实验日期室温大气压成绩
实验题目:
万年历综合实验
一、实验目的:
本实验主要目的是通过解决一些实际问题,巩固和加深“微机原理与接口技术”课程中所学的理论知识和实践能力,基本掌握计算机接口应用电路的一般设计方法,提高电子电路的设计和实践能力,加深对计算机软硬件知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。
通过课本现有程序改写编程,实现时钟设有整点音乐报时,半点数码管显示,每隔30秒流水灯提醒,还可以随时手动按键使其响音乐来作为警报或人为约定的提示等功能。
同时还可以用定时器来设定一次跳动的时间,为实际生活所服务。
二、实验仪器:
微型电子计算机(含软件H-JTAGV0.3.1和ADSv1_2)、EasyARM2131开发板。
三、硬件电路设计及其描述
3.1、复位电路
由于ARM芯片的高速、低功耗、低工作电压导致其噪声容限低,对电源的纹波、瞬态响应性能、时钟源的稳定性、电源监控可靠性等诸多方面也提出了更高的要求。
本开发板的复位电路使用了带I2C存储器的电源监控芯片CAT1025JI-30,提高系统的可靠性,电路原理
如图1.4所示。
在图1.4中,信号nRST连接到LPC2131芯片的复位脚RESET,当复位按键RST按下时,CAT1025JI-30的RESET引脚立即输出复位信号,使LPC2131芯片复位。
注意,使用CAT1025JI-30芯片时,其RESET引脚上的下拉电阻、RESET引脚上的上拉电阻都是不能省略的。
3.2、系统时钟电路
LPC2100系列ARM7微控制器可使用外部晶振或外部时钟源,内部PLL电路可调整系统时钟,使系统运行速度更快(CPU最大操作时钟为60MHz)。
倘若不使用片内PLL功能及ISP下载功能,则外部晶振频率范围是1MHz~30MHz,外部时钟频率范围是1MHz~
50MHz;若使用了片内PLL功能或ISP下载功能,则外部晶振频率范围是10MHz~25MHz,外部时钟频率范围是10MHz~25MHz。
EasyARM2131开发板使用了外部11.0592MHz晶振,电路如图1.5所示。
用11.0592MHz晶振的原因是使串口波特率更精确,同时能够支持LPC2131微控制器芯片内部PLL功能及ISP功能。
3.3、键盘电路
EasyARM2131开发板具有6个独立按键,分别为KEY1~KEY6,如图1.8所示。
由于P0口作为输入时,内部无上拉电阻,所以要使用R28~R33等6个上拉电阻,当没有按键时,口线值为1,当按键按下时为0;其中,KEY1、KEY5所连接的口线为P0.16、P0.20,这两个口分别与外部中断EINT0、EINT3复用,所以可用这两个按键进行外部中断的实验、唤醒掉电CPU的实验。
KEY2、KEY3、KEY4和KEY6所连的口线为P0.17、P0.18、P0.19、P0.21,可用作定时器的捕获输入。
键盘电路通过JP8跳线器来选择连接。
3.4、LED显示电路
在显示方面,EasyARM2131开发板采用了一片74HC595驱动一位静态共阳LED数码管,如图1.9所示,其时钟(SCK)、数据(SI)分别接到LPC2131的SPI接口的SCLK0、MOSI0,这样就可以发送数据到74HC595;片选(RCK,即74HC595输出触发端)与P0.29口连接,由P0.29控制74HC595数据锁存输出;而最高位输出(SQH)连接到LPC2131的SPI接口的MISO0,可用来读回数据。
这样连接就可以进行SPI接口控制实验,并能把74HC595的移位输出读回来(由MISO0读回)。
这一部份电路通过JP10跳线器来选择连接。
在使用硬件SPI接口主方式时,要把SPI0/1的4个I/O口均设置为SPI功能,如P0.4、P0.5、P0.6、P0.7,而且SSEL0/1引脚不能为低电平,一般要接一个10KΩ的上拉电阻。
另外,EasyARM2131开发板还具有8个独立的发光二极LED1~LED9,由P1.18~P1.25输出控制,输出1时对应的LED熄灭,输出0时对应的LED点亮,电路如图1.10所示。
这一部份电路通过JP12跳线器来选择连接。
电路采用了I/O口灌电流的驱动方式来驱动LED,这样做主要是因为I/O口能提供的灌电流大于其拉电流,保证了LED的显示亮度。
3.5、蜂鸣器控制电路
如图1.11所示,蜂鸣器使用PNP三极管Q1进行驱动控制,当P0.7控制电平输出0时,Q1导通,蜂鸣器蜂鸣;当P0.7控制电平输出1时,Q1截止,蜂鸣器停止蜂鸣;若把JP6选择断开连接,Q1截止,蜂鸣器停止蜂鸣。
Q1采用开关三极管8550,其主要特点是放大倍数高hFE=300,最大集电极电流ICM=1500mA,特征频率fT=100MHz。
由于P0.7口与SPI部件的SSEL0复用,所以此管脚上接一上拉电阻R22,防止在使用硬件SPI总线时由于SSEL0引脚悬空导致SPI操作出错。
3.6实时时钟
3.6.1概述
实时时钟(RTC,RealTimeClock)提供一套计数器在系统上电和关闭操作时对时间进行测量,RTC消耗的功率非常低。
LPC2131的RTC时钟可由独立的32.768KHz振荡器或基于VPB时钟的可编程预分频器来提供。
另外,RTC还具有专用的电源管脚Vbat,可连接到电池或其它器件使用的相同的3.3V电压上。
要使RTC中断能够唤醒掉电的CPU,必须选择外部时钟源。
3.6.2特性
1、测量保持日历或时钟的时间通路;
2、超低功耗设计,支持电池供电系统;
3、提供秒、分、小时、日、月、年和星期;
4、指定的32KHz振荡器或可编程VPB时钟预分频器;
5、专用电源管脚可与电池或3.3V的电压相连
3.6.3结构
RTC功能结构如图4.116所示。
3.6.4寄存器描述
RTC包含了许多寄存器,按照功能分成混合寄存器、时间寄存器、时间计数器、报警寄存器和预分频器几组,见表4.76。
3.7、PWM脉宽调制器
3.7.1概述
LPC2131的脉宽调制器(PWM,PulseWidthModulator)建立在标准定时器0/1之上。
应用可在PWM和匹配功能当中进行选择。
PWM基于标准的定时器模块并具有其所有特性。
不过LPC2131只将其PWM功能输出到管脚。
定时器对外设时钟(pclk)进行计数,可选择产生中断或基于7个匹配寄存器,在到达指定的定时值时执行其它动作(设置为高/低电平、翻转或者无动作)。
它还包括4个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择在事件发生时产生中断。
PWM功能是一个附加特性,建立在匹配寄存器事件基础之上。
可独立控制上升沿和下降沿的位置,这样使PWM可以应用于更多的领域。
例如,多相位电机控制通常需要3个非重叠的PWM输出,而这3个输出的脉宽和位置需要独立进行控
制。
两个匹配寄存器可用控制单边沿PWM输出。
PWMMR0控制PWM周期率,另一个匹配寄存器(PWMMR1~PWMMR6)控制PWM边沿的位置。
每个额外的单边沿PWM输出只需要一个匹配寄存器,因为所有PWM输出的重复率速率是相同的。
多个单边沿控制PWM输出在每个PWM周期的开始,当PWMMR0发生匹配时,都有一个上升沿。
3个匹配寄存器共同控制一个双边沿PWM输出。
PWMMR0控制PWM周期速率,其它匹配寄存器控制(PWMMR1~PWMMR6)两个PWM边沿位置。
每个额外的双边沿PWM输出只需要两个匹配寄存器,因为所有PWM输出的重复率速率是相同的。
使用双边沿控制PWM输出时,指定的匹配寄存器控制输出的上升和下降沿。
这样就产生了正脉冲(当上升沿先于下降沿时)和负脉冲(当下降沿先于上升沿时)。
3.7.2特性
1、7个匹配寄存器,可实现6个单边沿控制或3个双边沿控制PWM输出,或这两种类型的混合输出:
-连续操作,可选择在匹配时产生中断;
-匹配时停止定时器,可选择产生中断;
-匹配时复位定时器,可选择产生中断。
2、每个匹配寄存器对应一个外部输出,具有下列特性:
-匹配时设置为低电平;
-匹配时设置为高电平;
-匹配时翻转;
-匹配时无动作。
3、支持单边沿控制和/或双边沿控制的PWM输出。
单边沿控制PWM输出在每个周期开始时总是为高电平,除非输出保持恒定低电平。
双边沿控制PWM输出可在一个周期内的任何位置产生边沿。
这样可同时产生正和负脉冲。
4、脉冲周期和宽度可以是任何的定时器计数值。
这样可实现灵活的分辨率和重复速率的设定。
所有PWM输出都以相同的重复率发生。
5、双边沿控制的PWM输出可编程为正脉冲或负脉冲。
6、匹配寄存器更新与脉冲输出同步,防止产生错误的脉冲。
软件必须在新的匹配值生效之前将它们释放。
7、如果不使能PWM模式,可作为一个标准定时器。
8、带可编程32位预分频器的32位定时器/计数器。
9、当输入信号跳变时4个捕获寄存器可取得定时器的瞬时值,也可选择使捕获事件产生中断。
3.7.3PWM的方框图
图4.100所示为PWM的方框图。
在标准定时器模块上增加的部分位于图的右边和顶端。
图4.100的PWM输出逻辑允许通过PWMSELn(在PWM控制寄存器PWMPCR中)位选择单边沿或者双边沿控制的PWM输出。
3.8、SPI接口
3.8.1概述
LPC2131具有一个硬件SPI(SPI,SerialPeripheralInterface)接口,它是一个同步、全双工串行接口,最大数据位速率为时钟速率的1/8,可以配置为主机或者从机。
在同一总线上可以有多个主机或者从机,但同一时刻只能有一个主机和一个从机能够进行通信,在一次数据传输过程中,主机向从机发送一字节数据,从机也向主机返回一字节数据。
SPI可应用于:
串行存储器,如DataFlash、三线EEPROM等;串行外设,如ADC、DAC、LCD控制器、CAN控制器、传感器等;外部协处理器。
3.8.2特性
1、两个完全独立的SPI控制器;遵循串行外设接口(SPI)规范;
2、同步、串行、全双工通信;组合的SPI主机和从机;
3、最大数据位速率为输入时钟速率的1/8。
3.8.3结构
SPI0接口中的SPI方框图见图4.47。
3.9.1概述
LPC2131具有2个32位可编程定时/计数器,均具有4路捕获、4比较路匹配并输出电
路。
定时器对外设时钟(pclk)周期进行计数,可选择产生中断或根据4个匹配寄存器的设
定,在到达指定的定时值时执行其它动作(输出高/低电平、翻转或者无动作)。
它还包括4
个捕获输入,用于在输入信号发生跳变时捕获定时器值,并可选择产生中断。
可用于对内部事件进行计数的间隔定时器,或者通过捕获输入实现脉宽调制,亦可作为
自由运行的定时器。
定时器0和定时器1除了外设基地址以外,其它都相同。
3.9.2特性
带可编程32位预分频器的32位定时器/计数器;
具有多达4路32位的捕获通道-当输入信号跳变时可取得定时器的瞬时值,也可
3.9.3结构
定时器0和定时器1的方框图,见图4.85。
4.1程序概述
此程序是多功能万年历,具有以下功能:
1、利用实时时钟显示时间,利用定时器的功能使其两秒钟跳动一次;
2、进行整点报时:
到了整点时用PWM音乐输出来报点;
3、SPI设置:
当到了半点时数码管显示LPC2131来提醒人们;
4、当时间到了30秒时流水灯闪烁;
5、按键设置:
当按下按键1时PWM音乐输出响应。
4.2程序流程图
五、程序清单
/****************************************************************
**功能:
运行RTC进行计时,将时间值通过串口向上位机发送。
**上位机使用EasyARM软件,在仿真的万年历显示器显示结果。
**说明:
通讯波特率115200,8位数据位,1位停止位,无校验。
****************************************************************/
#include"config.h"
#include"music.h"
/*歌曲曲谱-虹彩妹妹*/
constuint32HCMM[]=
{_LA,_SO,_MI,_LA,_SO,_MI,
_LA,_LA,_SO,_LA,
_LA,_SO,_MI,_LA,_SO,_MI,
_RE,_RE,_DO,_RE,
_MI,_MI,_SO,_LA,_DO1,_LA,_SO,
_MI,_MI,_SO,_DO,
_MI,_MI,_MI,_MI,_MI,
_1LA,_1LA,_1SO,_1LA,};
/*歌曲节拍*/
constuint32HCMM_L[]=
{_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_4,_8,_8,
_8,_4,_8,_2,
_4,_8,_8,_8,_8,_8,_8,
_8,_4,_8,_2,
_4,_4,_4,_8,_8,
_8,_4,_8,_2,};
typedefstructUartMode
{
uint8datab;//字长度5/6/7/8
uint8stopb;//停止位1/2
uint8parity;//奇偶校验0-无校验,1-奇校验,2-偶校验
}UARTMODE;
#defineBEEP1<<7//P0.7控制蜂鸣器
#defineHC595_CS(1<<29)//P0.29口为74HC595的片选
constuint32LEDS8=(0xFF<<18);//P1[25:
18]控制LED8~LED1,低电平点亮
constuint32KEY1=1<<16;//P0.16连接KEY1
constuint32KEY2=1<<17;
constuint32KEY4=1<<19;
/********************************************************************函数名称:
Delay
**功能描述:
软件延时函数
****************************************************************/
voidDelay(uint8dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<0x7FFFF;i++);
}
/*
*******************************************************************函数名称:
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]);
}
/******************************************************************函数名称:
MSPI_Init()
**函数功能:
初始化SPI接口,设置为主机。
**入口参数:
无
**出口参数:
无
****************************************************************/
voidMSPI_Init(void)
{
//PINSEL0=(PINSEL0&0xFFFF00FF)|0x00005500;//设置管脚连接SPI
PINSEL0=(PINSEL0&(~(0xFF<<8)))|(0x55<<8);
SPCCR=0x52;//设置SPI时钟分频
SPCR=(0<<3)|//CPHA=0,数据在SCK的第一个时钟沿采样
(1<<4)|//CPOL=1,SCK为低有效
(1<<5)|//MSTR=1,SPI处于主模式
(0<<6)|//LSBF=0,SPI数据传输MSB(位7)在先
(0<<7);//SPIE=0,SPI中断被禁止
}
/******************************************************************函数