用51单片机实现电子时钟单片机课程设计(编辑修改稿)内容摘要:

连接至 9号复位引脚 复位电路如图所示,可以实现上电复位和手动复位功能。 时钟 电路设计 系统时钟源由内部时钟方式产生,时钟电路由 12MH 晶振和两个 30PF 瓷片电容组成,构成自激振荡,形成振荡源提供给单片机。 电容可在 5PF 到 30PF之间选择,电容的大小对振荡频率有微小影响,可起频率微调作用。 整 体 电路原理图 8 4 控制系统的软件设计 程序设计 由于 C 语言程序设计较汇编可读性强,可移植性,且可以大大降低编程的难 度和缩短开发周期,本系统程序采用 c 语言设计。 程序 源代码 include //包含单片机寄存器的头文件 include //包含 _nop_()函数定义的头文件 define uchar unsigned char define uint unsigned int sbit RS=P2^0。 //寄存器选择位,将 RS位定义为 sbit RW=P2^1。 //读写选择位,将 RW位定义为 sbit E=P2^2。 //使能信号位,将 E位定义为 sbit BF=P0^7。 //忙碌标志位,将 BF位定义为 uchar code table[]=20201207 WEEK6。 //初始化液晶显示 16 uchar code table1[]=TIME: 192750。 //14 uchar count,s1num。 char second,minute,hour,day,month,year,week。 sbit s1=P2^3。 //功能键 9 sbit s2=P2^4。 //加键 sbit s3=P2^5。 //减键 sbit s4=P2^6。 //保存并退出 /* 延时若干毫秒 */ void delay(uchar n) { uchar i,a,b。 for(i=0。 in。 i++) for(b=199。 b0。 b) for(a=1。 a0。 a)。 } /*********************************************** 函数功能:判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌。 result=0,不忙 ************************************************/ uchar BusyTest(void) { bit result。 RS=0。 //根据规定, RS为低电平, RW为高电平时,可以读状态 RW=1。 E=1。 //E=1,才允许读写 _nop_()。 //空操作 _nop_()。 _nop_()。 _nop_()。 //空操作四个机器周期,给硬件反应时间 result=BF。 //将忙碌标志电平赋给 result E=0。 //将 E恢复低电平 return result。 } /******************************************** 函数功能:写指令 入口参数: dictate *********************************************/ void WriteInstruction(uchar dictate) { while(BusyTest()==1)。 //如果忙就等待 RS=0。 //根据规定, RS和 R/W同时为低电平时,可以写入指令 RW=0。 E=0。 //E置低电平 (根据表 86,写指令时, E为高脉冲, //就是让 E从 0到 1发生正跳变,所以应先置 0 _nop_()。 10 _nop_()。 //空操作两个机器周期,给硬件反应时间 P0=dictate。 //将数据送入 P0口,即写入指令或地址 _nop_()。 _nop_()。 _nop_()。 _nop_()。 //空操作四个机器周期,给硬件反应时间 E=1。 //E置高电平 _nop_()。 _nop_()。 _nop_()。 _nop_()。 //空操作四个机器周期,给硬件反应时间 E=0。 //当 E由高电平跳变成低电平时,液晶模块开始执行命令 } /********************************************* 函数功能:写数据 入口参数: y(为字符常量 ) **********************************************/ void WriteData(uchar y) { while(BusyTest()==1)。 RS=1。 //RS为高电平, RW为低电平时,可以写入数据 RW=0。 E=0。 //E置低电平 (根据表 86,写指令时, E为高脉冲, //就是让 E从 0到 1发生正跳变,所以应先置 0 P0=y。 //将数据送入 P0口,即将数据写入液晶模块 _nop_()。 _nop_()。 _nop_()。 _nop_()。 //空操作四个机器周 期,给硬件反应时间 E=1。 //E置高电平 _nop_()。 _nop_()。 _nop_()。 _nop_()。 //空操作四个机器周期,给硬件反应时间 E=0。 //当 E由高电平跳变成低电平时,液晶模块开始执行命令 } /****************************************** 函数功能:对 LCD的显示模式进行初始化设置 *******************************************/ void LcdInitiate(void) { uchar num。 11 second=50。 minute=27。 hour=19。 week=6。 day=7。 month=12。 year=13。 count=0。 s1num=0。 E=0。 delay(15)。 //延时 15ms,首次写指令时应给 LCD一段较长的反应时间 WriteInstruction(0x38)。 //显示模式设置: 162显示, //57点阵, 8位数据接口 delay(5)。 //延时 5ms?,给硬件一点 反应时间 WriteInstruction(0x38)。 delay(5)。 WriteInstruction(0x38)。 //连续三次,确保初始化成功 delay(5)。 WriteInstruction(0x0c)。 //显示模式设置:显示开,无光标, //光标不闪烁 delay(5)。 WriteInstruction(0x06)。 //显示模式设置:光标右移,字符不移 delay(5)。 WriteInstruction(0x01)。 //清屏幕指令,将以 前的显示内容清除 delay(5)。 WriteInstruction(0x80)。 f。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。