基于单片机的电子万年历带计算器内容摘要:
错后,就直接生产 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] = { //矩阵按键编号到标准键盘键码的映射表。基于单片机的电子万年历带计算器
相关推荐
设计 在 LCD 显示子程序中,初始化后,从 LCD 中读状态字,判断 LCD 是否忙状态,不是则可向 LCD 写控制命令,再写数据,即显示数据。 19 图 LCD显示流程图 八、 程 序清单 include include //include //include define uint unsigned int define uchar unsigned char sbit
大 5nA 高共模抵制 CMR 最小 120dB 输入保护至 177。 40V 图 28 INA128 引脚图 宽电源电压范围 177。 至 177。 18V 低静态电流 700181。 A 8 引脚塑料 DIP 和 SO8 封装 放大器增益 G=1+50k/Rg,通过改变 Rg 的大小来改变放大器的增益。 因为放大的倍数是 1000,所以大致选用 50 欧姆的电阻就可以了。 基于以上分析
=3V~ 15V 逻辑 0(SPACE)=+3~+ 15V; 在 RTS、 CTS、 DSR、 DTR 和 DCD 等控制线上:信号有效(接通, ON 状态,正电压)= +3V~ +15V 信号无效(断开, OFF 状态,负电压 )=3V~15V TTL 输出 高电平 ,输出低电平。 在室温下,一般输出高电平是 ,项目 符号 测试条件 最小 典型 最大 单位 输入 正向压降 VF IF=10mA
为前提的,蓄电池可接受的充电曲线,如图 1 所示。 实验表明,如果充电电流按 这条曲线变化,就可以大大缩短充电时间,并且对电池的容量和寿命也没有影响。 原则上把这条曲线称为最佳充电曲线,从而奠定了快速充电方法的研究方向。 图 最佳充电 曲线 由图 可以看出:初始充电电流很大,但是衰减很快。 主要原因是充电过程中产生了极化现象。 在密封式蓄电池充电过程中,内部产生氧气和氢气,当氧 7
P2 口输出其特殊功能寄存器的内容。 P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口: P3口管脚是 8个带内部上拉电阻的双向 I/O口,可接收输出 4个 TTL 门电流。 当 P3 口写入“ 1”后,它们被内部上拉为高电平,并用作输入。 作为输入时,由于 12 外部下拉为低电平, P3口将输出电流 (ILL),也是由于上拉的缘故。 P3 口也可作为AT89C51
存储 )、 ROM(用于程序存储 )、 I/O 设备 (实现串行、并行输入 /输出接口 )及时钟电路 (建立工作时序 )。 在微型计算机中,上述部件被分成若干块芯片,安装在一块称之为主板的印刷线路板上,在程序的指挥下完成计算机的基本运算操作功能。 但是在单片机中,除了时钟电路之外,其余部分一般均被集成到一块半导体芯片上,所以被称为单片机,即单芯片微型计算机。 2) 控制功能类 控制功能类硬件包括