首页 单片机C语言-万年历电子钟设计报告含电路图和源程序(1)

单片机C语言-万年历电子钟设计报告含电路图和源程序(1)

举报
开通vip

单片机C语言-万年历电子钟设计报告含电路图和源程序(1)单片机C语言-万年历电子钟设计报告含电路图和源程序(1) 微机原理与接口技术专用周报告 (LCD1602万年历显示设计) 所属系部:电气信息工程系 班 级:电子信息工程一班 指导老师:施老师 姓 名 张雨 日 期:2015年3月31日 1 目录 一、设计要求与方案论证 ................................................................................................. 4 1.1 设计要求: ....

单片机C语言-万年历电子钟设计报告含电路图和源程序(1)
单片机C语言-万年历电子钟设计报告含电路图和源程序(1) 微机原理与接口技术专用周报告 (LCD1602万年历显示设计) 所属系部:电气信息 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 系 班 级:电子信息工程一班 指导老师:施老师 姓 名 张雨 日 期:2015年3月31日 1 目录 一、设计要求与 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 论证 ................................................................................................. 4 1.1 设计要求: ....................................................................................................... 4 1.1.1基本要求.................................................................................................... 4 1.1.2发挥部分.................................................................................................... 4 1.2 系统基本方案选择和论证 .................................................................................... 4 1.2.1单片机芯片的选择方案和论证:................................................................. 4 1.2.2 显示模块选择方案和论证: ....................................................................... 4 1.2.3时钟芯片的选择方案和论证: .................................................................... 5 1.3 电路设计最终方案决定 ................................................................................ 5 二、理论分析与计算 ........................................................................................................ 5 2.1,秒数的产生由定时器T0产生: ......................................................................... 5 2.2. 总天数的算法..................................................................................................... 5 三.系统的硬件设计与实现 ................................................................................................ 6 3.1 电路设计框图: .................................................................................................. 6 3.2 系统硬件概述: .................................................................................................. 7 3.3 主要单元电路的设计 ........................................................................................... 7 3.3.1单片机主控制模块的设计 ........................................................................... 7 3.3.2显示模块的设计 ......................................................................................... 7 3.3.3闹钟模块的设计 ......................................................................................... 9 3.3.4电源稳压模块........................................................................................... 10 四、系统的软件设计 ...................................................................................................... 10 4.1程序 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 框图 .....................................................................................................11 4.2闹钟模块流程图: ..............................................................................................11 4.3按键调整模块流程图: ...................................................................................... 12 五、测试方案与测试结果分析 ........................................................................................ 13 5.1 测试仪器 .......................................................................................................... 13 5.2软件测试平台 Keil C51 ...................................................................................... 13 5.3 模块测试 .......................................................................................................... 13 5.3.1显示模块测试........................................................................................... 13 5.4测试结果分析与结论 .......................................................................................... 14 5.4.1测试结果分析........................................................................................... 14 5.4.2 测试结论 ................................................................................................. 14 附录一:系统电路图 ...................................................................................................... 15 附录二:仿真效果图 ...................................................................................................... 15 附录三:系统C程序...................................................................................................... 16 参考文献........................................................................................................................ 27 2 摘要 本文主要介绍了LCD1602的各个引脚的功能及其作用,也介绍了单 片机的一些比较基础的,比较常用的一些资源的应用,同时也对 PROTEUS硬件仿真电路有一定的认识。对于单片机的原理设计电路, 在了解硬件的基础上完成程序设计,是自己掌握对一个系统的初步规划 和设计,同时也提高了自己分析问题的能力和资料整理的能力。 关键 字:LCD1602,程序设计,硬件电路。 Abstract: This paper mainly introduces the function and the function of each pin of LCD1602, also introduces micro controller some basis of comparison, some commonly used application resources,but also have a certain understanding to the PROTEUS hardwar e simulation circuit. The design principle of single chip circuit, completed the program design is based on the understanding of hardware, is in their own hands the preliminary planning and design of a system, but also improve the ability of their own ability to analyze the problem and the collation of data. Keyword:LCD1602, program design, hardware circuit. 3 一、设计要求与方案论证 1.1 设计要求: 1.1.1基本要求 (1)准确显示:时、分、秒(24小时制) (2)显示星期 (3)显示公历 (4)时间、日期、星期可调节 (5)断电记忆功能 1.1.2发挥部分 (1)闹钟功能 (2)显示汉字“年、月、日” (3)显示图标“hello Kitty’ 1.2 系统基本方案选择和论证 1.2.1单片机芯片的选择方案和论证: 方案一: 采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。 方案二: 采用AT89S52,片内ROM全都采用Flash ROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KB ROM 存储空间,同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。 所以选择采用AT89S52作为主控制系统. 1.2.2 显示模块选择方案和论证: 方案一: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较 4 适合,如采用在显示数字显得太浪费,且价格也相对较高,所以不用此种作为显示. 方案二: 采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,但无法显示图形文字,在显示星期是也只能用数字表示,而且采用动态扫描法与单片机连接时,在编程时比较复杂。所以也不采用了LED数码管作为显示。 方案三: 采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可见,所以在此设计中采用LCD液晶显示屏. 1.2.3时钟芯片的选择方案和论证: 方案一: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V,5.5V范围内,2.5V时耗电小于300nA.但在,题目中明确规定不能选用不可以使用任何专用的时钟芯片和模块,因此不采用此方案。 方案二: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案可以减少芯片的使用,也可以节约成本。所以采用此方案。 1.3 电路设计最终方案决定 综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统;采用单片机定时器提供时钟; 液晶显示屏作为显示。 二、理论分析与计算 2.1,秒数的产生由定时器T0产生: T0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D) 定时时间=(65536-56320)*(1/11.0592)*12=10ms (单片机晶振f0=11.0592Mhz) 用累加的方法让定时时间累加一百次即可产生一秒时间:100*10ms=1000ms=1s 2.2. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为355。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算 5 出从定义年一月一日到输出年的该月一日的总天数。 2.3 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。 2.4. 算出输出月份的完整日历算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。 5,计算某一天是星期几的算法:蔡勒(Zeller)公式 历史上的某一天是星期几,未来的某一天是星期几,关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。 即:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于5,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。)算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下: 蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) 即2049年10月1日(100周年国庆)是星期5。 三.系统的硬件设计与实现 3.1 电路设计框图: 液晶显示模块 键盘模块 AT89S52 主控制 模 块 闹钟模块 6 3.2 系统硬件概述: 本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;显示部份LCD1602实现,能够同时显示16x02即32个字符;闹钟部分由蜂鸣器构成,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。 3.3 主要单元电路的设计 3.3.1单片机主控制模块的设计 AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。 单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 如图-1 所示 图-1 主控制系统 3.3.2显示模块的设计 LCD1602液晶显示屏 工业字符型液晶,能够同时显示16x02即32个字符。(16列2行), 有16个引脚,通过D0~D7的8位数据端传输数据和指令,引脚图如图6-5。 7 图6-5 LCD1602引脚示意图 LCD1602液晶显示屏引脚功能如表6-5所示: 表6-5 LCD1602引脚功能 管脚1 一般接地 V ss 管脚2 接电源(+5V) V dd 管脚3 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对V 0 比度最高 管脚4 RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择RS 指令寄存器 管脚5 R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写R/W 操作。 管脚6 E(或EN)端为使能(enable)端,下降沿使能。 E 管脚7 底4位三态、 双向数据总线 0位 DB 0 管脚8 底4位三态、 双向数据总线 1位 DB 1 管脚9 底4位三态、 双向数据总线 2位 DB 2 管脚10 底4位三态、 双向数据总线 3位 DB 3 管脚11 高4位三态、 双向数据总线 4位 DB 4 管脚12 高4位三态、 双向数据总线 5位 DB 5 管脚13 高4位三态、 双向数据总线 6位 DB 6 管脚14 高4位三态、 双向数据总线 7位 DB 7 管脚15 背光电源正极 BLA 管脚16 背光 电源负极 BLK 1602液晶模块内部的控制器共有11条控制指令,如表10-14所示: 序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 1 清显示 0 0 0 0 0 0 0 0 0 1 2 光标返回 0 0 0 0 0 0 0 0 1 * 3 置输入模式 0 0 0 0 0 0 0 1 I/D S 4 显示开/关控制 0 0 0 0 0 0 1 D C B 5 光标或字符移位 0 0 0 0 0 1 S/C R/L * * 8 6 置功能 0 0 0 0 1 DL N F * * 置字符发生存贮器地字符发生存贮器地址 7 0 0 0 1 址 8 置数据存贮器地址 0 0 1 显示数据存贮器地址 9 读忙标志或地址 0 1 BF 计数器地址 写数到CGRAM或要写的数据内容 10 1 0 DDRAM) 11 从CGRAM或DDRAM读数 1 1 读出的数据内容 表10-14:控制命令表 1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。 指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。 将lcd的引脚与单片机连接,通过单片机实现对显示的输出,电路图实现如下: 3.3.3闹钟模块的设计 闹钟模块采用蜂鸣器实现,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电。 9 通过单片机的p3.7引脚输出的电平变化来控制蜂鸣器的导通与否,设计如下: 3.3.4电源稳压模块 方案一:LM7805稳压 方案二:USB接口+5V供电 四、系统的软件设计 10 开始 4.1程序流程框图 初始化LCD、时间日期处理程序 允许LCD显 示, YES NO LCD关闭 读取时间 LCD显示 扫描按键 时间设定 闹钟设定 开始 初始化 扫描按 键 4.2闹钟模块流程图: 闹钟设 定 数据保 存 返回 11 4.3按键调整模块流程图: 12 五、测试方案与测试结果分析 5.1 测试仪器 序号 名称 作用 KELL 51 软件 编写调试C程序并生成可烧录hex文件 1 仿真软件Proteus 对电路进行焊接前的仿真与测试 2 变压器 提供5伏输出电源 3 数字万用表 测试工作电源检测电路运行状况 4 5.2软件测试平台 Keil C51 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。下面详细介绍Keil C51开发系统各部分功能和使用。Keil C51工具包的整体结构,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。 5.3 模块测试 5.3.1显示模块测试 出现的问题:LCD1602液晶显示屏背景灯亮但不显示内容。 解决问题:初步假设电源已经供电但单片机没有工作。用万用表测试LCD使能端6引脚和写命令选择端4引脚,均有电位变化,推出单片机已经工作。再次假设,LCD1602的显示屏对比度没调好。让电路工作,慢慢旋转变阻器,但仍无内容显示。三次假设,LCD1602某些引脚短路,经检测各引脚电平,发现6脚线路某地方与电源VCC相连,导致数据命令无法写入LCD1602显示器,导致内容无法显示,改正后,显示正常,问题解决。 13 5.4测试结果分析与结论 5.4.1测试结果分析 在测试过程中遇到lcd1602显示不出来,首先使用万用表对电路进行测试,检查工作电压是否正常并查找出电路没正常工作的部分,再次检查各引脚接线情况。 5.4.2 测试结论 经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.同时在软件的编程方面得到更到的提高,对编程能力得到加强.同时对所学的知识得到很大的提高与巩固. 致谢 衷心感谢学校能够给我们提供这么一个学习平台来展示我们自己所学的东西,让我们学以致用,感谢指导我们这次专用周学习的老师,教给我们珍贵的知识,在我们不懂的时候能够给我们提出非常有帮助的建议,帮助我们完成这次的课题,并获得课堂之外的学习经验以及技能。 14 附录一,系统电路图 附录二,仿真效果图 15 附录三,系统C程序 #include #include #define uint unsigned int #define uchar unsigned char unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}; unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数 uchar CGCODE[]={0x08,0x0f,0x012,0x0f,0x0A,0x1f,0x02,0x02,0x00,0x0f,0x09,0x0f,0x09,0x0f,0x0 9,0x13,0x00,0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00}; uchar code tab[]={ 0x00,0x01,0x02}; unsigned char data i,inti; unsigned char data dis_buf1[16]; //lcd上排显示缓冲区 unsigned char data dis_buf2[16]; //lcd下排显示缓冲区 unsigned char data year,month,date,week;//年、月、日、星期 unsigned char data armhour,armmin,armsec;//闹钟时、分、秒 unsigned char data hour,min,sec,sec100; //时、分、秒、百分之一秒 unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值 bit alarm; //标识是否启用闹钟,1--启用,0--关闭 sbit rs = P2^0; //LCD数据/命令选择端(H/L) sbit rw = P2^1; //LCD读/写选择端(H/L) sbit ep = P2^2; //LCD使能控制 sbit PRE = P1^6; //调整键(k3) sbit SET = P1^7; //调整键(k4) sbit SPK = P3^7; void delayms(unsigned char ms); //延时程序 bit lcd_busy(); //测试LCD忙碌状态程序 void lcd_wcmd(char cmd); //写入指令到LCD程序 void lcd_wdat(char dat); //写入数据到LCD程序 void lcd_pos(char pos); //LCD数据指针位置 void lcd_init(); //LCD初始化设定程序 void pro_timedate(); //时间日期处理程序 void pro_display(); //显示处理程序 void pro_key(); //按键处理程序 void time_alarm(); //定时报警功能(闹钟) 16 unsigned char scan_key(); //按键扫描程序 unsigned char week_proc(); //星期自动计算与显示函数 bit leap_year(); //判断是否为闰年 void lcd_sef_chr(); //LCD自定义字符程序 void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s); //更新显示缓冲区函数 // 延时程序 void delay(unsigned char ms) { while(ms--) { unsigned char i; for(i = 0; i< 250; i++) { _nop_(); //执行一条_nop_()指令为一个机器周期 _nop_(); _nop_(); _nop_(); } } } //测试LCD忙碌状态 bit lcd_busy() { bit result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1为忙碌,D7=0为空闲 ep = 0; return result; } //写入指令到LCD void lcd_wcmd(char cmd) { while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指 17 令 rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } //写入数据到LCD void lcd_wdat(char dat) { while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数 据 rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; } 18 //LCD数据指针位置程序 void lcd_pos(char pos) { lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H) } //LCD初始化设定 void lcd_init() { lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据借口 delay(1); lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-") delay(1); lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动) delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1); } //闰年的计算 bit leap_year() { bit leap; if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件 leap=1; else leap=0; return leap; } //星期的自动运算和处理 unsigned char week_proc() { unsigned char num_leap; unsigned char c; num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数 if( leap_year()&& month<=2 ) //既是闰年且是1月和2月 c=5; else 19 c=6; week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期 return week; } //更新显示缓冲区 void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s) { dis_buf1[0]=0x20; // dis_buf1[1]=0x20; //空格 dis_buf1[2]=50; //'2' dis_buf1[3]=48; //'0' dis_buf1[4]=year/10+48; dis_buf1[5]=year%10+48; dis_buf1[6]=0x00; dis_buf1[7]=month/10+48; dis_buf1[8]=month%10+48; dis_buf1[9]=0x01; //'-' dis_buf1[10]=date/10+48; dis_buf1[11]=date%10+48; dis_buf1[12]=0x02; dis_buf1[13]=dis_week[4*week]; dis_buf1[14]=dis_week[4*week+1]; dis_buf1[15]=dis_week[4*week+2]; dis_buf2[0]=t2[0]; dis_buf2[1]=t2[1]; dis_buf2[2]=t2[2]; dis_buf2[3]=t2[3]; dis_buf2[4]=t2[4]; dis_buf2[5]=0x20; dis_buf2[6]=0x20; //空格 dis_buf2[7]=0x20; //alarm=0,不显示闹钟启用标致 dis_buf2[8]=dis_h/10+48; dis_buf2[9]=dis_h%10+48; dis_buf2[10]=0x3a; //':' dis_buf2[11]=dis_m/10+48; dis_buf2[12]=dis_m%10+48; dis_buf2[13]=0x3a; dis_buf2[14]=dis_s/10+48; 20 dis_buf2[15]=dis_s%10+48; } //时间和日期处理程序 void pro_timedate() { sec++; if(sec > 59) {sec = 0; min++; if(min>59) {min=0; hour++; if(hour>23) {hour=0; date++; if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) if (date>31) {date=1;month++;} //大月31天 if (month==4||month==6||month==9||month==11) if (date>30) {date=1;month++;} //小月30天 if (month==2) {if( leap_year()) //闰年的条件 {if (date>29) {date=1;month++;}} //闰年2月为29天 else {if (date>28) {date=1;month++;}} //平年2月为28天 } if (month>12) {month=1;year++;} if (year>99) year=0; } } } week_proc(); if (sec==armsec && min==armmin && hour==armhour) {if (alarm) TR1=1; //闹钟启用时,报警时间到,启动Timer1 } } //显示处理程序 void pro_display() 21 { unsigned char i; lcd_pos(0x00); for (i=0;i<=15;i++) {lcd_wdat(dis_buf1[i]);} lcd_pos(0x40); for (i=0;i<=15;i++) {lcd_wdat(dis_buf2[i]);} } //Timer0中断处理程序,秒的产生 void timer0() interrupt 1 { TH0=0xfe; TL0=0x0c; //定时时间 sec100++; if(sec100 >= 100) //1秒时间 (100*10ms=1000ms=1s) {sec100 = 0; pro_timedate();//调用时间和日期处理程序 } if (sec&0x01) // 一秒显示"hello",一秒显示"kitty" update_disbuf(0x00,"KITTY",hour,min,sec); //0x00表示显示00位置的自定义字符 else update_disbuf(0x00,"HELLO",hour,min,sec); pro_display(); //调用显示处理 } //按键扫描程序 unsigned char scan_key() { skey=0x00; //给变量vkey置初值 skey|=PRE; //读取PRE键的状态 skey=skey<<1; //将PRE键的状态存于skey的B1位 skey|=SET; //读取SET键的状态,并存于skey的B0位 return skey; //返回skey的键值(即PRE,SET的状态) } //外部中断INT0中断处理程序 void int0() interrupt 0 { TR0=0; //禁止Timer0 22 IE=0; //禁止中断 lcd_wcmd(0x0e); //显示光标"_",整个光标不闪烁 alarm=1; update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据,0x50表示要显示 "P" pro_display(); //调用显示处理程序 lcd_pos(0x47); //使光标位于第一个调整项下 flag=0; vkey=0x03; while(flag^0x0a) {skey = scan_key(); //扫描按键状态 if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体 { delay(10); //去按键抖动 skey = scan_key(); //转回扫描按键状态 if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体 { vkey=skey; //将skey的值付给vkey if (skey==0x01) //PRE键按下 { flag++; //调整标志位加1 switch (flag) //将光标置于相应调整位置 { case 1: lcd_pos(0x49);break; //光标置小时报警设置位置 case 2: lcd_pos(0x4c);break; //光标置分钟报警设置位置 case 3: lcd_pos(0x4f);break; //光标置秒时报警设置位置 case 4: update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x05);break; //光标置年调整位置 case 5: lcd_pos(0x08);break; //光标置月调整位置 case 6: lcd_pos(0x0b);break; //光标置日调整位置 case 7: lcd_pos(0x49);break; //光标置时调整位置 case 8: lcd_pos(0x4c);break; //光标置分调整位置 case 9: lcd_pos(0x4f);break; //光标置秒调整位置 default:break; } } if (skey==0x02) //SET键按下 { pro_key(); //转设置按键处理程序 } } 23 } } lcd_wcmd(0x0c); //设置LCD开显示及光标不闪烁,不显示"-" lcd_wcmd(0x01); //清除LCD的显示内容 IE=0x8f; //CPU开中断,INT0,INT1,开中断 TR0=1; } //Timer0启动 //主程序,初始化及初值设定! void main() { //inti; lcd_init(); //初始化LCD lcd_wcmd(0x40); //写入自定义字符号 for(i=0;i<56;i++) {lcd_wdat(CGCODE[i]); } lcd_wcmd(0x06); for(i=0;i<4;i++) {lcd_wdat(tab[i]); } { } hour=10;min=30;sec=0; //开机时的时,分,秒显示 armhour=10;armmin=29;armsec=0; //开机时的时,分,秒报警初值 year=15; month=5;date=20; //开机时的年,月,日,星期显示 week_proc(); alarm=1; //初始开机,启用闹钟 IE = 0x8f; //CPU开中断,INT0,INT1,Timer0,Timer1开中断 IP = 0x04; //设置INT0为中断最高优先级 IT0=0;IT1=0; //外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式, 易误动) TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定时方式 TH0 = 0xdc;TL0 = 0x00; //Timer0置10ms定时初值 TH1 = 0xff;TL1 = 0x00; //Timer1置初值 TR0 = 1; //Timer0启动 TR1 = 0; SPK=0; while(1); 24 } //设置按键处理程序 void pro_key() { switch (flag) { case 0:alarm=!alarm; //启用或关闭闹钟(alarm=1:启用,alarm=0:关闭) update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据 pro_display(); //调用显示处理 lcd_pos(0x47);break; //光标回到原调整位置 case 1:armhour++; if (armhour>23) armhour=0; update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据 pro_display(); //调用显示处理 lcd_pos(0x49);break; //光标回到原调整位置 case 2:armmin++; if (armmin>59) armmin=0; update_disbuf(0x50,"alarm:",armhour,armmin,armsec); pro_display(); lcd_pos(0x4c);break; case 3:armsec++; if (armsec>59) armsec=0; update_disbuf(0x50,"alarm:",armhour,armmin,armsec); pro_display(); lcd_pos(0x4f);break; case 4:year++; if (year> 99) year= 0; week_proc(); //星期自动运算 update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x05);break; case 5:month++; if (month>12) month=1; week_proc(); //星期自动运算 update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x08);break; 25 case 6:date++; if (month==1||month==3||month==5||month==7||month==8||month==10||month==12) if (date>31) date=1; //大月31天 if (month==4||month==6||month==9||month==11) if (date>30) date=1; //小月30天 if (month==2) {if(leap_year()) //闰年的条件 {if (date>29) date=1;} //闰年2月为29天 else {if (date>28) date=1;}} //平年2月为28天 week_proc(); //星期自动运算 update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x0b);break; case 7:hour++; if (hour>23) hour=0; update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x49);break; case 8:min++; if (min>59) min=0; update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x4c);break; case 9:sec++; if (sec>59) sec=0; update_disbuf(0x50,"time: ",hour,min,sec); pro_display(); lcd_pos(0x4f);break; default: break ; } } //Timer1中断处理程序,产生报警的声音 void timer1() interrupt 3 { TH1=0xff; TL1=0x00; SPK=~SPK; 26 } //外部中断INT1中断处理程序,停止报警声音 void int1() interrupt 2 { if(TR1) TR1=0; } 参考文献 [1] 李群芳,肖看,张世军.《单片微型计算机与接口技术》,电子工业出版社,2013. [2] 何利民.《单片机应用技术选编》.北京航空航天大学出版社,2000 [3] 刘文涛等.《MCS-51单片机培训教程》.电子工业出版社,2005 [4]李光飞等.《单片机C语言程序设计实例指导》.北京航空航天大学出版社,2005 [5]黄遵熹.《单片机原理接口与应用》.西北工业大学出版社,1997.05 [6]李华.《MCS-51系类单片机实用接口技术》.北京航空航天大学出版社,2004 27 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf ——张瑜 在为时两个周的单片机实训从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达我学会了万年历的制作,了解了各种C语言指令的运用这次实训终于落下了帷幕。在这次课程设计的过程中,我拥有了无数难忘的回忆和收获。这次实训的制作过程是我的一次再学习,再提高的过程。 在这次的专用周中,为了制作万年历,我学习了许多新的知识。例如PROTEUS和KEIL UVISION3的作用,其各自的菜单的使用,还有LCD1602液晶显示屏的各个引脚的作用和连接的方法,对于P89V51RD2单片机芯片有了进一步的学习。 对于我来说,可以说这次的这个专用周的课题是一个大的挑战。它在编写程序的时候,要考虑的东西很多。例如:各种C语言的 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写语法,应用方式和应用目的;平年、润年的判断,大月和小月的判断。还有就是当时间时间到了以后,该加一的部分也要加一。但是通过四个按键的控制,对于年月日、时分秒、星期,也要能够调出我们所需要的日期。 所以,为了能够把这次的课题做成功,我和我的队友都在网上搜索了相关的资料。我们找了一个比较相似的程序,然后对这个程序的每一条指令都进行了理解。明白了大概了设计方案,然后加上我们自己构想的设计方案进行综合,从而写出了这次实训周总的流程,然后把网上那个比较相似的流程图的各个子程序调出来进行整理。 在整理的过程当中,我们发现这个程序根本不能够实现一些我们需要的东西,所以我们相互交流、探讨,使程序完整化,最后PROTEUS和KEIL UVISION3软件的结合,使结果在LCD1602液晶显示屏上完美的显示出来了。 其中最大的收获就是又学会了一种新的软件PROTEUS,这无疑是让人惊喜的 。但是,在学习此软件的过程中,遇到了许多难点,有过放弃的念头,当在处于无奈之下的情形中,坚持着脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神让我在这次设计中取得了较大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在这次实训中也使我们的同学关系更进一步了,同学之间互相帮助,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。 28 在此我要向指导老师和专业老师致以最衷心的感谢和敬意。,是你们的细心指导和 关怀,使我能够顺利的完成此次实训并学到许多知识。 29 总结 ——郭玉菲 两周的专业课程设计结束了,从开始资料的搜集、整合到调试、仿真可以说每一步都充满了困难。 幸运的是这次的课题在现实生活中十分普遍,在网络上可以有很多的资料可以借鉴以及参考;正应为这些资料来源非常广,类型也多,所以在借鉴的时候遭遇了十分多的干扰。正因为如此,我们才需更加结合自己所学的内容来对资料进行查阅和借鉴。 由于这次的课程设计运用了PROTEUS软件,但对此软件并未接触的我们无疑是对它十分陌生的,为了成功的完成课题,我们抽了一天的时间,对proteus软件进行了了解与学习,并成功的绘制出了所需的电路。 这次的课程需要运用c语言进行编程,于是我们也将c语言的课程教材进行了研究,为达到理解以及正确的校准程序的目的。因为c语言的基础并不扎实,很多语句都不能完全理解,所以每一句都需要查找资料,弄懂其含义。 在这过程中,对lcd1602的学习是比较困难的,为了弄懂它的原理,我们查了许多器件手册,计算显示的代码,以及请教老师寻求帮助。 在编程过程中,遇到了相当多的问题,网上借鉴的程序多数不能够实现我们所需的目标,我们必须结合自己的课题对程序进行调整,这需要我们去学习很多新的语句,以及计算一些数值。 经过了将近两周的学习和实验,我们不断得积累着我们的知识,让它更多地运用到课题之上。 所幸努力没有白费,在我与组员的多次交流、学习、讨论、实验中,终于成功的在仿真软件上显示出来了想要的结果。 当然,这次的课题的完成依旧存在着不完善,但这对我们已经是一次质的飞跃,让我们在课题完成的基础上又学会了一个新的软件,学到了更多的知识以及对问题的思考模式。 在整个设计过程中,我们必须发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。 最终完成了课题。达到了预期的目的,在最初的设计中,相互学习、相互讨论、研究,达到了最终的目标。 30 手能力、实际操作能力和查阅文献资料的自主学习能力,延伸了我在课堂上许多没学到的知识也使我对所学的专业知识有了更深的拓展,较好的完成了作品,达到了预期的目的 。 这次课程学习到了更多的知识。在我能够独立设计更复杂的实用系统的时候,回想现在我连设计一个简单万年历设计都没有很好的把握时,我一定会为自己的成长感到喜悦。总之这次实训让我学习了很多。 31
本文档为【单片机C语言-万年历电子钟设计报告含电路图和源程序&#40;1&#41;】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_954223
暂无简介~
格式:doc
大小:260KB
软件:Word
页数:41
分类:互联网
上传时间:2017-09-27
浏览量:344