基于单片机的电子万年历的设计论文Word文件下载.docx
- 文档编号:17187916
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:26
- 大小:530.38KB
基于单片机的电子万年历的设计论文Word文件下载.docx
《基于单片机的电子万年历的设计论文Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子万年历的设计论文Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
PPT制作及实训报告
兰小玲:
视屏录制
三、实训选题分析(主要完成对选题的功能分析,注重原理阐述;
如何细化功能模块,软、硬件电路设计的设计思路)
功能分析:
电子万年历加闹钟就是实用单片机加上一个时钟芯片DS1302和几个与门芯片构成一个可调节年月日时分秒,以及能够读取当前时间的一个电路和闹钟功能。
实现我们日常生活中的日历的作用。
硬件设计由于电路程序复杂,本电路采用89c52单片机作为控制核心,它具有在线编程功能,低功耗,能在3V超低压工作;
时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5V-5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个用于临时存放数据的RAM寄存器。
可产生年、月、日、时、分、。
以及通过与门芯片和按键开关来实现
年月日时分秒可调。
具体框架结构图如下:
四、方案设计(最少要提出两种不同的方案,并比较两种方案在设计、实现细节方面的差异和优劣,确定实训最终选定方案)
方案一:
采用AT89C51芯片作为硬件核心,内部具有4KBROM存储空间,能于3V的超低电压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术。
显示部分采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机相连接时,占用的单片机口线少,但所需要的数码管数量太多,焊接困难极易出错,所以不采用LED数码管作为显示。
直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒技术,调节部分使用与门芯片和按键开关进行调节。
实现对年月日时分秒的调节与设定。
方案二:
采用STC89C52芯片,它能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KBROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏.采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。
采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM作为数据暂存区,工作电压2.5V-5.5V范围内,2.5V时耗电小于300Ma。
调节部分使用与门芯片和按键开关进行调节。
最后,我们采用方案二STC89C52单片机实时时钟芯片DS1302显示使用LCD1602液晶显示屏,并设置了5个按键,每个按键分别标号为KEY1,KEY2,KEY3,KEY4.KEY5.按下KEY1,选择调节的对象,key2,key3键为加减键,key4为确定键,key5键为闹钟设置键。
五、方案实现(根据选定的方案,给出每一功能模块具体的实现细节,所选用的具体芯片介绍,得到的硬件电路和相应的函数模块)
单片机芯片的选择和方案论证
采用AT89C52芯片,它能以3V的超低电压工作,同时也与MCS-51系列单片机完全兼容,该芯片内部存储器为8KBROM存储空间,同时具有89C51的功能,且具有在线编程可擦除技术,。
P1口有两个作用,一个接上DS1302的AD0-AD7(双向地址/数据复用总线),控制着DS1302的8位并行数据的地址和数据的传输,另接上液晶的DB0-DB7(数据总线)控制着向液晶发送8位并行数据。
P1.1接上DS1302的单数据线,发送并接受数据,地址的操作。
P3.0到P3.3作为独立按键口。
P2.4口为液晶的数据/命令选择端,1为数据,二为命令,P2.1口控制液晶读/写选择端,1为读命令,0为写操作,P2.0口控制液晶使能信号。
对DS1302:
P2.0口控制DS1302的片选信号的输入(CS),P2.1口控制地址选通输入(AS),P2.2口为读写输入(R/W),P1.7接入闹钟,到设置时间到了,led灯闪烁。
时钟电路模块的设计
图示为DS1302的引脚排列,其中VCC1为后备电源,VCC2为主电源,在主电源关闭的情况下,也能保持时钟的连续运行,DS1302由VCC1或VCC2两者中的较大者供电,当VCC2大于VCC1+0.2V时,VCC2给DS1302供电,当VCC2小于VCC1时候VCC1供电。
X1和X2是振荡源,外接32.768KHz晶振,RST是复位片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段,当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作,如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态,上电运行时,在VCC大于等于2.5V之前,RST必须保持低电平,中有在SCLK为低电平时,才能将RST置为高电平,I/O为串行数据输入端,SCLK始终是输入端。
工作原理如下:
(1)时钟芯片DS1302的工作原理:
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;
读/写时序如下图4所示。
图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。
对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。
位1至位5指操作单元的地址。
位0是读/写操作位,进行读操作时,该位为1;
该位为0则表示进行的是写操作。
控制字节总是从最低位开始输入/输出的。
表6为DS1302的日历、时间寄存器内容:
“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;
当该位为0时,时钟开始运行。
“WP”
是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。
当“WP”为1时,写保护位防止对任一寄存器的写操作。
(2)DS1302的控制字节
DS1302的控制字如表1所示。
控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;
最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出
表1DS1302的控制字格式
RAMRD
1A4A3A2A1A0
/CK/WR
(3)数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
如图5所示:
图5DS1302读/写时序图
闹钟模块
对时间进行设定,时间到了。
Led灯闪烁。
闹钟模块的接线如图所示,
3.2.5按键部分
按键部分如上图所示,本设计总的用了5个按扭开关作为键盘,其中一个是闹钟确定键,另4个中的其中两个是调整时间增加、减少的键,第一个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间,另外一个是确定键。
液晶显示部分
液晶显示模块如上图所示,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,本设计采用16列*2行的字符型LCD1602带背光的液晶显示屏。
六、仿真电路图
七、程序设计过程(介绍程序设计的算法思想、并介绍主要模块的功能及实现,用自顶向下的设计思路完成程序功能的分解)
1基于DS1302的电子万年历设计系统主程序设计该系统的主程序包含了液晶模块初始化、DS1302时钟控制模块初始化、定时器T0初始化、时钟程序和中断程序。
2液晶模块初始化程序首先产生一个让LCD复位的低电平脉冲,复位后再使能LCD。
初始化中主要设置LCD模式、偏置电压、显示模式和清屏。
3.DS1302时钟控制模块初始化程D1302时钟模块的初始化主要是往DS1302中写数据定时器T0初始化程序定时器T0的初始化主要设置定时器的操作模式、启动方式。
设置定时器的值及采用中断方式。
设置完成后,启动定时器工作。
4时钟程序和中断程序钟程序主要包含了键盘控制程序和时钟显示程序液晶显示模块液晶显示主要显示四行,第一行采用显示当前日期,格式为年
月日星期。
第二行显示闹钟的时间,格式为时:
分:
秒。
闹钟部分采用了led灯闪烁来显示闹钟的到来。
程序如下:
#include<
reg52.h>
#include<
string.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitSDA=P1^0;
//DS1302数据线
sbitCLK=P1^1;
//DS1302时钟线
sbitRST=P1^2;
//DS1302复位线
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitK1=P3^4;
//选择
sbitK2=P3^5;
//加
sbitK3=P3^6;
//减
sbitK4=P3^7;
//确定
sbitK5=P3^0;
//闹钟确定
sbitK6=P3^0;
//闹钟设置
sbitbeep=P1^7;
voidDisplay_LCD_String(ucharp,uchar*s);
uchartCount=0;
//一年中每个月的天数,2月的天数由年份决定
ucharMonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
uchar*WEEK[]={"
SUN"
"
MON"
TUS"
WEN"
THU"
FRI"
SAT"
};
//周日,周一到周六
ucharLCD_DSY_BUFFER1[]={"
Date00-00-00"
//LCD显示缓冲
ucharLCD_DSY_BUFFER2[]={"
Time00-00-00"
ucharALARM_TIME_BUFFER[]={"
"
//闹钟时分位保存
ucharDateTime[7];
//所读取的日期时间
charAdjust_Index=-1;
//当前调节的时间:
秒,分,时,日,
ucharChange_Flag[]="
-MHDM-Y"
;
ucharRead_LCD_State();
voidLCD_Busy_Wait();
voidWrite_LCD_Data(uchardat);
voidWrite_LCD_Command(ucharcmd);
voidInit_LCD();
voidSet_LCD_POS(ucharp);
voidDelayMS(uintx)
{uchari;
while(x--)for(i=0;
i<
120;
i++);
}
ucharRead_LCD_State()
{ucharstate;
RS=0;
RW=1;
EN=1;
DelayMS
(1);
state=P0;
EN=0;
returnstate;
voidLCD_Busy_Wait()
{while((Read_LCD_State()&
0x08)==0x80);
DelayMS(5);
}
voidWrite_LCD_Data(uchardat)//写数据
{LCD_Busy_Wait();
RS=1;
RW=0;
P0=dat;
voidWrite_LCD_Command(ucharcmd)//写命令
{
LCD_Busy_Wait();
P0=cmd;
voidInit_LCD()//LCD初始化
Write_LCD_Command(0x38);
Write_LCD_Command(0x01);
Write_LCD_Command(0x06);
Write_LCD_Command(0x0C);
Display_LCD_String(0x00,"
zhongzhoudaxue"
);
DelayMS(1000);
Display_LCD_String(0x40,"
dianzirili"
voidSet_LCD_POS(ucharp)
Write_LCD_Command(p|0x80);
voidDisplay_LCD_String(ucharp,uchar*s)
uchari;
Set_LCD_POS(p);
for(i=0;
16;
i++)
{
Write_LCD_Data(s[i]);
DelayMS
(1);
/*--------------------------
向DS1302写入一字节
---------------------------*/
voidDS1302_Write_Byte(ucharx)
8;
SDA=x&
1;
CLK=1;
CLK=0;
x>
>
=1;
/*-------------------------------
从DS1302读取一字节
--------------------------------*/
ucharDS1302_Read_Byte()
uchari,b,t;
for(i=0;
b>
t=SDA;
b|=t<
<
7;
CLK=1;
CLK=0;
}
returnb/16*10+b%16;
从DS1302指定位置数据
ucharRead_Data(ucharaddr)
uchardat;
RST=0;
RST=1;
DS1302_Write_Byte(addr);
dat=DS1302_Read_Byte();
returndat;
向DS1302某地址写入数据
voidWrite_DS1302(ucharaddr,uchardat)
DS1302_Write_Byte(dat);
/*------------------------------------
设置时间
------------------------------------*/
voidSET_DS1302()
uchari;
Write_DS1302(0x8e,0x00);
Write_DS1302(0x80+2*i,(DateTime[i]/10<
4|(DateTime[i]%10)));
Write_DS1302(0x8e,0x80);
读取当前时期时间
voidGetTime()
{
DateTime[i]=Read_Data(0x81+2*i);
时间和日期转换成数字字符
voidFormat_DateTime(uchard,uchar*a)
a[0]=d/10+'
0'
a[1]=d%10+'
判断是否为闰年
ucharisLeapYear(uinty)
return(y%4==0&
&
y%100!
=0)||(y%400==0);
星期转换
voidRefreshWeekDay()
uinti,d,w=5;
for(i=2000;
2000+DateTime[6];
d=isLeapYear(i)?
366:
365;
w=(w+d)%7;
d=0;
for(i=1;
DateTime[4];
i++)d+=MonthsDays[i];
d+=DateTime[3];
DateTime[5]=(w+d)%7+1;
年月日时分秒++/--
voidDateTime_Adjust(charx)
switch(Adjust_Index)
case6:
//年
if(x==1&
DateTime[6]<
99)DateTime[6]++;
if(x==-1&
DateTime[6]>
0)DateTime[6]--;
MonthsDays[2]=isLeapYear(2000+DateTime[6])?
29:
28;
if(DateTime[3]>
MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();
break;
case4:
//月
DateTime[4]<
12)DateTime[4]++;
DateTime[4]>
1)DateTime[4]--;
case3:
//日
DateTime[3]<
MonthsDays[DateTime[4]])DateTime[3]++;
DateTime[3]>
0)DateTime[3]--;
case2:
//时
DateTime[2]<
23)DateTime[2]++;
DateTime[2]>
0)DateTime[2]--;
case1:
//秒
DateTime[1]<
59)DateTime[1]++;
DateTime[1]>
0)DateTime[1]--;
主程序
voidmain()
Init_LCD();
//LCD初始化
IE=0x83;
//允许INT0,T0中断
IP=0x01;
IT0=0x01;
TMOD=0x01;
TH0=-50000/256;
TL0=-50000%256;
TR0=1;
while
(1)
if(Adjust_Index==-1)GetTime();
定时器每秒刷新LCD显示
voidT0_INT()interrupt1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 万年历 设计 论文