以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计及及的电子钟_第1页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计及及的电子钟_第2页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计及及的电子钟_第3页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计及及的电子钟_第4页
以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计及及的电子钟_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子系统设计实验报告实验名称以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟 院(系)别班号实验日期2009-6-25到28实验人姓名学号 实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、

2、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。扩展:闹钟和重要日期提醒功能(增加蜂鸣器), 闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在 “Options for Target 1”的Output选项中,将Create HEX Fil选项勾起来。2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus

3、软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档6、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:按键处理模块89C52CPU控制模块按键处理模块89C52CPU控制模块温度采集模块LCD显示模块DS1302时钟LCD显示模块DS1302时钟采集模块各个模块电路原理分析:1、DS1302时钟采集模块:电路原理图: DS1302分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年

4、的信息每月的天数和闰年的天数可自动调整时钟操作。DS1302芯片广脚介绍:X1、X2为晶振管脚。GND 为地。RST复位脚。I/O数据输入/输出引脚。SCLK串行时钟。Vcc1,Vcc2电源供电管脚。与单片机连接的信号线为: DS1302_SCLK 接P16; 实时时钟时钟线引脚 DS1302_IO 接P17; 实时时钟数据线引脚 DS1302_RST 接P15; 实时时钟复位线引脚特别注意DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。即单片机对SCLK咬先送高电平,再送低电平。数据时通过IO进行传送的。数据处理子程序流程图是否调用时间获

5、取子程序DS1302_GetTime是否调用时间获取子程序DS1302_GetTime 否 是调用调用Read1302函数,读取各个时间参数,并存放于ReadValue变量中对对ReadValue数据进行转换,转换成十进制数,并赋给Time指针中。调用调用年份转换成可供lcd显示的字段子程序DateToStr时间转换成可供lcd显示的字段子程序时间转换成可供lcd显示的字段子程序TimeToStr结束结束因为DS1302芯片在读取或写入数据时,都是一位一位传送的,并且每传送一位,SCLK信号线要有一个负跳变。所以在对DS1302具体某地址进行一字节数据的写入或读取时,都要调用实时时钟写入一字节

6、(内部函数) DS1302InputByte和实时时钟读取一字节(内部函数) DS1302OutputByte两个函数。2、按键处理模块按键连线图其中按键1为模式键,按键2为加1键,按键3为减1键。与单片机连线如下:mode连接P30; Mode键是否按下将mode按键次数存放于变量mode_num中mode_num=5mode_num=1mode_num=2mode_num=4mode_num=3mode_num=6mode_num=7移动光标,并返回判断是否为修改模式判断是否为加一键转减一键程序判断num=2判断num=3判断num=1修改day值,并返回修改mouth值,并返回修改yea

7、r值,并返回判断num=6判断num=5判断num=4修改小时值,并返回修改分值,并返回修改秒值,并返回写指令0 x38,显示模式设置写指令,显示光标写指令,光标移动清屏直接向18b20发送温度变换命令读取温度寄存器的温度值读低八位读高八位进行读取数据处理,得出温度存放于变量temp中 初始化lcd初始化内部定时器初始化DS1302从DS1302读取日期和时间移动光标并显示日期移动光标并显示时间移动光标并显示温度重复进行按键扫描; /用小数点分开个位和小数Mode键是否按下将mode按键次数存放于变量mode_num中mode_num=5mode_num=1mode_num=2mode_num

8、=4mode_num=3mode_num=6mode_num=7移动光标,并返回判断是否为修改模式判断是否为加一键转减一键程序判断num=2判断num=3判断num=1修改day值,并返回修改mouth值,并返回修改year值,并返回判断num=6判断num=5判断num=4修改小时值,并返回修改分值,并返回修改秒值,并返回写指令0 x38,显示模式设置写指令,显示光标写指令,光标移动清屏直接向18b20发送温度变换命令读取温度寄存器的温度值读低八位读高八位进行读取数据处理,得出温度存放于变量temp中 初始化lcd初始化内部定时器初始化DS1302从DS1302读取日期和时间移动光标并显示日

9、期移动光标并显示时间移动光标并显示温度重复进行按键扫描 write_date(int_to_charA2); /向lcd写数据,并且注意要转换A2数据类型 void timer0(void) interrupt 1 TR0=0; TL0=(TIMER0_COUNT & 0X00FF);/设置Timer0低八位数值 TH0=(TIMER0_COUNT 8);/设置Timer0高八位数值 TR0=1;count+; if(count=30) display_temp();/延时,当count=30时,显示温度,并延时 if(count=200) /当count自加到200时,开始判断此时时、分、秒

10、的值,并进行转换count=0;+;if=60) /当秒达到60时,向分进位,且秒数置零=0;+;if=60) /当分达到60时,向时进位,且分数置零=0;+;if=24)/当时达到24时,向天进位,且时数置零=0; +; ifmonthday,)、/判断天数,当超过本月最大天数时,向月份进位,且天数置一 =1; +; if=13) /判断月份,当月份超过12时,向年份进位,月份置一 =1; +; write_riqi(6,; 。/在位置6处,向lcd写月份 write_riqi(9,;/在位置9处,向lcd写天数 gotoxy(1,12); display_week();write_time

11、(1,; /在位置1处,向lcd写时数write_time(4,;/在位置4处,向lcd写分数write_time(7,;/在位置7处,向lcd写秒数void main() SYSTEMTIME CurrentTime; init_lcd(); /初始化lcd timer0_initialize(); /初始化内部定时器 Initial_DS1302(); /初始化DS1302 DateToStr(&CurrentTime); /从DS1302读取日期 TimeToStr(&CurrentTime); /从DS1302读取时间 gotoxy(1,1); display_string; /显示日

12、期 display_week(); /显示周几 gotoxy(2,1); display_string; /显示时间 gotoxy(2,10); display_string(); /显示温度 while(1) keyscan();2、lcd1602头文件程序:#define uchar unsigned char#define uint unsigned intsbit rs=P20;、/寄存器选择信号sbit rw=P21; /读写控制信号线sbit lcden=P22; /使能信号线#define lcd_mode 0 x38#definedisplay_cursor 0 x0f#def

13、ineundisplay_cursor 0 x0cchar code int_to_char=09;/*void delay(uint x) /延时程序uint a,b;for(a=x;a0;a-)for(b=10;b0;b-); /*void write_com(uchar com)/写命令P0=com; /写命令,记住时序问题rs=0; /rs要为低电平lcden=0;/使lcd使能端产生一个正脉冲delay(10);lcden=1;delay(10);lcden=0;/*void write_date(uchar date)/写数据P0=date; /将数据送到P0口准备传送出rs=1;

14、 /写数据时,rs要为高电平lcden=0;/使lcd使能端产生一个正脉冲delay(10);lcden=1;delay(10);lcden=0;/*void init_lcd(void) /初始化lcd1602 delay(15);write_com(lcd_mode); /模式设置delay(20);write_com(undisplay_cursor); /显示光标delay(20);write_com(0 x06); /光标移动delay(20);write_com(0 x01); /清屏delay(20);/*void display_string(char *p) /写字符串whi

15、le(*p)write_date(*p);delay(20);p+; /*void gotoxy(uchar x,uchar y)/设置移动坐标 if(x=1) write_com(0 x80+y);else write_com(0 xc0+y); /*void display_data(char number) /显示数据 uchar x,y; x=number/10; /将取得的数据转换成十进制 y=number%10; write_date(int_to_charx); write_date(int_to_chary); 3、ds1302头文件程序#ifndef _REAL_TIMER_

16、DS1302_2003_7_21_#define _REAL_TIMER_DS1302_2003_7_21_sbit DS1302_CLK = P16; /实时时钟时钟线引脚 sbit DS1302_IO = P17; /实时时钟数据线引脚 sbit DS1302_RST = P15; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsig

17、ned char Day;unsigned char Month;unsigned char Year;unsigned char DateString9;unsigned char TimeString9;SYSTEMTIME;/定义的时间类型#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0 x80 /时钟芯片的寄存器位置,存放时间,如0 x80放的的秒数#define DS1302_MINUTE0 x82#define DS1302_HOUR0 x84 #define DS1302_WEEK0 x8A#def

18、ine DS1302_DAY0 x86#define DS1302_MONTH0 x88#define DS1302_YEAR0 x8C#define DS1302_RAM(X)(0 xC0+(X)*2) /用于计算 DS1302_RAM 地址的宏 RAM命令控制字地址:0 xC0-0 xFDvoid DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /将IO线上的数据存放在ACC中 DS1302_CLK = 1;/特别注意

19、,DS1302写一数据时,CLK要产生一负脉冲 DS1302_CLK = 0; ACC = ACC 1; /每次移位一位 unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8; i0; i-) ACC = ACC 1; /将前一个下降沿读出的数据右移一位从而读出该次读出的数放入ACC7 ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0;/SCLK下降沿读出DS1302的数 return(ACC); void Write1302(unsigned

20、 char ucAddr, unsigned char ucDa)/其中Addr为 DS1302地址, ucData为要写的数据 DS1302_RST = 0; /写数据时,要注意RST产生一上升沿,CLK为低电平 DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1字节数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 uns

21、igned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0 x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1字节数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_SetProtect(bit flag) /是否写保护if(flag)Write1302(0 x8E,0 x80); /0 x8E 控制字节地址,bit7=WP WP=1 禁止数据写入DS130

22、2elseWrite1302(0 x8E,0 x00); /WP=0 允许写入DS1302void DS1302_SetTime(unsigned char Address, unsigned char Value) / 设置时间函数DS1302_SetProtect(0);Write1302(Address, (Value/10)Second = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);/将ReadValue数据的第4、5、6位取出,实际上就是秒数的十位,但是以二进制的形式表示,所以要进行移位,向右移四位,在乘以10,在加上ReadValue变量

23、中秒数的,将十六进制的数化成十进制数表示,并放在Time-Second中ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);/同上ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F); /同上ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0 x70)4)*10 + (ReadV

24、alue&0 x0F);/同上ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);/同上ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F); /同上ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);/同上void D

25、ateToStr(SYSTEMTIME *Time) /年份转换成可供lcd显示的字段子程序Time-DateString0 = Time-Year/10 + 0; /Time-DateString0中存放的就是要显示年的十位Time-DateString1 = Time-Year%10 + 0; /Time-DateString1中存放的就是要显示年的个位Time-DateString2 = -;/年和月份之间用-分开Time-DateString3 = Time-Month/10 + 0;/Time-DateString3中存放的就是要显示月份的十位Time-DateString4 = T

26、ime-Month%10 + 0;/Time-DateString4中存放的就是要显示月份的个位Time-DateString5 = -;Time-DateString6 = Time-Day/10 + 0; /Time-DateString6中存放的就是要显示日的十位Time-DateString7 = Time-Day%10 + 0; /Time-DateString7中存放的就是要显示日的个位Time-DateString8 = 0; /记住,结束时要添加0,以作为结束标志void TimeToStr(SYSTEMTIME *Time)/时间转换成可供lcd显示的字段子程序Time-Ti

27、meString0 = Time-Hour/10 + 0;Time-TimeString1 = Time-Hour%10 + 0;Time-TimeString2 = :;Time-TimeString3 = Time-Minute/10 + 0;Time-TimeString4 = Time-Minute%10 + 0;Time-TimeString5 = :;Time-TimeString6 = Time-Second/10 + 0;Time-TimeString7 = Time-Second%10 + 0;Time-TimeString8 = 0;void Initial_DS1302(

28、void)/DS1302的初始化程序unsigned char Second=Read1302(DS1302_SECOND);if(Second&0 x80) /BIT7=CH CH=0振荡器允许工作,CH=1,振荡器停止 DS1302_SetTime(DS1302_SECOND,0);#endif4、ds18b20头文件#include #include #define uchar unsigned char#define uint unsigned intuint temp; / 温度变量sbit DS=P10; /定义数据传输接口void delay1(uchar count)/延时 while(count0) count-;void reset(void) /送初值和初始命令 DS=0; delay1(100); DS=1; delay1(4); delay1(200);bit read_bit(void) /读一比特,特别注意对于18b20,要读数据时,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论