基于单片机的电子万年历带计算器内容摘要:

错后,就直接生产 hex 文件,然后进行( proteus)软件仿真。 我们用 proteus 绘制的仿真图如下: 图 、 软件仿真 在硬件设计完成后,利用软件对其进行仿真,这样,就会减少在做硬件时的错误,做到更准确。 本次我采用 Proteus 软件仿真。 第 16 页 如图 所示,电子万年历的时间仿真图。 图 经过此次的软件仿真,仿真结果正常,可以顺利的进行硬件制作。 、硬件调试 前期的那些准备工作都是为了这最后的一步,先把元件排版好后,就是自己动手焊接,制作出完整的实物。 在确保焊接无误后,接着将之前编好的程序烧写进单片机,做最后的硬件调试。 (看效果是否和仿真的效果一致,如果和仿真相同,那么作品就成功地完成了。 要是没有达到仿真时的效果,那么就是焊接时出现了失误。 )我们的硬件测试比较顺利,以下为实物演示图。 第 17 页 第七章 总结与体会 在用单片机实现万年历计算器的设计中使用 到了 STC89C5 LCD160LDS1302 及其 4*4 键盘的使用。 在设计过程中我通过在课本、网上和图书馆查阅资料,收集了关于单片机、液晶屏 LCD1602 显示和时钟芯片 LDS1302 方面的资料,通过对这些资料的学习,我了解了单片机的基本结构和单片机在生活和生产中所发挥的作用以及液晶显示器 LCD1602 和 时钟芯片 LDS1302 的原理和使用。 本次课程设计是对以前学过的理论知识进行了巩固,加深了理解,提高了应用的能力,提高了自己的发现、分析、解决问题的能力;也增加了团队合作的精神,我们分工明确,每人负责不 同的工作,做到了人人到参与到作品设计中,还有更重要的就是提升了自己的动手(实践)能力。 经历了从最初的选题、硬件设计、软件设计到最后仿真结果的出现,从一定程度上提高了对专业知识的认识及兴趣。 本次课程设计大体上还是比较顺利的,我们虽然把作品成功地做出来,这说明我们在硬件这一块还是可以的;但是在软件方面,我们就比较差了,软件一直困扰着我们,是我们的一大肋骨。 但我坚信只要我们持之以恒,就一定能攻破软件这一块。 我们期待着在软件方面的进步。 第 18 页 第八章 致谢 在此也很感谢学校和老师给我们提供了这样的平台,能使我 们的动手能力增强;感谢老师对我们提供的帮助,感谢老师带给我们新的知识,使我们顺利地完成本次的课程设计。 同时也感谢我的同学们,对我的帮助以及支持。 第九章 参考文献 [1]陈朝大 . 李杏彩 . 单片机原理与应用 . 化学工业出版社 . 2020: 045747 [2] 田立 .田清 .代方震 .51 单片机 C 语言程序设计 .北京 .人民邮电出版社 .2020: 132148. [3] 张仪和 .例说 51 单片机( C 语言版)(第三版) .北京 .人民邮电出版社 .2020: 374392. [4] 谭浩强 .C 程序设计(第 三版) .北京 .清华大学出版社 .2020: 140150. [5] 温子祺 .刘志峰 .冼安胜 .林秩谦 .李益鸿 .51单片机 C 语言创新教程 .北京 .北京航空航天大学出版社 .2020: 154163. [6] 俞锡存 .曹国华 .单片机原理及接口技术 .西安 .西安电子科技大学出版社 .2020: 8095. 第 19 页 第十章 附加程序 DS1302 时钟芯片程序 include typedef unsigned char u8。 typedef unsigned int u16。 sbit DS1302_CE = P3^5。 sbit DS1302_CK = P3^3。 sbit DS1302_IO = P3^4。 extern u8 setIndex。 //时间设置索引 u8 setIndex。 //时间设置索引 extern void LcdShowStr(u8 x, u8 y, u8 *str)。 extern void LcdSetCursor(unsigned char x, unsigned char y)。 extern void LcdOpenCursor()。 extern void LcdCloseCursor()。 struct sTime { //日期时间结构体定义 unsigned int year。 //年 unsigned char mon。 //月 unsigned char day。 //日 unsigned char hour。 //时 unsigned char min。 //分 unsigned char sec。 //秒 }。 /* 发送一个字节到 DS1302 通信总线 上 */ void DS1302ByteWrite(unsigned char dat) { unsigned char mask。 for (mask=0x01。 mask!=0。 mask=1) //低位在前,逐位移出 { if ((maskamp。 dat) != 0) //首先输出该位数据 DS1302_IO = 1。 else DS1302_IO = 0。 DS1302_CK = 1。 //然后拉高时钟 DS1302_CK = 0。 //再拉低时钟,完成一个位的操作 } DS1302_IO = 1。 //最后确保释放 IO 引脚 } /* 由 DS1302 通信总线上读取一个字节 */ unsigned char DS1302ByteRead() { unsigned char mask。 unsigned char dat = 0。 for (mask=0x01。 mask!=0。 mask=1) //低位在前,逐位读取 { if (DS1302_IO != 0) //首先读取此时的 IO 引脚,并设置 dat 中的对应位 { dat |= mask。 } 第 20 页 DS1302_CK = 1。 //然后拉高时钟 DS1302_CK = 0。 //再拉低时钟,完成一个位的操作 } return dat。 //最后返回读到的字节数据 } /* 用单次写操作向某一寄存器写入一个字节, reg寄存器地址, dat待写入字节 */ void DS1302SingleWrite(unsigned char reg, unsigned char dat) { DS1302_CE = 1。 //使能片选信号 DS1302ByteWrite((reg1)|0x80)。 //发送写寄存器指令 DS1302ByteWrite(dat)。 //写入字节数据 DS1302_CE = 0。 //除能片选信号 } /* 用单次 读操作从某一寄存器读取一个字节, reg寄存器地址,返回值 读到的字节 */ unsigned char DS1302SingleRead(unsigned char reg) { unsigned char dat。 DS1302_CE = 1。 //使能片选信号 DS1302ByteWrite((reg1)|0x81)。 //发送读寄存器指令 dat = DS1302ByteRead()。 //读取字节数 据 DS1302_CE = 0。 //除能片选信号 return dat。 } /* 用突发模式连续写入 8 个寄存器数据, dat待写入数据指针 */ void DS1302BurstWrite(unsigned char *dat) { unsigned char i。 DS1302_CE = 1。 DS1302ByteWrite(0xBE)。 //发送突发写寄存器指令 for (i=0。 i8。 i++) //连续写入 8 字节数据 { DS1302ByteWrite(dat[i])。 } DS1302_CE = 0。 } /* 用突发模式连续读取 8 个寄存器的数据, dat读取数据的接收指针 */ void DS1302BurstRead(unsigned char *dat) { unsigned char i。 DS1302_CE = 1。 DS1302ByteWrite(0xBF)。 //发送突发读寄存器指令 for (i=0。 i8。 i++) //连续读取 8 个字节 { dat[i] = DS1302ByteRead()。 } DS1302_CE = 0。 } /* 获取实时时间,即读取 DS1302 当前时间并转换为时间结构体格式 */ void GetRealTime(struct sTime *time) { unsigned char buf[8]。 第 21 页 DS1302BurstRead(buf)。 timeyear = buf[6]。 //+ 0x2020 timemon = buf[4]。 timeday = buf[3]。 timehour = buf[2]。 timemin = buf[1]。 timesec = buf[0]。 timeweek = buf[5]。 } /* 设定实时时间,时间结构体格式的设定时间转换为数组并写入 DS1302 */ void SetRealTime(struct sTime *time) { unsigned char buf[8]。 buf[7] = 0。 buf[6] = timeyear。 buf[5] = timeweek。 buf[4] = timemon。 buf[3] = timeday。 buf[2] = timehour。 buf[1] = timemin。 buf[0] = timesec。 DS1302BurstWrite(buf)。 /* DS1302 初始化,如发生掉电则重新设置初始时间 */ void InitDS1302() { unsigned char dat。 struct sTime code InitTime[] = { //2020 年 10 月 8 日 12:30:00 星期二 0x2020,0x10,0x08, 0x12,0x30,0x00, 0x02 }。 DS1302_CE = 0。 //初始化 DS1302 通信引脚 DS1302_CK = 0。 dat = DS1302SingleRead(0)。 //读取秒寄存器 if ((dat amp。 0x80) != 0) //由秒寄存器最高位 CH 的值判断 DS1302 是否已停止 { DS1302SingleWrite(7, 0x00)。 //撤销写保护以允许写入数据 SetRealTime(amp。 InitTime)。 //设置 DS1302 为默认的初始时间 } } 键盘按键程序 include typedef unsigned char u8。 typedef unsigned int u16。 sbit KEY_IN_1 = P2^4。 sbit KEY_IN_2 = P2^5。 sbit KEY_IN_3 = P2^6。 sbit KEY_IN_4 = P2^7。 sbit KEY_OUT_1 = P2^3。 sbit KEY_OUT_2 = P2^2。 sbit KEY_OUT_3 = P2^1。 sbit KEY_OUT_4 = P2^0。 sbit KEY_IN_Point = P3^7。 sbit KEY_IN_Switch = P3^6。 unsigned char PointFlag=0。 unsigned char code KeyCodeMap[5][4] = { //矩阵按键编号到标准键盘键码的映射表。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。