当前位置:文档之家› 单片机课程设计之智能电子钟

单片机课程设计之智能电子钟

单片机课程设计题目: 智能电子钟学生姓名专业班级指导教师成绩工程技术学院2016 年 3 月目录一、系统设计内容 (1)1.1 设计要求: (1)1.2 可实现的具体功能: (1)二、总体设计 (2)2.1 DS1302简介 (2)2.2 LCDl602简介 (3)2.3 AT89C51单片机简介 (3)三、硬件设计 (3)3.1 原理图 (4)3.2 PCB板丝印层 (4)3.3 PCB板底层 (4)四、软件设计流程 (4)4.1 总体设计 (4)4.2主程序流程图 (5)4.3显示流程图 (5)4.4 DS1302读取流程 (6)4.5 外部中断0流程 (6)4.6 外部中断1流程 (7)五、仿真效果图 (9)六、总结与体会 (11)附录 (12)1、程序 (12)2、参考文献 (22)智能电子钟(LCD显示)一、系统设计内容1.1 设计要求:以AT89C51单片机为核心,制作一个LCD显示的智能电子钟:(1)计时:秒、分、时、天、周、月、年;(2)闰年自动判别;(4)时间、月、日交替显示;(5)自定任意时刻自动开/关屏;(6)计时精度:误差≤1秒/月(具有微调设置);(7)键盘采用动态扫描方式查询。

所有的查询、设置功能均由功能键K1、K2完成。

本设计采用市场上流行的时钟芯片DS1302进行制作。

1.2 可实现的具体功能:智能电子钟的原理主要由4部分组成:(1)单片机的外围设备,即单片机最小系统,此部分是保证单片机正常工作的必要部分;(2)显示部分:LCD显示,即显示年、月、星期、日、时、分、秒等;(3)时钟芯片DS1302,DS1302是DALLAS公式推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。

实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力;(4)按键部分:按键实现开关显示屏对时钟时间的微调,开关键在正常显示模式下按下开火关LCD显示;模式键:可切换到时间调整界面,再按一次退出,此时开关屏键实现对秒的加一操作。

二、总体设计图2.1 设计方案框图2.1 DS1302简介DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

图2.2 DS1302芯片2.2 LCDl602简介1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。

2.3 AT89C51单片机简介AT89C51(如图所示)是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable andErasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

三、硬件设计智能电子钟(LCD 显示) 3.1 原理图P2.7/A1528P2.6/A1427P2.5/A1326P1.78P2.4/A1225P1.67P2.3/A1124P1.56P2.2/A1023P1.45P2.1/A9P1.34P1.23P1.1/T 2EX 2P1.0/T 21EA31AL E 30PSEN 29P3.0/RXD 10P3.1/T XD11P3.7/RD17P3.2/INT 012P3.6/WR 16P3.3/INT 113P3.5/T 115P3.4/T 01489C51X12X23VCC18VCC21RST 5SCL K 7I/O6U2WD1100-11C430uFC530uFX232.768kHzB13VVCCR21k10uF161514131211109RP1RE SPACK4VCC12K 12K112K23.2 PCB 板丝印层3.3 PCB 板底层四、软件设计流程4.1 总体设计在整个程序运行过程中,总体上可分为以下几方面:4.2主程序流程图4.3显示流程图4.4 DS1302读取流程4.5 外部中断0流程4.6 外部中断1流程五、仿真效果图日期时间交替显示:关屏时间调整六、总结与体会历经一个星期的设计、修改、调试,最终,我们得到了想要的结果,感受成功之喜悦,但这并不意味着我们做得很好,相反,在这当中暴露出了我们在各个方面许许多多的问题,学到许多的同时感触也很深厚。

在硬件设计时,通过对需要系统的分析,单元模块的设计,元件的选取等,使我们了解到平时所学单片机课程的实用价值,以及设计过程中的大局协调、取舍、分析能力的培养。

在编程以及仿真时,充分将单片机原理的知识学以致用,既是对我们单片机基础知识的考验,又是对我们灵活运用及创新能力的检验;既考验我们的学习能力,又考验逻辑思维技巧;既体现了个人对课程设计的灵思妙想,又培养了团队之间的合作能力。

我们能够很好地完成这次课设,离不开在科学研究上实事求是的工作原则、一丝不苟的工作态度、勤于思考的工作方法、百折不饶的工作精神和精益求精的工作作风,此外,最重要的就是团队之间相处和谐、分工明确。

在大家的共同努力下,得到了满意的成果,更使我们明白团队合作的重要与便利。

最后,衷心感谢老师在这次设计中耐心给予的大量帮助,解决了我程序中存在的不少问题,并指导了我一些设计的思路,也令我明白自己的大量不足之处,受益匪浅。

附录1、程序#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define DS1302_SECOND_WRITE 0x80#define DS1302_MINUTE_WRITE 0x82#define DS1302_HOUR_WRITE 0x84#define DS1302_DAY_WRITE 0x86#define DS1302_WEEK_WRITE 0x8a#define DS1302_MONTH_WRITE 0x88#define DS1302_YEAR_WRITE 0x8c#define DS1302_PROTECT_WRITE 0x8e#define DS1302_SECOND_READ 0x81#define DS1302_MINUTE_READ 0x83#define DS1302_HOUR_READ 0x85#define DS1302_DAY_READ 0x87#define DS1302_WEEK_READ 0x8b#define DS1302_MONTH_READ 0x89#define DS1302_YEAR_READ 0x8dsbit lcden = P2^2;sbit lcdrs = P2^0;sbit write = P2^1;sbit sck = P1^6; //时钟sbit io = P1^7; //数据sbit rst = P1^5;// DS1302复位unsigned char Chinese_1[3]={0x2d,0x20,0x3a};// “-”“”“:”unsigned char Chinese_2[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37};//一二三四五六天//unsigned char Cursor[6]={0x81,0x83,0x85,0x90,0x92,0x94};//定义光标移动的位置unsigned char num = 0;unsigned int ji = 0;unsigned int jiao = 0;void Delayms(unsigned int z)//延时{unsigned int x,y;for(x=z;x>0;x--)for(y=115;y>0;y--);}//lcd子程序void Write_com(unsigned char com)//写命令{lcdrs = 0;P0 = com;Delayms(5);lcden = 1;Delayms(5);lcden = 0;}void Write_data(unsigned char dat)//写数据{lcdrs = 1;P0 = dat;Delayms(5);lcden = 1;Delayms(5);lcden = 0;}unsigned char Read_com()//读命令{unsigned char com;write = 1;lcdrs = 0;lcden = 1;com = P0;Delayms(5);write = 0;lcdrs = 0;lcden = 0;return com;}void init_lcd()//lcd初始化{lcden = 0;Write_com(0x38);Write_com(0x0c);Write_com(0x06);Write_com(0x01);Write_com(0x80);}//ds1302子程序void DS1302WriteByte(uchar dat)//写字节{uchar i;sck=0;Delayms(2);for(i=0;i<8;i++){io=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的Delayms(2);sck=1;Delayms(2);sck=0;dat>>=1;}}uchar DS1302ReadByte()//读字节{uchar i,dat;Delayms(2);for(i=0;i<8;i++){dat>>=1;if(io==1)//当数据线为高时,证明该位数据为1dat|=0x80;//要传输数据的当前值置为1,若不是,则为0sck=1;Delayms(2);sck=0;Delayms(2);}return dat;}uchar DS1302Read(uchar cmd)//读命令{uchar dat;rst=0;sck=0;rst=1;DS1302WriteByte(cmd);//传输地址dat=DS1302ReadByte();//读取要得到的时间/日期sck=1;rst=0;return dat;}void DS1302Write(uchar cmd,uchar dat)//写命令{rst=0;sck=0;rst=1;DS1302WriteByte(cmd);//传输地址DS1302WriteByte(dat);//写入时间/日期sck=1;rst=0;}void Init_DS1302(void)//初始化{DS1302Write(0x8e,0x00);//写保护关DS1302Write(DS1302_SECOND_WRITE,0x55);//初始秒值DS1302Write(DS1302_MINUTE_WRITE,0x59);//初始分钟DS1302Write(DS1302_HOUR_WRITE,0x23);//初始为24小时模式初始时间为DS1302Write(DS1302_DAY_WRITE,0x02);//20xx年x月x日星期xDS1302Write(DS1302_MONTH_WRITE,0x03);DS1302Write(DS1302_YEAR_WRITE,0x16);DS1302Write(DS1302_WEEK_WRITE,0x03);DS1302Write(0x90,0x01);//充电DS1302Write(0xc0,0xf0);//初始化一次标示DS1302Write(0x8e,0x80);}void Split_display(unsigned char address)//取数显示{unsigned char i;i=DS1302Read(address);i=i/16+'0';Write_data(i);//显示十位Delayms(3);i=DS1302Read(address);i=i%16+'0';Write_data(i);//显示个位Delayms(5);}void Dispaly_shi()//显示时间{Write_com(0x84);Split_display(DS1302_HOUR_READ);//显示小时Write_data(Chinese_1[2]);//显示“:”Delayms(3);Split_display(DS1302_MINUTE_READ);//显示分钟Write_data(Chinese_1[2]);Delayms(3);Split_display(DS1302_SECOND_READ);//显示秒Delayms(3);Delayms(50);}void Display_nian()//显示年月日{uchar i;Write_com(0x82);Delayms(100);Write_com(0x82);Delayms(100);Write_data('2');Delayms(5);Write_data('0');Delayms(1);Split_display(DS1302_YEAR_READ);//显示年份Write_data(Chinese_1[0]);//显示“-”Delayms(3);Split_display(DS1302_MONTH_READ);//显示月份Write_data(Chinese_1[0]);Delayms(3);Split_display(DS1302_DAY_READ);//显示日期Write_data(Chinese_1[1]);Delayms(3);Write_data(Chinese_1[1]);Delayms(3);i=DS1302Read(DS1302_WEEK_READ);//显示星期i=i%16+'0';Write_data(i);Delayms(3);Write_com(0x82);Delayms(50);}void inter0() interrupt 0//按键中断1{ji = ji+1;if(ji%2 == 0)Write_com(0x0c);elseWrite_com(0x08);}void inter2() interrupt 2//按键中断2{unsigned char k,j,i,b;//Delayms(500);while(INT1!=1);b = Read_com();b = ACC & 0x7f;Write_com(0x01);Dispaly_shi();EA = 0;EX0=0;EX1=0;k=DS1302Read(DS1302_SECOND_READ);while(INT1){Write_com(0x8a);Write_com(0x0f);if(INT0==0){Delayms(10);if(INT0==0){if(k<0x59){ACC = k;#pragma asmadd a,#1da a#pragma endasmk = ACC;}else{DS1302Write(DS1302_SECOND_WRITE,k);while(k!=0){ k=DS1302Read(DS1302_SECOND_READ);}Write_com(0x01);Dispaly_shi();}Write_com(0x8a);i=k/16+'0';j=k%16+'0';Write_data(i);Delayms(3);Write_data(j);while(!INT0);}}}while(!INT1);DS1302Write(DS1302_SECOND_WRITE,k);Write_com(0x0c);Write_com(0x01);if(jiao==0){ Dispaly_shi();}else {Display_nian();}Write_com(b);EA = 1;EX0=1;EX1=1;}void main(){uchar i;write = 0;Delayms(50);IT0=1;IT1=1;EX0=1;EX1=1;EA=1;init_lcd();Init_DS1302();while(1){Write_com(0x01);for(i=9;i>0;i--)Dispaly_shi();Write_com(0x01);for(i=9;i>0;i--)Display_nian();Delayms(50);};}2、参考文献郭文川. MCS-51单片机原理、接口及应用电子工业出版社2013.01 吴国凤、宣善立. C/C++程序设计高等教育出版社2009.09江思敏、陈明Protel电路设计教程清华大学出版社2006.12莫名到奇妙. DS1302中文资料,带源代码百度文库2012.5.10 wubanwudi. 超详细的ds1302使用说明及其例程百度文库2011.08.10。

相关主题