单片机课设论文
单片机原理课程设计报告
电子日历时钟
院 (系): 计算机与控制学院
专 业: 自 动 化
学生学号: 0700320323
学生姓名: 唐光磊
指导教师: 李 平
2010年1月 19
课程名称:
日
摘要:
单片机技术是一门应用性很强的专业课,其理论与实践技能是从事机电类专
业技术工作的人员所不可少的。本次程设计是选择STC89C51为核心控制元件,DS1302做定时芯片,LCD1602作为显示芯片,蜂鸣器进行报时的电子时钟系统,实现日期和时间显示和修改,可以扩展报时功能和定时功能。
其主要的特色:5V电源供电,用DS1302作为定时芯片,时间准确,精度高;用LCD1602显示日历,时间,清晰醒目,在断电的情况下,DS1302可以通过3V蓄电池供电,保持时间的连续,本课设为了方便制作有的电容代替蓄电池,蜂鸣器可用于正点报时和闹钟定时,时间可以设置。经过实践证明,本系统运行稳定,具有一定的实用价值。
关键词:电子日历时钟 单片机 DS1302 LCD1602
引言:电子时钟具有计时精度高、字形显示清晰等特点。可同时显示时分秒
或时分日和星期信息,抗震性好,电压适应性强,安装方便等特点,应用于日常生活。
为了实现电子时钟的功能,选择单片机作为微处理器,DS1302用于定时,LCD1602作为显示芯片。
目录
一、系统设计方案···················································
1.1 电子日历时钟介绍············································· 1.2 芯片介绍····················································· 1.2.1单片机的特点·············································· 1.2.2 DS1302功能介绍及编程模式································· 1.2.3 LCD1602功能介绍及编程模式································
二、硬件电路分析与设计··············································
2.1 原理图····················································· 2.2 仿真图······················································ 2.3 PCB图······················································ 2.4 实物图······················································
三、程序清单························································
四、设计总结························································
五、参考文献························································
一、 系统方案 1.1电子日历时钟介绍
使用STC89C51单片机从DS1302内部提取日期和时间数据,驱动LCD1602进行显示。闹钟的数据存储于单片机内部的寄存器当中。修改时间要将修改后的数据写入DS1302中在进行显示,定时时驱动蜂鸣器响。
1.2芯片介绍
1.2.1单片机的特点
STC89C51可以代替AT89C51,功能更强,速度更快,寿命更长,价格更低。 外型:40个引脚,双列直插DIP-40。
STC89C51可以完成ISP在线编程功能,而AT89C51则不能。
将程序直接烧录到STC89C51中后,STC89C51就可以代替AT89C51直接工作(一般都不需要做任何改动即可正常工作)。
STC推出的系列51单片机芯片是全面兼容其它51单片机的,而51单片机是主流大军,每一个高等院校、普通学校、网站、业余单片机培训都是以51单片机为入门教材的,所以,教材最多,例子最多。
STC89C51内部有EEPROM,可以在程序中修改,断电不丢失。还增加了两级中断优先级,等等。 1.2.2 DS1302
1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
DS1302引脚功能及结构 图1示出DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由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:
编程模式
.void Initial_DS1302(void) //时钟芯片初始化 {
unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判断时钟芯片是否关闭
{ Write1302(0x8e,0x00); //写入允许 23:59:55
Write1302(0x88,0x07); Write1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59);
Write1302(0x80,0x55);
Write1302(0x8e,0x80); //禁止写入 }
Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间:
}
Ⅱ. typedef struct __SYSTEMTIME__ {
unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week;
unsigned char Day;
unsigned char Month; unsigned char Year; unsigned char DateString[11]; unsigned char TimeString[9]; }SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime; #define AM(X) #define PM(X)
X
(X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK #define DS1302_DAY #define DS1302_MONTH #define DS1302_YEAR
0x8 0x86 0x88 0x8C
//实时时钟写入一字节(内部函数)
Ⅲ.void DS1302InputByte(unsigned char d) {
unsigned char i; ACC = d;
for(i=8; i>0; i--) {
DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1;
} }
unsigned char DS1302OutputByte(void) {
unsigned char i; for(i=8; i>0; i--)
{
ACC = ACC >>1; ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; }
return(ACC);
//相当于汇编中的 RRC
//实时时钟读取一字节(内部函数)
//相当于汇编中的 RRC
}
Ⅳ.void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址,
ucData: 要写的数据
{
DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1; DS1302_RST = 0; }
Ⅴ.unsigned char Read1302(unsigned char ucAddr) {
unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData); }
Ⅵ.void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); nowtime[2]=Time->Second;
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); nowtime[1]=Time->Minute;
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); nowtime[0]=Time->Hour;
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH);
//读取DS1302某地址的数据
}
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
1.2.3 LCD1602
①管脚功能:
引脚 1 2 3
符号 VSS VDD V0
功能说明 一般接地 接电源(+5V)
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通
过一个10K的电位器调整对比度)。 RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选
择指令寄存器。 R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进
行写操作。
E(或EN)端为使能(enable)端,下降沿使能。 底4位三态、 双向数据总线 0位(最低位)
底4位三态、 双向数据总线 1位 底4位三态、 双向数据总线 2位 底4位三态、 双向数据总线 3位 高4位三态、 双向数据总线 4位 高4位三态、 双向数据总线 5位 高4位三态、 双向数据总线 6位
高4位三态、 双向数据总线 7位(最高位)(也是busy flang)
背光电源正极 背光 电源负极
4 5 6 7 8 9 10 11 12 13 14 15
RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 BLA
16 BLK
编程模式:
//内部等待函数
************************************************************************** unsigned char LCD_Wait(void) {
LcdRs=0; LcdRw=1; LcdEn=1; LcdEn=0;
_nop_(); _nop_();
return DBPort;
}
//向LCD写入命令或数据
************************************************************ #define LCD_COMMAND
0 // Command
#define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) { //
LcdEn=0;
LcdRs=style; LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序 LcdEn=1; LcdEn=0;
_nop_();//注意顺序 _nop_();
LCD_Wait(); Setkey(); Downkey(); // Upkey();
// outkey(); }
//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE
0x00 //显示关 0x02 //显示光标
0x00 //无光标 0x01 //光标闪动 0x00 //光标不闪动
#define LCD_CURSOR #define LCD_NO_CURSOR
#define LCD_FLASH
#define LCD_NO_FLASH
void LCD_SetDisplay(unsigned char DisplayMode) {
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
0x00 // default
#define LCD_AC_DOWN
#define LCD_MOVE #define LCD_NO_MOVE
0x01 // 画面可平移
0x00 //default
void LCD_SetInput(unsigned char InputMode) { }
//初始化LCD************************************************************ void LCD_Initial() { }
//液晶字符输入的位置************************ void GotoXY(unsigned char x, unsigned char y) {
if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40));
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//将字符输出到液晶显示 void Print(unsigned char *str) { }
while(*str!='\0') { }
LCD_Write(LCD_DATA,*str); str++;
二、硬件电路设计 2.1 原理图
2.2仿真图
2.3 PCB图
2.4 实物图
三、程序清单 程序见赵鹏飞报告论文。
四、设计总结
平时做硬件的机会不多,这次亲自做遇到很多问题,开始的板子封装不好,使显示屏盖住了调整时间的按键,还有一些地方弄错,导致了失败。发现问题,及时的修改,并解决问题,过程很煎熬又很充满期待,看到做好的作品,感到欣慰。
通过此次设计,进一步加深了对单片机AT89C51,DS1302,LCD1602的工作原理的理解和实际中的应用,感谢老师对一些疑难的解答和队友的默契配合,此次课设,受益颇多。
谢 辞
在本次课程设计过程中,我得到了实验室老师和同学的大力帮助和支持。电路的设计、电路的制作、电路的调试及最后系统的完成,老师们都耐心地给予指导并加以改正。其认真塌实的工作态度和温和的态度都值得我们尊敬。在整个课程设计过程中,老师们还为我们提供了良好的实验场所和各种实验工具,方便了
我们,在此表示由衷的感谢。我的同学们也在我的电路设计和调试过程中给了我很大的启发和帮助,在此特向给予我帮助的所有人表示诚挚的谢意。本报告可能还有许多不尽如人意的地方,希望能够得到老师们和同学们的批评和指导意见。
五、参考文献
[1] 清华大学电子学教研组编 华成英、童诗白主编 《模拟电子技术基础》 [2] 清华大学电子学教研组编 阎石主编 《数字电子技术基础》(第五版) [3] 黄冰 覃伟年 黄知超 编著 单片机原理及应用(MCS-51)重庆大学出版社 2003
[4] 例说51单片机(C语言版) [5] 胡寿松 主编 《自动控制原理》(第四版) 科学出版社,2002