1.单片机的电子万年历设计论文
基于单片机的多功能数字万年历
摘 要
随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。本设计以数字集成电路技术为基础,单片机技术为核心。本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。
本系统以单片机的C语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。系统通过点阵式液晶为载体显示数据,所以具有人性化的操作和美观的页面效果。可以显示时间、公农历日期、星期、温度、节气,天干地支和当天日出日落时间,并有闹铃和智能控制家用电器功能。
关键词 单片机;万年历; 液晶技术 ; 农历查询
目 录
摘 要 I
Abstract II
第一章 绪 论 1
1.1 课题开发背景 1
1.2 设计意义 1
1.3 设计目标 2
1.4 论文结构 2
第二章 硬件设计 3
2.1 硬件设计框图 3
2.2 系统硬件详细设计图 4
2.3 各芯片介绍 4
2.3.1 SM89516单片机应用设计 4
2.2.2 点阵液晶控制器T6963C 5
2.2.3 SD2000A时钟芯片 9
2.2.4 AT24C16可读写存储器 14
2.2.5 DS18B20单总线数字温度计 15
第三章 系统软件设计 18
3.1系统功能模块图及各功能介绍 18
3.2 主程序流程图 19
3.3 程序算法设计 23
第四章 调 试 41
4.1 硬件调试 42
4.2 软件调试 42
4.3 综合调试 44
结 论 45
致 谢 46
参考文献 47
附录1 48
附录2 外文文献 49
附录3 (系统使用说明书) 55
2.求用单片机制做万年历的毕业设计
#include
3.基于单片机的万年历的设计
void ds1302_limit(void) //初始化 { ds1302_writeenable(); ds1302_oscenable(); for(ds1302_b=0;ds1302_b<7;ds1302_b++) ds1302_sendbyte(ds_sec+2*ds1302_b,d1302[ds1302_b]); //赋值初始化 } uchar ds1302_read(uchar address) //读时钟 { uchar dat; ds1302_writeenable(); switch(address) {case 0:dat=ds1302_receivebyte(ds_sec+1); break; case 1:dat=ds1302_receivebyte(ds_min+1); break; case 2:dat=ds1302_receivebyte(ds_hour+1); break; case 3:dat=ds1302_receivebyte(ds_day+1); break; case 4:dat=ds1302_receivebyte(ds_week+1); break; case 5:dat=ds1302_receivebyte(ds_month+1); break; case 6:dat=ds1302_receivebyte(ds_year+1); break; } ds1302_writedisable(); return(dat); } void ds1302_write(uchar address,uchar dat) { ds1302_writeenable(); switch(address) { case 0:ds1302_sendbyte(ds_sec,dat); break; case 1:ds1302_sendbyte(ds_min,dat); break; case 2:ds1302_sendbyte(ds_hour,dat); break; case 3:ds1302_sendbyte(ds_day,dat); break; case 4:ds1302_sendbyte(ds_week,dat); break; case 5:ds1302_sendbyte(ds_month,dat); break; case 6:ds1302_sendbyte(ds_year,dat); break; } ds1302_writedisable(); } ds1302pro() //读出数据 { nian01=ds1302_receivebyte(ds_year+1); yue01=ds1302_receivebyte(ds_month+1); ri01=ds1302_receivebyte(ds_day+1); xiaoshi01=ds1302_receivebyte(ds_hour+1); sec01=ds1302_receivebyte(ds_sec+1); //读秒信息 min01=ds1302_receivebyte(ds_min+1); //读分信息 zhouxingqi=ds1302_receivebyte(ds_week+1); d1302_transfer(); //数值处理提取出待显示的值 } void ds1302_sendbyte(uchar command,uchar xmtdat) // 发送数据程序,发送1个字节给被控器ds1302 { uchar i; rst=0; _nop_(); sclk=0; _nop_(); rst=1; for(i=0;i<8;i++) { io_data= (bit)(command&0x01); command = command >> 1; sclk=1; _nop_(); sclk=0; } for(i=0;i<8;i++) { io_data= (bit)(xmtdat&0x01); xmtdat = xmtdat >> 1; sclk=1; _nop_(); sclk=0; } rst=0; } uchar ds1302_receivebyte(uchar command) // 接收数据程序;从被控器ds1302 接收1个字节数据 { uchar i, rcvdat=0; rst=0; _nop_(); sclk=0; _nop_(); rst=1; for(i=0;i<8;i++) { io_data= (bit)(command&0x01); command = command >> 1; sclk=1; _nop_(); sclk=0; } for(i=0;i<7;i++) { if(io_data)rcvdat|=0x80; rcvdat= rcvdat >> 1; sclk=1; _nop_(); sclk=0; } if(io_data)rcvdat|=0x80; rst=0; return rcvdat; } void ds1302_writeenable(void) //允许数据写入寄存器 { ds1302_sendbyte(ds_com,00); } void ds1302_writedisable(void) //禁止数据写入寄存器 { ds1302_sendbyte(ds_com,0x80); } void ds1302_oscenable(void) //起动时钟操作 { ds1302_sendbyte(ds_sec,0x00); } void ds1302_oscdisable(void) //停止时钟操作 { ds1302_sendbyte(ds_sec,0x80); } void d1302_transfer(void) //数据转换函数 { nian02=nian01&0x0f; nian01=nian01>>4; yue02=yue01&0x0f; yue01=yue01>>4; ri02=ri01&0x0f; ri01=ri01>>4; xiaoshi02=xiaoshi01&0x0f; xiaoshi01=xiaoshi01>>4; min02=min01&0x0f; min01=min01>>4; sec02=sec01&0x0f; //取miao信号的低四位 sec01=sec01>>4; //取高四位 } void delay1302(int i) //延时函数 { uchar x,j; for(x=0;x
4.设计一个基于单片机的万年历程序
#include
{ TIME[SetPlace]=TIME[SetPlace]+6; } if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12 { TIME[SetPlace]=0; } if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7 { TIME[SetPlace]=1; } // if(SetPlace==5) //月只能到12// {// TIME[SetPlace]=;// } } while((i<50)&&(K2==0)) //检测按键是否松开 { Delay10ms(); i++; } i=0; } } LcdDisplay(); } }/******************************************************************************** 函数名 : LcdDisplay()* 函数功能 : 显示函数* 输入 : 无* 输出 : 无*******************************************************************************/ void LcdDisplay() { LcdWriteCom(0x80+0X40); LcdWriteCom(0x0f); LcdWriteCom(0xc0|(2-0x40)); LcdWriteCom(0x0c); Delay10ms(); LcdWriteData('0'+TIME[2]/16); //时 LcdWriteData('0'+(TIME[2]&0x0f)); LcdWriteData(':'); LcdWriteData('0'+TIME[1]/16); //分 LcdWriteData('0'+(TIME[1]&0x0f)); LcdWriteData(':'); LcdWriteData('0'+TIME[0]/16); //秒 LcdWriteData('0'+(TIME[0]&0x0f)); LcdWriteCom(0x80); LcdWriteData('2'); LcdWriteData('0'); LcdWriteData('0'+TIME[6]/16); //年 LcdWriteData('0'+(TIME[6]&0x0f)); LcdWriteData(0x00); LcdWriteData('0'+TIME[4]/16); //月 LcdWriteData('0'+(TIME[4]&0x0f)); LcdWriteData(0x01); LcdWriteData('0'+TIME[3]/16); //日 LcdWriteData('0'+(TIME[3]&0x0f)); LcdWriteData(0x02); LcdWriteCom(0x8D); LcdWriteData('0'+(TIME[5]&0x07)-1); //星期 }/******************************************************************************** 函数名 : Int0Configuration()* 函数功能 : 配置外部中断0* 输入 : 无* 输出 : 无*******************************************************************************/ void Int0Configuration() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 EA=1;//打开总中断 }/******************************************************************************** 函数名 : Int0() * 函数功能 : 外部中断0 中断函数* 输入 : 无* 输出 : 无*******************************************************************************/ void Int0() interrupt 0 { Delay10ms(); if(K3==0) { SetState=~SetState; SetPlace=0; Ds1302Init(); } }/******************************************************************************** 函数名 : Delay10ms* 函数功能 : 延时函数,延时10ms* 输入 : 无* 输出 : 无*******************************************************************************/ void Delay10ms(void) //误差 0us { unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--); }。
5.基于单片机的万年历的设计
void DS1302_limit(void) //初始化{ DS1302_WriteEnable(); DS1302_OscEnable(); for(ds1302_b=0;ds1302_b<7;ds1302_b++) DS1302_SendByte(ds_sec+2*ds1302_b,d1302[ds1302_b]); //赋值初始化}uchar DS1302_Read(uchar address) //读时钟{ uchar dat; DS1302_WriteEnable(); switch(address) {case 0:dat=DS1302_ReceiveByte(ds_sec+1); break; case 1:dat=DS1302_ReceiveByte(ds_min+1); break; case 2:dat=DS1302_ReceiveByte(ds_hour+1); break; case 3:dat=DS1302_ReceiveByte(ds_day+1); break; case 4:dat=DS1302_ReceiveByte(ds_week+1); break; case 5:dat=DS1302_ReceiveByte(ds_month+1); break; case 6:dat=DS1302_ReceiveByte(ds_year+1); break; } DS1302_WriteDisable(); return(dat);}void DS1302_Write(uchar address,uchar dat){ DS1302_WriteEnable(); switch(address) { case 0:DS1302_SendByte(ds_sec,dat); break; case 1:DS1302_SendByte(ds_min,dat); break; case 2:DS1302_SendByte(ds_hour,dat); break; case 3:DS1302_SendByte(ds_day,dat); break; case 4:DS1302_SendByte(ds_week,dat); break; case 5:DS1302_SendByte(ds_month,dat); break; case 6:DS1302_SendByte(ds_year,dat); break; } DS1302_WriteDisable();}ds1302pro() //读出数据{ nian01=DS1302_ReceiveByte(ds_year+1); yue01=DS1302_ReceiveByte(ds_month+1); ri01=DS1302_ReceiveByte(ds_day+1); xiaoshi01=DS1302_ReceiveByte(ds_hour+1); sec01=DS1302_ReceiveByte(ds_sec+1); //读秒信息 min01=DS1302_ReceiveByte(ds_min+1); //读分信息 zhouxingqi=DS1302_ReceiveByte(ds_week+1); d1302_transfer(); //数值处理提取出待显示的值 }void DS1302_SendByte(uchar Command,uchar XmtDat) // 发送数据程序,发送1个字节给被控器DS1302{ uchar i; RST=0; _nop_(); SCLK=0; _nop_(); RST=1; for(i=0;i<8;i++) { IO_DATA= (bit)(Command&0x01); Command = Command >> 1; SCLK=1; _nop_(); SCLK=0; } for(i=0;i<8;i++) { IO_DATA= (bit)(XmtDat&0x01); XmtDat = XmtDat >> 1; SCLK=1; _nop_(); SCLK=0; } RST=0; }uchar DS1302_ReceiveByte(uchar Command) // 接收数据程序;从被控器DS1302 接收1个字节数据{ uchar i, RcvDat=0; RST=0; _nop_(); SCLK=0; _nop_(); RST=1; for(i=0;i<8;i++) { IO_DATA= (bit)(Command&0x01); Command = Command >> 1; SCLK=1; _nop_(); SCLK=0; } for(i=0;i<7;i++) { if(IO_DATA)RcvDat|=0x80; RcvDat= RcvDat >> 1; SCLK=1; _nop_(); SCLK=0; } if(IO_DATA)RcvDat|=0x80; RST=0;return RcvDat;}void DS1302_WriteEnable(void) //允许数据写入寄存器{ DS1302_SendByte(ds_com,00);}void DS1302_WriteDisable(void) //禁止数据写入寄存器{ DS1302_SendByte(ds_com,0x80);}void DS1302_OscEnable(void) //起动时钟操作{ DS1302_SendByte(ds_sec,0x00);}void DS1302_OscDisable(void) //停止时钟操作{ DS1302_SendByte(ds_sec,0x80);}void d1302_transfer(void) //数据转换函数{ nian02=nian01&0x0f; nian01=nian01>>4; yue02=yue01&0x0f; yue01=yue01>>4; ri02=ri01&0x0f; ri01=ri01>>4; xiaoshi02=xiaoshi01&0x0f; xiaoshi01=xiaoshi01>>4; min02=min01&0x0f; min01=min01>>4; sec02=sec01&0x0f; //取miao信号的低四位 sec01=sec01>>4; //取高四位 }void delay1302(int i) //延时函数{ uchar x,j; for(x=0;x
6.基于单片机控制的电子万年历课程设计
电子万年历
部分源程序
TEMPER_L EQU 40H;用于保存读出温度的高8位
TEMPER_H EQU 41H;用于保存读出温度的低8位
FLAG1 EQU 42H;是否检测到DS18B20标志位
a_bit equ 43h ;数码管个位数存放内存位置
b_bit equ 44h ;数码管十位数存放内存位置
T_RST Bit P3.6 ;实时时钟复位线引脚
T_CLK Bit P3.4 ;实时时钟时钟线引脚
T_IO Bit P3.5 ;实时时钟数据线引脚
SECOND EQU 45H
MINUTE EQU 46H
HOUR EQU 47H
DAY EQU 48H
有的
基于单片机控制的电子万年历课程设计
7.单片机万年历
原发布者:夜卧聆听烟雨
单片机课程设计题目基于单片机的万年历1绪论1.1设计目的培养和锻炼在学习完本课后综合运用所学理论知识,解决实际工程设计和应用问题的能力。通过课程设计,要求熟悉和掌握仿真系统的软件设计方法、设计步骤,以及硬件的设计方法、设计步骤,得到仿真系统应用方面的初步练习。本设计主要是采用51单片机来实现。自己动手设计与制作可以对硬件的结构和功能有更深的认识,并与软件结合,以达到理论与实践更好的结合,进一步提高综合运用所学知识进行设计的能力。这是对自己大学四年的学习的检验,具有重要的意义。1.2发展现状目前市场上的电子万年历并不是采用51单片机作为主控制器的,基于单片机的万年历一般是学生和单片机爱好者在进行设计,谈不上占有市场。也许就是这样,研究单片机万年历的人不在少数,并且都在努力。努力不是单方面的,单片机的功能也应该要提高,STC89C52单片机就是这样的例子,其功能虽然没有大幅度提高,但使用起来更方便了。我相信,在不久的将来肯定会有功能更强大成本更低的单片机出现,给我们的设计带来更多的便利。1.3解决问题本课题主要通过单片机的功能和应用,利用Keil[1]编程软件和Proteus仿真软件进行设计,并制作实物。设计要达到预期的效果要解决以下问题:(1)认真设计好万年历的逻辑原理图;(2)熟练使用C语言,运用Keil编程软件进行软件设计;(3)在Proteus仿真平台上,对程序进行编译仿真;(4)认真仔细地对万年历进行组装
转载请注明出处众文网 » 基于单片机的万历毕业论文笔记(单片机的电子万年历设计论文)