单片机万年历实训
多功能电子万年历实训报告

一、引言随着科技的发展,电子产品在我们的日常生活中扮演着越来越重要的角色。
作为电子信息专业的一名学生,我深知理论与实践相结合的重要性。
为了提高自己的动手能力和解决实际问题的能力,我参加了本次多功能电子万年历的实训项目。
通过本次实训,我不仅掌握了单片机的基本原理和编程方法,还学会了如何将理论知识应用于实际项目中。
二、实训目的1. 熟悉单片机的硬件结构和编程方法。
2. 掌握电子万年历的设计原理和实现方法。
3. 提高动手能力和解决实际问题的能力。
4. 培养团队协作和沟通能力。
三、实训内容本次实训主要围绕多功能电子万年历的设计与实现展开,主要包括以下几个方面:1. 硬件设计:选择合适的单片机作为核心控制单元,设计电路图,并焊接电路板。
2. 软件设计:编写程序,实现万年历的基本功能,如显示日期、时间、星期、闰年判断、闹钟等。
3. 温度采集:使用DS18B20温度传感器采集环境温度,并在LCD1602显示屏上显示。
4. 按键控制:设计按键电路,实现时间校准、闹钟设置、温度显示等功能。
四、实训过程1. 硬件设计:- 选择AT89C52单片机作为核心控制单元,因为它具有低功耗、高性能的特点。
- 设计电路图,包括晶振电路、复位电路、时钟电路、按键电路、LCD1602显示电路、温度传感器电路等。
- 焊接电路板,确保电路连接正确。
2. 软件设计:- 使用Keil软件编写程序,实现万年历的基本功能。
- 编写时间显示、闹钟、温度显示等模块的程序。
- 编写按键扫描程序,实现时间校准、闹钟设置、温度显示等功能。
3. 温度采集:- 使用DS18B20温度传感器采集环境温度。
- 将温度数据转换为数字信号,并在LCD1602显示屏上显示。
4. 按键控制:- 设计按键电路,实现时间校准、闹钟设置、温度显示等功能。
- 编写按键扫描程序,检测按键状态,并执行相应的操作。
五、实训结果经过努力,我成功完成了多功能电子万年历的设计与实现。
该万年历具有以下功能:1. 显示年、月、日、星期、时、分、秒。
单片机实训报告万年历

一、实训目的随着科技的发展,单片机在各个领域的应用越来越广泛。
本次实训旨在通过万年历的设计与实现,让学生深入了解单片机的编程与应用,提高学生的实践能力和创新意识。
通过万年历的设计,使学生掌握单片机的基本原理、编程技巧以及相关外设的使用。
二、实训内容本次实训以AT89C51单片机为核心,结合DS1302时钟芯片、LCD1602液晶显示屏和独立键盘,设计并实现一个具有年、月、日、星期、时分秒显示以及闰年判断功能的万年历。
三、实训步骤1. 需求分析- 显示当前日期和时间,包括年、月、日、星期、时分秒。
- 判断闰年,正确显示2月的天数。
- 允许用户通过按键调整日期和时间。
- 具有电源掉电保护功能,保证数据不丢失。
2. 硬件设计- 核心模块:AT89C51单片机- 时钟模块:DS1302时钟芯片,提供精确的日期和时间。
- 显示模块:LCD1602液晶显示屏,用于显示日期、时间和星期。
- 按键模块:独立键盘,用于调整日期和时间。
- 电源模块:锂电池,提供稳定的电源。
3. 软件设计- 主程序:负责初始化硬件、读取时间、显示时间和日期、处理按键输入等。
- 时钟模块:读取DS1302芯片中的时间,并进行处理。
- 显示模块:将时间、日期和星期显示在LCD1602液晶显示屏上。
- 按键处理模块:根据按键输入调整日期和时间。
4. 程序编写- 使用C语言进行程序编写,利用Keil软件进行编译和烧录。
5. 调试与测试- 对程序进行调试,确保功能正常。
- 对万年历进行测试,验证其准确性。
四、实训结果经过设计、编程、调试和测试,成功实现了万年历的功能。
万年历能够准确显示当前日期和时间,并具有闰年判断功能。
用户可以通过按键调整日期和时间,且在电源掉电的情况下,万年历仍能保持时间。
五、实训心得1. 实践出真知:通过本次实训,深刻体会到理论知识与实践应用相结合的重要性。
只有将所学知识运用到实际项目中,才能真正掌握单片机的编程与应用。
单片机实训--万年历程序

#include<reg52.h>typedef unsigned char uint8; #define clrdp 0x01#define enmode 0x06#define curback 0x02#define ondp 0x0f#define offdp 0x08#define movd 0x14#define funset 0x38#define bus P1#define contw 0x8e#define secw 0x80#define secr 0x81#define minw 0x82#define minr 0x83#define hourw 0x84#define hourr 0x85#define datw 0x86#define datr 0x87#define monthw 0x88#define monthr 0x89#define dayw 0x8a#define dayr 0x8b#define yearw 0x8c#define yearr 0x8dsbit K1=P2^7;sbit K2=P2^5;sbit K3=P2^4;sbit RS=P3^7;sbit RW=P3^6;sbit EN=P3^5;sbit DIO=P2^1;sbit RST=P2^2;sbit SCK=P2^0;bit flag=0;uint8 sel;uint8 time[7]={0};uint8 time_disp[32]={0}; void init_1602(void);void write_com(uint8 comd); void write_dat(uint8 wdata); void delay(void);void long_dleay(void);void init_1302(void);uint8 read_1302(uint8 addr);void write_1302(uint8 addr,uint8 wdata); void disp(void);void read_time(void);void sepr_time(void);void chk_key(void);uint8 bcd_dec(uint8 wdata);uint8 dec_bcd(uint8 wdata);void main(void){init_1302();init_1602();while(1){chk_key();read_time();sepr_time();disp();}}//1302初始化void init_1302(void){write_1302(contw,0);write_1302(secw,0);}//写1302寄存器void write_1302(uint8 addr,uint8 wdata) {uint8 i;SCK=0;RST=1;for(i=0;i<8;i++){DIO=addr&0x01;SCK=1;SCK=0;addr>>=1;}for(i=0;i<8;i++){DIO=wdata&0x01;SCK=1;SCK=0;wdata>>=1;}RST=0;}//读1302寄存器uint8 read_1302(uint8 addr) {uint8 i;uint8 temp;SCK=0;RST=1;for(i=0;i<8;i++){DIO=addr&0x01;SCK=1;SCK=0;addr>>=1;}for(i=0;i<8;i++){temp>>=1;if(! DIO){temp&=0x7f;}else{temp|=0x80;}SCK=1;SCK=0;}RST=0;return temp;}//读1302时间寄存器void read_time(void){uint8 i;uint8 temp;for(i=0;i<7;i++){temp=read_1302(0x81+i*2);time[i]=temp;}time[0]&=0x7f;}//显示时间void disp(void){uint8 i;write_com(0x80);for(i=0;i<16;i++){write_dat(time_disp[i]);}write_com(0xc0);for(i=16;i<32;i++){write_dat(time_disp[i]);}}//分离时间void sepr_time(void){time_disp[0]='-';time_disp[1]='-';time_disp[2]='2';time_disp[3]='0';time_disp[4]=(time[6]>>4)+0x30;time_disp[5]=(time[6]&0x0f)+0x30;time_disp[6]='-';time_disp[7]=(time[4]>>4)+0x30;time_disp[8]=(time[4]&0x0f)+0x30;time_disp[9]='-';time_disp[10]=(time[3]>>4)+0x30;time_disp[11]=(time[3]&0x0f)+0x30;time_disp[12]='-';time_disp[13]='-';time_disp[14]=(time[5]>>4)+0x30;time_disp[15]=(time[5]&0x0f)+0x30;time_disp[16]='-';time_disp[17]='-';time_disp[18]='-';time_disp[19]='-';time_disp[20]=(time[2]>>4)+0x30;time_disp[21]=(time[2]&0x0f)+0x30;time_disp[22]='-';time_disp[23]=(time[1]>>4)+0x30;time_disp[24]=(time[1]&0x0f)+0x30;time_disp[25]='-';time_disp[26]=(time[0]>>4)+0x30;time_disp[27]=(time[0]&0x0f)+0x30;time_disp[28]='-';time_disp[29]='-';time_disp[30]='-';time_disp[31]='-';}void init_1602(void){write_com(offdp);write_com(funset);write_com(enmode);write_com(movd);write_com(ondp);write_com(clrdp);}void write_com(uint8 comd){RS=0;RW=0;bus=comd;EN=1;EN=0;delay();}void write_dat(uint8 wdata){RS=1;RW=0;bus=wdata;EN=1;EN=0;delay();}void delay(void){uint8 t;for(t=0;t<250;t++);}void long_delay(void){uint8 t;for(t=0;t<200;t++){delay();}}void chk_key(void){uint8 buf;uint8 temp;if(!K1){long_delay();if(!K1){if(flag){if((sel>=0)&&(sel<8)){sel++;}else if(sel==8){temp=read_1302(secr);temp&=0x7f;write_1302(secw,temp);sel=0;flag=0;}else{sel=8;}}else{temp=read_1302(secr);temp|=0x80;write_1302(secw,temp);flag=1;}}}else if(!K2){long_delay();if(!K2){switch(sel){case 1:temp=read_1302(yearr);buf=bcd_dec(temp);if(buf<99){buf++;temp=dec_bcd(buf);write_1302(yearw,temp);}break;case 2:temp=read_1302(dayr);buf=bcd_dec(temp);if(buf<7){buf++;temp=dec_bcd(buf);write_1302(dayw,temp);}break;case 3:temp=read_1302(monthr);buf=bcd_dec(temp);if(buf<12){buf++;temp=dec_bcd(buf);write_1302(monthw,temp);}break;case 4:temp=read_1302(datr);buf=bcd_dec(temp);if(buf<31){buf++;temp=dec_bcd(buf);write_1302(datw,temp);}break;case 5:temp=read_1302(hourr);buf=bcd_dec(temp);if(buf<23){buf++;temp=dec_bcd(buf);write_1302(hourw,temp);}break;case 6:temp=read_1302(minr);buf=bcd_dec(temp);if(buf<59){buf++;temp=dec_bcd(buf);write_1302(minw,temp);}break;case 7:temp=read_1302(secr);temp&=0x7f;buf=bcd_dec(temp);if(buf<59){buf++;temp=dec_bcd(buf);temp|=0x80;write_1302(secw,temp);}break;default:break;}}}else if(!K3){long_delay();if(!K3){switch(sel){case 1:temp=read_1302(yearr);buf=bcd_dec(temp);if(buf>0){buf--;temp=dec_bcd(buf);write_1302(yearw,temp);}break;case 2:temp=read_1302(dayr);buf=bcd_dec(temp);if(buf>1){buf--;temp=dec_bcd(buf);write_1302(dayw,temp);}break;case 3:temp=read_1302(monthr);buf=bcd_dec(temp);if(buf>1){buf--;temp=dec_bcd(buf);write_1302(monthw,temp);}break;case 4:temp=read_1302(datr);buf=bcd_dec(temp);if(buf>1){buf--;temp=dec_bcd(buf);write_1302(datw,temp);}break;case 5:temp=read_1302(hourr);buf=bcd_dec(temp);if(buf>0){buf--;temp=dec_bcd(buf);write_1302(hourw,temp);}break;case 6:temp=read_1302(minr);buf=bcd_dec(temp);if(buf>0){buf--;temp=dec_bcd(buf);write_1302(minw,temp);}break;case 7:temp=read_1302(secr);temp&=0x7f;buf=bcd_dec(temp);if(buf>0){buf--;temp=dec_bcd(buf);temp|=0x80;write_1302(secw,temp);}break;default:break;}}}}uint8 dec_bcd(uint8 wdata){uint8 temp;uint8 i;uint8 j;i=wdata/10;j=wdata%10;temp=i;temp=temp<<4;temp=temp|j;return temp;}uint8 bcd_dec(uint8 wdata){uint8 temp;uint8 i;uint8 j;i=wdata>>4;j=wdata&0x0f;temp=i*10+j;return temp;。
单片万年历的实训报告

一、实训背景与目的随着科技的发展,单片机技术在各个领域得到了广泛应用。
万年历作为一种实用的电子设备,在日常生活中有着重要的地位。
本实训旨在通过设计并实现单片万年历,提高学生对单片机应用能力的掌握,加深对嵌入式系统设计、编程及调试的理解,培养解决实际问题的能力。
二、实训内容1. 万年历系统需求分析万年历系统应具备以下功能:(1)实时显示当前日期和时间;(2)具备闰年判断功能;(3)提供闰年、平年、大月、小月的判断;(4)提供日历查询功能;(5)提供闹钟功能。
2. 硬件设计万年历系统硬件主要由以下模块组成:(1)单片机:选用STC89C52单片机作为核心控制器;(2)实时时钟模块:选用DS1302实时时钟芯片,用于获取当前日期和时间;(3)显示模块:选用LCD1602液晶显示屏,用于显示日期和时间;(4)按键模块:选用独立按键,用于设置日期和时间、查询日历、设置闹钟等;(5)蜂鸣器:用于闹钟提示。
3. 软件设计万年历系统软件主要由以下部分组成:(1)主程序:负责初始化系统、处理按键输入、显示日期和时间、查询日历、设置闹钟等功能;(2)时钟模块:负责读取DS1302芯片的当前日期和时间,并更新显示;(3)日历模块:负责判断闰年、平年、大月、小月,并计算日期;(4)闹钟模块:负责设置闹钟时间,并在设定时间到来时触发蜂鸣器。
三、实训过程1. 硬件搭建根据设计方案,搭建万年历系统硬件电路,包括单片机、实时时钟模块、显示模块、按键模块和蜂鸣器等。
2. 软件编写使用C语言编写万年历系统软件,包括主程序、时钟模块、日历模块和闹钟模块等。
3. 调试与优化对万年历系统进行调试,修复程序中的错误,并对系统性能进行优化。
四、实训结果经过设计和调试,成功实现了一个功能完善的单片万年历系统。
系统能够实时显示当前日期和时间,具备闰年判断、日历查询、闹钟等功能。
用户可以通过按键设置日期和时间、查询日历、设置闹钟等。
五、实训总结1. 收获通过本次实训,我掌握了以下知识和技能:(1)熟悉了单片机系统硬件设计及搭建;(2)掌握了C语言编程及调试技巧;(3)了解了嵌入式系统设计及开发流程;(4)提高了解决实际问题的能力。
单片机万年历实习报告

一、实习背景随着科技的发展,单片机技术逐渐成为电子领域的主流技术之一。
为了提高自己的实践能力,加深对单片机原理的理解,我参加了单片机万年历的实习项目。
本次实习以AT89C51单片机为核心,结合LCD1602液晶显示屏,设计并实现了一个功能完善的万年历。
二、实习目的1. 熟悉单片机的基本原理和编程方法,掌握单片机的应用技术。
2. 学会使用LCD1602液晶显示屏,了解其工作原理和驱动方法。
3. 掌握万年历的设计与实现方法,提高自己的动手能力和实际操作技能。
4. 培养团队合作精神,提高自己的沟通能力和组织协调能力。
三、实习内容1. 硬件设计(1)选用AT89C51单片机作为核心控制器。
(2)使用LCD1602液晶显示屏显示日期、星期等信息。
(3)选用DS1302实时时钟模块获取当前时间。
(4)选用按键模块实现用户交互功能。
2. 软件设计(1)编写程序实现万年历的基本功能,包括日期显示、星期显示、时间设置等。
(2)编写程序实现实时时钟模块的初始化、数据读取和更新。
(3)编写程序实现按键模块的扫描和处理。
(4)编写程序实现LCD1602液晶显示屏的初始化、数据写入和显示控制。
3. 调试与优化(1)对硬件电路进行调试,确保电路连接正确,各模块工作正常。
(2)对软件程序进行调试,修复程序中的错误,优化程序性能。
(3)调整程序参数,使万年历显示效果更佳。
四、实习过程1. 硬件电路搭建根据设计要求,我首先搭建了万年历的硬件电路。
首先,将AT89C51单片机、LCD1602液晶显示屏、DS1302实时时钟模块和按键模块连接起来。
然后,对电路进行测试,确保各模块正常工作。
2. 软件编程在硬件电路搭建完成后,我开始编写软件程序。
首先,编写程序实现万年历的基本功能,包括日期显示、星期显示、时间设置等。
然后,编写程序实现实时时钟模块的初始化、数据读取和更新。
接着,编写程序实现按键模块的扫描和处理。
最后,编写程序实现LCD1602液晶显示屏的初始化、数据写入和显示控制。
万年历时钟实训报告

一、实训目的本次万年历时钟实训的主要目的是通过实际操作,学习万年历时钟的设计与制作,掌握万年历时钟的原理和制作方法,提高动手实践能力和创新思维。
实训过程中,我们学习了万年历时钟的硬件组成、软件编程、电路设计等知识,并对万年历时钟进行了实际制作。
二、实训内容1. 万年历时钟硬件组成万年历时钟主要由以下几部分组成:(1)单片机:作为万年历时钟的核心控制器,负责处理时间、日期、温度等数据,并控制整个时钟的运行。
(2)DS1302实时时钟模块:用于存储和提供当前时间、日期等信息。
(3)DS18B20温度传感器:用于检测环境温度。
(4)LCD12864液晶显示屏:用于显示时间、日期、温度等信息。
(5)按键:用于设置和调整时间、日期、温度等信息。
2. 万年历时钟软件编程万年历时钟的软件编程主要包括以下几部分:(1)主程序:负责初始化硬件设备,处理时间、日期、温度等数据,控制LCD显示。
(2)时钟模块:负责读取DS1302模块中的时间、日期信息,并实现时钟功能。
(3)温度模块:负责读取DS18B20传感器中的温度信息,并实现温度显示功能。
(4)按键处理模块:负责处理按键输入,实现时间、日期、温度的设置和调整。
3. 万年历时钟电路设计万年历时钟的电路设计主要包括以下几部分:(1)单片机与DS1302模块的连接:通过I2C接口连接单片机与DS1302模块,实现时间、日期信息的读取和写入。
(2)单片机与DS18B20传感器的连接:通过1-Wire接口连接单片机与DS18B20传感器,实现温度信息的读取。
(3)单片机与LCD12864显示屏的连接:通过SPI接口连接单片机与LCD12864显示屏,实现显示信息的输出。
(4)按键与单片机的连接:通过GPIO接口连接按键与单片机,实现按键输入的处理。
三、实训过程1. 硬件准备首先,准备好万年历时钟所需的硬件设备,包括单片机、DS1302模块、DS18B20传感器、LCD12864显示屏、按键等。
温度万年历的单片机实现实验报告

目录一、温度万年历设计的目的和意义 (1)二、电路设计方案 (1)三、原理设计 (1)四、方案结构图 (3)五、温度万年历1602驱动及显示的详细设计 (6)六、心得与总结 (14)一、温度万年历设计的目的和意义随着社会的发展,信息量的不断提升以前对信息交换的要求提高,温度万年历的发展以及投入市场变得非常有必要。
本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。
通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。
本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。
传统的电子日历大都体积大,功耗大,显示不准确等特点。
为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。
另外本设计具有显示实时温度的功能。
传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。
本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。
最后,温度和时间都将通过LCD1602液晶显示器进行显示。
测试表明系统达到了设计要求的各项功能,各部分工作正常。
二、电路设计方案采用AT89S52作为主控制系统; 直接采用单片机定时计数器提供秒信号;LCD 液晶显示屏作为显示。
三、原理设计1.基本原理:本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。
同时还添加了提醒功能,通过蜂鸣器实现。
2.总体框图图13. 单元电路设计◆ 单片机主控制模块的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O 口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O 口(P0、P1、P2、P3),每一条I/O 线都能独立地作输出或输入。
制作电子万年历实训报告

一、引言随着科技的飞速发展,电子产品的普及和应用越来越广泛。
电子万年历作为一种常见的电子设备,不仅可以显示年、月、日、星期、时、分等信息,还可以实现闹钟、定时显示等功能。
为了提高我们的实践能力和创新能力,本次实训我们选择制作一款基于单片机的电子万年历。
二、实训目的1. 掌握电子万年历的基本原理和设计方法。
2. 熟悉单片机的编程和应用。
3. 培养团队协作能力和动手实践能力。
三、实训内容1. 硬件设计本实训所使用的硬件主要包括以下部分:- 单片机:AT89C52- 时钟模块:DS1302- 显示模块:LCD1602- 遥控模块:1838V- 按键模块:S1(设置键)、S2(上调键)、S3(下调键)、S4(复位键)硬件电路图如下:2. 软件设计本实训所使用的软件主要包括以下部分:- 单片机编程:C语言- 显示程序:LCD1602驱动程序- 遥控程序:1838V遥控接收程序软件流程图如下:3. 功能实现本实训所实现的电子万年历具有以下功能:- 显示年、月、日、星期、时、分等信息。
- 遥控操作:设置时间、星期、日期等。
- 定时显示:定时显示当前时间。
- 停电自动计时:采用DS1302时钟模块,停电后可继续计时。
四、实训过程1. 硬件搭建首先,我们根据电路图搭建了电子万年历的硬件电路。
在搭建过程中,我们注意了以下几点:- 确保电路连接正确,避免短路或开路。
- 选择合适的元器件,确保电路性能稳定。
- 对电路进行测试,确保电路正常工作。
2. 软件编程接下来,我们使用C语言对单片机进行编程。
在编程过程中,我们遵循以下步骤:- 分析功能需求,确定程序结构。
- 编写程序代码,实现各项功能。
- 调试程序,确保程序运行正常。
3. 测试与优化在完成软件编程后,我们对电子万年历进行测试。
在测试过程中,我们发现以下问题:- 遥控操作不稳定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ﻩshort year;//待选
char month;
charmday;
charweek;
charhour;
ﻩcharminute;
char second;
}time;
structtime_char//time的字符型
{
char ch_year[4];
charch_month[2];
char ch_mday[2];
charflag_ok=0;//key_up与key_down的功能选择
charflag_mean=0;
char flag_set=0;//key_up与key_down的功能标识
charflag_year_leap=0;
//短语
//codecharstring_time[]="Settingtime?\0";
code char string_hour[]="Settinghour? \0";
codecharstring_minute[]="Settingminute?\0";
code char string_second[]="Setting second? \0";
//年月日时分秒的定义
struct DATA_TIME
else return0;
}
//星期的判断
void de_week(void)
{
int i,j,day=0;
charmweek;
for(i=2000;i<time.year;i++)
{
if(leep_year(i))day+=366;
elseday+=365;
}
for(j=1;j<time.month;j++)
pt[1]=DATA-pt[0]*10+0x10;
}
voidtran_4_ch(char*pt,intDATA)
{
pt[0]=DATA/1000;
pt[1]=DATA/100-pt[0]*10;
pt[2]=DATA/10-pt[0]*100-pt[1]*10;
pt[3]=DATA-pt[0]*1000-pt[1]*100-pt[2]*10;
{
if(j==1||j==3||j==5||j==7||j==8||j==10||j==12)
pt[0]+=0x30;
pt[1]+=0x30;
pt[2]+=0x30;
pt[3]+=0x30;
}
//格式转换的实现
voidtran_ch(void)
{
tran_4_ch(time_ch.ch_year ,time.year);
tran_2_ch(time_ch.ch_month,time.month);
charch_week[1];
charch_hour[2];
charch_minute[2];
char ch_second[2];
}time_ch;
/***************子函数****************/
//LCD的延时程序
void LCD_delay(void)
{
chari,j;
for(i=100;i>=0;i--)for(j=0;j<20;j++);
显示年、月、日、时、分、秒(24小时制)
时间可调,年份2000——9999
2012年10月9日
*******************************************/
#include<reg51.h>
/******全局变量的定义与设置******/
sbitkey_mean=P1^0;ﻩ//按键的定义
}
//向LCD写指令函数
void wcmd(charcmd)
{
RS=0;
RW=0;
E=1;
LCD_delay();
PORT=cmd;
LCD_delay();
E=0;
}
//向LCD写数据函数
voidwdata(charDATA)
{
RS=1;
RW=0;
E=1;
LCD_delay();
PORT=DATA;
tran_2_ch(time_ch.ch_mday,time.mday );
//tran_2_ch(time_ch.ch_week,time.week*10+1);
time_ch.ch_week[0]=time.week+0x30;
tran_2_ch(time_ch.ch_hour,time.hour);
单片机万年历实训
———————————————————————————————— 作者:
————————————————————————————————日期:
单片机万年历实训
仿真图:
原理图:
程序:
/******************************************
使用LCD1602与单片机实现的时钟与日期
tran_2_ch(time_ch.ch_minute,time.minute);
tran_2_ch(time_ch.ch_second,time.second);
}
//是否是闰年
char leep_year(intyear)//如果是闰年则flag_year_leep=1,否则=0
{
if((year%400==0)||year%4==0&&year%100!=0)return1;
codechar string_year[]="Setting year? \0";
codecharstring_month[]= "Settingmonth?\0";
codecharstring_mday[]="Setting day?\0";
code char string_week[]="Settingweek? \0";
sbitkey_ok=P1^1;
sbit key_set=P1^2;
sbitRS=P1^5;//LCD控制端口
sbitRW=P1^6;ﻩﻩﻩ
sbitE=P1^7;ﻩﻩﻩ
sfrPORT=0xa0;
char flag_sec=0;//值为20代表1s
charflag_en_ok=0;
charflag_en_key=0;ﻩ//值为1表示键盘有效,否则无效
LCD_delay();
E=0;
}
//写字符串
voidwstring(char *pt,chari)// i为字符的个数,不带\0
{
char j;
for(j=0;j<i;j++)
{
wdata(pt[j]);
}
}
//时Байду номын сангаас数据的格式转换
voidtran_2_ch(char*pt,charDATA)
{
pt[0]=DATA/10+0x30;