当前位置:文档之家› 51单片机课程设计——电子万年历

51单片机课程设计——电子万年历

电子万年历的设计学院计算机与控制工程学院专业班级自动化学生姓名指导教师2010年6月25日引言随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。

为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。

第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。

商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、LED 动态扫描显示屏显示。

AT89C51单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。

此外,该电子万年历还具有时间校准等功能。

1.方案论证1.1技术可行性随着国内超大规模集成电路的出现,微处理器及其外围芯片有了迅速的发展。

集成技术的最新发展之一是将CPU和外围芯片,如程序存储器、数据存储器、并行I/O口、串行I/O口、定时/计数器、中断控制器及其他控制部件集成在一个芯片之中,制成单片计算机(Single-Chip Microcomputer)。

而近年来推出的一些高档单片机还包括有许多特殊功能单元,如A/D、D/A转换器、调制解调器、通信控制器、锁相环、DMA、浮点运算单元、PWM控制输出单元、PWM输出时的死区可编程控制功能等。

因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统,如工业流水线控制系统、作为家用电器的主控制器、分布式控制系统的终端节点或作为其主控制节点起中继的作用、数据采集系统、自动测试系统等。

单片机的出现,并在各技术领域中得到如此迅猛的发展,与单片机构成计算机应用系统所形成的下述特点有关:1、单片机构成的应用系统有较大的可靠性。

这些可靠性的获得除了依靠单片机芯片本身的高可靠性以及应用有最少的联接外,还可以方便地采用软、硬件技术。

2、系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统,应用系统有较高的软、硬件利用系数。

3、由于构成的应用系统是一个计算机系统,相当多的测、控功能由软件实现,故具有柔性特征,不须改变硬件系统就能适当地改变系统功能。

4、有优异的性能、价格比。

1.2单片机的选择采用传统的AT89C51作为电机的控制核心。

单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。

1.3显示模块的选择LED数码管数码管具有:低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度比较高,称重轻,精确可靠,操作简单。

数码管采用BCD编码显示数字,程序编译容易,资源占用较少。

在本系统中,我们采用了八段四位一体数码管串口的动态显示,由于显示位数较多,故应使用显示驱动,在本设计中采用MAX7219显示驱动芯片。

1.4键盘模块的选择在对日期和时间进行切换,对日期和时间进行调节校准过程中,系统需要产生激励电流,因此需要用按键。

使用独立式键盘。

独立式键盘是指直接用I/O口线构成的单个按键电路。

独立式按键电路配置灵活,软件结构简单。

1.5总体方案论证与选择按照系统设计功能的要求,初步确定系统由主控模块、时控模块、显示驱动及显示模块和键盘接口模块共4个模块组成:图1.1电子万年历电路系统构成框图主控芯片使用51系列AT89C51单片机,时钟芯片使用美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟DS1302。

采用DS1302作为计时芯片,可以做到计时准确。

更重要的是,DS1302可以在很小电流的后备电源(2.5~5.5V电源,再2.5V 时耗电小于300nA),而且DS1302可以编程选择多种充电电流来队后备电源进行慢速充电,可以保证后备电源基本不耗电。

显示驱动采用MAX7219,MAX7219 是微处理器和共阴极八段八位LED 数码管显示、图条/柱图显示或64 点阵显示接口的小型串行输入/输出芯片。

片内包括BCD 译码器、多路扫描控制器、字和位驱动器和8×8 静态RAM。

外部只需要一个电阻设置所有LED 显示器字段电流。

MAX7219 和微处理器只需三根导线连接,每位显示数字有一个地址由微处理器写入。

允许使用者选择每位是BCD 译码或不译码。

使用者还可选择停机模式、数字亮度控制、从1~8 选择扫描位数和对所有LED 显示器的测试模式。

显示模块采用普通的共阴极四位一体八段LED数码管。

2.主要单元电路的设计2.1显示电路显示部分采用普通的共阴数码管显示,两个四位一体八段LED显示数码管和一个一位LED数码管设计时数码管同时扫描,显示时采用串行口输出段码,用MAX7219驱动数码管。

图2.1 MAX72192.2键盘接口键盘在单片机系统中是一个很重要的部件。

为了输入数据、查询和控制系统的工作状态,都要用到键盘,键盘是人工干预计算机的主要手段。

2.2.1按键开关去抖动问题按键开关在电路中的连接如图所示。

按键未按下时,A点电位为高电平5V;按键按下时,A点电位为低电平。

A点电位就用于向CPU传递按键的开关状态。

但是由于按键的结构为机械弹性开关,在按键按下和断开时,触点在闭合和断开瞬间还会接触不稳定,引起A点电平不稳定,如图2-11b所示,键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。

因此必须设法消除抖动的不良后果。

图2.2 键操作和键抖动消除抖动的不良后果的方法有硬、软件两种。

为了节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而是用软件消除抖动的方法。

根据抖动特性,在第一次检测到按键按下后,执行一段延时5~10ms 让前延抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。

当检测到按键释放后,也要给5~10ms 的延时,待后延抖动消失后才转入该键处理程序。

2.3时钟电路2.3.1 DS1302工作方式简介及数据操作原理DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM 。

它经过一个简单的串小于31采用24<采用三线接口与CPU 进行同步通信,并可数据。

Vcc1或Vcc2中较DS1302在任何数据传送时必须先初始化,把RST 脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK 的上升沿被访问到。

在开始8个时钟周期,把命令字节装入移位寄存器后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。

上电运行时,在Vcc≥2.5V 之前,RST 脚必须保持低电平。

只有在SCLK 为低电平时,才能将RST 置为高电平。

DS1302的控制字如图所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6如果为0,则表示存取日历时钟数据;为1则表示存取RAM 数据。

位5~1(A4~A0)指示操作单元的地址。

最低有效位(位0)如果为0,则表示要进行写操作;为1表示进行读操作。

控制字节总是从最低位开始输入/输出。

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD 码形式。

其日历、时间寄存器及其控制字如下表所示,其中奇数为读操作,偶数为写操作。

Vcc 2Vcc 1 GNDRSTX1 X2 SCLK I/O表2.3.1 DS1302控制字时钟暂停:秒寄存器的位7定义位时钟暂停位。

当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。

当它为0时,时钟将开始启动。

AM-PM/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。

它为高电平时,选择12小时方式。

在此方式下,位5为第二个10小时位(20~23h)。

DS1302的晶振选用32768Hz,电容推荐值为6pF。

因为振荡频率较低,也可以不接电容,对计时精度影响不大。

3.程序流程图3.1显示驱动程序流程图图3.1 MAX7219显示驱动程序流程图3.2 时间控制流程图图3.2 DS1302时控流程图结束语历经了半个月的奋战,紧张而又充实的课程设计终于落下了帷幕。

回想这段日子的经历和感受,我感慨万千,在这次课程设计的过程中,我拥有了无数难忘的回忆和收获。

选好主题,我便开始着手准备设计所需要的资料。

一个星期很快就过去了,论文的文字叙述已经完成。

然后开始进行相关图形的绘制工作和电路的设计工作。

为了画出自己满意的电路图,流程图等。

在设计电路初期,由于没有设计经验,觉得无从下手,空有很多设计思想,却不知道应该选哪个,通过查阅资料,逐渐确立系统方案。

方案中LED显示屏驱动电路的设计是个比较头疼的问题,在反复推敲,对比的过程中,最终定下了驱动电路采用MAX7219驱动芯片。

脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。

我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。

在这段时间里,因为有了指导老师的指导、同学们的帮忙,此次课程设计才得以顺利完成,在此对他们表示由衷的感谢。

大三学年即将结束,借此机会也对这三年来帮助、关心、鼓励过我的老师、同学说声谢谢!附录(电子万年历程序)#include <reg5.h>#include "intrins.h"#define uint unsigned char#define uint unsigned intuchar xingqi,nian,yue,ri,xiaoshi,fen,miao;uchar nianh,nianl,yueh,yuel,rih,ril,xiaoshih,xiaoshil,fenh,fenl,miaoh,miaol; uchar dd=2;sbit clk=p1^0;sbit dat=p1^1;sbit rst=p1^2;sbitA0=ACC^0;sbitA1=ACC^1;sbitA2=ACC^2;sbitA3=ACC^3;sbitA4=ACC^4;sbitA5=ACC^5;sbitA6=ACC^6;sbitA7=ACC^7;sbit p30=p3^0;sbit p31=p3^1;sbit p32=p3^2;sbit p33=p3^3;sbit p34=p3^4;sbit p35=p3^5;sbit p36=p3^6;sbit p37=p3^7;sbit date=p2^0;sbit load=p2^1;sbit clkk=p2^2;uchar bdata bitmsb;sbit m7=bitmsb^7;uchar x,y,c;bit flag=0;bit flagh=1;uchar code tab[]={0xff, //任意数0x06,/*1*/ //共阴数码管0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/};uchar code tab2[]={0x7e,ox30,ox6d,ox7,ox33,ox5b,ox5f,ox70,ox7f,ox7b};//max7219,0~9的字库uchar code tab1[]={ox00,ox01,ox02,ox03,ox04,ox05,ox06,ox07,ox08,ox09,ox010,ox11,ox12,ox13,ox14,ox15,ox16,ox17,ox18,ox19,ox20,ox21,ox22,ox23,ox 24,ox25,ox26,ox27,ox28,ox29,ox30,ox31,ox32,ox33,ox34,ox35,ox36,ox37,ox38,ox39,ox40,o x41,ox42,ox43,ox44,ox45,ox46,ox47,ox48,ox49,ox50,ox51,ox52,ox53,ox54,ox55,ox56,ox57, ox58,ox59,ox60};void send(void){uchar count;bitmsb=x;for(count=0;count<8;count++){ if(m7){clkk=0;date=1;-nop-();clkk=1;}else { clkk=0;date=0;nop-();clkk=1;}bitmsb<<=1;}}void wr(void){load=0;send();x=y;send();lend=1;}void ready(void){x=oxfb; //设置扫描限制y=ox07;wr();x=oxf9; //译码模式y=ox00;wr();x=oxfa; //亮度调节y=oxoc;wr();x=oxfc; //关断模式y=ox01;wr();}void InputByte(uchar dd) //写一个字节到1302中{uchar i;ACC=dd;for(i=8;i>0;i--){dat=A0;clk=1;clk=0;ACC=ACC>>=1;}}void OutputByte(void) //从DS1302中读出i个数据{uchar i;dat=1;for(i=8;i>0;i--){ACC=ACC>>1;A7=dat;clk=1;clk=0;}dd=ACC;}void Write(uchar addr,uchar num){rst=0;clk=0;rst=1;InputByte(addr); //写地址InputByte(num);//写数据clk=1;rst=0;{ rst=0;clk=0;rst=1;InputByte();clk=1;rst=0;}//初始化设置时间,2008年5月27号,23时58分00秒void main(void){ uchar i;uint xt=0;uchar fen1,fen2,fen3,fen4;p3=oxff;Disable WP(); //非写保护WriteSec(ox00); //秒WriteMin(ox58); //分WriteHr(ox23); //时WriteDay(ox27); //日WriteMn(ox05); //月WriteYs(ox08); //年WriteWe(ox02); //星期//7219设置ready();for(i=0;i<222;i++);for(i=0;i<222;i++);while(1){ Read(ox8b); //读星期数据xingqi =dd;Read(ox8d); //读年数据fen 1=dd;fen 2=fen1&oxof;fen3=fen1&oxfo;fen3>>=4;nian=fen3*10+fen2;nianh=nian/10;nianl=nian%10;Read(ox89); //读月数据fen1=dd;fen2=fen1&oxof;fen3=fen1&oxfo;fen3>>4;yue=fen3*10+fen2;yueh=yue/10;yuel=yue%10;Read(ox87); //读日数据fen1=dd;fen2=fen1&oxof;fen3>>=4;ri=fen3*10+fen2;rih=ri/10;ril=ri%10;Read(ox85); //读小时数据fen1=dd;fen2=fen1&oxof;fen3=fen1&oxfo;fen3>>=4;xiaoshi=fen3*10+fen2;xiaoshih=xiaoshi/10;xiaoshil=xiaoshi%10;Read(ox83); //读分数据fen1=dd;fen2=fen1&oxof;fen3=fen1&oxfo;fen3>>4;fen=fen3*10+fen2;fenh=fen/10;fenl=fen%10;Read(ox81); //读秒数据fen1=dd;miaoh=miao/10;miaol=miao%10;xingqi++;if(flag){ Read(ox89); //读月数据fen1=dd;fen2=fen1&oxof;fen3=fen1&oxf0;fen3>>4;yue=fen3*10+fen2;yue++;if(yue>=13)yue=1;WriteMn(tab1[yue]);while(p32==0);}if(p33==0) //日if(flag){Read(ox87); //读日数据fen1=dd;fen2=fen1&oxof;fen3=fen1&oxf0;fen3>>=4;ri=fen3*10+fen2;ri++;if(ri>=32)ri=1;WriteDay(tab1[ri]);//riwhile(p33==0) ;}if(p34==0) //小时if(flag){Read(ox85); //读小时数据fen1=dd;fen2=fen1&oxf0;fen3=fen1&oxf0;fen3>>=4;WriteHr(tab1[xiaoshi]);while(p34==0);}if(p35==0) //分if(flag){Read(ox83); //读分数据fen1=dd;}if(p37==0) //调整标志{ flag=~flag;if(flag)WriteSec(ox80);elseWriteSec(ox800);while(p37==0);}if(p36==0) //调整标志{flagh=~flagh;while(p36==0);}}}}。

相关主题