毕业设计基于单片机万年历的设计_第1页
毕业设计基于单片机万年历的设计_第2页
毕业设计基于单片机万年历的设计_第3页
毕业设计基于单片机万年历的设计_第4页
毕业设计基于单片机万年历的设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计项目: 基于单片机万年历的设计 设 计 时 间: 2012 .06 .28 专 业: 信息电子工程技术 年 级: 10 级 学 号: 1050213120 姓 名: 谢盛鹤 指 导 老 师: 刘天飞 摘 要本设计以数字集成电路技术为基础,单片机技术为核心。软件设计采用模块化结构,c语言编程。系统通过lcd显示数据,可以显示日期(年、月、日、时、分、秒)以及温度。在内容安排上首先描述系统硬件工作原理,着重介绍了各硬件接口技术和各个接口模块的功能;其次,详细的阐述了程序的各个模块和实现过程。目 录摘要2前沿.41设计要求52 设计方案52.1 控制器选用52.2 显示部分设计62.3 数字

2、温度采集设计62.4 系统设计72.4.1 晶体振荡器电路72.4.3 时间计数器电路72.4.4 时钟电路72.4.5 复位电路82.4.6复位电路的可靠性设计82.4.7 按键部分93各硬件介绍.93.1 at89s51的引脚说明.93.2 lcd1602简介103.3 ds1302 简介.103.4 ds18b20 简介124 系统硬件设计所需的器材155 系统软件总体设计156电路原理仿真图7 主程序流程图158 完整程序编写16前言 电子时钟是实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人家庭,车站, 码头,办公室,银行大厅等场所,成为人们日常生活中的必需品。数字集成电

3、路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。钟表的数字化给人们生产生活带来了极大的方便,在此基础上完成的电子时钟精度高,功能易于扩展。可扩展成为诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等电路。所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用有着非常现实的意义。本设计就是数字时钟简单的扩展应用。1 设计要求本设计利用ds1302;ds18b20;lcd1602实现以下功能:(1) 显示日期功能(年、月、日、时、分、秒以及星期) (2) 可通过按键切换年、月、日及时、

4、分、秒的显示状态(3) 可随时调校年、月、日或时、分、秒(4) 可每次增减一进行时间调节(5) 可动态完整显示年份,实现真正的万年历显示(6) 可显示温度2 设计方案2.1 控制器的选用凌阳16位单片机有丰富的中断源和时基。它的准确度相当高,并且c语言和汇编兼容的编程环境也很方便来实现一些递归调用。i/o口功能也比较强大,方便使用。用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高,而且就需要完成万年历这个不太复杂

5、的设计可以不必用凌阳16位单片机来完成,采用51单片机既能够实现既定功能,成本也不高。综合考虑最后选择用51单片机来作为中心控制器件。硬件控制电路主要用了at89s51芯片处理器、lcd显示器等。根据各自芯片的功能互相连接成电子万年历的控制电路。软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及星期显示和温度采集程序等组成。主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是电子万年历中比较重要的部分。时间控制程序体现了年、月、日、时、分、秒及星期的计算方法。时间控制程序主要是定时器0计时中断程序每隔10ms中断一次当作一个

6、计数,每中断一次则计数加1,当计数100次时,则表示1秒到了,秒变量加1,同理再判断是否1分钟到了,再判断是否1小时到了,再判断是否1天到了,再判断是否1月到了,再判断是否1年到了,若计数到了则相关变量清除0。先给出一般年份的每月天数。如果是闰年,第二个月天数不为28天,而是29天。再用公式sv1 +(y1/4(y1/100+(y1/400+ d计算当前显示日期是星期几,当调节日期时,星期自动的调整过来。闰年的判断规则为,如果该年份是4或100的整数倍或者是400的整数倍,则为闰年;否则为非闰年。在我们的这个设计中由于只涉及100年范围内,所以判断是否闰年就只需要用该年份除4来判断就行了。温度

7、的显示主要是靠ds18b20采集现在的温度数据,cpu读取数据进行显示,当各自的条件得不到满足时,对应的显示器状态就不发生改变,只是在满足条件的情况下,显示器的状态才变化。2.2显示部分设计本设计采用液晶显示方式。液晶显示效果出众,可以运用菜单项来方便操作,比较简单。2.3 数字温度采集设计本设计中的温度采集部分考虑用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器ds18b20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。温度采集电路设计如下图所示,控制器采用单片机at89s51,温度传感器采用ds18b20,用

8、lcd1602显示温度2.4 系统设计2.4.1 晶体振荡器电路 晶体振荡器电路给数字钟提供一个频率稳定准确的32768hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用晶体荡器电路。图3 ds1302电路2.4.2 分频器电路分频器电路将高频方波信号经分频后得到1hz的方波信号供秒计数器进行计数,分频器实际上也就是计数器。2.4.3 时间计数器电路 时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器而根据设计要求,时个位和时十位计数器为12进制计数器。

9、2.4.4 时钟电路内部时钟电路如图所示,在xtal1和xtal2引脚上外接定时元件,内部振荡电路就产生自激振荡。定时元件通常石英晶体和电容组成的并联谐振回路,晶体振荡器选择12mhz,电容采用30pf。 图4 时钟电路2.4.5 复位电路 影响单片机系统运行稳定性的因素可大体分为外因和内因两部分: (1)外因 射频干扰,它是以空间电磁场的形式传递在机器内部的导体(引线或零件引脚)感生出相应的干扰,可通过电磁屏蔽和合理的布线/器件布局衰减该类干扰; 电源线或电源内部产生的干扰,它是通过电源线或电源内的部件耦合或直接传导,可通过电源滤波、隔离等措施来衰减该类干扰 。(2)内因 振荡源的稳定性,主

10、要由起振时间频率稳定度和占空比稳定度决定 起振时间可由电路参数整定稳定度受振荡器类型温度和电压等参数影响复位电路的可靠性。2.4.6复位电路的可靠性设计复位是单片机的初始化操作。单片机启运运行时,都需要先复位,其作用是使cpu和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。因而,复位是一个很重要的操作方式。但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实现。 复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开 关或电源插头分-合过程中引起的抖动而影响复位。2.4.7 按键部

11、分本设计总的用了三个按扭开关作为键盘,其中一个是选择调时键,另两个分别为加和减键。图6 按键电路3各硬件介绍3.1 at89s51的引脚说明at89s51系列单片机中有pdip,plcc,tqfp多种封装形式。本设计采用的是pdip封装40管脚的单片机,各引脚如图2-2所示。图9 at89s51的pdip封装引脚图3.2 lcd1602简介 图11 lcm1602 fig.11 lcm1602lcm1602采用标准的16脚接口,其中: 第1脚:vss为地电源 第2脚:vdd接5v正电源 第3脚:v0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比最高,对比度过高时会产生“鬼影”,

12、使用时可以通过一个10k的电位器调整对比度 第4脚:rs为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:rw为读写信号线,高电平时进行读操作,低电平时进行写操作。当rsrw共同为低电平时可以写入指令或者显示地址,当rs为低电平rw为高电平时可读忙信号,当rs为高电平rw为低电平时可以写入数据.第6脚:e端为使能端,当e端由高电平跳变成低电平时,液晶模块执行命令。 第714脚:d0d7为8位双向数据线。 第1516脚:空脚 3.3 ds1302 简介1 ds1302 的结构及工作原理ds13021是美国dallas 公司推出的一种高性能、低功耗、带ram的实时时钟芯片,它

13、可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.55.5v。采用三线接口与cpu 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个31的用于临时性存放数据的ram 寄存器。ds1302 是ds1202 的升级产品,与ds1202 兼容,但增加了主电源后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。1.1 引脚功能表及内部结构图ds1302 的引脚及内部结构如图1 所示,引脚功能如表1 所示。1.2 ds1302 的控制字节说明ds1302 的控制字如图2 所示。控制字节的最高有效位(位7)必须是逻辑1,

14、如果它为0,则不能把数据写入到ds1302 中位6 如果为0,则表示存取日历时钟数据,为1 表示存取ram数据;位至位1 指示操作单元的地址;最低有效位(位0)如为0 表示要进行写操作,为1 表示进行读操作,控制字节总是从最低位开始输出。1.3 复位通过把 输入驱动置高电平来启动所有的数据传送。 输入有两种功能:首先,接通控制逻辑,允许地址命令序列送入移位寄存器;其次, 提供了终止单字节或多字节数据的传送手段。当 为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中置 为低电平,则会终止此次数据传送,并且i/o 引脚变为高阻态。上电运行时,在vcc2.5v 之前,

15、必须保持低电平。只有在sclk 为低电平时,才能将rst 置为高电平。1.4 数据输入输出在控制指令字输入后的下一个sclk 时钟的上升沿时数据被写入ds1302,数据输入从低位即位0 开始。同样,在紧跟8 位的控制指令字后的下一个sclk 脉冲的下降沿读出ds1302 的数据,读出数据时从低位0 位至高位7,数据读写时序见图。1.5 ds1302 的寄存器ds1302 共有12 个寄存器,其中有7 个寄存器与日历、时钟相关,存放的数据位为bcd 码形式。其日历、时间寄存器及其控制字见表2。此外,ds1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与ram相关的寄存器等。时钟

16、突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。ds1302 与ram 相关的寄存器分为两类,一类是单个ram单元,共31 个,每个单元组态为一个8 位的字节,其命令控制字为cohfdh,其中奇数为读操作,偶数为写操作;再一类为突发方式下的ram 寄存器,此方式下可一次性读写所有的ram 的31 个字节,命令控制字为feh(写)、ffh(读)。3.4 ds18b20 简介3.4.1.温度传感器ds18b20ds18b20温度传感器是美国dallas半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现位

17、的数字值读数方式。 to92封装的ds18b20的引脚排列见下图,其引脚功能描述见表1。 ds18b20底视图表1ds18b20详细引脚功能描述序号名称引脚功能描述1gnd地信号2dq数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源。3vdd可选择的vdd引脚。当工作于寄生电源时,此引脚必须接地。ds18b20的性能特点如下:独特的单线接口仅需要一个端口引脚进行通信;多个ds18b20可以并联在惟一的三线上,实现多点组网功能;无须外部器件;可通过数据线供电,电压范围为3.05.5;零待机功耗;温度以或位数字;用户可定义报警设置;报警搜索命令识别并标志超过程序限

18、定温度(温度报警条件)的器件;负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; c64 位rom和单线接口高速缓存存储器与控制逻辑温度传感器高温触发器th低温触发器tl配置寄存器8位crc发生器vddds18b20采用脚pr35封装或脚soic封装,其内部结构框图如图2所示。图2 ds18b20内部结构64位rom的结构开始位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后位是前面56位的crc检验码,这也是多个ds18b20可以采用一线进行通信的原因。温度报警触发器和,可通过软件写入户报警上下限。ds18b20温度传感器的内部存储器还包括一个高速暂存和一个非

19、易失性的可电擦除的eeram。高速暂存ram的结构为字节的存储器,结构如图3所示。头个字节包含测得的温度信息,第和第字节和的拷贝,是易失的,每次上电复位时被刷新。第个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。ds18b20工作时寄存器中的分辨率转换为相应精度的温度数值。该字节各位的定义如图3所示。低位一直为,是工作模式位,用于设置ds18b20在工作模式还是在测试模式,ds18b20出厂时该位被设置为,用户要去改动,r1和0决定温度转换的精度位数,来设置分辨率。温度 lsb温度 msbth用户字节1tl用户字节2配置寄存器保留保留保留crc 图3 ds18b20字节定义由表1

20、可见,ds18b20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。高速暂存的第、字节保留未用,表现为全逻辑。第字节读出前面所有字节的crc码,可用来检验数据,从而保证通信数据的正确性。当ds18b20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第、字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625lsb形式表示。当符号位时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位时,表示测得的温度值为负值,要先

21、将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。表1 ds18b20温度转换时间表 ds18b20完成温度转换后,就把测得的温度值与ram中的th、t字节内容作比较。若th或ttl,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只ds18b20同时测量温度并进行报警搜索。在64位rom的最高有效字节中存储有循环冗余检验码(crc)。主机rom的前56位来计算crc值,并和存入ds18b20的crc值作比较,以判断主机收到的rom数据是否正确。ds18b20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定

22、频率的脉冲信号送给减法计数器;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器的脉冲输入。器件中还有一个计数门,当计数门打开时,ds18b20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器、温度寄存器中,计数器和温度寄存器被预置在55所对应的一个基数值。减法计数器对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器的预置值减到时,温度寄存器的值将加,减法计数器的预置将重新被装入,减法计数器重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器

23、计数到时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。4 系统硬件设计所需的器材5v电源 3v电源at89s51单片机1个液晶显示器1个ds1302 1个ds18b20 一个电阻 1 k的2个、4.7k的2个4.7欧排阻8550三极管晶振12m的一个 32768k的一个电容(30p的两个)led二极管1个22f电容1个轻触开关4个5 系统软件总体设计 系统的软件设计采用c语言,对单片机进行编程实现各项功能。程序在windowsxp环境下采用keil软件编写。软件控制程序主要有主

24、控程序、电子时钟的时间控制程序h和温度显示程序组成。主控程序中对整个程序进行控制,进行了初始化程序还有键盘功能程序、以及显示程序和时间控制程序是电子时钟中比较重要的部分。时间控制程序体现了年、月、日、时、分、秒的计算方法。6 电路原理仿真图:7 主程序流程图 开始单片机读ds1302数据单片机送数据到lcd1602单片机判断按键单片机处理按键调显示数据结束图16 主流程框图8 完整程序编写#include#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ri,yue,nian,week,flag,k

25、ey1n,temp;#define yh 0x80 #define er 0x80+0x40 sbit dq = p35; sbit rs=p17;sbit e=p24;sbit rw=p16; sbit io=p15;sbit sclk=p14;sbit rst=p22;sbit acc0=acc0;sbit acc7=acc7;sbit key1=p10; sbit key2=p12; sbit key3=p13; uchar code tab1=20 - - ; uchar code tab2= : : ;void delay(uint xms)uint x,y;for(x=xms;x0

26、;x-) for(y=110;y0;y-);/液晶写入指令函数write_1602com(uchar com)rs=0;rw=0; p0=com;delay(1);e=1;delay(1);e=0; /液晶写入数据函数write_1602dat(uchar dat)rs=1;rw=0; p0=dat;delay(1);e=1; delay(1);e=0; /液晶初始化函数lcd_init()write_1602com(0x38);write_1602com(0x0c);write_1602com(0x06);write_1602com(0x01);write_1602com(yh+1);for

27、(a=0;a14;a+)write_1602dat(tab1a);delay(3);write_1602com(er+2);for(a=0;a0;a-)io=acc0;sclk=0;sclk=1;acc=acc1;/读一个字节uchar read_byte()rst=1;for(a=8;a0;a-)acc7=io;sclk=1;sclk=0;acc=acc1;return (acc);/向1302芯片写函数,指定写入地址,数据void write_1302(uchar add,uchar dat)rst=0;sclk=0;rst=1;write_byte(add);write_byte(dat

28、);sclk=1;rst=0;/从1302读数据函数,指定读取数据来源地址uchar read_1302(uchar add)uchar temp;rst=0;sclk=0;rst=1;write_byte(add);temp=read_byte();sclk=1;rst=0;return(temp);/bcd码转十进制函数,输入bcd,返回十进制uchar bcd_decimal(uchar bcd) uchar decimal; decimal=bcd4; return(decimal=decimal*10+(bcd&=0x0f);/1302芯片初始化子函数(2012-06-26,00:0

29、0:00,week2)void ds1302_init() rst=0;sclk=0;write_1302(0x8e,0x00); write_1302(0x80,0x00);write_1302(0x82,0x00);write_1302(0x84,0x00);write_1302(0x8a,0x02);write_1302(0x86,0x26);write_1302(0x88,0x06);write_1302(0x8c,0x12);write_1302(0x8e,0x80);/温度显示子函数/向lcd写温度数据,并指定显示位置void write_temp(uchar add,uchar

30、dat)uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw); write_1602dat(0xdf); write_1602dat(0x43);/时分秒显示子函数void write_sfm(uchar add,uchar dat)uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(er+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);/年月日显示子函数v

31、oid write_nyr(uchar add,uchar dat)uchar gw,sw;gw=dat%10;sw=dat/10;write_1602com(yh+add);write_1602dat(0x30+sw);write_1602dat(0x30+gw);/写星期函数void write_week(uchar week)write_1602com(yh+0x0c);switch(week)case 1:write_1602dat(m); write_1602dat(o); write_1602dat(n); break; case 2:write_1602dat(t); write

32、_1602dat(u); write_1602dat(e); break;case 3:write_1602dat(w); write_1602dat(e); write_1602dat(d); break;case 4:write_1602dat(t); write_1602dat(h); write_1602dat(u); break;case 5:write_1602dat(f); write_1602dat(r); write_1602dat(i); break;case 6:write_1602dat(s); write_1602dat(t); write_1602dat(a); b

33、reak;case 7:write_1602dat(s); write_1602dat(u); write_1602dat(n); break;/*键盘扫描有关函数void keyscan()if(key1=0)delay(9);if(key1=0) delay(20); while(!key1);key1n+;if(key1n=9)key1n=1;switch(key1n)case 1: tr0=0;write_1602com(er+0x09); write_1602com(0x0f); temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00);

34、write_1302(0x80,0x80|temp); write_1302(0x8e,0x80); break;case 2: write_1602com(er+6); break;case 3: write_1602com(er+3); break;case 4: write_1602com(yh+0x0e); break;case 5: write_1602com(yh+0x0a); break;case 6: write_1602com(yh+0x07); break;case 7: write_1602com(yh+0x04); break;case 8:write_1602com(

35、0x0c);tr0=1; temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp); write_1302(0x8e,0x80); break; if(key1n!=0)if(key2=0) delay(10);if(key2=0) delay(20); while(!key2);switch(key1n)case 1:miao+;if(miao=60)miao=0;write_sfm(0x08,miao);temp=(miao)/10*16+(miao)%10; write_1302(0x8e

36、,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80); write_1602com(er+0x09);break;case 2:fen+;if(fen=60)fen=0;write_sfm(0x05,fen);temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8e,0x80);write_1602com(er+6);break;case 3:shi+;if(shi=24)shi=0;write_sfm(2,shi);tem

37、p=(shi)/10*16+(shi)%10; write_1302(0x8e,0x00); write_1302(0x84,temp); write_1302(0x8e,0x80);write_1602com(er+3);break;case 4:week+;if(week=8)week=1; write_1602com(yh+0x0c);write_week(week); temp=(week)/10*16+(week)%10; write_1302(0x8e,0x00); write_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602co

38、m(yh+0x0e);break;case 5:ri+;if(ri=32)ri=1;write_nyr(9,ri);temp=(ri)/10*16+(ri)%10; write_1302(0x8e,0x00); write_1302(0x86,temp); write_1302(0x8e,0x80);write_1602com(yh+10);break;case 6:yue+;if(yue=13)yue=1;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10; write_1302(0x8e,0x00); write_1302(0x88,temp); writ

39、e_1302(0x8e,0x80);write_1602com(yh+7);break;case 7:nian+; if(nian=100)nian=0;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_1302(0x8e,0x00); write_1302(0x8c,temp); write_1302(0x8e,0x80);write_1602com(yh+4);break; if(key3=0)delay(10);if(key3=0) delay(20);while(!key3);switch(key1n)case 1:miao-;

40、if(miao=-1)miao=59;write_sfm(0x08,miao); temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,temp); write_1302(0x8e,0x80);write_1602com(er+0x09);break;case 2:fen-;if(fen=-1)fen=59;write_sfm(5,fen);temp=(fen)/10*16+(fen)%10; write_1302(0x8e,0x00); write_1302(0x82,temp); write_1302(0x8

41、e,0x80);write_1602com(er+6);break;case 3:shi-; if(shi=-1)shi=23;write_sfm(2,shi);temp=(shi)/10*16+(shi)%10; write_1302(0x8e,0x00); write_1302(0x84,temp); write_1302(0x8e,0x80);write_1602com(er+3);break;case 4:week-;if(week=0)week=7; write_1602com(yh+0x0c);write_week(week); temp=(week)/10*16+(week)%1

42、0; write_1302(0x8e,0x00); write_1302(0x8a,temp); write_1302(0x8e,0x80); write_1602com(yh+0x0e);break;case 5:ri-;if(ri=0)ri=31;write_nyr(9,ri);temp=(ri)/10*16+(ri)%10; write_1302(0x8e,0x00); write_1302(0x86,temp); write_1302(0x8e,0x80);write_1602com(yh+10);break;case 6:yue-;if(yue=0)yue=12;write_nyr(

43、6,yue);temp=(yue)/10*16+(yue)%10; write_1302(0x8e,0x00); write_1302(0x88,temp); write_1302(0x8e,0x80);write_1602com(yh+7);break;case 7:nian-; if(nian=-1)nian=99;write_nyr(3,nian); temp=(nian)/10*16+(nian)%10; write_1302(0x8e,0x00); write_1302(0x8c,temp); write_1302(0x8e,0x80);write_1602com(yh+4);bre

44、ak; /定时器、计数器设置函数void init() tmod=0x11;th0=0; tl0=0; ea=1; et0=1; tr0=1; /* 延时函数* 功能:在11.059mhz的晶振条件下调用本函数需要24s ,然后每次计数需16s */void ds18_delay(int useconds) int s;for (s=0; suseconds;s+); /* 复位函数* 功能:完成单总线的复位操作* 复位时间为480s,因此延时时间为(480-24)/16 = 28.5,取29s。* 经过70s之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3s。*/u

45、nsigned char ow_reset(void) unsigned char presence;dq = 0; ds18_delay(29); dq = 1; ds18_delay(3); presence = dq; ds18_delay(25); return(presence); /* 位写入函数* 功能:向单总线写入1位值:bitval*/void write_bit(char bitval) dq = 0; if(bitval=1) dq =1; ds18_delay(5); dq = 1; /* 字节写入函数* 功能:向单总线写入一个字节值:val*/void ds18write_byte(cha

温馨提示

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

评论

0/150

提交评论