版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
®讶Q充考法
《电子技术课程设计》实训报告
题目ds1302、ds18b20做的
led显示的万年历
学生姓名
专业班级
学号
系(部)
指导教师
实训时间2014.5.26-2014.6.6
实训报告评语
等级:_________
评阅人:职称:
年月日
一、实训任务要求
1、根据所学模拟电子电路、数字电子电路、自己了解的课外知识,自己设计完
成一个电子产品。
2、万年历(温度显示)具有走时准确、显示直观、易校时等优点,因此得到了
广泛的应用。多功能说子时钟由以下几部分组成:电源部分、时钟电路、复位电
路、显示电路、温度测量电路等。显示内容为:万年历(温度显示)是一种用
DS1302实时时钟芯片计时的装置,DS18B20测试环境温度,利用LCD1602显
示温度和时间。最终实现万年历的所有功能。
3、自己动手,从理论上升到实践,更好的实现理论和实践的结合。从中总结经
验教训,不断提高。
二、实训目的
1、培养动手能力,在实践中加强对理论知识的理解。
2、掌握对电子元器件识别,相应工具的操作,相关仪器的使用,电子设备制作、
装调的全过程的方法。
3、掌握查找及排除电子电路故障的常用方法。
4、学习使用proteus>protel电路仿真与设计软件,动手绘制电路图。
三、实训步骤:
(-)>设计方案的选择:
万年历的设计能够学习运用到多方面的知识。如单片机的使用、一些简单程
序的读写、了解运用(dsl302实时时钟芯片、ds18b20温度传感器、LCD1602液
晶等)的原理及功能、学会Altiumdesigner、proteus、keil等软件的使用。如果此
产品做成功不仅可以收获大量知识,而且自己日后可以使用自制的万年历。这将
会使自己有不小的成就感,曾加对专业学习的兴趣。
(二)、电路原理分析:
1、电路设计框图:
2、工作原理描述:
本电路由STC90C51单片机为控制核心,在5V电压下工作;时钟电路由
DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,可以对年、
月、日、周日、时、分、秒进行计时。需要5V、3V直流电源分别供电。采用三
线接口与CPU进行同步通信,并采用突发方式一次传递多个字节的时钟信号或
RAM数据,同时具有掉电自动保存功能。由它将时钟信号传递给单片机。温度
的采集由DS18B20构成,将当前环境温度转换为电信号传递给单片机。显示部
分由LCD1602液晶显示屏完成。最后,由单片机将D31302、DS18B20c传来的
信号传递给LCD1602,从LCD1602上就可以读出所要显示的所有信息。
(三)、芯片封装及功能:
DS1302实时时钟芯片:
封装:
1、引脚说明:
(1)Vccl:后备电源,VCC2:主电源。在主电源关闭的情况下,也能保持
口寸钟的连续运行。DS1302由Vccl或Vcc2两者中的较大者供电。当Vcc2大于
Vccl+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vccl时,DS1302由Vccl
供电。
(2)XI、X2:振荡源,外接32.768kHz晶振。
(3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传
送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入
移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为
高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过
程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行
时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能
将RST置为高电平。
(4)I/O为串行数据输入输出端(双向)。
(5)SCLK为时钟输入端。
2、DS1302的控制字节
DS1302的控制字如下图所示。
控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入
DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;
位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为
1表示进行读操作,控制字节总是从最低位开始输出。
3、数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,
数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK
脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7o
4、DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据
位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及
与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的
所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM
单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H〜FDH,
其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方
式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。
18B20温度传感器:
1、封装:
DS18B20芯片封装结构:
DALLASNC匚ZINC
18B20
NC匚
DQ匚GND
8-Pin150milSO
(DS18B20Z)
DQ『一8t=3Voo
NC匚口NC
27
NCc=d£L=)NC
3S°
GNDEZd3LzjNC
8-Pin"SOP
(BOTTOM\TEU^(DS18B20U)
TO-92
(DS18B20)
图I
2、DS18B20引脚功能:
•GND电压地・DQ单数据总线•VDD电源电压•NC空引脚
3、DS18B20工作原理及应用:
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力
更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作
流程之前我们有必要了解18B20的内部存储器资源。18B20共有2种形态的存
储器资源,它们分别是:
(1)ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列
编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位
是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。
DS18B2O共64位ROM。
(2)RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,
DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后
的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的
镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的
镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率
而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字
节的CRC码。EEPROM非易失性记忆体,用于存放长期需要保存的数据,上
下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM者K存在
镜像,以方便用户操作。
LCD1602液晶显示器:
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号
等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵
字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,
起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
1、LCD1602的引脚功能:图(1)LCD1602
第1脚:VSS为电源地
第2脚:VDD接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源
时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器
调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指
令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操
作。
第6脚:E(或EN)端为使能(enable)端。
第7〜14脚:D0〜D7为8位双向数据端。
第15〜16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
4、电路仿真结果:
图(2)电路仿真图
5、电路制作与调试
(1)上网查找电路图及程序(2)在KEIL中编译修改程序(3)PROTUES
上进行仿真(4)画原理图,生成PCB(5)打印PCB图(7)进行热转印,腐蚀
(8)打孔(9)向打过孔的PCB涂锡(10)焊接电路(11)向单片机下载程序,
进行调试(12)用万用表测量电气连接是否完好(13)调节LCD液晶的对比度
(14)正常显示时间、温度
四、实训心的
作为一•名大学生,做出来的东西要能拿得出手,要像是一个上过大学的人
做的。不能敷衍了事,无法与同学相较。不能总以没有时间为借口,下次有时间
再好好做来自欺。你做出来的东西,就体现着你的能力。习惯性的应付工作,有
严重的危害。工作是生活的一部分,如果完成的工作质量粗劣,不但使工作效能
降低,而且还会使你丧失做事的才能。当然,永远不可能拥有超人的成就和某种
特长。同时,他人也将不会尊重你的工作和你。因此,工作需要认真,要做就尽
力把工作做完满,绝不敷衍了事。
设计东西时统筹安排好,再开始做,不然做出来的产品不理想的地方也不易
修改。做产品不可能一蹴而就,需要耐心和毅力,要能坐得住,把握好每一个环
节,才能做出来好的产品。检测调试时,要仔细,不放过任何细节。这样不仅不
会浪费时间,反而有事半功倍的效果。
现在,对于我来说,电子制作还是刚刚接触。设计的东西虽然是非常的简单,
但是也得到了很多的乐趣。我相信,随着不断地学习,以后肯定会有大的突破。
原来感觉专业方面的学习是无聊的,自己学习也没有兴趣和动力。通过实训让我
了解到电子设计的魅力,渐渐地有了想要学习相关知识,自己设计产品的渴望。
只要有兴趣,付出的努力一定会有回报。
多向他人学习,学习他人的优点,虚心接受他人合理化的批评。从他人身上
发现自己需要改进和提高的方面。
做事情,只要下定决心,面对困难,不放弃,想方法去解决。最终,一定能
够成功。
附录一:元器件清单
⑴单片机STC90C51XI
(2)晶振12MXI
32768HzXI
(3)陶瓷电容22pX2
(4)电解电容10uXI
(5)电阻IkXI
(6)排阻103XI
(7)电位器103XI
(8)按键开关X5
⑼DS1302XI
(10)LCD1602XI
(11)DS18B20XI
(12)覆铜10X10XI
附录二:电路原理图
图(3)AltiumDesigner电路原理图
附录三:实物连线图(或pcb图)
:1308^15Oxz5838.769mH
:4448.648dy:798ZM8m3
nap:OOImiHotspotSnap(AlLayers):8mi
Jln
XOT5
O
O5
m
5
5
®
G
O
O
0
O
图(4)AltiumDesigner电路PCB图
附录四:实物照片
图(5)实物照片图
附录五:程序
ttinclude<REG51.H>
ttinclude<intrins.h>
//#include”LCD1602.h〃
//ttinclude〃DS1302.h〃
#defineuintunsignedint
#defineucharunsignedchar
sbitDS1302_CLK=Pr7;//实时时钟时钟线弓I
脚
sbitDS1302_I0=P「6;〃实时时钟数据线
引脚
sbitDS1302_RST=PT5;〃实时时钟复位线引
脚
sbitbeep=P3"4;
sbitACCO=ACC"O;
sbitACC7=ACC7
char
hide_sec,hide_min,hide_hour,hide_day,hide_zhou,hide_mon
th,hide_year,hide_m,hide_f,hide_h;
sbitSet=P20;〃模式切换键
sbitUp=P21;〃加法按钮
sbitDown=P22;〃减法按钮
sbitout=P2:3;〃立刻跳出调整模式按钮
sbitDQ=Pro;〃温度传送数据10口
sbitdd=P3"7;
chardone,count,temp,flag,up_flag,down_flag,key;
uchartemp_value;〃温度值
ucharm,f,h,mo,d,y,w,kaiguan,h=00,f=00;
ucharTempBuffer[5],zhou_value[2],nao[8];
voidnaotime();
ucharcode
tone[]={212,212,190,212,159,169,212,212,190,212,142,159
212,212,106,126,159,169,190,119,119,126,159,142,159,0);
ucharcodelon[]={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};
voiddelay(uintz)
{
uintx,y;
for(x-z;x>0;x一)
for(y=110;y>0;y--);
voidmusic()
uinti,j,k=0,m;
for(m=0;m<26;m++)
for(i=0;i<lon[k]*20;i++)
beep=~beep;
for(j=0;j<tone[k]/3;j++);
delay(10);
k++;
voidshow_time();〃液晶显示程序
/***********1602液晶显示部分子程序****************/
//Port
Definitions********************************************
ZT<*T*XIXXIXXT%
sbitLcdRs=P25;
sbitLcdRw=P2-6;
sbitLcdEn=P27
sfrDBPort=0x80;
〃P0=0x80,Pl=0x90,P2=0xA0,P3=0xB0.数据端口
//内部等待函数
sixKL*%L**X**X*vjx*Jxxlx*L**L*six*lxxlxxlz*lx*lxxlx*lxxlx*Jxxlx*lx*L**L*six*Xx
^TKXTXXjXXTSXTH✓lxXT><1X<7xXT*XT*>TXXTS✓TXX7>ZTSXT*<TSXTSXTS<Tx^TSXTS^TSXTHXT>XT><1X<1XXl>XlXXlXXTSXTS*TSXTX<T*XTS<I>XT*XTH✓TSXT*XT**J、XT*XT*^T\
vl*xl**1^>lxsL*si*xlx*lx*lxxlxxlx*Jx*X*sixslx*Jx*Jx
q、XTS*TXXTWxr*^TXXTS*7X*7XXTXXTX*TSZTH^T*^T*XT*XTSXTXXTS
unsignedcharLCDWait(void)
(
LcdRs=0;
LcdRw=l;_nop_();
LcdEn=l;_nop_();
LcdEn=O;
returnDBPort;
)
〃向LCD写入命令或数据
MXXL*XL*six*Jx*Jx*lx*X*xL*sixxlxxlz*lx*lxxlx*lxxlx*Jxxlx*lx*L**L*six*Xx*lx
^r\xTxx7^xTs✓TsXT*XTSXT*XT*xr*>Txxrs✓rxXT>ZTSXT*<TSXTSXTS<TX^TSXTSXTHXT><7X<7Xxl>XTXXTXXTSXTSXTX<r*xrs^r\XTHxp*xrs^r\✓Tsxrsxrsxr*XT*xjsxj%
xlxxlxxl*
xj>ZTS*1>
#defineLCD_COMMAND0//Command
ttdefineLCD_DATA1//Data
ttdefineLCD_CLEAR_SCREEN0x01//清屏
ttdefineLCD_HOMING0x02//光标返回原点
voidLCDJVrite(bitstyle,unsignedcharinput)
{
LcdEn=0;
LcdRs=style;
LcdRw=0;_nop_();
DBPort=input;_nop_();〃注意顺序
LcdEn=l;_nop_();〃注意顺序
LcdEn=O;_nop_();
LCILWaitO;
〃设置显示模式
vlxvlxxlzsixxlx>L**1^^L**X**x**lx*Jx*Jx*X*^L*vi**A*xL*xL**1^
^r\xTxxTs✓TsXT*XTS✓r*xr*xr*zr*zr*✓rxZTN✓TSZTS<TS<i>^rszrs<7>^7xx7xxj><7x<7xxT>xlxxlxXTSxrx<r*xrs^r\XTHxp*xrs^r\✓lx<7xXT*xjsxj%
xlxxlxxl**Jx>lx
xj>ZTS*1>XTS
#defineLCD__SHOW0x04〃显示开
#defineLCD__HIDE0x00〃显示关
#defineLCD__CURSOR0x02〃显示光标
#defineLCD__NO_CURSOR0x00〃无光标
#defineLCD_FLASH0x01〃光标闪动
#defineLCD__NO_FLASH0x00〃光标不闪动
voidLCI)_SetDisplay(unsignedcharDisplayMode)
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
//设置输入模式
Kt*KtZK1*KLZ%tzxlzxlzxL*xL*Vl>Kt*Kt*XX*XX*xlxxlxxtz*£>%£>XX*KL^KIZxl>XX^*X*XX*
XlX^T**T*>p*ZT<*T*XIX✓TXXT%>T*XTHXT*✓?*✓?**T**TX✓T^✓T^^jX✓jXXT*XT*✓TX✓TXXr*XTHXTHXIX>T*>r*✓?*>7<*TX✓T^^TX✓jXXT*ZTXXT*XT*✓TXXT*^T*XT*
xlzxlxsixxX*
**r**T**T**T*
#defineLCDACUP0x02
#defineLCDACDOWN0x00//default
#defineLCDMOVE0x01//画面可平移
#defineLCDNOMOVE0x00//default
voidLCDSetlnput(unsignedcharInputMode)
{
LCD_Write(LCD_COMMAND,0x04|InputMode);
)
初始化
Il/1|I)Ixrss<ri*s✓rxZTS<r\<r\xT>>7>xp*xrs^Tx*z«rx**<Xr%**zXr*s*xXrs*✓TxxysxysZTN^rxzlx✓r*zrs^Z£T*X*Z*1T^S*Z1T^S><!r<\*<1r<\*J**xp*xp*XTSXT*XTH*XXT*S*XXT<*<I>✓!>*x1y*s**Z»TX**x«p**x«p*><1r*\^zrLs*✓rx*z1r^s*z1r^s><!r<\*xT«>*>7>*X*xp*
xl*xlzxlxxL*^L*vl^
✓TxxT><IXZVSXTS"、XT*✓Tx
voidLCDInitial()
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2
行显示,5*7点阵
delay(1);
LCD_Write(LCD_COMMAND,0x38);
delay(1);
LCD^SetDisplay(LCD_SII0W|LCD_N0_CURS0R);〃开启显示,
无光标
LCD^Write(LCD_COMMAND,LCD_CLEAR_SCREEN);〃清屏
delay(1);
LCD_SetInput(LCD_AC_UP|LCD_N0_M0VE);〃AC递增,画
面不动
)
//液晶字符输入的位置************************
voidGotoXY(unsignedcharx,unsignedchary)
if(y==0)
LCD_Write(LCD_COMMAND,0x801x);
delay(1);
if(y==l)
LCDWrite(LCD_C0MMAND,0x801(x-0x40));
delay(l);
}
〃将字符输出到液晶显示
voidPrint(unsignedchar*str)
(
while(*str!='\0')
(
LCDWrite(LCDDATA,*str);
delay(1);
str++;
)
Avoidprintc(unsignedcharIcddata)
{
LCD_Write(LCD_DATA,lcd_data);
}*/
/***********DS1302时钟部分子程序******************/
typedefstruct_SYSTEMTIME
unsignedcharSecond;
unsignedcharMinute;
unsignedcharHour;
unsignedcharZhou;
unsignedcharDay;
unsignedcharMonth;
unsignedcharYear;
unsignedcharDateString[12];
unsignedcharTimeString[10];
}SYSTEMTIME;〃定义的时间类型
SYSTEMTIMECurrentTime;
#defineAM(X)X
ttdefinePM(X)(X+12)//转成24小时制
ttdefineDS1302_SEC0ND0x80〃时钟芯片的寄存器
位置,存放时间
ttdefineDS1302_MINUTE0x82
ttdefineDS1302_H0UR0x84
#defineDS1302_ZH0U0x8A
#defineDS1302.DAY0x86
ttdefineDS1302MONTH0x88
ttdefineDS1302YEAR0x8C
voidI)S1302InputByte(unsignedchard)〃实时时钟写入一,
字节(内部函数)
(
unsignedchari;
ACC=d;
for(i=8;i>0;i一)
(
DS1302J0=ACCO;〃相当于汇编中的RRC
DS1302_CLK=1;
DS1302_CLK=0;
ACC=ACC»1;
)
)
unsignedcharDS13020utputByte(void)〃实时时钟读取一
字节(内部函数)
unsignedchari;
for(i=8;i>0;i--)
{
ACC=ACC»1;〃相当于汇编中的RRC
ACC7=DS1302J0;
DS1302_CLK=1;
DS1302_CLK=0;
}
return(ACC);
)
voidWritel302(unsignedcharucAddr,unsignedcharucDa)
//ucAddr:DS1302地址,ucData:要写的数据
{
I)S1302.._RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr);//地址,命令
DS1302InputByte(ucDa);//写IByte数据
I)S1302_CLK=1;
DS1302_RST=0;
}
unsignedcharReadl302(unsignedcharucAddr)〃读取
DS1302某地址的数据
(
unsignedcharucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr10x01);//地址,命令
ucData=DS13020utputByte();//读IByte数据
I)S1302_CLK=1;
DS1302_RST=0;
return(ucData);
voidDS1302_GetTime(SYSTEMTIME*Time)〃获取时钟芯片的
时钟数据到自定义的结构型数组
unsignedcharReadValue;
ReadValue=Readl302(DS1302_SEC0ND);
Time->Second=((ReadValue&0x70)»4)*10+
(ReadValue&OxOF);
ReadValue=Readl302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)»4)*10+
(ReadValue&OxOF);
ReadValue=Read1302(DS1302_H0UR);
Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);
ReadValue=Read1302(DS1302_DAY);
Time->Day=((ReadValue&0x70)»4)*10+(ReadValue&OxOF);
ReadValue=Read1302(DS1302_ZH0U);
Time->Zhou=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);
ReadValue=Read1302(DS1302_M0NTH);
Time->Month=((ReadValue&0x70)»4)*10+
(ReadValue&OxOF);
ReadValue=Readl302(DS1302_YEAR);
Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&OxOF);
)
voidDateToStr(SYSTEMTIME*Time)〃将时间年,月,日,星
期数据转换成液晶显示字符串,放到数组里DateString[]
{if(hide_year<2)〃这里的if,else语
句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为
2007/07/22
(
Time->DateString[O]='2';
Time->DateString[l]='O';
Time->DateString[2]=Time->Year/10+'O';
Time->DateString[3]=Time->Year%10+'O';
)
else
Time->DateString[O]=
Time->DateString[1]=
Time->DateString[2]=
Time->DateString[3]=
Time->DateString[4]=';
if(hide_month<2)
(
Time->DateString[5]=Time->Month/10+'O';
Time->DateString[6]=Time->Month%10+'O';
)
else
Time->DateString[5]=
Time->DateString[6]=
)
Time->DateString[7]=',;
if(hide_day<2)
{
Time->DateString[8]=Time->Day/10+'O';
Time->DateString[9]=Time->Day%10+'O';
Time->DateString[10]='';
Time->DateString[l1]='';
}
else
(
Time->DateString[8]='';
Time->DateString[9]='';
Time->DateString[10]=';
Time->DateString[l1]='';
}
if(hide_zhou<2)
zhou_value[0]=Time->Zhou%10+'O';〃星期的数据另外放
到zhou_value□数组里,跟年,月,日的分开存放,因为等一下要
在最后显示
)
else
(
zhou_value[0]='';
)
zhouvalue[1]='\0';
Time->DateString[10]='\0';〃字符串末尾加'\0',判断结
束字符
)
voidTimeToStr(SYSTEMTIME*Time)〃将时,分,秒数据转换成
液晶显示字符放到数组TimeString[];
if(hide_hour<2)
Time->TimeString[O]=Time->Hour/10+'O';
Time->TimeString[1]Time->Hour%10+'O';
)
else
{
Time->TimeString[0]=
Time->TimeString[l]=
)
Time->TimeString[2]=
if(hide_min<2)
Time->TimeString[3]Time->Minute/10+'O';
Time->TimeString[4]=Time->Minute%10+'O';
else
Time->TimeString[3]=
Time->TimeString[4]=
}
Time->TimeString[5]=
if(hide_sec<2)
Time->TimeString[6]=Time->Second/10+'O';
Time->TimeString[7]=Time->Second%10+'O';
Time->TimeString[8]='';
else
{
Time->TimeString[6]=
Time->TimeString[7]=
Time->TimeString[8]=
)
Time->DateString[9]='\0';
}
voidbaoshi(SYSTEMTIME*Time)
{
if(Time->Hour<22&&Tinie->Hour>8&&Time->Minute/10==0&&Tini
e->Minute%10==0&&Time->Second/10==0&&Time->Second%10==0
)
music();
}
voidnaozhong(SYSTEMTIME*Time)
if(Time->Minute%10=(f%10)&&Time->Minute/10==(f/10)&&Ti
me->Hour%10—(h%10)&&Time->Hour/10=(h/10)&&Time->Secon
d%10==(m%
10)&&Time->Second/10==(m/10))
music();
voidInitial_DS1302(void)〃时钟芯片初始化
unsignedcharSecond=Readl302(DS1302_SEC0ND);
if(Second&0x80)〃判断时钟芯片是否关闭
{
Writel302(0x8e,0x00);〃写入允许
Writel302(0x8c,0x07);〃以下写入初始化时间日
期:07/07/25.星期:3.时间:23:59:55
Writel302(0x88,0x07);
Writel302(0x86,0x25);
Writel302(0x8a,0x07);
Writel302(0x84,0x23);
Writel302(0x82,0x59);
Writel302(0x80,0x55);
Writel302(0x8e,0x80);〃禁止写入
/***********dsl8b20延迟子函数(晶振12MHz)*******/
voiddelay18B20(unsignedinti)
while(i一);
voidInitDS18B20(void)
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(8);〃稍做延时
DQ=0;〃单片机将DQ拉低
delay_18B20(80);〃精确延时大于480us
DQ=1;〃拉高总线
delay_18B20(14);
x=DQ;〃稍做延时后如果x=0则初始化成功x=l
则初始化失败
delay」8B20(20);
unsignedcharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i一一)
DQ=0;//给脉冲信号
dat>>=l;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
return(dat);
)
/*************dsl8b20写~1个字节****************/
voidWriteOneChar(uchardat)
unsignedchari=0;
for(i=8;i>0;i一)
DQ=0;
DQ=dat&OxOl;
delay_18B20(5);
DQ=1;
dat>>=l;
)
}
/**************读取dsl8b20当前温度************/
voidReadTemp(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
IniOS18B200;
WriteOneChar(OxCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18B20(100);//thismessageisweryimportant
IniOS18B20();
WriteOneChar(OxCC);〃跳过读序号列号的操作
WriteOneChar(OxBE);〃读取温度寄存器等(共可读9个寄存
器)前两个就是温度
delay_18620(100);
a=ReadOneChar();〃读取温度值低位
b=ReadOneChar();〃读取温度值高位
temp_value=b<<4;
temp_value+=(a&OxfO)>>4;
)
voidtemp_to_str()〃温度数据转换成液晶字符显示
(
TempBuffer[0]=temp_value/10+,0);〃十位
TempBuffer[l]=temp_value%10+,0);〃个位
TempBuffer[2]=Oxdf;〃温度符号
TempBuffer[3]=,C);
TempBuffer[4]=,\0);
voidnaoz()
if(hide_h<2)
nao[0]=h/10+,O';
nao[l]=h%10+,O';
}
else
{
nao[0]=,';
nao[l]=,,;
)
nao[2]=':';
if(hide_f<2)
(
nao[3]=f/10+,O';
nao[4]=f%10+,O';
else
nao[3]=,,;
nao[4]=',;
}
nao[5]=,:';
if(hide_m<2)
{
nao[6]=m/10+,O';
nao[7]=m%10+,O';
}
else
(
nao[6]='';
nao[7]=,,;
)
nao[8]='\0';
voidDelaylms(unsignedintcou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026西南医科大学附属自贡医院自贡市精神卫生中心第一批编外人员招聘11人备考题库(四川)及参考答案详解1套
- 2026锦泰财产保险股份有限公司陕西分公司招聘支公司经理等岗位32人备考题库及参考答案详解一套
- 2026锦泰财产保险股份有限公司陕西分公司招聘支公司经理等岗位32人备考题库附答案详解(完整版)
- 2026锦泰财产保险股份有限公司陕西分公司招聘支公司经理等岗位32人备考题库含答案详解(满分必刷)
- 2026北京理工大学事业编制相关岗位招聘备考题库及答案详解【历年真题】
- 2026上海市闵行区华漕学校教师第二批招聘备考题库附完整答案详解(名师系列)
- 2026天津立度资产经营管理有限责任公司社会招聘工作人员1人备考题库附答案详解【预热题】
- 2026河北邯郸幼儿师范高等专科学校春季博硕人才选聘26人备考题库附参考答案详解(典型题)
- 2026上海三毛保安服务有限公司招聘217人备考题库附参考答案详解(轻巧夺冠)
- 2026松原吉林油田医院招聘38人备考题库及答案详解【全优】
- 代付土地使用税协议书
- 生猪屠宰厂可行性方案
- 金羽年产150mwh高能量密度金属锂电池、15mwh水系锌离子电池生产线项目环境影响报告
- 景区旅游经营预测研究报告
- JB-T 14179-2022 带式输送机用托辊冲压轴承座
- 产褥期母婴的护理-产褥期妇女的生理变化(妇产科护理学课件)
- 四川省高等教育自学考试毕业生登记表【模板】
- 《城市轨道交通票务管理》课程标准
- 健康管理师资料:健康管理概论
- 泌尿男生殖系统其他疾病
- 机电设备及管道安装施工方案
评论
0/150
提交评论