多功能电子时钟.docx
《多功能电子时钟.docx》由会员分享,可在线阅读,更多相关《多功能电子时钟.docx(27页珍藏版)》请在冰豆网上搜索。
多功能电子时钟
摘要
随着科学技术的不断发展,电子时钟已经成为一种普遍的工艺了。
日常生活中到处可见。
电子时钟的设计有很多种,普遍的电子时钟是基于单片机用汇编语言做成的扩展。
ARM功能也一样且更精确。
本文是详细介绍基于ARM上做成的电子时钟。
这个电子时钟的硬件是用LPC2103板,8个按键和8个数码管组成的键盘显示板,还有LED灯当成闹铃使用。
此时钟还可以当成秒表使用。
这是一个基于ARM实现多功能的电子时钟。
关键词:
ARM;数码显示管;按键;LED灯;
前言3
第一章概述4
1.1电子时钟概述4
第二章工作原理5
2.1系统框图5
2.2时钟的工作原理与功能5
第三章硬件电路设计6
3.1键盘显示板的电路设计6
3.12数码管的电路设计8
3.12键盘电路设计8
3.14蜂鸣器电路的设计8
3.15LPC2103的电路设计9
第四章软件设计11
4.1软件设计11
第五章调试过程18
5.1调试过程18
5.2总结18
附录18
参考文献20
谢辞20
前言
时钟是人们生活中必不可少的一种工具,更是更是在人类生产,生活,学习等多个领域得到广泛的应用。
然而随着时间的推移,尤其是在现在科技的发达,生活水平高,什么都讲究效率的年代。
人们不仅对时钟的精度要求高,而且对时钟的功能的要求也越来越多。
时钟已不仅仅是一种用来显示时间的工具,而是在很多实际应用中它还需要能够实更多的其他功能。
比如日历显示功能,秒表功能,闹钟功能,温度或湿度的测量电压测量等。
时钟数字化给人们的生活带来了极大的方便,而且也大大地扩展了钟表原先的保湿功能。
诸如定时自动报警,按时自动闹铃,定时广播,各种定时电气的自动启用等。
这些功能都是一钟表数字化为基础的。
可以说设计多功能数字时钟的意义已不不只在于数字时钟本身,更大的意义在于多功能数字时钟在许多实时控制系统中的应用。
在很多实际应用中,只要对数字时钟的程序和硬件电路加以一定的修改,便可以得到实施控制的实用系统,从而应用到实际工作与生产中去。
因此,研究数字时钟及扩大其应用,有着非常现实的意义。
怎样让时钟更好的为我们服务?
怎样让时钟更符合实际应用的需求?
这就要求人们不断设计出新型时钟,不断设计出适合实际应用的多功能时钟。
本设计方案正是根据以上所述并结合日常生活中对时钟功能需求的分析,运用ARM编写技术,设计出一个适合日常生活需要的多功能数字时钟。
此多功能数字时钟除了传统的显示时间功能之外还有日历功能以及秒表及定时闹钟功能。
第一章概述
1.1电子时钟概述
加入世贸组织以后,中国会面临激烈的竞争。
这种竞争将是一场技实力、管理水平和人才素质的较量,风险和机遇共存。
于是我们在学习ARM基础上,要会做成多功能的时钟。
电子时钟是要用硬件和软件组成。
现在设计的电子时钟的硬件由LPC2103,键盘显示板和蜂鸣器组成,软件由基于ARM编写程序。
LPC2103是一个基于支持实时仿真的16/32位ARM7TDMI-SCPU的微控制器,并带有32kB的嵌入高速Flash存储器,128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。
较小的封装和极低的功耗使LPC2103适用于访问控制器和POS机等小型应用系统中;由于内置了宽范围的串行通信接口(2个UART、SPI、SSP和2个I2C)和8KB的片内SRAM,LPC2103也适合用在通信网关和协议转换器中。
32/16位定时器、增强型10位ADC、定时器输出匹配PWM特性、多达13个边沿、电平触发的外部中断、32条高速GPIO,使得LPC2103微控制器特别适用于工业控制和医疗系统中。
键盘显示板是用按键控制LED数码管的显示。
不同的按键及不同的按键次数已表明不同的功能使数码管显示不同功能。
键盘显示板有5个排针,分别是要来接电源,地,输入数据引脚,检测按键引脚,输入位码和段码的引脚。
蜂鸣器是输入低电平就鸣叫的。
键盘显示板和蜂鸣器都是用LPC2103的CPU控制数据的。
第二章工作原理
2.1系统框图
系统是以LPC2103为核心,由按键向2103输入信号,向LED显示板和蜂鸣器发送信号。
系统的基本工作的框图如图2.1.
图2.1系统框图
2.2时钟的工作原理与功能
用接在电脑上的串口线与电源线接到LPC2103上,并用导线把LPC2103上的P0.4,P0.5,P0。
6与键盘显示板连接。
P0.4引脚为SCK(SPI0)功能P0.5为GPIO的功能。
P0.6引脚设置为MSOI(SPI0)功能还要把LPC2103上P0.16引脚与蜂鸣器连接。
键盘显示板与蜂鸣器各接上电源线和地线。
运行程序时,数据输入,利用74LS164译码器给数码管。
在LPC2103开发系统中,均采用了8位数码管动态扫描显示。
它将所数码管的8个段线相应地并接在一起,并接到LPC2103的P0.4口,由P0.4口控制字段输出。
各位数码管的共阴极由LPC2103的P0.6口控制Q20-Q27来实现8位数码管的位输出控制。
如图2.1这样,对于一组数码管动态扫描显示需要由两组信号来控制:
一组是字段输出口输出的形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选第几位数码管工作,称为位码。
由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。
因此,在同一刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。
若要各数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。
即在某一时刻,只让某位的位选线处于导通状态,而其它各位的位选线处于关闭状态。
同时,段线上输出相应位显示字符的字型码。
这样在同一时刻,只有选通的那一位显示出字符,而其它各位则是熄的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。
图2.12数码管电路图
这个时钟有如下的功能如下一是显示时间,则当开始运行时就会是显示定时的时间。
如果想改变时间了就按下按键KEY2,则是分钟加或减1.如果按下按键KEY3,则是小时加或减1。
当你在按下按键KEY1时则是显示日历,如果按下按键KEY4,则是天数加或减1.如果按下按键KEY5,则是月数加或减1。
如果你再按下按键KEY1则是实现秒表,按下按键KEY7,则是启动秒表,如果再按下按键KEY7就会停止。
如果想要从新开始计时,只要按下按键KEY8,就可以使秒表复位。
如果你再按下按键KEY1,你就可以定时,时间到了蜂鸣器就会响。
当然,你想加或减了,就有你自己决定了。
为了方便,我们把按键KEY6设计成方向键。
它默认为是加1的,当你想减1时,你只要在按一下按键KEY6即可。
第三章硬件电路设计
3.1键盘显示板的电路设计
键盘显示板是由电阻,电容,74LS164,排针,按键,数码管,板组成的。
如图3.1所示是键盘显示板的原理图。
如图3.12是组成键盘显示板的器件。
图3.13是实图。
图3.1键盘显示板原理图
名称
封装
数量
按键
SPST-2
8
排针
HDR1X5
1
电容
CAPR2.5-5
1
电容
CC2012-0805
1
电阻
AXLAL
9
数码管
8
74HC164
2
图3.12键盘显示板部件清单
图3.13
3.12数码管的电路设计
数码管又叫LED数码管。
LED是发光二极管的缩写。
一个LED数码管是由8个发光二极管构成的。
每一个发光二极管的阳极都接一个电阻到外部引脚上。
用阴极做公共端,连接在一起接地。
如图3.14。
器件表格如3.15
图3.14图3.16
名称
数量
备注
发光二极管
64
组成8个8段数码管
表3,15数码管的器件
3.13键盘电路设计
键盘显示板上总共使用了8个独立按键。
独立按键是每个按键都有一个信号线与机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。
按键相互独立的接通一条输入数据线,每个键的工作不会影响其它的I/0口,如图3.15
3.14蜂鸣器电路的设计
该蜂鸣器是一个无源蜂鸣器,要使用PWM驱动。
它是由一个1K的电阻,PNP三极管和蜂鸣器组成了蜂鸣器电路。
如图3.16,实图3.17,图3.18器件表。
图3.16蜂鸣器电路图图3.17蜂鸣器实图
名称
数量
备注
排针
1
引脚连接
三极管
1
NPN型
PLC2103
1
主板
鸣蜂器
1
当成闹钟
精密电阻
1K*1(%1)
10K*1(%1)
万用表部分
TL431部分
图3.18蜂鸣器部件
3.15LPC2103的电路设计
一:
LPC2103特性
16/32位ARM7TDMI-S微控制器,超小LQFP48封装;
8KB的片内静态RAM和32KB的片内Flash程序存储器。
128位宽度接口/加速器可实现高达70MHz工作频率;
通过片内boot装载程序实现在系统/在应用编程(ISP/IAP)。
单个Flash扇区或整片擦除时100ms,256字节编程时间为1ms;
嵌入式ICERT通过片内RealMonitor软件提供实时调试;
10位A/D转换器提供8路模拟输入(每个通道的转换时间低至2.44us),以及特定的结果寄存器来最大限度地减少中断开销;
2个32位定时器/外部事件计数器(带7路捕获和7路比较通道);
16位定时器/外部事件计数器(带3路捕获和7路比较通道);
低功耗实时时钟(RTC)具有独立的电源和特定32KHz时钟输入;
多个串行接口,包括2个UART(16C550协议标准)、2个高速12
C总线(400Kbit/s)、
SPI和具有缓冲作用和数据长度可变功能的SSP;
向量中断控制器(VIC),可配置优先级和向量地址;
多达32个通用I/O口(可承受5V电压);
多达13个边沿、电平触发的外部中断管脚;
通过一个可编程的片内PLL(100us的设置时间)可实现最大为70MHz的CPU操。
作频率,其具有10MHz~25MHz的输入频率;
片内集成振荡器与外部晶体的操作频率范围为1~25MHz;
低功耗模式包括空闲模式、带RTC的睡眠模式和掉电模式;
可通过个别使能/禁止外围功能和外围时钟分频来优化额外功耗;
通过外部中断或RTC将处理器从掉电模式中唤醒。
二引脚的功能如表3.19
PINSEL0
引脚名称
00
01
10
11
复位值
9:
8
P0.4
GPIOP0.4
SCK0(SPI0)
CAP0.1(定时器0)
保留
00
11:
10
P0.5
GPIOP0.5
MISO0(SPI0)
MAT0.1(定时器0)
保留
00
13:
12
P0.6
GPIOP0.6
MOSI0(SPI0)
CAP0.2(定时器0)
保留
00
图表3.19LPC2103的引脚功能
图3.20芯片及其引脚说明
第四章软件设计
4.1软件设计
系统通过ADS1.2软件平台把十六进制转换二进制主要是实现四个功能,一是显示时间,二是显示日历,三是实现秒表,四是定时闹铃。
把系统分为了主程序、中断服务程序、发送程序、延时程序、等几个部分,再逐个编写,单独调试通过。
程序如下:
#include"config.h"
#defineLED1<<17
uint8T0Flag=0;
uint8stop=1;//秒表
uint8director=1;//加减方向
uint8h=0,m=0;//定时
uint32msecond=0;
uint32hour=1,minute=4,second=45;
uint32minute1=0,second1=0;
uint32year=11,month=1,date=10,date1=0;//数码管显示的数据
uint8selectable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//送位码
uint8digitable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//送段码
uint32data[8];
uint32Key=1<<5;
/********************************************************************
**函数名称:
Timer0_InitExt()
**功能描述:
TIMER0初始化
**入口参数:
无
**出口参数:
无
******************************************************************/
voiddelay(intdly){
uint32j,k;
for(j=dly;j>0;j--)
for(k=50;k>0;k--);
}
voidTime0_InitExt(){
T0TC=0;//设置计时器初始值为0
T0PR=0;//预分频器不分频
T0MCR=0x03;//当T0MR0与TC值发生匹配时,将使TC复位,并产生中断标志
T0MR0=Fpclk/400;//设置定时器的时间为2.5毫秒
T0TCR=0x01;//启动定时器
}
/********************************************************************
**函数名称:
void_irqIRQ_Time0()
**功能描述:
定时器timer0中断服务程序,这个中断的作用就是为了计时
**入口参数:
无
**出口参数:
无
*******************************************************************/
void__irqIRQ_Timer0(void){
T0Flag=1;//定时器中断处理,即中断标志
T0IR=0x01;//清除中断标志
VICVectAddr=0x00;//通知VIC中断处理结束,清零表示为下一次中断做准备
}
/********************************************************************
**函数名称:
voidIRQ_Init()
**功能描述:
设置定时器TIMR0中断IRQ
**入口参数:
无
**出口参数:
无
*******************************************************************/
voidIRQ_Init(){
VICIntSelect=0x00;//所有中断分配为IRQ中断
VICVectCntl0=0x20|0x04;//设置定时器中断分配为向量IRQ通道0,即其具有最高优先级
VICVectAddr0=(uint32)IRQ_Timer0;//向量IRQ通道0的中断服务程序地址为IRQ_Timer0,当产生中断时
//就到地址为IRQ_Timer0这个地点执行程序,即执行函数IRQ_Timer0
VICIntEnable=(1<<4);//定时器中断使能
}
/********************************************************************
**函数名称:
voidCONVBIT()
**功能描述:
//给全局变量数组data[8]赋值
**入口参数:
无
**出口参数:
无
*******************************************************************/
voidCONVBIT0(void){
data[0]=second%10;//个位
data[1]=second/10;//十位
data[2]=11;//百位
data[3]=minute%10;//千位
data[4]=minute/10;//万位
data[5]=11;//十万位
data[6]=hour%10;//百万位
data[7]=hour/10;//千万位
}
voidCONVBIT1(void){
data[0]=date%10;//个位
data[1]=date/10;//十位
data[2]=11;//百位
data[3]=month%10;//千位
data[4]=month/10;//万位
data[5]=11;//十万位
data[6]=year%10;//百万位
data[7]=year/10;//千万位
}
voidCONVBIT2(void){
data[0]=msecond%10;//个位
data[1]=msecond/10;//十位
data[2]=11;//百位
data[3]=second1%10;//千位
data[4]=second1/10;//万位
data[5]=11;//十万位
data[6]=minute1%10;//百万位
data[7]=minute1/10;//千万位
}
voidCONVBIT3(void){
data[0]=0;//个位
data[1]=0;//十位
data[2]=11;//百位
data[3]=m%10;//千位
data[4]=m/10;//万位
data[5]=11;//十万位
data[6]=h%10;//百万位
data[7]=h/10;//千万位
}
/********************************************************************
**函数名称:
voidMSPI_Init()
**功能描述:
初始化SPI接口,并设置为主机
**入口参数:
无
**出口参数:
无
*******************************************************************/
voidMSPI_Init(){
SPI_SPCCR=0x52;
SPI_SPCR=(0<<3)|//CPHA=0,数据在SCK的第一个跳变沿(时钟沿)采样。
传输从SSEL信号激活时开始,
//并在SSEL信号无效时结束
(1<<4)|//CPOL=1,时钟为低电平有效
(1<<5)|//设置为主机
(0<<6)|//LSBF=0时,SPI数据据MSB(即最高位(位7))在先
(1<<7);//SPI中断使能
}
/********************************************************************
**函数名称:
voidMSendData(uint8data)
**功能描述:
向SPI总线发送数据,即发送位码和段码
**入口参数:
data表示需要发送的数据
**出口参数:
*******************************************************************/
voidMSendData(uint8data){
SPI_SPDR=data;//发送数据
while((SPI_SPSR&0x80)==0);//等待SPIF置位(当SPSR状态寄存器的第七位(功能为SPIF)置位,
//表示一次SPI数据传输完毕,即等待数据发送完毕
}
/********************************************************************
**函数名称:
intmain(void)
**功能描述:
实现数据的显示
**入口参数:
无
**出口参数:
无
********************************************************************/
intmain(void)
{//addusersourcecode
uint32i=0,function=0;//定义i初始值为0,i表示的是所显示的数据在数码管的第几位,显示一位后,执行i++;使i加1
//这样就显示下一位数,直到第八位,也就是i等于8时,给i赋值为0,这样就可循环显示数据
uint32W=0,ms=0;
uint8Tk=0x09;
uint8h1=0,m1=0;
PINSEL0=(0x01<<8)|//设置p0.4引脚为SCK(SPI0)功能p0.5s->Gpio
(0x01<<12);//将p0.6引脚设置为MSOI(SPI0)功能
PINSEL1=0x00;
IODIR|=LED;
IOSET|=LED;
MSPI_Init();//功能是初始化SPI接口,并设置为主机
Time0_InitExt();//定时器timer0中断服务程序,这个中断的作用就是为了计时
IRQEnable();//IRQ中断使能
IRQ_Init();
while
(1)
{
if(T0Flag)//如果产生中断
{T0Flag=0;//使计时器重新开始计时
while(W==4)//当计时器的值经过了4*2.5毫秒时,将W清零,即重新计时(指W重新计时),
{
W=0;
ms++;
if(function==0)
CONVBIT0();//并将数组CS[]中的数据赋值给数组data[],
elseif(function==1)
CONVBIT1();
elseif(function==2)
CONVBIT2();
elseif(function==3)
CONVBIT3();
if(stop==0)msecond++;
if(msecond>=100)
{msecond=0;second1++;}
if(second1>=60)
{second1=0;minute1++;}
////////////////////////////////////////////////////////////