版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
闹钟(定时)+温度.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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省赣州市南康区重点中学2024年中考一模数学试题含解析
- 氧气知识培训复习测试卷附答案
- 污水处理厂工程投标方案(技术方案)
- 人教部编版选择性必修下册《第10课 兰亭集序 归去来兮辞并序》2024年同步练习
- 样板房装修工程施工组织设计
- 冀教版英语八年级上32课-幻灯片
- 高中历史-综合探究:伏尔泰对英国政体的评价-课件1(23张)-岳麓版必修1
- 人教部编版九年级历史上册第21课马克思主义的诞生和国际工人运动的兴起课件共26张
- 人教版五年级语文下册课件:语文第五组第18课将相和课件(30张)
- 北京市156中学2022年物理高一第二学期期末统考试题含解析
- 定期排污扩容器技术说明书
- 网店经营合作合同协议范本模板 三方
- 配位化学:超分子配位化合物
- 07FK02防空地下室通风设备安装PDF高清图集
- 通用航空项目商业计划书(模板范文)
- 我的家乡——宣威-ppt课件
- 部编版五年级上册语文全册近义词反义词
- 松下PLC基本指令
- 新编日语第一册教案
- 2020高中历史《中外历史纲要》下册第8单元20世纪下半叶世界的新变化第20课社会主义国家的发展与变化
- 抗菌药物备案
评论
0/150
提交评论