单片机课程设计之智能电子钟.docx
- 文档编号:8293690
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:22
- 大小:616.38KB
单片机课程设计之智能电子钟.docx
《单片机课程设计之智能电子钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计之智能电子钟.docx(22页珍藏版)》请在冰豆网上搜索。
单片机课程设计之智能电子钟
单片机课程设计
题 目:
智能电子钟
学生姓名
专业
班级
指导教师
成绩
工程技术学院
2016年3月
智能电子钟(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显示;模式键:
可切换到时间调整界面,再按一次退出,此时开关屏键实现对秒的加一操作。
二、总体设计
AT89C51
时钟芯片
DS1302
按键
LCD
显示电路
图2.1设计方案框图
2.1DS1302简介
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
图2.2DS1302芯片
2.2LCDl602简介
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
2.3AT89C51单片机简介
AT89C51(如图所示)是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
三、硬件设计
3.1原理图
3.2PCB板丝印层
3.3PCB板底层
4、软件设计流程
4.1总体设计
在整个程序运行过程中,总体上可分为以下几方面:
4.2主程序流程图
4.3显示流程图
4.4DS1302读取流程
4.5外部中断0流程
4.6外部中断1流程
5、仿真效果图
日期时间交替显示:
关屏
时间调整
六、总结与体会
历经一个星期的设计、修改、调试,最终,我们得到了想要的结果,感受成功之喜悦,但这并不意味着我们做得很好,相反,在这当中暴露出了我们在各个方面许许多多的问题,学到许多的同时感触也很深厚。
在硬件设计时,通过对需要系统的分析,单元模块的设计,元件的选取等,使我们了解到平时所学单片机课程的实用价值,以及设计过程中的大局协调、取舍、分析能力的培养。
在编程以及仿真时,充分将单片机原理的知识学以致用,既是对我们单片机基础知识的考验,又是对我们灵活运用及创新能力的检验;既考验我们的学习能力,又考验逻辑思维技巧;既体现了个人对课程设计的灵思妙想,又培养了团队之间的合作能力。
我们能够很好地完成这次课设,离不开在科学研究上实事求是的工作原则、一丝不苟的工作态度、勤于思考的工作方法、百折不饶的工作精神和精益求精的工作作风,此外,最重要的就是团队之间相处和谐、分工明确。
在大家的共同努力下,得到了满意的成果,更使我们明白团队合作的重要与便利。
最后,衷心感谢老师在这次设计中耐心给予的大量帮助,解决了我程序中存在的不少问题,并指导了我一些设计的思路,也令我明白自己的大量不足之处,受益匪浅。
附录
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_READ0x8d
sbitlcden=P2^2;
sbitlcdrs=P2^0;
sbitwrite=P2^1;
sbitsck=P1^6;//时钟
sbitio=P1^7;//数据
sbitrst=P1^5;//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;
voidDelayms(unsignedintz)//延时
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
//lcd子程序
voidWrite_com(unsignedcharcom)//写命令
{
lcdrs=0;
P0=com;
Delayms(5);
lcden=1;
Delayms(5);
lcden=0;
}
voidWrite_data(unsignedchardat)//写数据
{
lcdrs=1;
P0=dat;
Delayms(5);
lcden=1;
Delayms(5);
lcden=0;
}
unsignedcharRead_com()//读命令
{
unsignedcharcom;
write=1;
lcdrs=0;
lcden=1;
com=P0;
Delayms(5);
write=0;
lcdrs=0;
lcden=0;
returncom;
}
voidinit_lcd()//lcd初始化
{
lcden=0;
Write_com(0x38);
Write_com(0x0c);
Write_com(0x06);
Write_com(0x01);
Write_com(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,若不是,则为0
sck=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_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);
}
voidDisplay_nian()//显示年月日
{
uchari;
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);
}
voidinter0()interrupt0//按键中断1
{
ji=ji+1;
if(ji%2==0)
Write_com(0x0c);
else
Write_com(0x08);
}
voidinter2()interrupt2//按键中断2
{
unsignedchark,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;
#pragmaasm
adda,#1
daa
#pragmaendasm
k=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;
}
voidmain()
{
uchari;
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中文资料,带源代码XX文库2012.5.10
wubanwudi.超详细的ds1302使用说明及其例程XX文库2011.08.10
指导教师评语:
成绩评定:
指导教师:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 智能 电子钟