闹钟(定时)温度_第1页
闹钟(定时)温度_第2页
闹钟(定时)温度_第3页
闹钟(定时)温度_第4页
闹钟(定时)温度_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

闹钟(定时)+温度.c

/vizvl*KIZxl*xlx*Jzxl*%fz*Jzxl*viz*1**1*%fz*X*vl*KIZxl*xlx*1*xl**lzxl**1**1**1**lzxl**1*vl**1**lx*1*vl**lzxlzvizxfxK1**1*xlz*lz*1*

/xT^*7%"、*T%XTHXTX*TX*TX*TX^TXXJ%^TX*TX^7%xj、*TxxT>*7**T*zT**7**T**T**7*xr%xj%xr^^Tx*TX^7%xj、*TxxT>"、*Tx*7%*T^*Tx*7*xr**Tx*TXXTX*T%*7%*7%*7**T**T*

xl**AxKIZ、|Xxl*vfx*JxK£X、|X

xT%xT>*y*"、*Tx^TxXTXxjxXTX

*文件名:时钟DS1302LCD.c

*描述:该文件实现用DS1302来实现日历和时钟功能,液晶

1602上显示出来。

*创建人:东流,2009年4月10日

*版本号:2.0

*lx*1**1**1**1**1**1**1**1**1**1**1**1**1**1*KIX*fz*1*K1**£**1**lz*1**1**£**1**1**1**1**Jx*A**1*K£**1**1**1*xf**1**1**1**1**1**lz*£*

*T**T*xp*xT%XTNxy*xTxxrsyjxxTx>TN*THxj、xy*xTxxy*xT%*7^xjxxT%XTN^T>XTXxrsyjxxTx>TNXTXxj、*T^*JX>TXXT**TX*TXXTXXTX^TXZT**TXXT^*TXXT*XTXZTX

*£**£**1**lz*£**1**1**1**1**>1**1*/

^7%xr%^Tx✓rs*TszT^XTs*T^*Tx/

#include<reg52.h>

#include<intrins.h>

#defineucharunsignedchar//无符号字符0-255

#defineuintunsignedint〃无符号整型0-65535

ttdefineCYCLE100x698//1688us

ftdefineCYCLE_1_50x9E4//2532

ftdefineCYCLE_2_00xD30//3376us

ftdefineTH_CYCLE_1_O(CYCLE_1_O»8)

ttdefineTH_CYCLE_1_5(CYCLE_1_5»8)

ttdefineTH_CYCLE_2_0(CYCLE_2.0»8)

//用于解码的变量

unsignedintSAA3010RecvCode=0;//保存解码数值(1

个控制位5个地址位6个命令位)

unsignedcharSAA3010BitCount=0;//记录已经解码的

位数

unsignedcharSAA3010State=0;//初始状态

sbitrelayout0=Pl0

sbitrelayout1=Pl"1

sbitrelayout2=Pl2

sbitrelayout3=P13;

sbitrelayout4=P1'4;

charcodeTab[16]=?/0123456789ABCDEF,z;

sbitACCO=ACC'O;

sbitACC7=ACC"7;

sbitP3_2=P3c2;

sbitP3_4=P3"4;

sbitT_CLK=Pr6;/*实时时钟时钟线引脚*/

sbitT_I0=P3"5;/*实时时钟数据线引脚*/

sbitT_RST=P17/*实时时钟复位线引脚*/

sbitAddKey=P3"6;〃加1键,SI

sbitDec_Key=P3"7;〃减1键,S2

sbit0K_Key=P2"0;〃确定键,S3

sbitBell_0ut=P2八1;〃闹钟管脚输出。低电平有效

sbitDQ=P2'3;//dsl820data

〃这三个引脚参考资料

sbitE=P2c7;〃:1602使能引脚

sbitRW=P2c6;〃1602读写引脚

sbitRS=P2"5;〃1602数据/命令选择引脚

bit

flag,secs=0,mins=0,hours=0,years=0,mons=0,days=0,weeks=0;

〃闪烁标志位

bitBell_Swh,Hourb,Minb,Secb,Kgb;〃闹钟调时闪烁标志位

bitflag_min=0,flag_sec=0;〃整点报警标志位

unsignedcharid,id2,d,e,S1302,H_1302,SBell;//id

为第儿个调整对象,

ucharsec,min,hour,day,month,year,week;

/*1**1**1^*■!**■!**1**1*KIXvl*xl**1**1**1*%lz*1**1**1**£**1**1**1**1**1**1**1**1**1**1**1**1**1*vl**A**1**1**1**1**lz*1*

/zT*xTxXT%xj、xTxxTxxTxxT%xTxxT%xpsxTx*TXXT*xp**TxXT*xTx*TXxT%xT%xT%xrx*TS*Tx^TxxT%xT%xT%*TxzT**T*xTxxTx*7%*T*ZT^*TxxT^zTx*T*XT*xT^^TxxT^zTxXT*xr^*7%*T*

**/

//函数声明

voiddelay();

voidDelayl(intnum);〃延时函数

ucharbcdtodec(ucharbed);

ucharConvert(ucharInDate);〃形参主函数付的值

uchardectobcd(uchardec);

voidDisp(void);〃显示和闪烁函数

voidenable(uchardel);

voidid_casel_key(void);//id为1时的下一级选择

voidL1602_char(ucharhang,ucharlie,charsign);

voidL1602_init(void);

voidL1602_string(ucharhang,ucharlie,uchar*p);

voidRunDS1302(void);

ucharuc_RTOutputByte(void);

voidv_BurstR1302R(uchar*pReDa);

voidv_BurstR1302T(uchar*pSecDa);

voidv_BurstW1302R(uchar*pReDa);

voidv_BurstW1302T(uchar*pSecDa);

voidv_Getl302(ucharucCurtime口);

voidv_RTInputByte(ucharucDa);

voidv_Setl302(uchar*pSecDa);

voidv_W1302(ucharucAddr,ucharucDa);

voidwrite(uchardel);

voidWrite_DS1302Init(void);

voidDelay2(unsignedintt);//

voidDisp2(void);〃显示和闪烁函数

voidid_case2_key(void);//id2为1时的下一级选择

voidSet_Bell(unsignedcharsei,bitsel_l);//根据选择调整相

应项目并写入

unsignedintReadTemperature(void);//读取温度

voidInit_DS18B20(void);〃初始化dsl820

unsignedcharReadOneChar(void);〃温度读一个字节

voidWriteOneChar(unsignedchardat);//温度写一个字节

voidDelayUs(unsignedcharus);//us延时

voidDelayMs(unsignedcharms);//Ms延时

/xL*xtxxtxKI*xL*vizxlxxlzsixxlxxL**1*sixxtxxl*sixxl>xlxsL*xtx\L*xlxxfx*1*xlxxlxsixxfxxfxsixxlx

/<T^XTSXTXXIXXTXZT*yTX»»TX✓TXJ、XTXZTXXT*XTXXTXXTXZTSXTXZT*XTXXTXXTSXT^✓IXZTXXT*XTXXTSXTS✓JXyT**T*XIX✓JSZTXXTXXTXXTXZTSXT^^TSZTXXJXXT*XT^XTSXTXXTXXTXXISZTX

*1<*X**1<*lx*A*six

xp*XTXxjxZTX✓JX

*名称:delay()

*功能:延时,延时时间大概为140USo

*输入:无

*输出:无

*1**Jxxl**1>xlxxlxxlzxlzxl**lx*2**Jxsi*xlzxlxxlxxlz*Azxl**lx*2**Jxsi*xlzxlxxlxxlz*Azxl**lx*2**Jxsi*

XTHXTX*TS*TXXT*XV*XjXZTSXTX✓IXZ|>XTSXT*XTXXTXXTXXT**T**T>XT*XTXXjX<TXZT>XTXXp*XJXXTSZTXXTXXTXXTSXTX✓TXXT*XTXXT>XTXXT**TXXTXXT^XTSXTX*T*^T\XTXZ7SXTXXTXZTSXTXXT>XTX

*Jxvjxxlzxlxxl>xlzxtxxlzxjx/

XT^XIXXJSXTN*T*XT*XTSXT*XTXZTXZ7S/

voiddelay()〃void为函数类型,说明返回数值的类型,要返回就

要有return,如不,则void

{

inti,j;

for(i=0;i<=10;i++)

for(j=0;j<=2;j++)

)

/*1**£**lz*1**1**1**1**lz*1**lx%lz*1**lx*1**1*vl**1**Jx*A**1**1**1**1**1**1**1**1**1**1**1**1**1**1*vl**Jx*A**1**1**1**1**lz*1*

/*T**7**TxxTx*TxxTs*Ts*T*xrx*TXxT%xpsxTxxr%xTxxTxxj、xT^xTxxTxxTxxj、xp*xj、xT%xr%*7*zTx*T*xr*xT^^TxxT^zTxxTxxTx*Tx*rx*7%*Txxrx*rs*Tx*7%xr%xT%xT%xTxxTszT**T*xT**7%

*JxxlxKJX*txxL*\tx*A*、Jx\tx*J>xtxxl*\!>xlx*1>xlx*lx/

XTXX|HZTXXTXZT*XT*XT**T»✓JXZ7XXj^*T*XTXXj^*T**T*XT*»*TS*TXXT*/

voidDelayl(intnum)〃延时函数

{

while(num一);

/*1**£**1**1**1**1**1**£**1**1*xfz*1**1*viz*1**1**1**1**1**X**1**1**1**£**lz*X*vl*KIZ*1**L**1**1**1**1**1**£**1**1**1**1**1**Xz*1*KIZ*1**1**1**!**!**!**1*

/*T**T**T**qx^TxrfTXxTx*7%xTx*y*^T*XT*xp**Tx^T*ZT**TxxT%*TX*TX^TxxTx^Tx*TXzT*zTx*7*XT**TxxT%*7*XTs*Tx*jx*T*XT^xTxxT%*TxXTsxTszT%xTxxT%*TXxTxZTX*T*

*******/

voidDelay2(unsignedintt)//

unsignedinti,j;

for(i=0;i<t;i++)

for(j=0;j<10;j++);

/*1**1*si*xlz*1**X**1**1**1**1X*1Zvl*vl**X**lz*lz*1**1**1*xl**X**lzvl**1*xlz*lz*1**1>*1Z*1**lz*X**Jx*lzvl**1*si*xlz*lz*1**1**1*xl**X*

/*T**Tx*T>*T%xjsq、*TxxTxxTxxT^^TxxTx*T%*7^*rxxT^*T%xT%*Tx*T**7**T**7%*T^*Tx*7*xr**Tx*TXXTX*T%*7%xT%*7**TxxT^^Tx*T%zTx*Tx^7%zr**T**7**jx^7%xj、*TxxT>*7*

*X**1**1**1**1**X**1**1*/

xT*zTx*TsZTX*T*/

voidDelayUs(unsignedcharus);//us延时

voidDelayMs(unsignedcharms);//Ms延时

/xlzxlz*A*xl>*Jxxlzxlz*A**Jxxlzxjxxlzxlzxlx*lx*A>>Jx*1^xlz*A*xl>*1>xlzxlzxlx*lxsixxjxxlzxlzxlx*lx*A>>Jxvjxxlz*A*xl>*Jxxlzxlzxlx*lxsixxjxxlzxlzxlxxlz*A>>Jxvjxsl>*A*xl>*1>xlzxlz

/XTSXTHZTXXJXXTSXTSXTXXTX✓JSXTXXTXXTXXJXXTXXTX*THXJXXTSXTSXTXXTSXTXXTXXTXXIS*TXXT**TXXjXXjXXISXIXXJXXTSXTSXTXXTX✓JSXTX*THXTSZT**T*XJX*T*XTXXIXXTXXTS

*1**X**1**A**1**1**1**1**1*/

XT%xTxxTxxTxxTxXT%xj、xTx*Tx*7*/

voidDelayUs(unsignedcharus)//us延时

unsignedcharuscnt;

uscnt=us>>l;/*Crystalfrequencyin12MHz*/

while(一uscnt);

/slz*Azxl**1>xlxxlxxlzxlzxl**lxxl>*2**Jxsi*xlzxlxxlxxlz*Azxl**lxxl>*2**Jx*L*si*%1>xlzxlxxlxxlz*Azxl**lxxl>*2**Jxsi*

/ZTSXTXXTXXT*XV*XjXZTSXTX✓IXZ|>XTSXT*XTXXT^XTX**jxXTXXT**T**T>XT*XTXXjX<TXZT>XTXXp*XJXXTSZTXXTX**jxXTXXTSXTX✓TXXT*XTXXT>XTXXT**TXXTXXT^XTSXTX*TH*T*✓JSXTXZ7SXTXXTXZTSXTXXT>XTX

*1**1**1**1**1*/

*rxzTx*j**T*/

voidDelayMs(unsignedcharms)//Ms延时

while(一ms)

DelayUs(250);

DelayUs(250);

DelayUs(250);

DelayUs(250);

)

/*1*xl**1^xl*sixvlx*1*xl*vl**1**1**1**1**1**1**1**1**1**1**1**1*

/«、*y*«、xjxxT%xT%zTx✓TxxTxxj、zTxxT^*TxXT%zTxxT*XT*ZTXXT**7%*T^xTvxTs*7%xTxzTxxT*zT^

xlxxlx*X**1**1**lx*1**1*/

xTxxp*xj、xp*xTxxT%xj、xTxxTx/

voidSAA3010ProcessCommand(intremotecode)//红外处理命令

unsignedcharbuffer[3];

buffer[0]0x80;

buffer[1](unsignedchar)((remotecode>>8)&OxFF);

buffer[2](unsignedchar)(remotecode&OxFF);

if(buffer[2]==0x04)relayout4=""relayout4;

if(buffer[2]==0x03)relayout3=^relayout3;

if(buffer[2]==0x02)relayout2=~relayout2;

if(buffer[2]==0x01)relayoutl=~relayoutl;

if(buffer[2]==0x0c)relayout0=^relayout0;

DelayMs(1000);

/slzxl*xlxxlxxlzxlzxl**lxxl>*2**Jx*L*si*%1>xlzxlxxlxxlz*Azxl**lxxl>*2**Jx*L*xlz*1>si*%1>xlzxlxxlxxlz*Azxl**lxxl>*2**Jx*L*si*

/ZTSXTXXTSXT*XV*XjXZTSXTX✓IXZ|>XTSXT*XV*XTSXT**T*XTXXTSXTXZT*XTXXTXX7>ZTXZT>XTXXTXXT^XTSXTX*TH*T*✓JSXTXZ7SXTXXT*XTXXTXX7>ZTXZT>XTXXTXXTXXTS*TSXT**T*XTXXTSXTXZT*XTXXT^XJX^TX

秘***/

voidSAA3010Init()//初始化中断及定时器

{

EA=1;

TMOD=0x10;//T1工作于方式1,即16位定时器

ET1=1;//关定时器。中断允许

TRI=1;//关闭定时器

TH1=0;

TL1=0;

//外部中断源INTO

EX1=1;〃允许外部中断源INTI

PX1=1;//外部中断源为高优先级

IT1=1;//边缘触发

SAA3010BitCount=0;

SAA301ORecvCode=0;

SAA3010State=0;

[51c51c51c51c^|c^|c^|c51c51c51cx|c^|c^|c^|c^|c^c^|c^|c^c^|c^|c^|c^|cx|c^|c^|c^Cx|c^|c^|c^|c^|c^|c^c^|c^|c51c51cx|c^|c^|c^|c^Cx|CxjC^|c

*******/

voidSAA3010Timerl(void)interrupt3//定时器T1的中断处理函

//出现了超时

if(SAA3010BitCount==13)

if(SAA3010State==1||//1,1

SAA3010State==2)//0,1

SAA3010BitCount++;

SAA3010RecvCodeSAA3010RecvCode<<1;

SAA3010RecvCodeSAA3010RecvCode+1;

}

//检查是否有合理数据

if(SAA3010BitCount==14)

(

//停止中断0

EXI=0;

//处理遥控命令

SAA3010ProcessCommand((^SAA3010RecvCode)&OxOFFF);

//重新初始化初始化

SAA3010BitCount=0;

SAA3010State=0;

//启用中断

EXI=1;

*****/

voidSAA3010Intl(void)interrupt2//外部中断1的处理函数

〃保存计数器的高位,作为判断周期长短的依据

unsignedcharHighTick=TH1;

//重置计数器

TH1=O;TL1=O;TR1=1;ET1=1;

//状态转移图

switch(SAA3010State)

(

case0://第一个起始位

SAA3010State=2;

SAA3010BitCount=1;

SAA3010RecvCode=0;

break;

case1://状态1

if(HighTick==TH_CYCLE_1_O)//S1->S1

SAA3010State=1;

SAA3010BitCount++;

SAA301ORecvCode=SAA3010RecvCode<<1;

SAA3010RecvCode=SAA3010RecvCode+1;

elseif(HighTick==TH_CYCLE_1_5)//S1->S2(1,1,0)

SAA3010State=2;

SAA3010BitCount=SAA3010BitCount+2;

SAA3010RecvCode=SAA3010RecvCode<<1;

SAA3010RecvCode=SAA30lORecvCode+1;

SAA3010RecvCode=SAA3010RecvCode<<1;

else//错误状态

{

SAA3010BitCount=0;

SAA3010State=0;

)

break;

case2://状态2

if(HighTick==TH_CYCLE_1_O)//S2->S2

SAA3010State=2;

SAA3010BitCount++;

SAA301ORecvCode=SAA30lORecvCode<<1;

}

elseif(HighTick==TH_CYCLE_1_5)//S2->S1

SAA3010State=1;

SAA3010BitCount++;

SAA30lORecvCode=SAA30lORecvCode<<1;

SAA3010RecvCode=SAA3010RecvCode+1;

elseif(HighTick==TH_CYCLE_2_0)//S2->S2

//0->l->0

SAA3010State=2;

SAA3010BitCount=SAA3010BitCount+2;

SAA3010RecvCode=SAA30lORecvCode<<1;

SAA3010RecvCode=SAA3010RecvCode+1;

SAA3010RecvCode=SAA30lORecvCode«1;

else//错误状态

SAA3010BitCount0;

SAA3010State=0;

break;

)

/viz*1*xl**1**£**1**£*vizviz*1*

/*7*xTxxTxxTxxp*xTxxTxxTxxT^xTxxT*xTx*TxxT%xrsxTxxTxxTxXT*zrs*7^xTx^7*xT*xTx*7^xTx

voidBeep(void)//BELL峰明器发声,整点报警

BellOut=0;

Delayl(6000);//50ms

Bell_Out=1;

Delayl(6000);//50ms

/xlx*AxxL*sixxl**Azxlx*Jxxt>xlxsL**1>*L*sl>xtx*1*xl**Jxxtxxl>*1>*Jx*JxxlxsL**L*si*xtx\L**1*xlz*J>*1>*Jxsixxfx*1*xlxxlxsix*J>xlx*J>xfxxl>*1*xfxsixsix*Jzxlx

/ZTSZJSZTX*T*XTXXJXXTXXTX✓Tx•(TXXTXJ、XV**T**T*XTSXTSXV**T**T*XIXXTXZTXXT***TXXTSXTX✓TX<TXXJXXTXXTXXTSXTXXTXXJXXVXXTSZT^XTXXT*XTXXTSXT^*TSZTX*7XXTXXT*XTSXTXXTX*7SXTXXTSZT^

*£**£**1**1**1**X**1**1**1**A**£**A**£**!**£**1**1**1**1*/

*T^x7^xT^zTxzT^xTx*T%xTx*7*zTxxT^*jx*7%zTxxT*/

voidBellnow(void)

Bell_0ut=0;

Delayl(31250);//for250ms

Bell_0ut=1;

Delayl(6350);//50ms

BellOut=0;

Delayl(18750);//150ms

Bell_0ut=1;

Delayl(50000);//400ms

/*1*xlz*1**1*vl**X**lz*1**1**1**1*xlz*1Z*1Z*1*vl**lzxlz*lz*1**1**1Z

/zr**T**Tx*T>*T%xjsq、xTxxTxxT^^TxxT%XT%(、xT%xj、xT>*7**T*zT**7**T**T**7*xr%xj%xr^^Tx*TX^7%xj、*TxxT>"、*T%xT*^Tx*T%zTx*Tx^7%zr**T**7**jx*rxxT^*T%xT%*7**TxxT^

*X**1**1**1**1**1**1**1**1**1**1**1**1**X**1**X*/

xT%xp»xjx*Tx*TX^TxrfTXxTx>7^XT^xTxxT%zTx*7**T%*T**T**T*/

voidWriteOneChar(unsignedchardat)//温度写—"b字节

unsignedchari=0;

for(i=8;i>0;i一)

(

DQ=0;

DQ=dat&OxOl;

Delayl(5);

DQ=1;

dat>>=l;

/sixxtxsixxlzvt*xtxxl*xlzxt>xtz*A*KL**J>xtxsixxlzsixxl>*1*xtxxlx*Az*1*si*\tz*1>*Jxxlxxlxxtzsix*L**1>xtxxlx*Az*1*si*\tz*L*^lzxl**lz*1>

/ZTSZT*XTXZT*XT*XT**T»XTXZ7XXj^*T*XTXXj^ZT*X7XXp**T»XTXZTXyT*XT*XT*XTX*T**TXXV*XT>XTX*TXXTXZTHXjX»»T>XjxXTX<TXXT*XTSXTSXTX✓ISXTXXT^✓ISXTH✓JXXTXXTHXTV»»TS*T»XTXXTSXTX*TXXTSXTX

*L**J>*Axxl>*A>xl>xlxslzxlxsix*lxxlxxlzxl>sixxlzsixslz/

*TXXTX*T*XTXXIXXTXXJXXTXXTXXTXXT*XTXXT*ZTS<TSXTS^TWXTX/

unsignedcharReadOneChar(void)〃温度读一个字节

unsignedchari=0;

unsignedchardat=0;

for(i=8;i>0;i一)

DQ=0;//给脉冲信号

dat>>=l;

DQ=1;//给脉冲信号

if(DQ)

dat|=0x80;

Delayl(4);

return(dat);

)

/slz*Azxl**1>xlxxlxxlzxlzxl**lxxl>*2**Jx*L*si*%1>xlzxlxxlxxlz*Azxl**lxxl>*2**Jx*L*si*%1>xlzxlxxlxxlz*Azxl**lxxl>*2**Jx*L*

温馨提示

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

评论

0/150

提交评论