单片机课程设计之智能电子钟.docx
- 文档编号:24525887
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:36
- 大小:562.17KB
单片机课程设计之智能电子钟.docx
《单片机课程设计之智能电子钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之智能电子钟.docx(36页珍藏版)》请在冰豆网上搜索。
单片机课程设计之智能电子钟
题目:
智能电子钟
学生姓名
专业
班级
指导教师
成绩
工程技术学院
2016年3月
一、系统设计容1
1.1设计要求:
1
1.2可实现的具体功能:
1
二、总体设计2
2.1DS1302简介2
2.2LCDl602简介3
2.3AT89C51单片机简介3
三、硬件设计4
3.1原理图4
3.2PCB板丝印层4
3.3PCB板底层4
四、软件设计流程4
4.1总体设计4
4.2主程序流程图5
4.3显示流程图5
4.4DS1302读取流程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)计时精度:
误差w1秒/月(具有微调设置);
(7)键盘采用动态扫描方式查询。
所有的查询、设置功能均由功能键K1、K2完成。
本设计采用市场上流行的时钟芯片DS1302进行制作。
1.2可实现的具体功能:
智能电子钟的原理主要由4部分组成:
(1)单片机的外围设备,即单片机最小系统,此部分是保证单片机正常工作的必要部分;
(2)显示部分:
LCD显示,即显示年、月、星期、日、时、分、秒等;
(3)时钟芯片DS1302,DS1302是DALLAS公式推出的涓流充电时钟芯片,含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。
实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力;
(4)按键部分:
按键实现开关显示屏对时钟时间的微调,开关键在正常显示模式下按下开火关LCD显示;模式键:
可切换到时间调整界面,再按一次退出,此时开关屏键实现对
秒的加一操作。
二、总体设计
图2.1设计方案框图
2.1DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V〜5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302部有一个31X8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
图2.2DS1302芯片
7^7
xir
2
1
JSCLK
X2[
3
6
GND匸
4
5
]R5T
DS1302
8-PiiiDIPGOO-Mil)
□NDC
39
21
"IP2.0AS.
2.2LCD1602简介
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
2.3AT89C51单片机简介
AT89C51(如图所示)是一种带4K字节闪烁可编程可擦除只读存储器
(FPEROM—FalshProgrammableandErasableReadOnlyMemory)
的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案
22pF
VCC
VCC
B1*
3V
2
8
29
30
■31
RST
PSEN
ALE
EA
P0.5/AD5
P0.7/AD7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
33
32
21
22
23
24
25
26
28
三、硬件n设计
丄X2
I32.768kHz
3.勺原理图
30uFWD1
RST
SCLK
I/O
WD1100-11
3.2PCB板丝印层
■2
P1.0/T2P1.1/T2EX
P3.0/RXDP3.1/TXD
10
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
89C51
£亡肖a弧pn
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/TI
P3.6/WR
P3.7/RD
13
14
16
17
J
87
6£
54
32
1
1
[)
91
34
5
RP1
RESPACK4
JVCC
K1
鑒:
!
!
:
=■■=薫疆聽:
:
:
:
4.2主程序流程图
4.3显示流程图
清屏
设定光标位置
从DS1302读取要显
示的值
将读取的BCD码拆
分送LCD显示
4.4DS1302读取流程
SZ
设定DS1302为读
状态
2
写字节写入要读取
的值所在地址
读字节读出数据
返回数据
4.5外部中断0流程
sz
4.6外部中断1流程
等待按键释放
2
记录此时光标位置
五、仿真效果图
日期时间交替显示:
EEEEpnPDFVE
鬥IFh?
心
Fl*TD
巧汁
町邑価
P:
切
补iM氏匸丄的
峠討刖
4
08
00v25
£M_
■乂
nr5P*j:
K-i
LLrUl
LIMC3L
HVZPIMiRH知耳
陀二ifi]
-■^**12
Ml
uCtlXKX3
L
KL<
VO
闪他邯
即gAKp鬥ITi*3-ViTTsEiJuflm
P1 sm町島5Pl-flB 关屏 A GHnnsea RPt rr5P*r»? -i a-1754£^0T. hEHptplm叭可 LUJ1 U¥I=IL hb-•-一- EG EHBEGEB F '■ 叭TP”価H-厕 时间调整 六、总结与体会 历经一个星期的设计、修改、调试,最终,我们得到了想要的结果,感受成功之喜悦,但这并不意味着我们做得很好,相反,在这当中暴露出了我们在各个方面许许多多的问题,学到许多的同时感触也很深厚。 在硬件设计时,通过对需要系统的分析,单元模块的设计,元件的选取等,使我们了解到平时所学单片机课程的实用价值,以及设计过程中的大局协调、取舍、分析能力的培养。 在编程以及仿真时,充分将单片机原理的知识学以致用,既是对我们单片机基础知识的考验,又是对我们灵活运用及创新能力的检验;既考验我们的学习能力,又考验逻辑思维技巧;既体现了个人对课程设计的灵思妙想,又培养了团队之间的合作能力。 我们能够很好地完成这次课设,离不开在科学研究上实事的工作原则、一丝不苟的工作态度、勤于思考的工作方法、百折不饶的工作精神和精益求精的工作作风,此外,最重要的就是团队之间相处和谐、分工明确。 在大家的共同努力下, 得到了满意的成果,更使我们明白团队合作的重要与便利。 最后,衷心感谢老师在这次设计中耐心给予的大量帮助,解决了我程序中存在的不少问题,并指导了我一些设计的思路,也令我明白自己的大量不足之处,受益匪浅。 附录 1、程序 #include #include #defineucharunsignedchar #defineDS1302_SECOND_WRITE0x80 #defineDS1302_MINUTE_WRITE0x82 #defineDS1302_HOUR_WRITE0x84 #defineDS1302_DAY_WRITE0x86 #defineDS1302_WEEK_WRITE0x8a #defineDS1302_MONTH_WRITE0x88 #defineDS1302_YEAR_WRITE0x8c #defineDS1302_PROTECT_WRITE0x8e #defineDS1302_SECOND_READ0x81 #defineDS1302_MINUTE_READ0x83 #defineDS1302_HOUR_READ0x85 #defineDS1302_DAY_READ0x87 #defineDS1302_WEEK_READ0x8b #defineDS1302_MONTH_READ0x89 #defineDS1302_YEAR_READ0x8dsbitIcden=P2A2; sbitIcdrs=P2A0; sbitwrite=P2A1; sbitsck=P1A6;//时钟 sbitio=P1A7;//数据 sbitrst=P1A5;//DS1302复位 unsignedcharChinese_1[3]={0x2d,0x20,0x3a};//“-”“” 一二三四五六天 定义光标移动的位置 unsignedcharChinese_2[7]={0x31,0x32,0x33,0x34,0x35,0x36,0x37};// //unsignedcharCursor[6]={0x81,0x83,0x85,0x90,0x92,0x94};// unsignedcharnum=0; unsignedintji=0; unsignedintjiao=0; voidDeIayms(unsignedintz)//延时 { unsignedintx,y; for(x=z;x>0;x--) for(y=115;y>0;y--); } //Icd子程序 voidWrite_(unsignedchar)//写命令 { Icdrs=0; P0=; DeIayms(5); Icden=1; Delayms(5); lcden=0; 写数据 } voidWrite_data(unsignedchardat)// { lcdrs=1; P0=dat; Delayms(5); lcden=1; Delayms(5); lcden=0; } unsignedcharRead_()//读命令 { unsignedchar; write=1; lcdrs=0; lcden=1; =P0; Delayms(5); write=0; lcdrs=0; lcden=0; return; } voidinit_lcd()//lcd初始化 { lcden=0; Write_(0x38); Write_(0x0c); Write_(0x06); Write_(0x01); Write_(0x80); } //ds1302子程序 voidDS1302WriteByte(uchardat)//写字节 { uchari; sck=0; Delayms (2); for(i=0;i<8;i++) { io=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的 Delayms (2); sck=1; Delayms (2); sck=0; dat>>=1; } } ucharDS1302ReadByte()//读字节 { uchari,dat; Delayms (2); for(i=0;i<8;i++) { dat>>=1; if(io==1)//当数据线为高时,证明该位数据为1 dat|=0x80;//要传输数据的当前值置为1,若不是,则为0sck=1; Delayms (2); sck=0; Delayms (2); } returndat; 读命令 传输地址 读取要得到的时间/日期 } ucharDS1302Read(ucharcmd)// { uchardat; rst=0; sck=0; rst=1; DS1302WriteByte(cmd);// dat=DS1302ReadByte();// sck=1; rst=0;returndat; } voidDS1302Write(ucharcmd,uchardat)//写命令 { rst=0; sck=0; rst=1; DS1302WriteByte(cmd);//传输地址 DS1302WriteByte(dat);//写入时间/日期 sck=1; rst=0; } voidInit_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日星期x DS1302Write(DS1302_MONTH_WRITE,0x03); DS1302Write(DS1302_YEAR_WRITE,0x16); DS1302Write(DS1302_WEEK_WRITE,0x03); DS1302Write(0x90,0x01);//充电 DS1302Write(0xc0,0xf0);//初始化一次标示 DS1302Write(0x8e,0x80); } voidSplit_display(unsignedcharaddress)//取数显示 { unsignedchari; i=DS1302Read(address); i=i/16+'0'; Write_data(i);//显示十位 Delayms(3); i=DS1302Read(address);i=i%16+'0'; Write_data(i);//显示个位 Delayms(5); } voidDispaly_shi()//显示时间 { Write_(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); } 显示小时 显示分钟 显示秒 voidDisplay_nian()//显示年月日 { uchari; Write_(0x82); Delayms(100); Write_(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_(0x82); Delayms(50); } voidinter0()interrupt0//按键中断1 { ji=ji+1; if(ji%2==0) Write_(0x0c); else Write_(0x08); } voidinter2()interrupt2//按键中断2 { unsignedchark,j,i,b; //Delayms(500); while(INT1! =1); b=Read_(); b=ACC&0x7f; Write_(0x01); Dispaly_shi(); EA=0; EX0=0;EX1=0;k=DS1302Read(DS1302_SECOND_READ); while(INT1) { Write_(0x8a); Write_(0x0f); if(INT0==0) { Delayms(10);if(INT0==0) { if(k<0x59) { ACC=k; #pragmaasmadda,#1daa #pragmaendasmk=ACC; else { DS1302Write(DS1302_SECOND_WRITE,k); while(k! =0) {k=DS1302Read(DS1302_SECOND_READ);} Write_(0x01); Dispaly_shi(); } Write_(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_(0x0c); Write_(0x01); if(jiao==0) {Dispaly_shi();} else{Display_nian();} Write_(b); EA=1; EX0=1;EX1=1; } voidmain() { uchari; write=0; Delayms(50); IT0=1;IT1=1; EX0=1;EX1=1; EA=1; init_lcd(); Init_DS1302(); while (1) { Write_(0x01); for(i=9;i>0;i--) Dispaly_shi(); Write_(0x01); for(i=9;i>0;i--) Display_nian(); Delayms(50); }; } 2、参考文献 郭文川.MCS-51单片机原理、接口及应用电子工业出版社2013.01吴国凤、宣善立.C/C++程序设计高等教育出版社2009.09江思敏、明Protel电路设计教程清华大学出版社2006.12莫名到奇妙.DS1302中文资料,带源代码XX文库2012.5.10 wubanwudi. 超详细的ds1302使用说明及其例程XX文库2011.08.10 指导教师评语: 成绩评定: 指导教师:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 智能 电子钟