收藏 分销(赏)

单片机课程设计-基于AT89C52单片机的LED点阵显示电子钟设计.doc

上传人:精*** 文档编号:2226229 上传时间:2024-05-23 格式:DOC 页数:27 大小:769.50KB 下载积分:10 金币
下载 相关 举报
单片机课程设计-基于AT89C52单片机的LED点阵显示电子钟设计.doc_第1页
第1页 / 共27页
单片机课程设计-基于AT89C52单片机的LED点阵显示电子钟设计.doc_第2页
第2页 / 共27页


点击查看更多>>
资源描述
课程名称:单片机课程设计 设计题目: 单片机LED点阵显示电子钟 院 系: 电气工程系 专 业: 电子信息工程 年 级: 2010 级 姓 名: 指导教师: 赵琳 西南交通大学峨眉校区 2013年 月 日 1 绪论 1.1 LED点阵显示电子钟的背景及意义 在日常生活中,大家见到的都是数码管制作的电子钟,LED点阵时钟则不多见。用单片机控制的LED点阵显示电子钟具有结构简单、性能可靠、成本低廉、价格便宜和显示灵活等优点,其应用前景广阔。之所以使用LED点阵电子屏显示,是与它本身所具有的优点分不开的[1]。这些优点概括起来就是:亮度高、工作电压低、功耗小、小型化、寿命长、耐冲击和性能稳定。在实际应用中的显示屏由于成本和可靠性的因素常采用一种动态扫描的显示方法。本文设计的是一个室内用16块8×8点阵时钟显示屏,数字采用静止显示方式。电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟走时更准确、性能更稳定。由于用LED点阵显示数据,在夜晚或黑暗的场合里也可以使用,具有一定的实用性。随着人们生活环境的不断改善和美化,在许多场合都可以看到LED点阵显示电子钟。在城市的主要营业场所、车站、码头等公共场所使用LED数字电子钟已经成为一种时尚[2]。 1.2 设计任务及要求 任务:利用AT89C52单片机结合LED点阵显示器设计一个电子钟。电子时钟将在16块8×8点阵显示屏上分别显示(小时十位)、(小时个位)、(:)、(分十位)、(分个位)(:)(秒十位)、(秒个位)。设计一种基于AT89C52单片机的LED点阵显示时钟,基本设计要求如下: (1) 电子钟的基本功能,也就是计时的功能,要保证电子钟的正常工作,正常计时。 (2) 时钟的显示由LED点阵构成,格式为XX:XX:XX(时:分:秒),点阵为8×8点阵显示屏。 (3) 能正确显示时间,上电显示为当前时间 。 2 总体方案设计及论证 在本章节中将对总体的方案进行阐述,同时将对可能用到的元器件进行详细介绍,以便接下来的设计工作能顺利,有效的进行打下结实的基础。 2.1 系统方案 因为是应用AT89C52单片机来实现控制,所以系统总的方案集中在两个部分,一个是硬件结构的设计,一个是控制的总体思想。在本小节中将对这两部分内容进行简单的叙述。 2.1.1 硬件结构 根据项目的功能和要求,可采用AT89C52单片机作为核心控制器。LED点阵电子钟系统组成包括:晶振电路模块、显示电路模块、显示行驱动电路模块、 电源模块。 2.1.2 控制思想 LED点阵电子钟程序主要功能是屏幕显示时间稳定,精确。所以按照分块设计的方法可以把程序分为主程序、显示程序、计时程序。主程序主要是用来初始化系统和控制各个子程序之间执行的顺序。显示程序用来完成数字在LED点阵上的显示,时钟的显示是使用16块8×8点阵显示屏。计时程序用来完成计时,数时功能。 2.2 设计方案论证 由时钟电路经转换子程序转换成适应LED点阵显示屏显示的数据,并通过单片机的输出功能输入到LED点阵显示屏,再通过显示扫描程序,显示出时钟的走时时间。用计时程序来完成计时,数时功能,再通过单片机综合控制将数字显示出来。由此可见,通过AT89C52单片机的控制功能,完全可以实现LED点阵显示电子钟。 2.3 主要元器件选择 主要用到的硬件有:AT89C52单片机,8×8点阵屏,74HC245总线收发器,DS1302实时时钟电路 , 74HC154译码器,12MHz晶振。 2.3.1 8×8点阵显示屏 图2.2为8×8点阵LED外观及引脚图,其等效电路如图2.3所示,只要其对应的DC、DR轴顺向偏压,即可使LED发亮。例如如果想使图2.3左上角LED点亮,则DC8=1,DR1=0即可。应用时限流电阻可以放在DC轴或DR轴。8×8点阵LED外观及引脚如图2.2[4]。 DC3 DC6 DR4 DC8 DR6 DR7 DC7 DC5 DC1 DR5 DR3 DC4 DR8 DC2 DR2 DR1 8×8点阵焊接面引脚 图2.2 图2.3为8×8点阵LED等效电路,由此可以看出点阵是用64个LED组成的。点阵LED扫描法介绍:从图2.3中可以看出,8×8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮。 频率必须大于128赫兹,周期小于7.8毫秒即可符合视觉暂留要求。此外一次驱动一列或一行(8盏LED)时需外加驱动电路提高电流,否则LED亮度会不足。 图2.3 2.3.2 74HC245总线收发器 总线收发器(bus transceiver),典型的CMOS型三态缓冲门电路。由于单片机或CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。 第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。 第2~9脚“A”信号输入输出端,A0=B0、、、、、、A7=B7,A0与B0是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。 第11~18脚“B”信号输入输出端,功能与“A”端一样,不再描述。 第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。 第10脚GND,电源地。 第20脚VCC,电源正极。 2.3.3 DS1302实时时钟电路 DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),后面有详细说明。SCLK为时钟输入端。 下图为DS1302的引脚功能 : 小时寄存器D7位为12小时/24小时制的选择位,当为1时选12小时制,当为0时选24小时制。当为1时钟暂停,为0时钟开启。写保护寄存器的WP为写保护位,当WP=1,写保护,当WP=0未写保护,当对日历、时钟寄存器或片内RAM进行写时WP应清零,当对日历、时钟寄存器或片内RAM进行读时WP一般置1. 2.3.4 74HC154译码器 74HC154是一款高速CMOS器件,74HC154引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC154译码器可接受4位高有效二进制地址输入,并提供16个互斥的低有效输出。74HC154的两个输入使能门电路可用于译码器选通,以消除输出端上的通常译码“假信号”,也可用于译码器扩展。该使能门电路包含两个“逻辑与”输入,必须置为低以便使能输出端。任选一个使能输入端作为数据输入,74HC154可充当一个1-16的多路分配器。当其余的使能输入端置低时,地址输出将会跟随应用的状态。 引脚说明 1-11 13-17 :输出端。(outputs (active LOW)) 12:Gnd电源地 (ground (0 V)) 18-19:使能输入端、低电平有效 (enable inputs (active LOW)) 20-23:地址输入端 (address inputs) 24:VCC电源正 (positive supply voltage) 2.3.5 AT89C52单片机 微处理器采用AT89C52系列单片机,AT89C52单片机是这几年在我国非常流行的单片机,是一种带8K字节闪存器的高性能单片机,可擦除存储器可以反复擦除100次,具有低功耗,高性能的特点,并且可与工业标准的MSC-51指令集和输出管脚相兼容,对于本设计需要实现的功能,完全可胜任[7] 3 硬件电路设计 元器件表 元件名称 型号 个数 用途 单片机 AT89C52 1 控制核心 LED点阵 8×8 16 显示电路 总线收发器 74HC245 4 信号功率放大 实时时钟电路 DS1302 1 记时 集成块 74HC154 4 行扫描 排阻 10K*8 1 上拉电阻 4 软件部分设计 #include<reg52.h> #define uchar unsigned char #define uint unsigned int #define set_out(X) X = 1 #define clr_out(X) X = 0 sbit e0=P3^0; sbit e1=P3^1; sbit e2=P3^2; sbit e3=P3^3; sbit ds1302_RST=P3^5; sbit ds1302_IO=P3^7; //定义DS1302引脚 sbit ds1302_SCLK=P3^6; sbit ACC0=ACC^0; sbit ACC7=ACC^7; char done,count,temp,flag,up_flag,down_flag,count; idata uint m,z,l,d; idata uint c0,c1,c2,c3,c4,c5,c6,c7; uchar read_Byte(); uchar read_data_ds1302(uchar taddr); void write_Byte(uchar tdata); void write_data_ds1302(uchar taddr,uchar tdata); void set_ds1302(uchar *P1302); void get_ds1302() ; void init_ds1302(); uchar initial_time[]={0x30,0x57,0x17,0x18,0x05,0x01,0x11} // 秒 分 时 日 月 周 年 uchar data now_time[7]; /*字模0-9*/ uchar code led[11][16]= { /*0 CHAR_30 */ {0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x18,0x30,0x08,0x20,0x18,0x30,0xF0,0x1F,0xE0,0x0F}, /*1 CHAR_31 */ {0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00}, /*2 CHAR_32 */ {0x00,0x00,0x70,0x30,0x78,0x38,0x08,0x2C,0x08,0x26,0x88,0x23,0xF8,0x31,0x70,0x30}, /*3 CHAR_33 */ {0x00,0x00,0x30,0x18,0x38,0x38,0x88,0x20,0x88,0x20,0xC8,0x31,0x78,0x1F,0x30,0x0E}, /*4 CHAR_34 */ {0x00,0x00,0x00,0x07,0xC0,0x07,0xE0,0x24,0x30,0x24,0xF8,0x3F,0xF8,0x3F,0x00,0x24}, /*5 CHAR_35 */ {0x00,0x00,0xF8,0x19,0xF8,0x39,0x88,0x21,0x88,0x20,0x88,0x31,0x08,0x1F,0x08,0x0E}, /*6 CHAR_36 */ {0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x98,0x31,0x88,0x20,0x98,0x31,0x18,0x1F,0x00,0x0E}, /*7 CHAR_37 */ {0x00,0x00,0x38,0x00,0x38,0x00,0x08,0x3F,0xC8,0x3F,0xF8,0x00,0x38,0x00,0x08,0x00}, /*8 CHAR_38 */ {0x00,0x00,0x70,0x1C,0xF8,0x3E,0x88,0x23,0x08,0x21,0x88,0x23,0xF8,0x3E,0x70,0x1C}, /*9 CHAR_39 */ {0x00,0x00,0xE0,0x00,0xF0,0x31,0x18,0x33,0x08,0x22,0x18,0x33,0xF0,0x1F,0xE0,0x0F}, /*: CHAR_3A */ {0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0xC0,0x30,0xC0,0x30,0x00,0x00,0x00,0x00} }; /*ds1302模块部分*/ uchar read_Byte()//从1302中读出一字节数据 { uchar i; for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿 ds1302_SCLK=1; ds1302_SCLK=0;//产生下降沿输出一位数据 } return(ACC); } void write_Byte(uchar tdata)//向1302中写入一字节数据 { uchar i; ACC=tdata; for(i=8;i>0;i--) { ds1302_IO=ACC0; ds1302_SCLK=1; ds1302_SCLK=0;//产生上升沿输入数据 ACC=ACC>>1; } } void write_data_ds1302(uchar taddr,uchar tdata)//向1302中写入 地址为taddr的空间 写入数据tdata { ds1302_RST=0; ds1302_SCLK=0; ds1302_RST=1; write_Byte(taddr); write_Byte(tdata); ds1302_RST=0; ds1302_SCLK=1; } uchar read_data_ds1302(uchar taddr)//从1302中读出地址为taddr的空间数据 { uchar tdata; ds1302_RST=0; ds1302_SCLK=0; ds1302_RST=1; write_Byte(taddr); tdata=read_Byte(); ds1302_RST=0; ds1302_SCLK=1; return(tdata); } void set_ds1302(uchar *P1302)// { uchar i; uchar taddr = 0x80; write_data_ds1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/ for(i =7; i>0; i--) { write_data_ds1302(taddr,*P1302); /* 秒 分 时 日 月 星期 年 */ P1302++; taddr+=2; } write_data_ds1302(0x8e,0x80); /* 控制命令,WP=1,写保护*/ } void get_ds1302() { uchar k; uchar taddr = 0x81; for (k=0; k<7; k++) { now_time[k] = read_data_ds1302(taddr);/*格式为: 秒 分 时 日 月 星期 年 */ taddr+= 2; } } void delay(uint z) { uint x,y; for(x=z;z>0;z--) for(y=20;y>0;y--); } void display() { c0=now_time[2]/16; //显示时十 c1=now_time[2]%16; c2=10; c3=now_time[1]/16; //显示分十 c4=now_time[1]%16; //显示分 c5=10; c6=now_time[0]/16; //显示秒十 c7=now_time[0]%16; //显示秒 e0=0; e1=1; e2=1; e3=1; for(m=0;m<8;m++) { P0=P2=0x00; P1=0xff; P1=m; P0=led[c0][2*m]; P2=led[c0][2*m+1]; delay(1); } for(m=8;m<16;m++) { P0=P2=0x00; P1=0xff; P1=m; P0=led[c1][2*(m-8)]; P2=led[c1][2*(m-8)+1]; delay(1); } e0=1; e1=0; e2=1; e3=1; for(z=0;z<8;z++) { P0=P2=0x00; P1=0xff; P1=z; P0=led[c2][2*z]; P2=led[c2][2*z+1]; delay(1); } for(z=8;z<16;z++) { P0=P2=0x00; P1=0xff; P1=z; P0=led[c3][2*(z-8)]; P2=led[c3][2*(z-8)+1]; delay(1); } e0=1; e1=1; e2=0; e3=1; for(l=0;l<8;l++) { P0=P2=0x00; P1=0xff; P1=l; P0=led[c4][2*l]; P2=led[c4][2*l+1]; delay(1); } for(l=8;l<16;l++) { P0=P2=0x00; P1=0xff; P1=l; P0=led[c5][2*(l-8)]; P2=led[c5][2*(l-8)+1]; delay(1); } e0=1; e1=1; e2=1; e3=0; for(d=0;d<8;d++) { P0=P2=0x00; P1=0xff; P1=d; P0=led[c6][2*d]; P2=led[c6][2*d+1]; delay(1); } for(d=8;d<16;d++) { P0=P2=0x00; P1=0xff; P1=d; P0=led[c7][2*(d-8)]; P2=led[c7][2*(d-8)+1]; delay(1); } } void main() { set_ds1302(initial_time); while(1) { get_ds1302(); display(); } } 5 系统仿真 根据设计要求时钟的显示由LED点阵构成,格式为XX:XX:XX(时:分:秒),点阵为8×8点阵显示屏能正确显示时间, 仿真电路开机画面如下图所示。从图中可以看出显示的时间为23点1分34秒。 结束语 本次课程设计到现在已经有几个月,回顾其中学到了很多东西。本设计是一个基于AT89C52的LED点阵显示电子钟,是将电子钟的数字显示用LED点阵的方式来实现的。本系统硬件少,结构简单,容易实现,性能稳定,成本低。 总结本文的研究工作,主要做了一下几点工作:通过阅读大量的相关资料,详细了解LED发光原理和LED点阵显示原理,了解LED现状,清楚的了解LED与其他显示器的区别。并且通过多单片机资料的查阅,更进一步增加了对单片机只是的理解和运用能力。 在本次设计中学会了PROTEUS和KEIL的基本使用,感到PROTUES在电子制图,仿真上的重要性和KEIL作为编程软件的实用性。 课 程 设 计 任 务 书 专 业 电子信息工程 姓 名 学 号 开题日期:2013 年3 月1 日 完成日期: 2012年6月15 日 题 目 单片机LED点阵显示电子钟 一、设计的目的 设计一部基于AT89C52单片机的LED点阵显示电子钟,熟练的运用单片机知识 二、设计的内容及要求 l 各部分硬件及其概念 l 对应的程序 l Protues 仿真 三、指导教师评语 四、成 绩 指导教师 (签章) 年 月 日目 录 第一章 项目的意义和必要性 1 1.1 项目名称及承办单位 1 1.2 项目编制的依据 1 1.3 肺宁系列产品的国内外现状 2 1.4产业关联度分析 3 1.5项目的市场分析 4 第二章 项目前期的技术基础 8 2.1成果来源及知识产权情况,已完成的研发工作 8 2.3产品临床试验的安全性和有效性 8 第三章 建设方案 23 3.1建设规模 23 3.2 建设内容 23 3.3产品工艺技术 23 3.5产品质量标准 29 3.6 土建工程 37 3.7 主要技术经济指标 39 第四章 建设内容、地点 41 4.1 建设内容及建设规模 41 4.2 建设地点 41 4.3外部配套情况 44 第五章 环境保护、消防、节能 46 5.1 环境保护 46 5.2消防 49 5.3节能 50 第六章 原材料供应及外部配套条件落实情况 52 6.1主要原辅材料、燃料、动力消耗指标 52 6.2 公用工程 54 第七章 建设工期和进度安排 56 7.1建设工期和进度安排 56 7.2建设期管理 56 第八章 项目承担单位或项目法人所有制性质及概况 57 8.1 项目承担单位概况 57 8.2 企业财务经济状况 58 8.3 项目负责人基本情况 59 第九章 投资估算与资金筹措 62 9.1 项目计算期 62 9.2 投资估算的编制依据及参数 62 9.3 投资估算 62 9.4 资金筹措 64 9.5 贷款偿还 64 第十章 财务评价 65 10.1财务评价依据 65 10.2销售收入和销售税金及附加估算 65 10.3利润总额及分配 66 10.4盈利能力分析 66 10.5不确定分析 66 10.6财务评价结论 68 第十一章 项目风险分析,效益分析 69 11.1 风险分析 69 11.2 效益分析 70
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服