电子万年历实验1

上传人:飞*** 文档编号:47513651 上传时间:2018-07-02 格式:PDF 页数:25 大小:1.08MB
返回 下载 相关 举报
电子万年历实验1_第1页
第1页 / 共25页
电子万年历实验1_第2页
第2页 / 共25页
电子万年历实验1_第3页
第3页 / 共25页
电子万年历实验1_第4页
第4页 / 共25页
电子万年历实验1_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《电子万年历实验1》由会员分享,可在线阅读,更多相关《电子万年历实验1(25页珍藏版)》请在金锄头文库上搜索。

1、电子万年历实验实验要求 : 在 LCD (12864 或者 1602)上显示:年月日星期时间 可以 自由修改显示的年月日星期时间实验需求 : 硬件需求:1.需要按键做初始化等需求2.需要 LED 作为显示输出。2 需要一款硬件作为实时时钟器件选型DS1302 实时时钟芯片,三线接口,带涓流充电。DS1307 实时时钟芯片,I2C 接口。DS1337 实时时钟芯片,I2C 接口,带两个日历闹钟。PCF8563 实时时钟芯片,I2C 接口,带中断输出。PCF8583 实时时钟芯片, I2C 接口,带中断输出,内置的32.768KHz 振荡器, 256 个字 节 RAM ,但性价比较差。选型结论:L

2、CD:12864 键盘: 4*4 矩阵键盘实时时钟芯片 :DS1302结构框图DS1302 DS1302 是 DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和 31 字节静态 RAM 可通过简单的串行接口与单片机进行通信可提供 : -秒分时日日期月年的信息-每月的天数和闰年的天数可自动调整-可通过 AM/PM 指示决定采用 24 或 12 小时格式-保持数据和时钟信息时功率小于1mWDS1302 引脚X1 X2 32.768KHz 晶振管脚GND 地CE 复位脚I/O 数据输入 /输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚各引脚的功能为 :Vcc1 : 主电源

3、;Vcc2 : 备份电源。当Vcc2Vcc1+0.2V时,由Vcc2向DS1302供电,当 Vcc2=1;/数据右移一位,准备传输下一位数据 /* *名称 : DS1302ReadByte *说明 : 无*功能 : 读取 8bit 的数据*调用 : delayus() *输入 : 无*输出 : dat:读取的数据*/ uchar DS1302ReadByte() uchar i,dat; delayus(2); for(i=0;i=1;/要返回的数据左移一位if(SDA=1) /当数据线为高时,证明该位数据为1 dat|=0x80;/要传输数据的当前值置为1,若不是 ,则为 0 SCLK=1;

4、/ 拉高时钟线delayus(2); SCLK=0; /制造下降沿delayus(2); return dat;/返回读取出的数据 程序流程设计开始初始化 LCD初始化 DS1302读取 DS1302中的数据把时间和日期 显示到 LCD 上结束几个数组,用来定义要显示的汉字信息unsigned char Chinese_117 = 0xc4,0xea, 0xd4,0xc2, 0xc8,0xd5, 0xca,0xb1, 0xb7,0xd6, 0xc3,0xeb, 0xd0,0xc7, 0xc6,0xda, ;/ 年 月 日时分秒 星 期unsigned char Chinese_215 = 0x

5、d2,0xbb, 0xb6,0xfe, 0xc8,0xfd, 0xcb,0xc4, 0xce,0xe5, 0xc1,0xf9, 0xcc,0xec, ;/ 一二三四五六天unsigned char Cursor6 =0x81,0x83,0x85,0x90,0x92,0x94;/定义光标移动的位置主函数部分主 函 数 部 分 只 需 要 按 照 流 程 图 的 需 要 调 用 各 个 模 块 即 可/* *名称 : void main() *说明 : 无*功能 : 读取 8bit 的数据*调用 : delayms() *输入 : 无*输出 : dat:读取的数据*/ void main() De

6、layms(50); EX1 = 1 ;/外部中断开EA = 1; /全局中断开CH452_Write(CH452_SYSON2);/初始化 CH452 Init_1602(); /初始化 LCD Init8259a(); /初始化 8259a Dispaly_Menu(); /显示年月日等文字Delayms(50); / Init_DS1302(); /初始化 DS1302,只需要执行一次,设定好后,不需要再次执行while(1)/ /while 中的值只循环显示小时,分钟,秒这几个常变量,有其他需要,可以继续添加 Write_com(Cursor3); /小时的位置Split_displa

7、y(DS1302_HOUR_READ);/显示小时Delayms(5);/ Write_com(Cursor4); /分钟的位置Delayms(3); Split_display(DS1302_MINUTE_READ);/显示分钟Delayms(5);/ Write_com(Cursor5);/秒的位置c = DS1302Read(DS1302_SECOND_READ); /读取秒的十位c = c c = c/16 + 0; Write_data(c); /显示秒的十位Delayms(3); c = DS1302Read(DS1302_SECOND_READ); /读取秒的个位c = c%16

8、 + 0; Write_data(c); /显示秒Delayms(500); ; DS1302 的初始化部分只需要调用一次,写入一个初始值即可/* *名称 : void Init_DS1302(void) *说明 : 给 1302 写入一个初始的值*功能 : 写入日期,和时钟的值*调用 : DS1302Write ()*输入 : 无*输出 : 无*/ void Init_DS1302(void) DS1302Write(0x8e,0x00); /写保护关DS1302Write(DS1302_SECOND_WRITE,0x00);/初始秒值为0 DS1302Write(DS1302_MINUTE

9、_WRITE,0x20);/初始分钟值为0 DS1302Write(DS1302_HOUR_WRITE,0x09); /初始为 24 小时模式初始时间为0 点DS1302Write(DS1302_DAY_WRITE,0x25);/2011 年 1 月 1 日 星期 6 DS1302Write(DS1302_MONTH_WRITE,0x12); DS1302Write(DS1302_YEAR_WRITE,0x10);DS1302Write(DS1302_WEEK_WRITE,0x06); DS1302Write(0x90,0x01);/充电DS1302Write(0xc0,0xf0);/初始化一

10、次标示DS1302Write(0x8e,0x80); 由于 DS1302 的很多数值都是十位数, 所以需要把十位数分成2 次在 LCD12864 上显示/- / 函数名称: void Split_display() / 函数功能:把一个十位数分二次显示至传递来的位置/ 入口参数: unsigned char address / 出口参数:无/- void Split_display(unsigned char address) unsigned char i; i = DS1302Read(address); /读取十位i = i/16 + 0; Write_data(i);/ /显示十位De

11、layms(3); i = DS1302Read(address); /读取个位i = i%16 + 0; Write_data(i); /显示个位Delayms(5); 屏幕显示部分显示屏幕上的文字信息显示效果为:/- / 函数名称: void Dispaly_Menu() / 函数功能:显示屏幕上的所有元素/ 入口参数:无/ 出口参数:无/- void Dispaly_Menu() Write_com(0x01); Delayms(100); Write_com(0x80); Delayms(100); Write_data(2); Delayms(5); Write_data(0); D

12、elayms(1); Split_display(DS1302_YEAR_READ);/ 显示年份Write_data(Chinese_10); /显示“年”Delayms(3); Write_data(Chinese_11); Delayms(3); 20XX 年 XX 月 XX 日XX 时 XX 分 XX 秒星期 X Split_display(DS1302_MONTH_READ);/显示月份Write_data(Chinese_12); /显示“月”Delayms(3); Write_data(Chinese_13); Delayms(3); Split_display(DS1302_D

13、AY_READ);/显示日期Write_data(Chinese_14); /显示“日”Delayms(3); Write_data(Chinese_15); Delayms(3); Write_data(Chinese_116); Delayms(3); Write_com(0x90); /换第二行Split_display(DS1302_HOUR_READ);/显示小时Write_data(Chinese_16); /显示“时”Delayms(3); Write_data(Chinese_17); Delayms(3); Split_display(DS1302_MINUTE_READ);

14、/显示分钟Write_data(Chinese_18); /显示“分”Delayms(3); Write_data(Chinese_19); Delayms(3);/ c = DS1302Read(DS1302_SECOND_READ);/读取秒的十位c = c c = c/16 + 0; Write_data(c); /显示秒的十位Delayms(3); c = DS1302Read(DS1302_SECOND_READ);/读取秒的个位c = c%16 + 0; Write_data(c); Delayms(5);/显示秒Write_data(Chinese_110); /显示“秒”Delayms(3); Write_data(Chinese_111); Delayms(3); Write_data(Chinese_116); Delayms(3); Write_com

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号