数码管万年历实习报告..

合集下载

数字万年历实训报告电气

数字万年历实训报告电气

一、实训目的随着科技的不断发展,电子产品的应用越来越广泛。

数字万年历作为一种常见的电子设备,具有显示日期、星期、农历、节假日等多种功能,给人们的生活带来了极大的便利。

为了更好地掌握电子产品的设计原理和制作方法,提高自身的实践能力,本次实训旨在通过设计和制作数字万年历,使学生对电子技术、电路设计、编程等方面有一个全面的认识和掌握。

二、实训内容1. 数字万年历的设计(1)功能需求分析根据用户需求,数字万年历应具备以下功能:1)显示日期、星期、农历、节假日等信息;2)具有闹钟功能,可设定闹钟时间、闹钟音量等;3)具有定时关机功能,可根据用户需求设定关机时间;4)具备背光功能,便于夜间使用;5)具有定时更新功能,可自动更新农历、节假日等信息。

(2)硬件设计1)主控芯片:选用STM32F103系列单片机,具有丰富的片上资源,易于编程和控制。

2)显示模块:采用TFT LCD显示屏,显示效果清晰,支持触摸操作。

3)按键模块:采用独立按键,实现功能选择、闹钟设置、关机等操作。

4)时钟模块:采用DS3231实时时钟模块,提供高精度的时间测量和闹钟功能。

5)背光模块:采用LED背光,可调节亮度,满足不同环境需求。

6)电源模块:采用DC-DC转换器,将5V输入电压转换为3.3V输出电压,为电路提供稳定电源。

(3)软件设计1)系统初始化:初始化各个模块,包括显示模块、按键模块、时钟模块等。

2)主循环:根据用户操作,实现功能切换、闹钟设置、关机等功能。

3)闹钟功能:实现闹钟时间设置、闹钟音量调节、闹钟提醒等功能。

4)定时关机功能:根据用户设置,实现定时关机功能。

5)背光功能:实现背光亮度调节,满足不同环境需求。

6)定时更新功能:自动更新农历、节假日等信息。

2. 数字万年历的制作(1)焊接电路板:按照电路图,焊接各个模块,确保电路连接正确。

(2)编程:使用Keil uVision5开发环境,编写STM32F103单片机程序,实现数字万年历的功能。

万年历组装实训报告

万年历组装实训报告

—實訓報告—(单片机实训报告)学院系别:机电工程学院专业班级:电信BK31901设计学生:张欢指导老师:陈老师、阎老师设计时间:2012年10月19日万年历组装与调试及单片机实训报告2012-10-219| 电信BK31901班张欢一、实习时间:2012年10月15日至2012年10月19日二、实习地点:机电实训楼三、实习目的与要求:1熟练C语言中if语句、for语句、while语句的使用。

2.掌握万年历的基本原理,学会分析基本的电路原理图。

3.学会利用Keil软件和proteus软件进行设计。

四、实习内容:1.利用Keil软件对数码管(秒表)液晶(时钟)编程,并进行编译和链接。

2.掌握AT89C51芯片I/O口的功能及作用。

3.灵活运用C语言对中断、定时计数器及数码管进行编程设计。

4认真掌握proteus仿真软件,并用proteus画出电路图软件进行仿真。

5.掌握万年历的工作原理,学会贴片电容,贴片电阻,晶振集成块的识别与测试,进一步掌握和熟练焊接技术。

五、运用Keil软件对数码管及液晶进行编程设计并用proteus仿真1.用数码管显示0—60的源程序:#include<reg51.h>#define uint unsigned char#define uchar unsigned intsbit K1=P3^7;uchar i,Second_Counts,Key_Flag_Idx;bit Key_State;uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};void DelayMS(uint x){ uchar t;while(x--)for(t=0;t<500;t++);}void Key_Byent_Handle(){ if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){case 1:EA=1;ET0=1;TR0=1;break;case 2:EA=0;ET0=0;TR0=0;break;case 0:P0=0x3f;P2=0x3f;i=0;Second_Counts=0; }}} void main(){P0=0x3f;P2=0x3f;i=0;Second_Counts=0;Key_Flag_Idx=0;Key_State=1;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;while(1){if(Key_State!=K1){DelayMS(10);//开关消抖Key_State=K1;Key_Byent_Handle();}}}void DSY_keyfresh() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(++i==2){i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==60)Second_Counts=0;}}2.用液晶显示年、月、日、字符串的源程序:#include<reg52.h>unsigned char code tab[]="welcome BK31901"; unsigned char code tab1[] ="2012-10-19"; unsigned char num;sbit RS=P1^2;sbit RW=P1^1;sbit E =P1^0;void delay(unsigned int z){unsigned int x,y;for(x=z;x>0;x--)for(y=0;y<150;y++);}void write_com(unsigned char cmd){RS=0;RW=0;E=1;P2=cmd;E=0;delay(2);}void write_data(unsigned char dat){RS=1;RW=0;E=0;P2=dat;E=0;delay(2);}void init(){write_com(0x38);write_com(0x08);write_com(0x01);write_com(0x0f);write_com(0x06);}int main(){init();write_com(0x80);for(num=0;num<17;num++){write_data(tab[num]);}write_com(0x80-0x42);for(num=0;num<11;num++){ write_data(tab1[num]);}while(1);return 0;}3.用proteus画出电路图软件进行仿真六、作品实物图片七、心得体会在本次单片机实训中,我们从焊接贴片电阻、贴片电容、电子元器件开始,到组装、调试、检验合格,完成了万年历的整个过程。

6、用DS1302与LCD1602可调数字万年历实验设计报告

6、用DS1302与LCD1602可调数字万年历实验设计报告

利用时钟芯片DS1302实现万年历系别电子通信工程系组别第十组专业名称电子信息工程指导教师组内成员2013年8月19日用DS1302与LCD1602设计的可调式电子日历时钟一、总体设计1.1、设计目的为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与DS1302 设计可调式电子日历时钟。

1.2、设计要求(1)显示:年、月、日、时、分、秒和星期;(2)设置年、月、日、时、分、秒和星期的初始状态;(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期;完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。

控制程序的编写等。

备注:本程序另外添加了每到上午8:10和下午2:10的闹钟提醒功能。

1.3、系统基本方案选择和论证1.3.1、单片机芯片的选择方案方案一:采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。

方案二:采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。

内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。

但造价较高。

1.3.2 、显示模块选择方案和论证:方案一:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。

所以不用此种作为显示。

方案二:采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。

所以也不用此种作为显示。

方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。

数字万年历实习报告

数字万年历实习报告

实习报告一、实习背景及目的随着科技的不断发展,数字电子技术在人们的生活中扮演着越来越重要的角色。

数字万年历作为一种实用性强的电子产品,不仅能够提供准确的日期信息,还能具备一些扩展功能,如节日提醒、闹钟等。

为了提高自己的实践能力和对数字万年历的了解,我选择了数字万年历设计制作作为实习项目。

本次实习的主要目的是通过实际操作,掌握数字万年历的设计原理和制作过程,提高自己的电子技术应用能力。

二、实习内容1. 数字万年历的设计在实习过程中,我首先学习了数字万年历的设计原理,了解了其核心组成部分,包括微控制器、显示模块、按键输入模块等。

在此基础上,我根据实习指导书提供的电路图和程序代码,设计了数字万年历的硬件电路和软件程序。

2. 数字万年历的组装在设计完成后,我开始进行数字万年历的组装工作。

首先将微控制器、显示模块、按键输入模块等元器件焊接在电路板上,然后连接电源模块和时钟模块。

在组装过程中,我学习了如何使用电烙铁、焊锡等工具,提高了自己的动手能力。

3. 数字万年历的调试与优化完成组装后,我开始对数字万年历进行调试。

通过反复测试,发现并解决了一些问题,如显示模块显示异常、按键响应不良等。

在解决问题过程中,我深入分析了电路原理和程序代码,掌握了数字万年历的运行机制。

最后,我对程序代码进行了优化,提高了数字万年历的运行效率。

三、实习收获1. 提高了自己的电子技术应用能力。

通过本次实习,我掌握了数字万年历的设计原理、组装方法和调试技巧,提高了自己在电子技术方面的实际操作能力。

2. 培养了动手能力和团队协作精神。

在实习过程中,我学会了如何使用各种电子工具,培养了动手能力。

同时,与同学们一起讨论问题、分享经验,提高了团队协作精神。

3. 增强了自己的问题解决能力。

在数字万年历的调试过程中,我遇到了各种问题,通过查阅资料、请教同学和老师,逐步解决问题,增强了自己的问题解决能力。

4. 加深了对数字电子技术的理解。

通过实习,我对数字电子技术的基本原理和应用有了更深入的了解,为今后学习相关课程和从事相关工作奠定了基础。

数字万年历组装实训报告

数字万年历组装实训报告

一、实训背景随着科技的发展,电子产品在我们的日常生活中扮演着越来越重要的角色。

为了提高学生的动手能力和实际操作技能,同时也为了加深对数字电路知识的理解,我们选择了数字万年历的组装作为实训项目。

数字万年历是一种具有日历、星期、日期、农历、节假日等多种功能的电子设备,它集成了数字电路、微控制器、液晶显示屏等元件,能够直观地显示日期和时间信息。

二、实训目的1. 通过组装数字万年历,使学生掌握数字电路的基本原理和实际应用。

2. 培养学生的动手能力、团队协作能力和创新意识。

3. 加深对微控制器、液晶显示屏等电子元件的理解和认识。

4. 学会使用电子工具和仪器,提高实际操作技能。

三、实训内容1. 硬件准备:数字万年历的硬件主要包括微控制器、液晶显示屏、时钟模块、按键、电源模块等。

2. 元件识别:学习各种电子元件的外观、符号、规格等,了解它们在电路中的作用。

3. 电路设计:根据数字万年历的功能要求,设计电路图,包括电路元件的连接方式和电路参数。

4. 电路焊接:按照电路图,将各个电子元件焊接在一起,确保电路的连通性。

5. 软件编程:编写微控制器的程序,实现万年历的各项功能,如时间显示、日期设置、农历查询等。

6. 系统调试:检查万年历的各项功能是否正常,对出现的问题进行调试和修复。

四、实训过程1. 硬件准备:首先,我们准备了一套数字万年历的组装套件,包括微控制器、液晶显示屏、时钟模块、按键、电源模块等。

2. 元件识别:在指导老师的讲解下,我们学习了各种电子元件的外观、符号、规格等,了解了它们在电路中的作用。

3. 电路设计:根据数字万年历的功能要求,我们设计了电路图,包括电路元件的连接方式和电路参数。

电路图设计完成后,我们将其打印出来,作为焊接的依据。

4. 电路焊接:按照电路图,我们将各个电子元件焊接在一起。

在焊接过程中,我们注意以下几点:a. 焊接前,检查元件的规格和引脚是否正确;b. 焊接时,控制好焊接时间,避免过热损坏元件;c. 焊接完成后,检查焊接点是否牢固,是否有虚焊现象。

万年历实验报告

万年历实验报告

篇一:电子万年历实验报告重庆电力高等专科学校计算机科学系实训报告课程名称实验名称班级信息0911 姓名廖林单片机应用技术电子万年历学号 200903020243 教师任照富日期 2010-12-28 地点一教七机房一、实训任务:1、看实训要求,计划出自己实训所要用元件,在网上查找资料。

2、思考仿真原理图,然后画出来(具体i/o口暂时不确定)。

3、在网上找一些程序,然后自己改一些,进行编译。

4、编译无误之后,跟原理图相联系,完成最终的仿真图。

5、进行最后的改写,把程序和仿真原理图确定下来。

6、根据仿真图形,制作出实物图。

7、在实物制作过程中,进行电路检查和最后的调试。

二、实训要求:要求:能显示阳历的年、月、日、星期、时、分、秒;能显示阴历的年、月、日;能进行日期、时间的调整。

扩展:能显示当前温度;有闹钟功能(至少2个)选择ds1302时钟芯片,温度传感器采用ds18b20数字温度传感器。

三、实训环境(软件、硬件):软件:keil protues7.5硬件:计算机2单片机的应用四、实训意义:在这快速发展的年代,时间对人们来说是越来越宝贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。

因此我们需要一个定时系统来提醒这些忙碌的人,而数字化的钟表给人们带来了极大的方便。

由于单片机具有灵活性强、成本低、功耗低、保密性好等特点,所以电子日历时钟一般都以单片机为核心,外加一些外围设备来实现。

电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。

因为它的有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。

而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。

所以,电子万年历无论作为竞赛题目还是毕业设计题目都是很有价值。

对于这个实验项目,我们还要有一些其他的基本知识掌握和意义:(1)在学习了《数字电子技术》和《单片机原理及接口技术》课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,为了培养动手能力和解决实际问题的经验,了解专用时钟芯片ds1302,并会用ds1302芯片开发时钟模块,应用到其他系统中去。

万年历实训报告

万年历实训报告

万年历实训报告目录第一部分:实训目的 (2)第二部分:实训意义 (2)第三部分:实训内容 (3)(一)硬件实训内容 (3)(二)软件实训内容 (3)1.秒、分的VHDL语言及CNT60模块 (3)2.时的VHDL语言及CNT24模块 (4)3.天的VHDL语言及tian模块 (6)4.月的VHDL语言及yue模块 (7)5.年的VHDL语言及nian模块 (9)6.调试的VHDL语言及tiaoshi模块 (10)7.显示的VHDL语言及xianshi模块 (11)8.万年历的原理图 (12)第四部分:实训中疑难解答 (14)第五部分:实训心得 (15)一.实训目的(一)硬件实训目的:1. 熟悉EDA实验箱的基本工作原理。

2. 熟悉并掌握EDA实验箱各个模式的功能。

3. 提高学生的动手能力。

(二)软件实训目的:1.熟悉并掌握Quartus II 6.0软件的使用。

2.熟练的使用原理图输入设计方法,VHDL语言编写程序,进一步了解和掌握各个程序语言,提高编程的熟练程度。

3.掌握年、月、日、时、分、秒程序的原理,进而理解万年历的设计原理。

4.拓宽学生知识面,增强工程意识,培养学生的分析和解决实际问题的能力。

5.提高学生的动手能历。

二.实训意义该数字时钟实现了调时、年、月、日、时、分、秒的显示功能,无需接译码器,可直接接八段共阴极数码管,总体结构如下图所示:第一部分第二部分第三部分D8(l5)D7(l2) D6 D5 (l4) D4(l1) D3 D2(l3)D18个LED数码管为了显示清楚只用了6个数码管,分为3个部分。

采用的是EDA试验箱上的模式7。

软件Quartus II 6.0方面:在显示程序中,k3控制分屏。

当k3=‘1’时,3部分数码管显示年、月、日;当k3=‘0’时,3部分数码管显示时、分、秒。

万年历正常工作时,D1~D8都不亮。

调时时,秒的变化不需控制,故需调时有年、月、日、时、分5个量。

万年历实验报告

万年历实验报告

万年历实验报告基于单片机的课程设计设计题目:电子万年历设计任务与要求:1、显示年月日时分秒及星期信息2、具有可调整日期和时间功能3、增加闰年计算功能方案比较:方案一:系统分为主控制器模块、显示模块、按键开关模块,主控制模块采用AT89C52单片机为控制中心,显示模块采用普通的共阴LED 数码管,键输入采用查询法实现功能调整,计时使用AT89C52单片机自带的定时器功能,实现对时间、日期的操作,通过按键盘开关实现对时间、日期的调整。

方案二:系统分为主控模块、时钟电路模块、按键扫描模块,LCD 显示模块,电源电路、复位电路、晶振电路等模块。

主控模块采用AT89C52单片机,按键模块用三个按键,用于调整时间,显示模块采用LCD1602,时钟电路模块采用DS1302时钟芯片实现对时间、日期的操作。

两个方案工作原理大致相同,只有显示模块和时钟电路不同。

LED 数码管价格适中,对于数字显示效果较好,而且使用单片机的端口也较少; LCD1602液晶显示屏,显示功能强大,可以显示大量文字、图形,显示多样性,明晰可见,价格相对LED数码管来说要昂贵些,但是基于本设计显示的东西较多,假设采用LED数码管的话,所需数码管较多,而且不利于控制,因此选择LCD1602作为显示模块。

DS1302是一款高性能的实时时钟芯片,以计时准确、接口简单、使用方便、工作电压范围宽和低功耗等优点,得到广泛的应用,实时时钟有秒、分、时、星期、日、月和年,月小于31天时可以自动调整,并具有闰年补偿功能,而且在掉电时能够在外部纽扣电池的供电下继续工作。

单片机有定时器的功能,但时间误差较大,且需要编写始终程序,因此采用DS1302作为时钟电路。

基于单片机的课程设计对比以上方案,结合设计技术指标与要求我们选择了方案二进行设计。

逻辑总框图:该电子万年历的总体设计框图如图(1)所示。

设计所需的元件:元件名称型号数量/个1 1单片机 AT89C52 时钟芯片晶振晶振电容电容DS130212MHz 1 32.768kHz130pF 2 22uF 11 32 1按键开关复位开关电阻滑动变阻器220 10K发光二极管红色 1 电池 LCD1.5V 4 LCD16021基于单片机的课程设计电源Vcc 导线+5V 1假设干单元电路设计:1、主控制系统单片机中央处理系统的方案设计,选用AT89C52单片机作为中央处理器,如图(2)所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河南机电高等专科学校综合实训报告系部:专业:班级:学生姓名:学号:2013年 6月 28日实训任务书1.时间:2013年6月15日~2013年6月28日2. 实训单位:河南机电高等专科学校3. 实训目的:深入学习电子产品设计制作的全过程4. 实训任务:①加深学习电路图绘制软件的相关常识及其特点;②以51单片机为核心设计出一个LED万年历;③万年历具有年份、月、日、时、分、秒、周、温度、整点报时等功能;④自己独立完成设计电路图,生成PCB,转印、腐蚀电路板,焊接等硬件制作工作;⑤会使用keil软件编写程序,并完成烧写过程;⑥学会调试程序,敢于发现问题,解决问题;⑦参考相关的的书籍、资料,认真完成实训报告。

综合实训报告前言:万年历是我们经常见到和使用的计时工具,使用方便,功能多。

但自己做一个让人满意的万年历,就不一定有那么轻而易举了,本次实训的任务就是自己亲手做一个万年历。

利用本学期学过的单片机知识,设计出具有显示年、月、日、时、分、秒、周、温度功能,同时有整点报时的功能的万年历。

一、实训器件1.温度传感器DS18B20采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。

另外,数字式温度传感器还具有测量精度高、测量范围广等优点。

因此,本设计DS18B20温度传感器作为温度采集模块。

2.时钟芯片DS1302采用DS1302时钟芯片实现时钟,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。

采用普通32.768kHz晶振。

因此,本设计中采用DS1302提供时钟。

3.74LS15474LS154 为 4 线-16 线译码器,其主要电特性的典型值如下:当选通端(G1、G2)均为低电平时,可将地址端(ABCD)的二进制编码在一个对应的输出端,以低电平译出。

若将G1和G2中的一个作为数据输入端,由ABCD对输出寻址,54/74154 还可作4线-16线数据分配器。

引出端符号: A、B、C、D 译码地址输入端(低电平有效)G1、G2 选通端(低电平有效)0-15 输出端(低电平有效)可用此种芯片作为数码管的选址芯片。

4.74HC57374HC573是八进制3态非反转透明锁存器,是高性能硅门CMOS器件。

当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。

当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。

输出能直接接到CMOS,NMOS和 TTL接口上操作电压范围:2.0V~6.0V×低输入电流: 1.0uA 。

本实训采用此芯片作为数码管的驱动芯片。

5.数码管本实训使用共阴极数码管作为显示器件,采用 LED 数码管动态扫描,LED 数码管价格适中,对于显示数字也最合适。

综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用AT89S51作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;74LS154作为选址芯片;74HC573作为数码管的驱动芯片;共阴极数码管显示数字;S8550驱动扬声器。

二、实训原理为了使万年历在包装美化时简单化及布线的方便,我将万年历分为两部分,一部分是主体部分含有年份、月、日、时、分、秒,另一部分是小模块包含周、温度。

电路图如下:主电路图:主电路PCB:周,温度电路图:周,温度PCB:三、程序编写使用Keil软件编写程序。

程序包括主函数、时间显示函数、温度显示函数、时间调整函数、DS18B20模块、DS1302模块和周计算函数等。

程序的编写使我熟练的掌握了Keil软件的应用。

具体程序见附录。

四、程序的烧写与调试程序烧写需要用专用的烧写软件将Keil软件声生成的.hex文件写进单片机里。

经过多次的程序的改写与调试,最终制作出比较满意的成品。

五、成品展示:心得体会:经过此次实训我学到了很多,刚开始以为做万年历很难,着手开始做这个产品没有一点头绪,经过上网查资料,产生了最初的制作框架,然后就开始找芯片,查芯片资料,设计电路图,又请同学帮忙指点,修改原理图。

接着买元器件,做封装,生成PCB,制作电路板,焊接元器件,最后完成了整个硬件部分的制作。

完成了硬件制作后,我又编了测试软件测试硬件是否有问题,发现数码管不亮,经过问题排查及资料查询,发现单片机P0口缺少了上拉电阻,接上后,解决了问题。

编程也是比较困难的,由于掌握的知识不够多,借鉴了别人的程序,并加入自己的想法,经过调试,程序编写成功。

最终完成了产品的制作。

在实习的过程中我得到了别人的帮助,同时也主动帮助别人,得到了很多经验,为以后学习提供了方便。

实习就是学习的过程,本次实习是最成功的一次,也是学到最多的一次。

参考文献:《单片机C51程序设计教程与实验》北京航空航天大学出版社《单片机原理及应用(C51语言)》清华大学出版社《数字电子技术》黄河水利出版社《Protel DXP 2004电路设计与仿真教程》北京航空航天大学出版社附录:程序万年历.c#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x00}; uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;uchar count=0;sbit SET=P3^4;sbit ADD=P3^5; //增加sbit RED=P3^6; //减小sbit CANL=P3^7;sbit le=P2^6;sbit oe=P2^7;sbit en=P1^4;sbit beep=P2^4;uchar GetWeekFromDay(uchar years,uchar months,uchar days);void WriteSet1302(uchar cmd,uchar date);uchar ReadSet1302(uchar cmd);void ReadyreadDS18B20(void);uchar ReadDS18B20(void);void IntDS1302(void);void delay1ms( uint x){uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}void delaynus(uchar n) //延时若干微秒{while(n--);}void display_Year(year) //显示年{uchar i,j;i=year/10;j=year%10;P0=digit[2];P1=8;delay1ms(2);P0=digit[0];P1=9;delay1ms(2);P0=digit[i];P1=10;delay1ms(2);P0=digit[j];P1=11;delay1ms(1);}void display_Month(month) //显示月{uchar i,j;i=month/10;j=month%10;P0=digit[i];P1=6;delay1ms(2);P0=digit[j];P1=7;delay1ms(1);}void display_Day(day) //显示日{uchar i,j;i=day/10;j=day%10;P0=digit[i];P1=4;delay1ms(2);P0=digit[j];P1=5;delay1ms(1);}void display_Hour(hour) //显示时{uchar i,j;i=hour/10;j=hour%10;P0=digit[i];P1=2;delay1ms(2);P0=digit[j]+n*0x80;P1=3;delay1ms(1);}void display_Minute(minute) //显示分{uchar i,j;i=minute/10;j=minute%10;P0=digit[i];P1=0;delay1ms(2);P0=digit[j];P1=1;delay1ms(1);}void display_Week(void) //显示周{WEEK=GetWeekFromDay(years,months,days); P1=12;switch(WEEK){case 1:P0=digit[1];delay1ms(2);break;case 2:P0=digit[2] ;delay1ms(2);break;case 3:P0=digit[3];delay1ms(2);break;case 4:P0=digit[4];delay1ms(2);break;case 5:P0=digit[5];delay1ms(2);break;case 6:P0=digit[6];delay1ms(2);break;case 7:P0=digit[8];delay1ms(2);break;}}void display_Time(void) //显示实时时间{uchar value;value=ReadSet1302(0x83);minutes=(((value&0x70)>>4)*10+(value&0x0f));display_Minute(minutes);value=ReadSet1302(0x85);hours=(((value&0x70)>>4)*10+(value&0x0f));display_Hour(hours);value=ReadSet1302(0x87);days=(((value&0x70)>>4)*10+(value&0x0f));display_Day(days);value=ReadSet1302(0x89);months=(((value&0x70)>>4)*10+(value&0x0f));display_Month(months);value=ReadSet1302(0x8D);years=(((value&0xf0)>>4)*10+(value&0x0f));display_Year(years);display_Week();}/*****************时间调整部分*********************/void hourset(void) //调时{uchar timevalue,hour;delay1ms(500); //防止多次触发WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302timevalue=ReadSet1302(0x85); //读取此时的数值hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){hour++;delay1ms(100);while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){hour--;delay1ms(100);if(hour==0) hour=23;while(RED==0);}}if(hour>=24) hour=0;timevalue=(((hour)/10)<<4|(hour%10));WriteSet1302(0x84,timevalue);delay1ms(2);display_Hour(hour);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void minuteset(void) //调分{uchar timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){minute++;if(minute>=60) timevalue=0;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){minute--;if(minute==0) minute=59;delay1ms(300);while(RED==0);}}if(minute>=60) minute=0;timevalue=((minute/10)<<4|(minute%10));WriteSet1302(0x82,timevalue);delay1ms(2);display_Minute(minute);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void yearset(void) //调年{uchar datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){year++;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){year--;delay1ms(100);while(RED==0);}}datevalue=((year/10)<<4|(year%10));WriteSet1302(0x8c,datevalue);delay1ms(5);display_Year(year);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void monthset(void) //调月{uchar datevalue,month;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){month++;if(month>12) month=1;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){month--;delay1ms(100);if(month==0) month=12;while(RED==0);}}datevalue=((month/10)<<4|(month%10));WriteSet1302(0x88,datevalue);delay1ms(5);display_Month(month);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void dayset(void) //调日{uchar datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(10);if(ADD==0){day++;if(day>31) day=1;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){if(day==0) day=31;day--;delay1ms(300);while(RED==0);}}datevalue=((day/10)<<4|(day%10));WriteSet1302(0x86,datevalue);delay1ms(5);display_Day(day);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void TimeSet(void) //时间调整函数{if(SET==0){delay1ms(20);if(SET==0){ while (!SET) ;mode++;delay1ms(20);switch(mode){case 1:{yearset();delay1ms(20);} break;case 2:{monthset();delay1ms(20);} break;case 3:{dayset();delay1ms(20 );} break;case 4:{hourset(); delay1ms(20);} break;case 5:{minuteset();delay1ms(20);} break;}if(mode==5) mode=0;}}}/***************显示温度模块********************/uchar flag;/*********************显示温度整数部分*************************/ void Display_Integer(unsigned char x){uchar s,g;s=x%100/10;g=x%10;P0=digit[s];P1=13;delay1ms(3);P0=digit[g]+0x80;P1=14;delay1ms(3) ;P0=digit[10];P1=15;delay1ms(1);}void display_Temperature(void){ReadyreadDS18B20();TL=ReadDS18B20();TH=ReadDS18B20();if((TH&0XF8)!=0X00){flag=1;TL=~TL;TH=~TH;TL+=1;if(TL>255) TH+=1;TN=TH*16+TL/16;}TN=TH*16+TL/16;Display_Integer(TN);}/**************** 设置模块******************/void Set(void){if(SET==0){delay1ms(5);if(SET==0){delay1ms(50);while(1){TimeSet();if(CANL==0){break;}}}}}void InitTimer0(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0x0B0;EA = 1;ET0 = 1;TR0 = 1;}/***************主函数**********************/void main(){int i;P0=0;InitTimer0();IntDS1302(); //初始化DS1302delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1){for (i=1000;i>0;i--){Set( );display_Time( );Display_Integer(TN);if(hours==7||hours==8||hours==9||hours==10||hours==11||hours==12||hours==14||hours==15||hours==16||hours==17||hours==18||hours==19||hours==20||hours==21||hours==22){if(minutes==0x00){uchar value,w,k;value=ReadSet1302(0x81);seconds=(((value&0x70)>>4)*10+(value&0x0f));if(seconds>0&&seconds<2){for(k=5;k>=0;k--){for(w=100;w>0;w--){beep=0;delay1ms(3);beep=1;delay1ms(3);}delay1ms(1000);}}else beep=1;}}}display_Temperature();}}void t0() interrupt 1{TH0 = 0x3C;TL0 = 0x0B0;count++;if(count==10){n=0;}if(count==20){ count=0;n=1;}}/*******DS1302模块*************/sbit SCLK=P2^0; //DS1302时钟输入sbit DATE=P2^1; //DS1302数据输入sbit REST=P2^2; //DS1302复位端口void Write1302(uchar date)//向1302写数据{uchar i;SCLK=0;delaynus(2);for(i=0;i<8;i++){DATE=date&0x01;SCLK=1;delaynus(2);SCLK=0;delaynus(2);date>>=1;}}void WriteSet1302(uchar cmd,uchar date) //根据相应的命令输入相应的数据{REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);Write1302(date);SCLK=1;REST=0;}uchar Read1302(void) //读取1302数据{uchar i,date;delaynus(2);for(i=0;i<8;i++){date>>=1;if(DATE==1)date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);}return date;}uchar ReadSet1302(uchar cmd)//根据命令读取1302相应的值{uchar date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;}void IntDS1302(void) //DS1302初始化{uchar flag;flag= ReadSet1302(0x81);if(flag&0x80) //判断时钟芯片是否关闭{WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((0/10)<<4|(0%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((0/10)<<4|(0%10))); //根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((0/10)<<4|(0%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写年寄存器命令字,写入年的初始值WriteSet1302(0x90,0xa5); //打开充电功能选择2K电阻充电方式WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令}}/**********************操作DS18B20模块***************************/sbit DQ=P2^3;uchar time;void delayms(uchar x){ uchar i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}/**********************DS18B20初始化****************************/bit IntDS18B20(void){bit temp;DQ=1;for(time=0;time<2;time++);DQ=0;for(time=0;time<200;time++);DQ=1;for(time=0;time<10;time++);temp=DQ;for(time=0;time<200;time++);return temp;}/**************************读DS18B20**********************/uchar ReadDS18B20(void){uchar dat,i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;_nop_();DQ=1;for(time=0;time<2;time++);dat>>=1;if(DQ==1)dat=dat|0x80;elsedat=dat|0x00;for(time=0;time<10;time++);}return dat;}/*********************向DS18B20写数据**************************/ void WriteDS18B20(uchar date){uchar i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;DQ=date&0x01;for(time=0;time<10;time++);DQ=1;for(time=0;time<1;time++);date>>=1;}for(time=0;time<4;time++);}/*******************为读取温度做好准备************************/void ReadyreadDS18B20(void){IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0X44);IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0XBE);}// 计算2000~2099年任一天星期几// year : 00-99// month: 01-12// day : 01-31uchar GetWeekFromDay(uchar years,uchar months,uchar days){if( months == 1 || months == 2 ){months+=12;if( years> 0 )years--;elseyears ;}return (1+(( days + 2*months + 3*(months+1)/5 + years + years/4 ) %7)); // 返回星期几//(星期一用1表示,而星期天用7表示)}。

相关文档
最新文档