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.单片机课程设计
这有一篇,给你参考:
?1308581933
万年历程序 *
;*****************************
;67H(高两位年)66H(低两位年)65H(月)64H(星期)
;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
;显示缓冲单元7CH~7BH(4CH~4BH)年低位,7AH~79H(4AH~49H)月,
;78H(48H)星期,77H~76H(47H~46H)日,75H~74H(45H~44H)时,
;73H72H(43H~42H)分,71H~70H(41H~40H)秒,5EH~5DH(55H~54H)农历年
;5CH~5BH(53H~52H)农历月,5AH~59H(51H~50H)农历日
;闰年标志为F0,定时器T1为调整时候闪烁用;************************************
主程序 * ;************************************
START: SETB EA
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充电,充电电流1.1mA
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.基于单片机的万年历的设计
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
5.基于单片机控制的电子万年历课程设计
电子万年历
部分源程序
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
有的
基于单片机控制的电子万年历课程设计
6.设计一个基于单片机的万年历程序
#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--); }。
转载请注明出处众文网 » 基于单片机的万历设计毕业论文(单片机的电子万年历设计论文)