多功能电子时钟.doc_第1页
多功能电子时钟.doc_第2页
多功能电子时钟.doc_第3页
多功能电子时钟.doc_第4页
多功能电子时钟.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式课程设计报告摘要随着科学技术的不断发展,电子时钟已经成为一种普遍的工艺了。日常生活中到处可见。电子时钟的设计有很多种,普遍的电子时钟是基于单片机用汇编语言做成的扩展。arm功能也一样且更精确。本文是详细介绍基于arm上做成的电子时钟。这个电子时钟的硬件是用lpc2103板, 8个按键和8个数码管组成的键盘显示板,还有led灯当成闹铃使用。此时钟还可以当成秒表使用。这是一个基于arm实现多功能的电子时钟。关键词:arm;数码显示管;按键;led灯;目 录前言 3第一章 概述 41.1 电子时钟概述 4第二章工作原理 52.1系统框图 52.2时钟的工作原理与功能 5第三章硬件电路设计 63.1键盘显示板的电路设计 63.12数码管的电路设计 83.12键盘电路设计 83.14蜂鸣器电路的设计 83.15lpc2103的电路设计 9第四章软件设计 114.1软件设计 11第五章调试过程 185.1调试过程 185.2 总结 18附录 18参考文献 20谢辞 20前言时钟是人们生活中必不可少的一种工具,更是更是在人类生产,生活,学习等多个领域得到广泛的应用。然而随着时间的推移,尤其是在现在科技的发达,生活水平高,什么都讲究效率的年代。人们不仅对时钟的精度要求高,而且对时钟的功能的要求也越来越多。时钟已不仅仅是一种用来显示时间的工具,而是在很多实际应用中它还需要能够实更多的其他功能。比如日历显示功能,秒表功能,闹钟功能,温度或湿度的测量电压测量等。时钟数字化给人们的生活带来了极大的方便,而且也大大地扩展了钟表原先的保湿功能。诸如定时自动报警,按时自动闹铃,定时广播,各种定时电气的自动启用等。这些功能都是一钟表数字化为基础的。可以说设计多功能数字时钟的意义已不不只在于数字时钟本身,更大的意义在于多功能数字时钟在许多实时控制系统中的应用。在很多实际应用中,只要对数字时钟的程序和硬件电路加以一定的修改,便可以得到实施控制的实用系统,从而应用到实际工作与生产中去。因此,研究数字时钟及扩大其应用,有着非常现实的意义。怎样让时钟更好的为我们服务?怎样让时钟更符合实际应用的需求?这就要求人们不断设计出新型时钟,不断设计出适合实际应用的多功能时钟。本设计方案正是根据以上所述并结合日常生活中对时钟功能需求的分析,运用arm编写技术,设计出一个适合日常生活需要的多功能数字时钟。此多功能数字时钟除了传统的显示时间功能之外还有日历功能以及秒表及定时闹钟功能。第一章概述1.1 电子时钟概述加入世贸组织以后,中国会面临激烈的竞争。这种竞争将是一场技实力、管理水平和人才素质的较量,风险和机遇共存。于是我们在学习arm基础上,要会做成多功能的时钟。电子时钟是要用硬件和软件组成。现在设计的电子时钟的硬件由lpc2103,键盘显示板和蜂鸣器组成,软件由基于arm编写程序。lpc2103是一个基于支持实时仿真的16/32位arm7 tdmi-s cpu的微控制器,并带有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 口控制q20q27 来实现 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-28排针hdr1x51电容capr2.5-51电容cc2012-08051电阻axlal9数码管874hc1642图3.12键盘显示板部件清单 图3.133.12数码管的电路设计 数码管又叫led数码管。led是发光二极管的缩写。一个led数码管是由8个发光二极管构成的。每一个发光二极管的阳极都接一个电阻到外部引脚上。用阴极做公共端,连接在一起接地。如图3.14。器件表格如3.15图3.14图3.16名称数量备注发光二极管64组成8个8段数码管表3,15数码管的器件3.13键盘电路设计键盘显示板上总共使用了8个独立按键。独立按键是每个按键都有一个信号线与机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。按键相互独立的接通一条输入数据线,每个键的工作不会影响其它的i/0口,如图3.153.14蜂鸣器电路的设计该蜂鸣器是一个无源蜂鸣器,要使用pwm驱动。它是由一个1k的电阻,pnp三极管和蜂鸣器组成了蜂鸣器电路。如图3.16,实图3.17,图3.18器件表。图3.16蜂鸣器电路图 图3.17 蜂鸣器实图名称数量备注排针1引脚连接三极管1npn型plc21031主板鸣蜂器1当成闹钟精密电阻1k*1(%1)10k*1(%1)万用表部分tl431部分图3.18蜂鸣器部件3.15lpc2103的电路设计一:lpc2103 特性 16/32 位 arm7 tdmi-s微控制器,超小 lqfp48 封装; 8kb 的片内静态 ram 和 32kb 的片内 flash 程序存储器。128 位宽度接口/加速器可实现高达 70 mhz 工作频率; 通过片内 boot 装载程序实现在系统/在应用编程(isp/iap)。单个flash 扇区或整片擦除时100ms,256字节编程时间为1ms; 嵌入式 ice rt 通过片内 realmonitor软件提供实时调试; 10位a/d转换器提供8路模拟输入(每个通道的转换时间低至 2.44us),以及特定的结果寄存器来最大限度地减少中断开销; 2个32位定时器/外部事件计数器(带7路捕获和7路比较通道); 16位定时器/外部事件计数器(带 3 路捕获和 7 路比较通道); 低功耗实时时钟(rtc)具有独立的电源和特定32khz时钟输入; 多个串行接口,包括2个uart(16c550协议标准)、2个高速12c总线(400 kbit/s)、spi和具有缓冲作用和数据长度可变功能的 ssp; 向量中断控制器(vic),可配置优先级和向量地址; 多达 32 个通用 i/o口(可承受 5v电压); 多达 13 个边沿、电平触发的外部中断管脚; 通过一个可编程的片内 pll(100us 的设置时间)可实现最大为 70mhz 的cpu操。作频率,其具有 10mhz25mhz 的输入频率; 片内集成振荡器与外部晶体的操作频率范围为 125mhz; 低功耗模式包括空闲模式、带 rtc的睡眠模式和掉电模式; 可通过个别使能/禁止外围功能和外围时钟分频来优化额外功耗; 通过外部中断或 rtc 将处理器从掉电模式中唤醒。二引脚的功能如表3.19pinsel0引脚名称00 01 10 11 复位值9:8p0.4gpio p0.4sck0(spi0)cap0.1(定时器0)保留 00 11:10p0.5gpio p0.5miso0(spi0)mat0.1(定时器0)保留 00 13:12p0.6gpio p0.6mosi0(spi0)cap0.2(定时器0) 保留 00 图表3.19lpc2103的引脚功能图3.20芯片及其引脚说明第四章软件设计4.1软件设计系统通过ads1.2软件平台把十六进制转换二进制主要是实现四个功能,一是显示时间,二是显示日历,三是实现秒表,四是定时闹铃。把系统分为了主程序、中断服务程序、发送程序、延时程序、等几个部分,再逐个编写,单独调试通过。程序如下:#include config.h#define led 117uint8 t0flag = 0;uint8 stop = 1;/秒表uint8 director=1;/加减方向uint8 h=0,m=0;/定时uint32 msecond=0;uint32 hour=1,minute=4,second=45;uint32 minute1=0,second1=0;uint32 year=11,month=1,date=10,date1=0;/数码管显示的数据 uint8 selectable8 = 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;/送位码uint8 digitable10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /送段码uint32 data8;uint32 key = 1 0; j -) for(k = 50;k 0; k -);void time0_initext() t0tc = 0; /设置计时器初始值为0 t0pr = 0; /预分频器不分频 t0mcr = 0x03; /当t0mr0与tc值发生匹配时,将使tc复位,并产生中断标志 t0mr0 = fpclk/400; /设置定时器的时间为2.5毫秒 t0tcr = 0x01; /启动定时器/* 函数名称:void _irq irq_time0()* 功能描述:定时器timer0中断服务程序,这个中断的作用就是为了计时* 入口参数:无* 出口参数:无*/void _irq irq_timer0(void) t0flag = 1; /定时器中断处理,即中断标志 t0ir = 0x01; /清除中断标志 vicvectaddr = 0x00; /通知vic中断处理结束,清零表示为下一次中断做准备/* 函数名称:void irq_init()* 功能描述:设置定时器timr0中断irq* 入口参数:无* 出口参数:无*/void irq_init() vicintselect = 0x00; /所有中断分配为irq中断 vicvectcntl0 = 0x20 | 0x04; /设置定时器中断分配为向量irq通道0,即其具有最高优先级 vicvectaddr0 = (uint32)irq_timer0; /向量irq通道0的中断服务程序地址为irq_timer0,当产生中断时 /就到地址为irq_timer0这个地点执行程序,即执行函数irq_timer0 vicintenable = (1 4); /定时器中断使能/* 函数名称:void convbit()* 功能描述:/给全局变量数组data8赋值* 入口参数:无* 出口参数:无*/void convbit0(void) data0 = second % 10; /个位 data1 = second / 10; /十位 data2 = 11; /百位 data3 = minute % 10; /千位 data4 = minute / 10; /万位 data5 = 11; /十万位 data6 = hour % 10; /百万位 data7 = hour / 10; /千万位void convbit1(void) data0 = date % 10; /个位 data1 = date / 10; /十位 data2 = 11; /百位 data3 = month % 10; /千位 data4 = month / 10; /万位 data5 = 11; /十万位 data6 = year % 10; /百万位 data7 = year / 10; /千万位void convbit2(void) data0 = msecond % 10; /个位 data1 = msecond / 10; /十位 data2 = 11; /百位 data3 = second1 % 10; /千位 data4 = second1 / 10; /万位 data5 = 11; /十万位 data6 = minute1 % 10; /百万位 data7 = minute1 / 10; /千万位void convbit3(void) data0 =0; /个位 data1 =0; /十位 data2 = 11; /百位 data3 = m % 10; /千位 data4 = m / 10; /万位 data5 = 11; /十万位 data6 = h%10; /百万位 data7 = h/10; /千万位/* 函数名称:void mspi_init()* 功能描述:初始化spi接口,并设置为主机* 入口参数:无* 出口参数:无*/void mspi_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中断使能/* 函数名称:void msenddata(uint8 data)* 功能描述:向spi总线发送数据,即发送位码和段码* 入口参数:data表示需要发送的数据* 出口参数:*/void msenddata(uint8 data) spi_spdr = data; /发送数据 while(spi_spsr & 0x80) = 0); /等待spif置位(当spsr状态寄存器的第七位(功能为spif)置位, /表示一次spi数据传输完毕,即等待数据发送完毕/* 函数名称:int main (void)* 功能描述:实现数据的显示* 入口参数:无 * 出口参数:无*/int main (void) / add user source code uint32 i = 0,function=0; /定义i初始值为0,i表示的是所显示的数据在数码管的第几位,显示一位后,执行i+;使i加1/这样就显示下一位数,直到第八位,也就是i等于8时,给i赋值为0,这样就可循环显示数据 uint32 w = 0,ms=0; uint8 tk = 0x09; uint8 h1=0,m1=0; pinsel0 = (0x01 gpio (0x01 =100) msecond=0;second1+; if(second1=60) second1=0;minute1+; / switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12:date1=31; break; case 2:date1=28; break; case 4: case 6: case 9: case 11:date1;/ if(ms=100) ms=0; second+; if(second=60) second=0;minute+; if(minute=60) minute=0;hour+; if(hour=24) hour=0;date+; if(datedate1) date=1;month+; if(month12) month=1;year+; w +; / w 自加2.5毫秒 / if(io0pin & key) != 0) /按键处理初始化 uint8 tk = 0x09; if(tk = i) switch(tk) case 1:function=(function+1)%4; break; case 2:if(function=0) if(director=1) minute+; else if(minute0) minute-; else minute=59; if(function=3)m=(m+1)%60; break; case 3:if(function=0) if(director=1) hour+; else if(hour0) hour-; else hour=23; if(function=3) h=(h+1)%23; break; case 4:if(function=1) if(director=1)date+; else if(date1) date-; else date=date1; if(function=3) h1=h;m1=m; break; case 5:if(function=1) if(director=1) month+; else if(month1) month-; else month=12; break; case 6:director=(director+1)%2; break; case 7:if(function=2) stop=(stop+1)%2; break; case0:if(function=2)msecond=0;second1=0;minute1=0; tk = 0x09; else if(io0pin & key) = 0) delay(100); if(io0pin & key) = 0) tk = i; / if(hour=h1 & minute=m1 & second=0) ioclr |=led; else ioset |=led; / if(datai=11) msenddata(0x40); else msenddata(digitabledatai); /发送段码 msenddata(selectablei); /发送位码 i +; / i 自加 ,即显示第 i (即数码管上的第 i 位数字) 位数字 if(i 7) /如果第八位数字显示完毕,则再重新显示第一位数字,如此循环 i = 0; /重新在数码管上显示第 1 位数字 / return 0;第五章调试过程5.1调试过程调试是一个很重要的过程,也是一个很艰巨的任务,经常遇到很多意想不的错误。比如说,1:对中断还不够熟悉。2:对led数码管认识不够等。由于这次的设计使用的是lpc2103的开发板,所以在硬件上不需要太多的去调试。在利用开发板硬件资源的基础上,由于这次的多功能闹钟设计使用的模块较多,基本上各个模块的调试是分开进行的。主要包括初始化的程序调试、按键子程序调试、led显示调试这几部分子程序的调试。将这三部分调试成功,那么整个设计的软件部分也就基本完成了。在该课程设计中,采用的集成开发环境是ads1.2,在软件设计过程中,有时候不小心插入了一个中文的符号(如分号),就会使软件编译不通过,开始在这个错误上浪费不少

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论