单片机技术与应用

上传人:仙*** 文档编号:102207632 上传时间:2022-06-06 格式:DOC 页数:32 大小:709.50KB
收藏 版权申诉 举报 下载
单片机技术与应用_第1页
第1页 / 共32页
单片机技术与应用_第2页
第2页 / 共32页
单片机技术与应用_第3页
第3页 / 共32页
资源描述:

《单片机技术与应用》由会员分享,可在线阅读,更多相关《单片机技术与应用(32页珍藏版)》请在装配图网上搜索。

1、 单片机技术及其应用 课程设计报告题目: 万年历的设计班级: 120302学号:1203010216某:涂划同组人员: 汤吉鑫、高翔、王正提指导教师:薛莲 二0一四年九月二十七日目 录1课程设计目的42课程设计题目描述和要求43.课程设计报告内容53.1 设计思路53.2设计过程53.3电路的仿真及调试174.总结185.指导教师意见19参考书目19程序代码2030 / 321课程设计目的在学习单片机后,我们深知它在我们的生活中无处不在,而社会更好的发展需要当代知识分子不懈的努力。在理论知识的充溢后,我们必须通过实践来更好的掌握单片机技术,只有自己动手通过单片机做出自己想做的东西,才可证明我们

2、对单片机能够灵活的运用。在理论与实践结合的情况下我们可在此次设计小作品中自己查阅资料并自己仿真电路编写程序设计出完整的单片机电路。在完成课程设计的过程中我们可提升自己对电路的分析能力,及编译程序的能力,并且可以增强我们布局电路的意识,从而让我们自己全面的运用到学过的知识,让自己在今后的发展中能好的学以致用。2课程设计题目描述和要求我们选择的课题为:万年历的设计。随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中;电子万年历作为一种功能十分强大的日常计时工具,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使

3、用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒等信息,还具有时间校准等功能,已逐步的出现在我们的日常生活中。一般日常生活中大都使用的是纸质日历,纸质日历显示效果不太好并且使用寿命不长,造成了一定的资源浪费。针对传统的纸质日历局限性,本论文设计了一款基于单片机的电子万年历系统;本设计以STC89C52单片机为核心,构成系统主控制电路,全部信息用12864液晶显示;时间、日期调整、闹铃及界面的切换由三个独立按键来实现,并可对闹铃开关进行设置。日历能显示阳历和阴历年、月、日以及星期、时、分、秒。电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺

4、陷。它集时间、日期、星期等功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。本次的课程设计题目要求为:采用51系列单片机和LCD12864液晶显示屏设计一个万年历,能够实现年、月、日、农历、星期、时间和定时的功能。主要功能如下:(1)、显示年、月、日,时、分、秒和星期,并有相应的农历显示;(2)、可通过键盘自动调整时间;(3)、具有闹钟功能;(4)、能够显示环境温度,误差小于1;(5)、计时精度:月误差小于20s。3.课程设计报告内容3.1 设计思路(1)根据设计要求,选择AT89C52单片机为核心控制器件。(2)时钟芯片采用DS

5、1302实现计时的功能。(3)采用DS18B20温度传感器与单片机P2.6口相连实现温度显示功能。(4)使用一个PNP三极管作为蜂鸣器的驱动,接P2.7口实现闹钟功能。3.2设计过程3.2.1硬件设计(1)系统模块根据系统功能要求,可大致画出系统所需硬件结构框图如图3-1所示:图3-1 系统功能模块图主控模块采用性价比较高的AT89S52单片机芯片,在其内部烧写好程序,可通过程序的运行控制测温模块进行测温;测温模块主要是由DS18B20构成,将其与所测对象进行接触即可获取被测对象的温度数据,而所测得的温度和时钟芯片测得的实时日历将通过显示模块的液晶显示器以数字形式显示;单片机调用程序,读取DS

6、1302内寄存器,可以得到万年历的时间数据,经过程序处理就可以输出在LCD上;键盘电路可对实时日历进行调整;蜂鸣器可以在作为声音提醒。(2)单片机模块AT89S52是ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含8k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚,它集Flash存储器既可在线编辑(ISP)也可用传统方法进行编辑及通用8位微处理器于单片芯片中,功能强大AT89S52单片机可为您提供许多高性价比的应用场合。器管脚图如图3-2:图3-2AT89S52管脚图在本系统中,AT89S52

7、单片机内部的功能单元已经能够满足系统设计需要,不需要系统扩展。AT89S52具有以下的特点:主要性能 与MCS-51单片机产品兼容 8K字节在系统可编程Flash存储器 1000次擦写周期 全静态操作:0Hz33Hz 三级加密程序存储器 32个可编程I/O口线 三个16位定时器/计数器 八个中断源 全双工UART串行通道 低功耗空闲和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 掉电标识符 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允

8、许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。(3)时钟模块DS1302为美国DALLAS公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用32.768Hz晶振。它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302 用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析以及对异常数据出现的原因

9、的查找有重要意义。在本设计中,它的实际电路图如图3-2所示:图3-3 DS1302与单片机的连接DS1302需要外接32.768K的晶振,1号引脚接主电源VCC(5V)电源,8号引脚接备用电池(3V),当主电源掉电后,备用电源为DS1302提供电源,维持DS1302内数据不丢失。DS1302的各引脚的功能如下:1:VCC2主电源2,3:X1,X2振荡源,外接32768HZ晶振4:GND地线5:RST复位/片选线6:I/O串行数据输入/输出端(双向)7:SCLK串行数据输入端8:VCC1后备电源时钟芯片DS1302的性能特性:实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;用于高

10、速数据暂存的318位RAM;最少引脚的串行I/O;2.55.5V电压工作X围;2.5V时耗电小于300nA;用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;简单的3线接口;可选的慢速充电(至VCC1)的能力。时钟芯片DS1302的工作原理:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位

11、0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。控制字节如图3-4所示。图3-4 DS1302控制字节DS1302时间日期寄存器及相应位定义:表3-5为DS1302时间寄存器信息:表3-5为DS1302时间寄存器信息DS1302数据的输入和输出在控制指令字输入后的下一个SCLK 时钟的上升沿时数据被写入DS1302,数据输入从低位即位0 开始。同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位至高位7。图3-6 DS1302的时序(4)显示模块本设计显示模块主要采用LCD1

12、2864液晶显示器,其电路原理图如下:图3-7 LCD12864模块LCD12864液晶显示器通过数据端口也即端口714与主控芯片AT89S52的I/O端口P3相连接实现数据与指令的传输,再通过控制端口RS、RW、EN也即端口46与主控芯片P1.5,P1.6,P1.7端口相接实现对数据和指令传输的控制。(5)温度模块传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多,本设计测温模块采用一线制总线数字温度传感器DS18B20,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,其电路原理图如图3-8所

13、示:图3-8 DS18B20温度模块从图中可看出,将温度传感器的一线制总线通过端口2与本设计主控芯片STC12C5A6S2的端口标号为DS18B20的相连即可实现相互之间的通信。设计中的测温元件采用的是DS18B20测温元件,DS18B20是由DALLAS(达拉斯)公司生产的一种温度传感器。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20很受欢迎。这是世界上第一片支持“一线总线”接口的温度传感器。DS18B20数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS18B20或从DS18B20送出,因此从单片机到DS18B20仅需一条线连接

14、即可。它可在1秒钟(典型值)内把温度变换成数字。(6)蜂鸣器模块蜂鸣器模块是本设计中体现人机交互的又一大设计亮点,其电路原理图如下图3-9蜂鸣器模块(7)蜂鸣器的介绍蜂鸣器的作用:蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、机、定时器等电子产品中作发声器件。蜂鸣器的分类:蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两类。蜂鸣器的电路图形符号:蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。本设计里,我们采用有源蜂鸣器,由于蜂鸣器的工作电流一般比较大,以至于单片机的I/O 口是无法直接驱动

15、的,所以要利用放大电路来驱动,我们使用三极管来放大电流,驱动蜂鸣器,此模块只要通过BELL(连接到到单片机P2.7)输入的PWM波既可以使蜂鸣器分出声音,我们设计的这款万年历可以在闹钟定时中作为声音提醒信号。(8)独立键盘模块键盘是人与万年历实现信息交互的接口,本设计中,我们采用3个独立键盘,电路原理如下图3-9:图3-10独立键盘当按键按下,与主控芯片连接的端口被降为低电平,按键松开则也升为高电平。按键采用的是Tack Switch按钮开关,它具有自动恢复(弹回)的功能。当我们按下按钮时,其中的接点接通(或切断),放开按钮后,接点恢复为切断(或接通)。按照尺寸区分,电子电路或微型计算机所使用

16、的Tack Swith可分为8mm、10mm、12mm等。虽然Tack Switch有4个引脚,但实际上,其内部只有一对a接点,即其中两个引脚是内部相连通的,而另外两个引脚内部也是相连通的。3个按键实现了开机模式选择,日期调节等功能,独立按键的引入使得体现了本设计的人性化,智能化,功能的强大。3.2.2软件设计(1)万年历软件系统的流程图图3-11系统软件流程图当接通电源开始工作后,单片机中的程序开始运行,将对DS18B20进行初始化,以便和单片机芯片达成通信协议。完成初始化后,由于本系统只有一个测温元件,单片机会向其发出跳过RAM指令,接下来便可向其发送操作指令,启动测温程序,测温过程完成后

17、,发出温度转换指令,从而便可将温度转化成数字模式进行显示读取;同时DS1302将读取时分秒星期以及年月日寄存器然后通过液晶显示实时时间、星期及日期;键盘电路中按键可对实时日历时钟进行调整。(2)DS1302读写程序部分DS1302读写模块与单片机进行数据交换时,先有STC89C52向电路发出命令字节,命令字节的最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;如果D6=0,指定时数据,D6=1,指定RAM数据;D5D1指定输入的寄存器;最低位MLB(D0)为逻辑0,指定写操作(输入),=1,指定读操作(输出)。若进行单字节传送,8位命令字节传送结束后,在下另一个S

18、CLK周期的上升沿输入数据字节,或在下八个SCLK周期的下降沿输出数据字节。图3-12 DS1302读写程序模块流程图(3)温度的显示控制当所测温度从DS18B20输送到单片机上之后,下一步就是要将其在液晶显示器上显示出来。首先对液晶进行初始化,液晶显示器12864的初始化过程如下:先将复位引脚置高位即RST=1、数据传输方式设为并口方式即PSB=1(在设计中,我们将LCD的该引脚接VCC),然后将指令集调到基本指令集上来即写指令30H,再将显示打开、关光标、清除液晶里先前的显示内容即分别写指令0CH、01H,写指令时需分别延时5ms。然后就是数据的传送过程,要使数据在液晶显示器上显示必须要按

19、照其读写操作时序来进行,其读、写操作时序图为3-13所示。图3-13 12864 液晶显示器写时序图(4)蜂鸣器模块蜂鸣器模块的设计,主要是让单片机产生一定频率的电流信号,在我们的设计中,使用单片机通过程序输出方波信号,来产生蜂鸣器需要的信号,当闹钟定时结束时,就可以调用蜂鸣器程序,让蜂鸣器发出声音。当然,我们的万年历再开机时会提醒用户是否开启按键时,蜂鸣器是否声音提醒,实现的方法是:我们在蜂鸣器中设置了flag标志位,当开机时,用户的选择会赋给flag标志位,从而由单片机判断是否让蜂鸣器工作,为了记录用户的选择,我们将flag标志位放在了DS1302的空闲寄存器中,以保证用户的选择不会因为系

20、统的掉电而消失,当系统重新上电时,系统还可以恢复用户的选择。(5)键盘模块键盘模块的软件程序相对于温度模块和时钟模块比较简单。键盘模块的设计,关键是消陡。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。按键的消抖,可用硬件或软件两种方法。因为硬件消抖需要添加额外的硬件,故这里我们采用软件消抖。软件方法去抖,即检测出键闭合后执行一个延时程序,5ms10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合

21、状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms的延时,待后沿抖动消失后才能转入该键的处理程序。3.3电路的仿真及调试在定好方案后便可根据各个模块来仿真万年历电路,在仿真之前可以复习单片机的必要知识及端口的用法。连接电路只是一个简单的过程,根据对单片机的了解,此次我们用了单片机的四个IO口。电路分为晶振电路、复位电路、时钟电路、LCD显示电路、蜂鸣器电路、温度感应电路、按键电路。P1口接上10k的上拉电阻,P2.02.6接受时钟电路、温度感应电路、按键电路输入信息,P2.7口控制蜂鸣器。P1口和P3口控制LCD12864,其中用了中断及计时器。仿真电路如图3-14所示。

22、图3-14经过数天的程序编写,一步步解决问题后我们终于写完了完整的程序,将其在KeilVision2 软件的编译下可得到hex文件,将其下载到仿真电路的单片机中则可得到万年历的效果并可实现要求功能,效果图如图3-15所示。图3-154.总结在硬件电路焊接和软件程序设计分别完成的基础之上,进行软硬件的结合与调试。通过下载将在电脑上已完成的程序下载到单片机芯片中。在调试中发现软件中存在的问题,及时解决问题,确保系统能正常工作并达到设计要求。通过反复的调试与实验,可以证明该系统能够较好地完成设计所需的基本要求。即能够正确的显示万年历。在完成软件系统时,对时间要求很精确,由于晶振的不同造成了读数据的错

23、误,经过这次调试,让我更清晰的认识到了时序对元器件的重要性。在设计中,因为考虑到闹钟定时功能,我们希望我们设置的闹钟时刻不会因为系统的掉电而丢失,考虑到DS1302是有锂电池作为电源的,不会因为主系统掉电丢失内部数据,所以我们将闹钟的定时时刻放到了DS1302内的空余寄存器里面。经过万年历的设计,让我学到了很多,让我认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。5.指导教师意见参考书目1 李群芳,肖看,单片机原理接口及应用,清华大学,20072 谭浩强,

24、C语言程序设计,清华大学,20063 X义和,王敏男,许宏昌等,例说51单片机,人民邮电,20084 X坤,宋戈,赵红波等,51单片机C语言应用技术开发技术大全,人民邮电,20085 白延敏,51单片机典型系统开发实例精讲,电子工业,20096 周丽娜,Protel99SE电路设计技术,中国铁道,2009程序代码/* * 万年历*/#include main.h /包含头文件main.h#include LCD.h/包含头文件LCD.h#include DS1302.h/包含头文件DS1302.h#include word.h/包含头文件word.h#include lunar_calenda

25、r.h /包含头文件lunar_calendar.h#include buzz.h/包含头文件buzz.hTIME time, tmp_time; /时间变量ALARM alarm;/时间变量bit Alarm_flag=0;/时间变量bit Clock_flag=0;/时间变量bit flag=0;/时间变量sbit DQ=P26; /DS18B20 pin 温度传感器引脚/-18B20-unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen; /温度用变量unsigned int fg=0,xiaoshu_a;/温度用变量/-18B20

26、-/-音乐-uint8 code SONG_TONE= /音乐数据 212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0;uint8 code SONG_LONG=/ 9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0;/-void delay(uint16 n)/延时us级while (n-);/*/ 函数: LCD_Delay()/ 描述: 延时t ms函数

27、/ 参数: t / 返回: 无/ 备注: 11.0592MHZ t=1延时时间约1ms/ 版本: 2011/01/01 First version/*/void Delay_nms(unsigned int t)unsigned int i,j;for(i=0;it;i+) /循环t次for(j=0;j113;j+) /循环113次 每次约3us;/-播放音乐-void PlayMusic() uint16 i =0,j,k;while(SONG_LONGi!=0|SONG_TONEi!=0) for(j=0;jSONG_LONGi*20;j+) /读取数据 BEEP = BEEP;/蜂鸣器取

28、反for(k=0;k0; i-)/循环8次 DQ = 0;/DQ输出0 DQ = dat&0x01; delay_18B20(5); /延时 DQ = 1; /DQ输出1 dat=1; /右移位 unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; /移位 DQ = 1; / 给脉冲信号 if(DQ) /如果DQ=1,执行下面的语句 dat|=0x80; delay_18B20(4);/延时 return(dat);/返回数据vo

29、id read_18B20(void)Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();/初始化DS18B20WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);/延时L_18B20=ReadOneChar();/读取低八位数据H_

30、18B20=ReadOneChar();/读取高八位数据zhengshu=L_18B20/16+H_18B20*16; /整数部分xiaoshu_a=(L_18B20&0x0f)*10/16; /小数第一位/-DS18B20-/* * 按键扫描*/int8 scan_key(void)int8 val=-1; /初始化键值为-1if (KeyIn1 = 0) /判断=0?有无按键按键val = 1; /键值=1while (KeyIn1 = 0); /等待按键释放else if (KeyIn2 = 0) /判断=0?有无按键按键val = 2;/键值=2while (KeyIn2 = 0);/

31、等待按键释放else if (KeyIn3 = 0)/判断=0?有无按键按键val = 3;/键值=3while (KeyIn3 = 0);/等待按键释放/if (val 0)/buzzer_sound();return val;/返回键值/* * 主界面框架*/void main_frame(void)play32(80, 2, 10); /显示数play32(32, 2, 10); /显示数play8(16, 0, S_xie);/显示斜线play8(40, 0, S_xie);/显示斜线/play8(96, 0, RH);/play8(120, 0, S_percent);play8(1

32、20, 6, S_du);/显示度/* * 主界面*/void main_show(bit refresh) uint8 lunar2;if (refresh)read_time(uint8 *)&time);/ 读时间函数/ 时间 if (refresh | (time.sec != tmp_time.sec) / 秒更新tmp_time.sec = time.sec; /读取秒数据 play8_num(104, 6,zhengshu); /温度显示play32_num(96, 2, time.sec);/显示秒if (refresh)main_frame();/刷新界面if (refres

33、h | (time.min != tmp_time.min) / 分更新if (!refresh)flag = 0;tmp_time.min = time.min;/读取分play32_num(48, 2, time.min); /显示分if (refresh | (time.hour != tmp_time.hour) / 时更新if (!refresh)&(Clock_flag)alarm_sound();tmp_time.hour = time.hour; /读取时play32_num(0, 2, time.hour);/显示时if (refresh | (time.day != tmp

34、_time.day) /日更新tmp_time.day = time.day;/读取日play8_num(48, 0, time.day);/显示日/ 农历turn_lunar_calendar(&time, lunar);play_lunar_calendar(0, 6, lunar0, lunar1);if (refresh | (time.week != tmp_time.week) / 周更新tmp_time.week = time.week;/读取周play_week(68, 0, time.week);/显示周if (refresh | (time.mon != tmp_time.

35、mon) / 月更新tmp_time.mon = time.mon;/读取月play8_num(24, 0, time.mon);/显示月/ 农历turn_lunar_calendar(&time, lunar);/转换农历月play_lunar_calendar(0, 6, lunar0, lunar1);/显示农历月if (refresh | (time.year != tmp_time.year) / 年更新tmp_time.year = time.year;/读取年数据play8_num(0, 0, time.year);/显示年/ 农历turn_lunar_calendar(&tim

36、e, lunar);/转换农历年play_lunar_calendar(0, 6, lunar0, lunar1);/显示农历年/* * 主机界面设置 */void main_set(void)int8 key_val, state=1; /变量play32_num(96, 2|0x80, time.sec);/显示秒while (1)key_val = scan_key();/键盘扫描if (key_val = 1) / 设置if (state = 7)state = 0;elsestate+;/位置状态加1set_time(uint8 *)&time);/设置时间main_show(1);

37、/显示主界面switch (state)case 0:set_time(uint8 *)&time); break;/设置时间case 1:play32_num(96, 2|0x80, time.sec); break;/显示秒case 2:play32_num(48, 2|0x80, time.min); break;/显示分case 3:play32_num(0, 2|0x80, time.hour); break;/显示时case 4:play_week(68, 0|0x80, time.week); break;/显示周case 5:play8_num(48, 0|0x80, time

38、.day); break; /显示日case 6:play8_num(24, 0|0x80, time.mon); break; /显示月case 7:play8_num(0, 0|0x80, time.year); break; /显示年default: break;/退出循环 else if (key_val 1)/按键值大于1if (state = 1)/位置1设置秒if (key_val = 3)/加按下?time.sec+;/秒加1elsetime.sec-; /秒减1if (time.sec = 60)time.sec = 0;else if (time.sec = 60)time

39、.min = 0;else if (time.min = 24)time.hour = 0;else if (time.hour = 8)time.week = 1;else if (time.week = 32)time.day = 1;else if (time.day = 13)time.mon = 1;else if (time.mon = 100)time.year = 0;/0年else if (time.year 0)time.year = 99;/99年play8_num(0, 0|0x80, time.year);/显示年elsebreak;/退出循环if (state =

40、0)break;/退出循环/* * 闹钟界面显示*/void alarm_show(void)int8 key_val, state=1;uint32 t=0;play16(0, 0, nao);/显示 闹play16(16, 0, zhong);/钟play16(32, 0, maohao);/冒号:if (Alarm_flag)play16(48, 0, kai);/开elseplay16(48, 0, guan);/关play32_num(32, 2, alarm.hour);/时play32(64, 2, 10);/冒号play32_num(80, 2, alarm.min);/分pl

41、ay16(0, 6, zheng);/显示 整play16(16, 6, dian);/显示 点play16(32, 6, bao);/显示 报play16(48, 6, shi);/显示 时play16(64, 6, maohao);/显示 冒号if (Clock_flag)play16(80, 6, kai);/显示 开elseplay16(80, 6, guan);/显示 关for (t=0; t 1)/判断数据break;else if (key_val = 1)/判断数据if (Alarm_flag)play16(48, 0|0x80, kai);/显示 开elseplay16(48

42、, 0|0x80, guan);/关while (1)key_val = scan_key();/键盘扫描 获取键值if (key_val = 1) / 完成设置if (state = 4)/判断数据state = 0;elsestate+;if (Alarm_flag)play16(48, 0, kai);/显示 开elseplay16(48, 0, guan);/显示 关play32_num(32, 2, alarm.hour); /闹钟 时 显示 play32_num(80, 2, alarm.min);/闹钟 分 显示 if (Clock_flag)play16(80, 6, kai)

43、;/显示 开elseplay16(80, 6, guan);/显示 关switch (state) /判断数据case 1: if (Alarm_flag)/判断数据play16(48, 0|0x80, kai);/显示 开elseplay16(48, 0|0x80, guan); /显示 关break;case 2:play32_num(80, 2|0x80, alarm.min);/闹钟 分 显示 break;case 3: play32_num(32, 2|0x80, alarm.hour);/闹钟 时 显示 break;case 4: if (Clock_flag)/判断数据play1

44、6(80, 6|0x80, kai);/显示 开elseplay16(80, 6|0x80, guan);/显示 关break;default: break;else if (key_val 1)/判断数据if (state = 1)/判断数据Alarm_flag = Alarm_flag;if (Alarm_flag)play16(48, 0|0x80, kai);/显示 开elseplay16(48, 0|0x80, guan);/显示 关else if (state = 2)/判断数据if (key_val = 3)/判断数据alarm.min+;/加1elsealarm.min-;/减

45、1if (alarm.min = 60)/判断数据alarm.min = 0;else if (alarm.min = 24)/判断数据alarm.hour = 0;else if (alarm.hour 0)/判断数据alarm.hour = 23;play32_num(32, 2|0x80, alarm.hour);/闹钟 时 显示 else if (state = 4)/判断数据Clock_flag = Clock_flag;if (Clock_flag)/判断数据play16(80, 6|0x80, kai);/显示 开elseplay16(80, 6|0x80, guan);/显示

46、关elsebreak;/退出if (state = 0)/状态为0退出break;/状态为0退出if (state = 0)/状态为0退出break;/状态为0退出main()uint8 key_val; read_18B20(); /初始DS18B20 Delay_nms(1000);/延时1S,等待18B20工作正常LCD_init(); /初始化液晶clear12864(); /清屏幕main_frame(); /显示主界面框架main_show(1); /刷新1次 read_18B20(); /读温度play8_num(104, 6,zhengshu); /显示温度while(1) key_val = scan_key();if (key_val = 1) /K1?main_set(); /设置主界面else if (key_val = 2) /K2?clear12864(); /清屏幕alarm_show(); /

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!