




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录摘 要11 方案论证21.1 单片机芯片的选择方案和论证21.2 显示模块选择方案和论证21.3 时钟芯片的选择方案和论证31.4 电路设计最终方案决定32 系统的硬件设计与实现32.1 电路设计框图32.2 系统硬件概述32.3 主要单元电路的设计42.3.1 单片机主控制模块的设计42.3.2 时钟电路模块的设计42.3.3 电路原理及说明52.3.4 显示模块的设计63 系统的软件设计73.1 程序流程框图74 测试与结果分析94.1 软件测试94.2 测试结果分析与结论94.3.1 测试结论95 课程设计总结9参考文献10附录一:系统电路图11附录二:元器件清单12附录三:系统程序清单12摘 要随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国dallas公司推出的具有涓细电流充电能的低功耗实时时钟电路ds1302,它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且ds1302的使用寿命长,误差小。对于数字电子时钟采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用at89s52单片机作为核心,功耗小,能在3v的低压工作,电压可选用35v电压供电。综上所述此电子时钟具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。关键词:电子时钟 ds1302 动态扫描 单片机 1 方案论证1.1 单片机芯片的选择方案和论证方案一: 采用89c51芯片作为硬件核心,采用flash rom,内部具有4kb rom 存储空间,能于3v的超低压工作,而且与mcs-51系列单片机完全兼容,但是运用于电路设计中时由于不具备isp在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二: 采用at89s52,片内rom全都采用flash rom;能以3v的超底压工作;同时也与mcs-51系列单片机完全该芯片内部存储器为8kb rom 存储空间,同样具有89c51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用at89s52作为主控制系统。1.2 显示模块选择方案和论证方案一: 采用led数码管动态扫描,led数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案三: 采用lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,并且我做的最小系统上带一个ts1620-1,和at89s52已经接好,省了很多麻烦,所以在此设计中采用lcd液晶显示屏。1.3 时钟芯片的选择方案和论证方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二: 采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年进行计数,而且精度高,位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na。1.4 电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用at89s52作为主控制系统;ds1302提供时钟;lcd液晶显示屏作为显示。2 系统的硬件设计与实现2.1 电路设计框图lcd液晶显示屏显示模块d7d0p2.0 p0.7p2.3 p0.0at89s52单片机p1.5p1.7键盘模块 ds1302 时钟模块复位电路rstrstsclki/o图2-1 系统原理图2.2 系统硬件概述本电路是由at89s52单片机为控制核心,具有在线编程功能,低功耗,能在3v超低压工作;时钟电路由ds1302提供,它是一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5v5.5v。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个31*8的用于临时性存放数据的ram寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;显示部份由lcd液晶显示屏显示。2.3 主要单元电路的设计2.3.1 单片机主控制模块的设计 at89s52单片机为40引脚双列直插芯片,有四个i/o口p0,p1,p2,p3, mcs-51单片机共有4个8位的i/o口(p0、p1、p2、p3),每一条i/o线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,xtal1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,xtal2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。如图2-2所示:图2-2 主控制系统2.3.2 时钟电路模块的设计图2-3显示出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进行操作。如果在传送过程中rsts置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电动行时,在vcc大于等于2.5v之前,rst必须保持低电平。中有在sclk 为低电平时,才能将rst置为高电平,i/o为串行数据输入端(双向)。sclk始终是输入端。图2-3 ds1302的引脚图2.3.3 电路原理及说明(1) 时钟芯片ds1302的工作原理: ds1302在每次进行读、写程序前都必须初始化,先把sclk端置 “0”,接着把rst端置“1”,最后才给予sclk脉冲。ds1302的控制字的位7必须置1,若为0则不能把对ds1302进行读写数据。对于位6,若对程序进行读/写时ram=1,对时间进行读/写时,ck=0,位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表.2为ds1302的日历、时间寄存器内容:“ch”是时钟暂停标志位,当该位为1时,时钟振荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,wp必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。(2) ds1302的控制字节:ds1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(3) 数据输入输出(i/o)在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。(4) ds1302的寄存器ds1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为bcd码形式。此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 ds1302与ram相关的寄存器分为两类:一类是单个ram单元,共31个,每个单元组态为一个8位的字节,其命令控制字为c0hfdh,其中奇数为读操作,偶数为写操作;另一类为突发方式下的ram寄存器,此方式下可一次性读写所有的ram的31个字节,命令控制字为feh(写)、ffh(读)。 2.3.4 显示模块的设计如图2-4为lcd显示模块,和最小系统上的连线一样,无需修改。图2-4 lcd液晶显示屏显示模块3 系统的软件设计开始初始化 读日期、时间 写日期、时间显示子程序时间修改子程序 日期修改子程序显示结果返回 开关控制子程序3.1 程序流程框图 图3-1 主程序流程图 图3-2 时间调整程序流程图4 测试与结果分析4.1 仿真测试电子时钟是多功能的数字型,可以看当前日期,时间。电子万年历功能很多,所以对于它的程序也较为复杂,所以在编写程序和调试时出现了相对较多的问题。最后经过多次的模块子程序的修改,一步一步的完成,最终解决了软件。在软件的调试过程中遇到的主要问题是: 1.烧入程序后,lcd液晶显示屏显示亮度不好。 解决:一遍旋转10k欧的滑动变阻器,一遍观看lcd显示屏,知道看到合适的亮度为止。4.2 测试结果分析与结论4.3.1 测试结论经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。同时在软件的编程方面得到更到的提高,对编程能力得到加强,同时对所学的知识得到很大的提高与巩固。5 课程设计总结在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了作品,达到了预期的目的,完了最初的设想。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路,反而得心应手。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。此次课程设计学到了很多很多东西,这是最重要的。总之,此次课设使我的能力得到了全方位的提高。参考文献1电气与电子信息工程学院.单片机实验指导书 2彭为等.单片机典型系统设计实例精讲.北京:电子工业出版社,20073王庆利等.单片机设计案例实践教程.北京:北京邮电大学出版社,20084皮大能等.单片机课程设计指导书.北京:北京理工大学出版社,20105张毅刚等.单片机原理及应用.北京:高等教育出版社,2010附录一:系统电路图附录二:元器件清单附表1 电子时钟主要元器件清单元件名称规格型号数量(个)单片机at89s511lcd液晶显示屏lm016l1晶振12mhz2电容22pf2电容20uf1按键button5电阻1k1上拉电阻10k1排阻respack-8/10k1电源变压器9v1附录二:系统程序清单#include #include /#include lcd1602.h/#include ds1302.h#define uint unsigned int#define uchar unsigned charsbit ds1302_clk = p17; /实时时钟时钟线引脚 sbit ds1302_io = p16; /实时时钟数据线引脚 sbit ds1302_rst = p15; /实时时钟复位线引脚sbit acc0 = acc0;sbit acc7 = acc7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit set = p20; /模式切换键sbit up = p21; /加法按钮sbit down = p22; /减法按钮sbit out = p23; /立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag;uchar tempbuffer5,week_value2;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/port definitions*sbit lcdrs= p25;sbit lcdrw= p26;sbit lcden = p27;sfr dbport = 0x80;/p0=0x80,p1=0x90,p2=0xa0,p3=0xb0.数据端口/内部等待函数*unsigned char lcd_wait(void)lcdrs=0;lcdrw=1;_nop_();lcden=1;_nop_();lcden=0;return dbport;/向lcd写入命令或数据*#define lcd_command0 / command#define lcd_data1 / data#define lcd_clear_screen0x01 / 清屏#define lcd_homing 0x02 / 光标返回原点void lcd_write(bit style, unsigned char input)lcden=0;lcdrs=style;lcdrw=0;_nop_();dbport=input;_nop_();/注意顺序lcden=1;_nop_();/注意顺序lcden=0;_nop_();lcd_wait();/设置显示模式*#define lcd_show0x04 /显示开#define lcd_hide0x00 /显示关 #define lcd_cursor0x02 /显示光标#define lcd_no_cursor0x00 /无光标 #define lcd_flash0x01 /光标闪动#define lcd_no_flash0x00 /光标不闪动void lcd_setdisplay(unsigned char displaymode)lcd_write(lcd_command, 0x08|displaymode);/设置输入模式*#define lcd_ac_up0x02#define lcd_ac_down0x00 / default#define lcd_move0x01 / 画面可平移#define lcd_no_move0x00 /defaultvoid lcd_setinput(unsigned char inputmode)lcd_write(lcd_command, 0x04|inputmode);/初始化lcd*void lcd_initial()lcden=0;lcd_write(lcd_command,0x38); /8位数据端口,2行显示,5*7点阵lcd_write(lcd_command,0x38);lcd_setdisplay(lcd_show|lcd_no_cursor); /开启显示, 无光标lcd_write(lcd_command,lcd_clear_screen); /清屏lcd_setinput(lcd_ac_up|lcd_no_move); /ac递增, 画面不动/液晶字符输入的位置*void gotoxy(unsigned char x, unsigned char y)if(y=0)lcd_write(lcd_command,0x80|x);if(y=1)lcd_write(lcd_command,0x80|(x-0x40);/将字符输出到液晶显示void print(unsigned char *str)while(*str!=0)lcd_write(lcd_data,*str);str+;/*ds1302时钟部分子程序*/typedef struct _systemtime_unsigned char second;unsigned char minute;unsigned char hour;unsigned char week;unsigned char day;unsigned char month;unsigned char year;unsigned char datestring11;unsigned char timestring9;systemtime;/定义的时间类型systemtime currenttime;#define am(x)x#define pm(x)(x+12) / 转成24小时制#define ds1302_second0x80 /时钟芯片的寄存器位置,存放时间#define ds1302_minute0x82#define ds1302_hour0x84 #define ds1302_week0x8a#define ds1302_day0x86#define ds1302_month0x88#define ds1302_year0x8c void ds1302inputbyte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i;acc = d; for(i=8; i0; i-) ds1302_io = acc0; /相当于汇编中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; unsigned char ds1302outputbyte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) acc = acc 1; /相当于汇编中的 rrc acc7 = ds1302_io; ds1302_clk = 1;ds1302_clk = 0; return(acc); void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要写的数据 ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 写1byte数据 ds1302_clk = 1; ds1302_rst = 0; unsigned char read1302(unsigned char ucaddr)/读取ds1302某地址的数据 unsigned char ucdata; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0x01); / 地址,命令 ucdata = ds1302outputbyte(); / 读1byte数据 ds1302_clk = 1; ds1302_rst = 0; return(ucdata);void ds1302_gettime(systemtime *time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char readvalue;readvalue = read1302(ds1302_second);time-second = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_minute);time-minute = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_hour);time-hour = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_day);time-day = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_week);time-week = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_month);time-month = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_year);time-year = (readvalue&0x70)4)*10 + (readvalue&0x0f);void datetostr(systemtime *time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里datestring if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 time-datestring0 = 2; time-datestring1 = 0; time-datestring2 = time-year/10 + 0; time-datestring3 = time-year%10 + 0; else time-datestring0 = ; time-datestring1 = ; time-datestring2 = ; time-datestring3 = ;time-datestring4 = /;if(hide_monthdatestring5 = time-month/10 + 0; time-datestring6 = time-month%10 + 0; else time-datestring5 = ; time-datestring6 = ;time-datestring7 = /;if(hide_daydatestring8 = time-day/10 + 0; time-datestring9 = time-day%10 + 0; elsetime-datestring8 = ;time-datestring9 = ; if(hide_weekweek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;time-datestring10 = 0; /字符串末尾加 0 ,判断结束字符void timetostr(systemtime *time) /将时,分,秒数据转换成液晶显示字符放到数组 timestring; if(hide_hourtimestring0 = time-hour/10 + 0; time-timestring1 = time-hour%10 + 0; else time-timestring0 = ;time-timestring1 = ;time-timestring2 = :;if(hide_mintimestring3 = time-minute/10 + 0; time-timestring4 = time-minute%10 + 0; else time-timestring3 = ;time-timestring4 = ; time-timestring5 = :; if(hide_sectimestring6 = time-second/10 + 0; time-timestring7 = time-second%10 + 0; elsetime-timestring6 = ;time-timestring7 = ; time-datestring8 = 0;void initial_ds1302(void) /时钟芯片初始化 unsigned char second=read1302(ds1302_second);if(second&0x80) /判断时钟芯片是否关闭 write1302(0x8e,0x00); /写入允许write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55write1302(0x88,0x07);write1302(0x86,0x25);write1302(0x8a,0x07);write1302(0x84,0x23);write1302(0x82,0x59);write1302(0x80,0x55);write1302(0x8e,0x80); /禁止写入void delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j0;delay-)for(i=0;i0x59) /超过59秒,清零 temp=0; break; case 2:temp=read1302(ds1302_minute); /读取分数 temp=temp+1; /分数加1up_flag=1;if(temp0x59) /超过59分,清零temp=0;break;case 3: temp=read1302(ds1302_hour); /读取小时数temp=temp+1; /小时数加1up_flag=1;if(temp0x23) /超过23小时,清零 temp=0; break; case 4: temp=read1302(ds1302_week); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp0x7) temp=1; break; case 5: temp=read1302(ds1302_day); /读取日数 temp=temp+1; /日数加1 up_flag=1; if(temp0x31) temp=1; break; case 6: temp=read1302(ds1302_month); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp0x12) temp=1; break; case 7: temp=read1302(ds1302_year); /读取年数 temp=temp+1; /年数加1 up_flag=1; if(temp0x85) temp=0; break; default:break;while(up=0); /void downkey()/降序按键 down=1;if(down=0) mdelay(8); switch(count) case 1: temp=read1302(ds1302_second); /读取秒数 temp=temp-1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0x7f) /小于0秒,返回59秒 temp=0x59; break; case 2: temp=read1302(ds1302_minute); /读取分数 temp=temp-1; /分数减1 down_flag=1; if(temp=-1) temp=0x59; /小于0秒,返回59秒 break; case 3: temp=read1302(ds1302_hour); /读取小时数 temp=temp-1; /小时数减1 down_flag=1; if(temp=-1) temp=0x23; break; case 4: temp=read1302(ds1302_week); /读取星期数 temp=temp-1; /星期数减1 down_flag=1; if(temp=0) temp=0x7; break; case 5: temp=read1302(ds1302_day); /读取日数 temp=temp-1; /日数减1 down_flag=1; if(temp=0) temp=31; break; case 6: temp=read1302(ds1302_month); /读取月数 temp=temp-1; /月数减1 down_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位内部培训管理制度
- 制造企业借款管理制度
- 外包人员出入管理制度
- 公司轮流值班管理制度
- 宿舍之星评比管理制度
- 医院后勤出库管理制度
- 党员积分星级管理制度
- 员工食堂气球管理制度
- 工地员工喝酒管理制度
- 医院改造设计管理制度
- 田亩转户协议书
- 2025年商业伦理与社会责任认识考试试卷及答案
- 资产委托购买协议书
- 病例康复治疗汇报
- 2025-2030中国半导体行业市场现状供需分析及投资评估规划分析研究报告
- 庭院绿化养护合同协议书
- 退休返聘合同和协议书
- 2025年MySQL开发趋势试题及答案研究
- 山东省济宁市2025年高考模拟考试化学试题及答案(济宁三模)
- 胃癌护理个案护理
- 2025年汽车经销行业深度研究报告
评论
0/150
提交评论