单片机电子钟课设Word格式.docx
- 文档编号:18098415
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:33
- 大小:1,010.29KB
单片机电子钟课设Word格式.docx
《单片机电子钟课设Word格式.docx》由会员分享,可在线阅读,更多相关《单片机电子钟课设Word格式.docx(33页珍藏版)》请在冰豆网上搜索。
首先DS1302是DALLAS公司推出的涓流充电时钟芯片。
内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。
DS1302芯片广脚介绍:
X1、X2为32.768KHz晶振管脚。
GND为地。
RST复位脚。
I/O数据输入/输出引脚。
SCLK串行时钟。
Vcc1,Vcc2电源供电管脚。
DS1302_SCLK接P1^7;
实时时钟时钟线引脚
DS1302_IO接P1^0;
实时时钟数据线引脚
DS1302_RST接P1^5;
实时时钟复位线引脚
4、按键处理模块:
其中1号按键为模式调节键,2号按键为加1键,3号按键为减1键,4号按键为跳出模式键,与单片机连线如下:
1号键连接P3^0;
2号键连接P3^1;
3号键连接P3^2;
4号键连接P^3;
5、LCD显示模块:
液晶显示器是一种功耗极低的被动式显示器件,1602广脚介绍:
D0—D7数据传送引脚,VSS为接地线,VDD为电源线,VEE为LCD驱动电压调节,由此可以调节显示亮度。
RS为寄存器选择信号,高电平选择数据寄存器,低电平选择指令寄存器。
RW为读写控制信号,高电平读,低电平写。
EN使能信号,读状态下高电平有效,写状态下下降沿有效。
RS连接P2^0;
寄存器选择信号
RW连接P2^1;
读写控制信号线
EN连接P2^2;
使能信号线
6、DS18B20温度采集模块
DS18B20数字温度传感器接线方便,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信。
测温范围-55`C-+125`C,误差0.5`C。
使用方便,使用过程中不需要使用任何外围设备。
VCC接电源,GND接地,DQ为数据端接P1^0。
7.Proteus仿真结果:
8.实物图
四、设计结果性能分析
该设计电路系统较大,电路只要一出有错误就会对检测造成很大的不便,应该注意元器件的正确放置与安装及布线的合理以便于电路的检修和维护,为了减少复杂度,可以使用Protues进行仿真。
设计的功能虽然比较简单单程序还是较为复杂的,中间遇到了一些问题。
从性能来看,LCD能够正确的显示DS1302芯片上面的时间和日期;
其次,可以通过四个按键键对电子钟进行时间和日期的调整,并且具有时间记忆功能。
总之设计所要求的性能基本得到了实现。
五、实习心得体会
通过本次单片机课程设计,使我所学的知识能够得到实际的应用,过程中也发现自身所学的知识存在许多的不足和问题,当然同时也学到了不少宝贵的知识,提高了自己的动手实践能力。
在整个设计过程中从设计方案确定,到具体的电路仿真,最后到总体电路的连接构建以及程序的编写烧制,特别是程序的编写要求对LCD1602的初始化操作,指令和数据的操作都非常熟悉。
通过这次对数字钟的设计与制作让我了解了设计电路的程序也让我了解了关于数字钟的原理与设计理念要设计一个电路总要先用仿真仿真成功之后才实际接线的。
但是最后的成品却不一定与仿真时完全一样因为再实际接线中有着各种各样的条件制约着。
而且在仿真中无法成功的电路接法在实际中因为芯片本身的特性而能够成功。
所以在设计时应考虑两者的差异从中找出最适合的设计方法。
在这次实习中遇到了许多问题,但通过向老师同学请教都得到了解决。
通过这次课程设计,我知道了做任何事都要有一颗平常心,不要想着走捷径,要一步一个脚印才能取得最后成功,在此过程中更要注重自主学习,发挥自己的主管能动性。
总之这次课程设计试一次很好的锻炼,让我有了全方位的提高,受益匪浅,为我以后的工作学习打下了很好的基础,而且积累了丰富的经验。
六、参考文献
[1]张义和.例说51单片机[M].北京:
人民邮电出版社,2010年
[2]阎石编著数字电子技术基础(第五版)北京高等教育出版社]2006.1~550
[3]蔡明文冯先成主编单片机课程设计华中科技大学出版社2007.3
[4]陈明萤编著8051单片机课程设计实训教材清华大学出版社2004
[5]康华光编著模拟电子技术基础(第五版)高等教育出版社2006
[6]黄智伟编著全国大学生电子设计竞赛电路(第一版)航空航天大学出版社2006.36
七、程序清单
//***电子钟程序******
#include<
REG52.H>
#include"
LCD1602.H"
DS18B20.H"
DS1302.H"
#defineuintunsignedint
#defineucharunsignedchar
#defineTH35//设置温度上限
externunsignedcharweek_value[2],TempBuffer[5];
//声明外部变量
externinttemp_value;
charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year;
//秒,分,时到日,月,年位闪的计数
sbitSet=P3^0;
//模式切换键
sbitUp=P3^1;
//加法按钮
sbitDown=P3^2;
//减法按钮
sbitout=P3^3;
//立刻跳出调整模式按钮
sbitdeng=P1^1;
chardone,count,temp,flag,up_flag,down_flag;
charSD=1;
voidshow_time();
//液晶显示函数声明
//*********延时子程序***************
voidmdelay(uintdelay)
{uinti;
for(;
delay>
0;
delay--)
{for(i=0;
i<
62;
i++)//1ms延时.
{;
}
}
//*****升序按键*********
voidUpkey()
{
Up=1;
if(Up==0)
{
mdelay(8);
switch(count)
{case1:
temp=Read1302(DS1302_SECOND);
//读取秒数
temp=temp+1;
//秒数加1
up_flag=1;
//数据调整后更新标志
if((temp&
0x7f)>
0x59)//超过59秒,清零
temp=0;
break;
case2:
temp=Read1302(DS1302_MINUTE);
//读取分数
//分数加1
if(temp>
0x59)//超过59分,清零
temp=0;
case3:
temp=Read1302(DS1302_HOUR);
//读取小时数
//小时数加1
0x23)//超过23小时,清零
case4:
temp=Read1302(DS1302_WEEK);
//读取星期数
//星期数加1
0x7)
temp=1;
case5:
temp=Read1302(DS1302_DAY);
//读取日数
//日数加1
0x31)
case6:
temp=Read1302(DS1302_MONTH);
//读取月数
//月数加1
0x12)
case7:
temp=Read1302(DS1302_YEAR);
//读取年数
//年数加1
0x85)
default:
break;
}
while(Up==0);
//*******降序按键**********
voidDownkey()
Down=1;
if(Down==0)
temp=temp-1;
//秒数减1
down_flag=1;
if(temp==0x7f)//小于0秒,返回59秒
temp=0x59;
//分数减1
if(temp==-1)
//小于0秒,返回59秒
//小时数减1
temp=0x23;
//星期数减1
if(temp==0)
temp=0x7;
;
//日数减1
temp=31;
//月数减1
temp=12;
//年数减1
temp=0x85;
while(Down==0);
//*******模式选择按键******
voidSetkey()
{
Set=1;
if(Set==0)
{
mdelay(8);
count=count+1;
//Setkey按一次,count就加1
done=1;
//进入调整模式
while(Set==0);
}
//*******跳出调整模式,返回默认显示****
voidoutkey()
{ucharSecond;
out=1;
if(out==0)
{
count=0;
hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;
Second=Read1302(DS1302_SECOND);
Write1302(0x8e,0x00);
//写入允许
Write1302(0x80,Second&
0x7f);
Write1302(0x8E,0x80);
//禁止写入
done=0;
while(out==0);
}
//*******按键功能执行*********
voidkeydone()
if(flag==0)//关闭时钟,停止计时
{Write1302(0x8e,0x00);
temp=Read1302(0x80);
Write1302(0x80,temp|0x80);
Write1302(0x8e,0x80);
flag=1;
Setkey();
//扫描模式切换按键
switch(count)
{case1:
do//count=1,调整秒
outkey();
//扫描跳出按钮
Upkey();
//扫描加按钮
Downkey();
//扫描减按钮
if(up_flag==1||down_flag==1)//数据更新,重新写入新的数据
{
Write1302(0x8e,0x00);
Write1302(0x80,temp|0x80);
//写入新的秒数
Write1302(0x8e,0x80);
up_flag=0;
down_flag=0;
hide_sec++;
//位闪计数
if(hide_sec>
3)
hide_sec=0;
show_time();
//液晶显示数据
}while(count==2);
case2:
do//count=2,调整分
outkey();
if(temp>
0x60)
temp=0;
if(up_flag==1||down_flag==1)
Write1302(0x82,temp);
//写入新的分数
hide_min++;
if(hide_min>
hide_min=0;
}while(count==3);
case3:
do//count=3,调整小时
hide_min=0;
Write1302(0x84,temp);
//写入新的小时数
hide_hour++;
if(hide_hour>
hide_hour=0;
}while(count==4);
case4:
do//count=4,调整星期
hide_hour=0;
Write1302(0x8a,temp);
//写入新的星期数
hide_week++;
if(hide_week>
hide_week=0;
}while(count==5);
case5:
do//count=5,调整日
Write1302(0x86,temp);
//写入新的日数
hide_day++;
if(hide_day>
hide_day=0;
}while(count==6);
case6:
do//count=6,调整月
hide_day=0;
Write1302(0x88,temp);
//写入新的月数
hide_month++;
if(hide_month>
hide_month=0;
}while(count==7);
case7:
do//count=7,调整年
hide_month=0;
Write1302(0x8c,temp);
//写入新的年数
hide_year++;
if(hide_year>
hide_year=0;
}while(count==8);
case8:
hide_year=0;
//count8,跳出调整模式,返回默认显示状态
done=0;
break;
//count=7,开启中断,标志位置0并退出
default:
//******液晶显示程序******
voidshow_time()
DS1302_GetTime(&
CurrentTime);
//获取时钟芯片的时间数据
TimeToStr(&
//时间数据转换液晶字符
DateToStr(&
C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子钟