微控制器系统原理设计-基于S08的万年历设计.doc_第1页
微控制器系统原理设计-基于S08的万年历设计.doc_第2页
微控制器系统原理设计-基于S08的万年历设计.doc_第3页
微控制器系统原理设计-基于S08的万年历设计.doc_第4页
微控制器系统原理设计-基于S08的万年历设计.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微控制系统原理设计报告题 目: 基于S08的万年历设计 专业班级: 自动1304 学生姓名: 学 号: 成 绩: 目 录摘要11、概述11.1 课题的背景、研究意义11.2 功能介绍22、硬件电路的设计与实现22.1 硬件总体设计框图22.3 主要单元电路的设计32.3.1 单片机主控制模块的设计32.3.2 温度测量模块42.3.3 时钟电路52.3.4 复位电路62.3.5 按键电路62.3.6 时钟芯片电路72.3.7 LCD显示电路83、系统的软件设计83.1 系统软件设计概述93.2 S08和DS12C887之间数据传输103.3 LCD显示程序设计133.4 温度测量模块程序设计133.5 按键程序设计144、系统的软件调试154.1 CodeWarrior简介154.2 程序调试16总结18参考文献18附录19附录A 主程序19附录B 温度测量程序20附录C LCD显示程序24附录C DS12C887程序26附录D 按键程序29附录E 整体电路图33摘要电子万年历是一种非常广泛日常计时工具,在现代社会越来越流行。单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅 猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和 玩具等。并且已经深入到工业生产的各个环节以及人民生活的各个方面,如车间 流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等。用单片 机来控制的小型家电产品具有便携实用,操作简单的特点。当今的电子万年历不仅可以显示年、月、日、时、分、秒、星期,有些万年 历还可以显示当时当地的温度,附带功能还包括整点闹铃、定时闹铃等。安全性 也越来越能得到保障,部分电子万年历具有防爆、防震、防火、防水的特性。显示屏的选择也更加丰富,可以选择LED显示或LCD显示。本文设计的电子万年历属于小型智能家用电子产品。利用MC9S08AW60单片机进行控制,实时时钟芯片采用DS12C887,外加掉电存储电路、显示电路和18B20温度测量电路,可实现时间的调整、显示以及温度的显示。关键词:MC9S08AW60 DS12C887时钟芯片 万年历 1、概述 1.1 课题的背景、研究意义 现市场的电子钟具有低功耗的实时时钟电路,它们可以对年、月、日、周日、时、分、秒进行计时,还具有润年补偿等功能,且使用寿命长、误差小、使用方便。电子万年历的出现给人们的生活带来的诸多方便。目前,国际上的电子万年历正从模拟式向数字式、由集成化向智能化的方向飞速发展。 综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。1.2 功能介绍 本次设计主要用单片机控制程序让它在液晶上显示年、月、日、时、分、 秒及星期。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发 生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数 器进一,日计数器由平年、闰年的大、小月和二月的判断应与当月相应的日期相 一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进 位,当年计数器计满100时所有计数器清零。还有温度测量的设计,通过温度测量电路测得温度经过单片机处理显示在液晶显示屏上,设计采用的是年、月、日和时、分、 秒、星期和当时温度同时显示,另外本次设计还具有闹钟的功能。2、硬件电路的设计与实现2.1 硬件总体设计框图此设计在液晶上显示年、月、日、时、分、秒及星期,其原理框图如下图 所示,电路一般包括以下几个部分:单片机模块、时钟模块、键盘模块及显示模块、测温模块、闹钟模块、电源模块。主控芯片采用飞思卡尔的MC9S08AW60单片机,时钟 芯片采用DS12C887。2.2 硬件系统概述本电路是由MC9S08AW60单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS12C887提供,它是一种高性能、低功耗、带RAM的实时时钟电路,可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿,自带晶体振荡器和锂电池,在没有外部电源的情况下可工作10年。工作电压为3.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,;温B度的采集由DS18B20构成;显示部份由LCD1602个液晶屏组成。测温模块由DS18B02组成。键盘模块用来校准日期和时间,还可以进行定时。2.3 主要单元电路的设计2.3.1 单片机主控制模块的设计本设计的主控芯片采用飞思卡尔的MC9S08AW60单片机,其是低成本、高性能8位微处理器S08家族中的成员。Freescale的S08系列8位MCU由于其稳定性高、开发周期短、成本低、型号多样、兼容性好而被广泛应用。MCU的最小系统是指可以使内部程序运行所必需的外围电路。一般情况下,MCU的硬件最小系统由BDM下载器接口、晶振及复位等电路组成。如图一所示。图一 MCU硬件最小系统电路图2.3.2 温度测量模块根据DS18B20 中文资料典型测温电路,设计电路如下:图二 温度测量模块(1) GND 为电源地;(2) DQ 为数字信号输入/输出端;(3) VDD 为外接供电电源输入端; DS18B20 与S08 通信分析: 当程序运行时,首先将DS18B20 初始化,设置好要求的初始值,再调用温度读取子程序读取温度测量值,当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0 和第1 个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。对应的温度计算:当符号位S=0 时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。第九个字节是冗余检验字节。 DS18B20暂存寄存器分布寄存器内容字节地址温度值低位0 温度值高位1 高温限值TH2低温限值TL3 配置寄存器4 保留5 保留6 保留7CRC 检验8。 温度数据的计算处理方法:从DS18B20 读取出的二进制值必须先转换成十进制值,才能用于字符的显示。因为DS18B20 的转换精度为912 位可选项的,为了提高精度采用12 位。在采用12 位转换精度时,温度寄存器里的值是以0.0625 为步进的,即温度值为温度寄存器里的二进制值乘以0.625,就是实际的二进制温度值。一个十进制值和二进制值之间有很明显的关系,就是把二进制的高字节的低半字节和低字节的低半字节化成十进制后,就是温度值的小数部分。小数部分因为是半个字节,所以二进制值范围是0F,转换成十进制小数值就是0。0625 的倍数(015)。采用1 位显示小数,可以精确到0.1。2.3.3 时钟电路 S08AW的时钟信号外部震荡接外部晶振,其电路图如图二所示。电容器C1、C2起稳定震荡频率、快速起振的作用,电容值一般为5-30pF,晶振通常选用6MHZ、12MHZ、24MHZ。内部震荡方式所得的时钟信号比较稳定。图三 时钟振荡电路2.3.4 复位电路 复位操作是为了完成S08AW内部电路的初始化,使S08AW从一种确定的状态开始运行。当S08AW的复位引脚RST出现2个机器周期以上,S08AW就完成了复位操作。如果RST持续为高电平,S08AW就处于循环复位状态。复位通常有2种基本形式:上电复位和开关复位。上电复位要求要求接通电源后,自动实现复位操作。开关复位要求在电源接通的条件下,在S08AW运行期间,用按钮开关操作使S08AW复位。本次采用的是常用的上电且开关复位电路,如图四所示图四 复位电路上电后,由于电容充电,使RST持续一段高电平时间。当S08AW已在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电且开关复位的操作。通常选择C=1030F,R=101000。复位操作使S08AW进入初始化过程,其中包括使程序计数器PC=0000H,其它寄存器处于零。2.3.5 按键电路本次设计采用的液晶显示器,对时间或日期的修改比较方便,所以为了简化电路,使其变得简单易操作,所以设计值采用了三个按键:S1、S2、S3。其中S1键作为功能键即把光标放置在需要进行修改的日期或时间的位置上;键S2是增加键,按下按键光标闪动的位置其数值就会增加1;键S3是减少键,原理同键S2一样。如图五所示图五 按键电路2.3.6 时钟芯片电路本文设计采用的时钟日历芯片为美国DALLAS公司的新型时钟日历芯片DS12C887。由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。GND、VCC:直流电源,其中VCC接+5V输入,GND接地。当VCC输入为+5V时,用户可以访问DS12C887内RAM中的数据,并可对其进行读、写操作;当VCC输入小于+4.25V时,禁止用户对内部RAM进行读、写操作,此时用户不能正确获取芯片内的时间信息;当VCC输入小于+3V时,DS12C887会自动将电源切换到内部自带的锂电池上,以保证内部的电路能够正常工作。对比PCF8563与DS12C887两种芯片的性能,最终决定选择功能丰富,性能可靠,质量好,功耗低的DS12C887。图六 时钟芯片电路DS12C8872.3.7 LCD显示电路LCD(Liquid Crystal Display)作为电子信息产品的主要显示器件,相对于其他类型的显示部件有其自身的特点,主要包括:低电压微功耗、平板型结构、使用寿命长、被动显示、显示信息量大、易于彩色化、无电磁辐射等。LCD与AW60的连接方式如图七所示图七 LCD与S08AW60的硬件连接3、系统的软件设计在硬件电路确定之后,则系统所有的智能功能要由软件来完成。软件是整个控制系统设计的核心,它具有充分的灵活性,可以根据系统的要求而变化,对于同样的硬件系统,配以不同的软件系统,所实现的功能也就不一样,而且有此硬件电路的功能都可以用软件来实现。所以对于一个系统设计来说,软件系统常常比硬件系统需要更多的工作量。整个系统的硬件组成相对简单,较小的硬件开销需要相对复杂的软件进行补偿,下面较为详细地分析软件的设计。3.1 系统软件设计概述本系的软件采用结构化模块程序设计,所谓“模块”,实质上就是具有一定功能、相对独立的程序段。其基本思路是将整个控制系统的功能分解为几个相对独立的标准模块,使其中的每一个程序模块完成某一特定的控制功能,并且分别只有一个入口和出口中,这样就可以对每一个程序分别定义无歧义性的输入变量和输出变量,使它们的运行相对地不受其它程序的影响,从而增强了系统的可靠性。模块设计的主要特点是:单模块比一个完整的程序容易编写、查错和测试;模块可以实现共享,一个模块可被多个任务在不同的条件下调用;把输入/输出封装起来,可以使程序其余部分免受经常变动;输入/输出放入模块使得程序很容易适应输入/输出设备的变动。这样的设计有利于程序化码的优化,而且便于设计、调试和维护。软件结构采用模块化设计方法,将所要完成的功能分别编写和调试,所有模块调试成功以后,将各个模块连接成软件系统。在本电子万年历的设计中,软件系统包括主程序、LCD显示程序、键盘调整程序等模块。其整体程序流程图如图八所示图八 整体程序流程图3.2 S08和DS12C887之间数据传输主机要向从机写1个字节数据时,主机首先产生START信号,然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/W),0表示主机发送数据(写),1表示主机接收数据(读),这时候主机等待从机的应答信号(ACK),当主机收到应答信号时,发送要访问的地址,继续等待从机的响应信号,当主机收到响应信号时,发送1个字节的数据,继续等待从机的响应信号,当主机收到响应信号时,产生停止信号,结束传送过程。S08向DS12C887写一个字节数据的流程图如图九所示图九 AW60向PCF8563写一个数据流程图S08向DS12C887中写一个字节数据的具体C语言程序如附录所示。当主机要从从机读1个字节数据时,主机首先产生START信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为0,表明是向从机写命令,这时候主机等待从机的应答信号(ACK),当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号,当主机收到应答信号后,主机要改变通信模式,所以主机发送重新开始信号,然后紧跟着发送一个从机地址,注意此时该地址的第8位为1,表明将主机设置成接收模式开始读取数据,这时主机等待从机的应答信号,当主机收到应答信号时,就可以接收1个字节的数据,当接收完成后,主机发送非应答信号,表示不再接收数据,主机进而产生停止信号,结束传送过程。S08向DS12C887读一字节数据的流程图如图十所示图十 DS12C887读一字节数据的流程图S08向DS12C887中读一个字节数据的具体C语言程序如附录所示。3.3 LCD显示程序设计LCD显示程序的任务是AW60主控芯片持续不断地从PCF8563时钟芯片中读出相应数据,之后再转换为用于LCD显示的数据。如图所示。图十一 LCD显示流程图3.4 温度测量模块程序设计由于DS18B20单线通信功能为分时完成,有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储操作命令处理数据。根据单总线操作协议,首先要对DS18B20进行初始化,而初始化有严格的时序控制,如图3.6所示,即总线控制器(TX)发出一个复位脉冲(至少480us的低电平),然后释放总线进入接收状态,总线由5.1K上拉电阻上拉为高电平,探测到I/O引脚上的上升沿后,DS18B20等待15us60us后,然后发出一个存在脉冲(60us240us的低电平信号)。下面是几个驱动函数:1) Init_DS18B20(void)*功能:DS18B20初始化2) ReadTemp(void)*功能:读取温度值温度采集模块流程图如图十二所示图十二 温度采集模块流程图3.5 按键程序设计本设计中按键采用查询法识别按键,程序简单。本系统中含有三个调整按键,分别命名为S1、S2、S3。在主函数里面查询S1按键是否按下,S2、S3键的功能由S1键激活。这样设计可以减少CPU的工作量,详细程序见附录程序清单。4、系统的软件调试4.1 CodeWarrior简介软件调试工具使用的是Freescale CodeWarrior.。CodeWarrior Development Studio是完整的用于编程应用中硬件bring-up的集成开发环境。 采用CodeWarrior IDE,开发人员可以得益于采用各种处理器和平台(从Motorola到TI到Intel)间的通用功能性。根据Gartner Dataquest的报告,CodeWarrior编译器和调试器在商用嵌入式软件开发工具的使用率方面排名第一。而这只是流行的CodeWarrior软件开发工具中的两个。CodeWarrior包括构建平台和应用所必需的所有主要工具 - IDE、编译器、调试器、编辑器、链接器、汇编程序等。另外,CodeWarrior IDE支持开发人员插入他们所喜爱的工具,使他们可以自由地以希望的方式工作。CodeWarrior开发工作室将尖端的调试技术与健全开发环境的简易性结合在一起,将C/C+源级别调试和嵌入式应用开发带入新的水平。开发工作室提供高度可视且自动化的框架,可以加速甚至是最复杂应用的开发,因此对于各种水平的开发人员来说,创建应用都是简单而便捷的。它是一个单一的开发环境,在所有所支持的工作站和个人电脑之间保持一致。在每个所支持的平台上,性能及使用均是相同的。无需担心主机至主机的不兼容。4.2 程序调试1、创建新工程:点击FileNew Project图十三 新建工程步骤12、选中MC9S08AW60芯片,并选择 HCS08 Open Source BDM,接着点“下一步”图十四 新建工程步骤23、选择C语言编写,定义工程名称为“E-calendar.mcp”,并选择工程位置。图十五 新建工程步骤34、将程序代码添加进工程中,进行编译图十六 对工程编译总结 论文首先对本设计作了简要描述,最后确定该设计采用电源模块、时钟模块、显示模块、键盘接口模块、温度测量模块和闹钟模块共六个模块组成,接着分别从硬件系统和软件系统两方面对基于单片机的电子万年历设计作了详细论述,另外还简要介绍了一下系统的调试。 在整个设计过程中,硬件方面主要设计了S08AW60单片机的最小系统、DS12C887接口电路、DS18B20接口电路、闹钟及LCD显示;软件方面借助各个渠道的资料,主要设计了阳历数据读取程序、温度采集程序、闹铃程序以及LCD显示程序;系统的调试主要是通过一块S08AW60开发板,再借助于CodeWarrior以及少许自己搭建的外围电路实现的;再此过程中,分步调试时显示出了阳历的日期及时间,还有实时温度,集中调试时达到预期效果。参考文献1 张萌.单片机应用系统开发综合实例M.北京:清华大学出版社,2007.7Tommy Noergarrd 著. 马洪兵 谷源涛 译. 嵌入式系统硬件与软件架构. 北京:人民邮电出版社,20082 John Catsoulis 著. 徐君明 陈振林 郭天杰 改编. 嵌入式硬件设计. 北京:中国电力出版社,20073 李广弟.单片机原理及应用M北京航空航天大学出版社,2004年美Randall Hyde著,韩东海译编程卓越之道北京:电子工业出版社,20064 加Peter Spasov著,李小洪译微控制器原理与应用(第5版)北京:清华大学出版社,20065 继伟. 基于ColdFire的评估系统的设计与实现:硕士学位论文,江苏;苏州大学,20076 SCM1602LCM使用说明书DB长沙:长沙太阳人电子有限公司王宜怀 刘晓升 著. 嵌入式应用技术基础教程. 北京:清华大学出版社,20057 谭浩强 著. C程序设计教程. 北京:清华大学出版社,2002附录附录A 主程序#include #includederivative.h #include1206.h#include18b20.h#includeds12c887.hint main() init_IO(); init_display();18b20_init();while(1)keyscan();if(flag=0)keyscan();/获取显示的值 year=read_ds(8);month=read_ds(7);week=read_ds(6);day=read_ds(5);shi=read_ds(4);fen=read_ds(2);miao=read_ds(0);Tem=get_temp(); /显示 write_sfm(7,miao);write_sfm(4,fen);write_sfm(7,shi);write_week(week);write_nyr(3,year); write_nyr(6,month);write_nyr(9,day);write_date(9,Tem); return 0; EnableInterrupts; /* 开中断 */ for(;) _RESET_WATCHDOG(); 附录B 温度测量程序#ifndef _18b20_H_#define _18b20_H_#define unit unsigned int#define uchar unsigned char#define DQ_H PTBDD_PTBDD3=1 / 设为输入,上拉电阻把总线拉高,即电阻上拉#define DQ_L PTBDD_PTBDD3=0#define DQ_0 PTBDD_PTBD3=0 /P1.1 设为输入,输出低电平,把总线拉低,即总线主器件拉低int 18b20_init();void writebit(unsigned char bit);unsigned char readbit();void write_byte(unsigned char byte);unsigned char read_byte();float get_temp();#endif#include18b20.h/延时函数 z表示ms void delay(unit z)unit x,y;for(x=2*z;x0;x-) for(y=0x1996;y0;y-) _RESET_WATCHDOG; void delay_us(unit z) uint y; for(y=z;y0;y-) _RESET_WATCHDOG; /* 名 称:reset()* 功 能:检测 DS18B20 初始化序列* 入口参数:无* 出口参数:int t。t=1,DS18B20 初始化;t=0,DS18B20 没有初始化*/int 18b20_init()int t;DQ_H;delay_us(50);_NOP();_NOP();DQ_L;DQ_0; /主器件拉低delay_us(500); /最少 480usDQ_H; /电阻上拉delay_us(60); /等待 1560usif(P2IN&BIT3)=0) t=1; /判断存在脉冲,DS18B20 是否拉低else t=0;delay_us(480); /最小 480usreturn(t); /若 DS18B20 复位,返回值 t=1/* 名 称:writebit()* 功 能:单片机对 DS18B20 写时隙* 入口参数:unsigned char bit。bit=1,写 1 时隙;bit=0,写 0 时隙。* 出口参数:无*/void writebit(unsigned char bit)DQ_L; /主器件拉低开始DQ_0;delay_us(3); /最少延时 1usif(bit) DQ_H; /电阻上拉,写 1elseDQ_L; /主器件拉低,写 0DQ_0;delay_us(80); /写时隙必须至少持续 60sDQ_H;delay_us(60); /大于 1us 延时即可/* 名 称:readbit()* 功 能:单片机对 DS18B20 读时隙* 入口参数:无* 出口参数:char bit。bit=1,读 1 时隙;bit=0,读 0 时隙。*/unsigned char readbit()char bit;DQ_L; /主器件拉低开始DQ_0;delay_us(3); /延时大于 1usDQ_H; /IO 口设为输出, DS18B20 拉低,则读出 0;电阻上拉拉高,则读出 1delay_us(3); /延时小于 15usif(P2IN&BIT5) bit=1; /判断 IO 输入状态else bit=0;delay_us(80); /延时大于 45usDQ_H;delay_us(60);return(bit);/* 名 称:write_byte()* 功 能:单片机向 DS18B20 写入一个字节* 入口参数:unsigned char byte。byte 为单片机写入的数据* 出口参数:无*/void write_byte(unsigned char byte)int i;for(i=0;i1; /byte 右移一位,byte 从低位到高位,逐位写入_NOP(); /* 名 称:read_byte()* 功 能:单片机从 DS18B20 读出一个字节* 入口参数:无* 出口参数:unsigned char ans。ans 为单片机从 DS18B20 读出的数据*/unsigned char read_byte()int t;unsigned char ans=0;for(t=0;t=1; /ans 右移一位if(readbit()ans|=0x80; /若读出 1 则,ans 最高位写入 1,写满 8 位_NOP();return(ans); /返回读出的数据float get_temp()while(!reset() /访问 DS18B20 以一个初始化序列未开始write_byte(0xCC); /总线上只有一个 DS18B20,因此可直接跳过寻址write_byte(0x44); /开始温度转换delay_us(5000); /等待转换while(!reset() /等待 DS18B20 复位write_byte(0xCC);write_byte(0xBE); /读暂存器temp1=read_byte(); /读出 LStemp2=read_byte(); /读出 MSreset();t=(float)temp1*0.0625+(float)temp2*16; /计算温度值 /t=t*10+0.5; /放大 10 倍,四舍五入 return(t);附录C LCD显示程序#ifndef _1206_H_#define _1206_H_#define unit unsigned int#define uchar unsigned char/1206控制端引脚宏定义 #define EN_CLR PTBD_PTBD0=0#define EN_SET PTBD_PTBD0=1#define RS_CLR PTBD_PTBD2=0#define RS_SET PTBD_PTBD2=1#define RW_CLR PTBD_PTBD1=0;#define RW_SET PTBD_PTBD1=1;void delay(unit z);void 1602_init(); void write_com(uchar com);void write_data(uchar data);#endif#include1206.h/延时函数 z表示ms void delay(unit z)unit x,y;for(x=2*z;x0;x-) for(y=0x1996;y0;y-) _RESET_WATCHDOG; void 1602_init() /1602初始化,请参考1602的资料EN_CLR; /#define EN_CLR PTBD_PTBD0=0;write_com(0x38); /设置16*2显示,5*7点阵,8位数据接口write_com(0x0c); /光标不显示write_com(0x06); /写入新数据后光标右移,显示频不移动write_com(0x01); /0000000001 清屏write_com(0x18);void init_display()RW_CLR; /写数据指令 1602_init();write_com(0x80);for(i=0;i15;i+) write_data(tablei); delay(1);write_com(0x8a+0x40);for(i=0;i0 执行指令void write_data(uchar data) /输出数据RS_SET; /RS置高 RS=1输出数据PTA0=data;delay(5)/延时5ms EN_SET;delay(5)/延时5ms EN_CLR; /E置低 1-0 执行指令附录C DS12C887程序#includeds12c887.huchar code table=20 - - ;uchar code table1= : : T: ;char miao,shi,fen,year,month,day,week,amiao,afen,ashi;void delay(unit z)unit x,y;for(x=z;x0;x-) for(y=100;y0;y-) _RESET_WATCHDOG;void di()beep=0;delay(100);beep=1; /1602液晶刷新时分秒函数 4为时,7为分,10为秒 void write_sfm(uchar add,char date)char shi ge;shi=date/10;ge =date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);/ 1602液晶刷新年月日 3为年,6为月,9为日 void write_nyr(uchar add,char date) char shi ge;shi=date/10;ge =date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);/写液晶星期显示函数 void write_week(char we)write_com(0x80+12)switch(we)case 1: write_date(M);delay(5); write_data(N);dalay(5); write(N); break; case 2: write_date(T);delay(5); write_data(U);dalay(5); write(E); break;case 3: write_date(w);delay(5); write_data(E);dalay(5);write(D);break; case 4: write_date(T);delay(5); write_data(H);dalay(5);write(U);break; case 5: write_date(F);delay(5); write_data(R);dalay(5);write(I);break; case 6: write_date(S);delay(5); write_data(A);dalay(5); write(T); break; case 7: write_date(S);delay(5); write_data(U);dalay(5); write(N); break; void write_ds(uchar add,uchar date)dscs=0;dsas=1;dads=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1; uchar read_ds(uchar add)uchar ds_date;dsrw=1;dsas=1;dscs=1;dscs=0;P0=add;dads=1;dsas=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;/*void read_alarm()amiao=read_ds(1);afen=read_ds(3);ashi=read_ds(5); */void set_time() /首次上电后初始化时间函数 write_ds(0,0); write_ds(1,0); write_ds(2,0); write_ds(3,0); write_ds(4,0); write_ds(5,0); write_ds(6,0); write_ds(7,0); write_ds(8,0); write_ds(9,0); 附录D 按键程序void init_IO() PTAD=0XFF; PTBD=0XFF; PTDD=0XFF; PTDDD=1; PTADD=1; PTBDD=1;void keyscan() char s1num,flag,Temp; Tem=get_temp(); if(s1=0)delay(5);if(s1=0) s1num+; flag=1; while(!s1);di(); switch(s1num) case 1:write_com(0x80+0x40+7) write_com(0x0f); break; case 2:write_com(0x80+0x40+4) break; case 3:write_com(0x80+0x40+1) b

温馨提示

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

评论

0/150

提交评论