📄 ds1302.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define _Nop(); _nop_()
#include <stdio.h>
#include <absacc.h>
//sfr WDT = 0xA6;
sbit xd=P2^7;
sbit pd=P1^3;
uchar xsd;
uchar pp;
uchar code xs[]={0x3f,0x3,0x6d,0x67,0x53,0x76,0x7e,0x23,0x7f,0x77,0x7b,0x5e,0x3c,0x27,0x7c,0x78};//显示百位表格
uchar ucCurtime[7]; //读时间
uchar writ1302[7]; //设置时间
uchar time[12];
uchar hc138;
uchar t138;
uchar Scrtp[2]; //读出温度高&低字节
///////////////////////////////////////////
uchar miaoh,miaol;
uchar fenh,fenl;
uchar hourh,hourl;
uchar hao,hao1;
uchar yue,yue1;
uchar xiqi,xiqi1;
uchar ni,ni1;
uchar Keytemp0; //按键缓冲0
uchar Keytemp1; //按键缓冲1
uchar Menu;
uchar music[4];
uchar clockh,clockl;
ulong temp; //读出的温度
uchar Xsb; //显示百位缓冲
uchar Xss; //显示十位缓冲
uchar Xsg; //显示个位缓冲
//////////////////////////////////////////////
sbit T_CLK = P1^6; /*实时时钟时钟线引脚 */
sbit T_IO = P1^5; /*实时时钟数据线引脚 */
sbit T_RST = P1^4; /*实时时钟复位线引脚 */
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit scl=P3^6; //24c02clok
sbit sda=P3^7; //24c02dat
sbit bit1=P0^0;
sbit bit2=P0^1;
sbit bit3=P0^2;
sbit bit4=P0^3;
sbit bit5=P0^4;
sbit bit6=P0^5;
sbit bit7=P0^6;
sbit bit8=P0^7;
sbit bit9=P2^0;
sbit bit10=P2^1;
sbit bit11=P2^2;
sbit bit12=P2^3;
sbit bit13=P2^4;
sbit bit14=P2^5;
sbit bit15=P2^6;
sbit bit16=P2^7;
sbit bit17=P3^2;
sbit bit18=P3^3;
sbit bit19=P3^4;
//////////////////////////////////////////////////////////////////////////////////////////////////
sbit dat595=P3^0;
sbit clk595=P3^1;
sbit crk595=P1^7;
sbit DQ=P3^5; //数据采样
sbit Mu=P2^4; //功能键
sbit Up=P2^6; //上
sbit Dn=P2^5; //下
bit ds1820bit; //初始化失败
bit T0bit0; //T0750ms时间到了标志0
bit T0bit1; //有否发转换命令标志
bit Keybit0; //有否按标志
bit Keybit1; //有否按三下志
bit Keybit2; //键有否放开过充许标志
bit negbit; //显示负号位判断
bit negbit0; //负温实测
bit xsbit; //为1显示设置
/////////////////////////////////////////////////////////////////
w595(uchar ddat) ////////////////////送595子程序/////////////////////////
{
uchar i;
ACC = ddat;
for(i=8; i>0; i--)
{
dat595 = ACC0;
clk595 = 0;
_nop_();
clk595 = 1;
ACC = ACC >> 1;
}
crk595=0;
crk595=1;
}
////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
/*Delay*/
void delay1(uchar wt) //Delay 6.5us
{while(wt--!=0);}
void delay(uint x) //Delay 1ms
{uchar j;
while(x--)
{
for(j=0;j<125;j++)
{;}
}
}
////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////24c02////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
void x24c02_init()
{
scl=1; _Nop(); sda=1; _Nop();
}
void start()
{
sda=1; _Nop(); scl=1; _Nop(); sda=0; _Nop(); scl=0; _Nop();
}
void stop()
{
sda=0; _Nop(); scl=1; _Nop(); sda=1; _Nop();
}
void writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1; scl=0; _Nop(); sda=CY; _Nop(); scl=1; _Nop();
}
scl=0; _Nop(); sda=1; _Nop();
}
uchar readx()
{
uchar i,j,k=0;
scl=0; _Nop(); sda=1;
for (i=0;i<8;i++){
_Nop(); scl=1; _Nop();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j; scl=0;
}
_Nop(); return(k);
}
void clock()
{
uchar i=0;
scl=1; _Nop();
while ((sda==1)&&(i<255))i++;
scl=0; _Nop();
}
uchar x24c02_read(uchar address)
{
uchar i;
start(); writex(0xa0);
clock(); writex(address);
clock(); start();
writex(0xa1); clock();
i=readx(); stop();
delay1(255);
return(i);
}
void x24c02_write(uchar address,uchar info)
{
//EA=0;
start(); writex(0xa0);
clock(); writex(address);
clock(); writex(info);
clock(); stop();
//EA=1;
delay1(255);
}
//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////显示程序/////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
show()
{ if(!Keybit1)
{
if(hourh)
{
w595(xs[hourh]);
bit1=0;
delay(1);
bit1=1;
}
w595(xs[hourl]);
bit2=0;
delay(1);
bit2=1;
if(fenh)
{
w595(xs[fenh]);
bit3=0;
delay(1);
bit3=1;
}
w595(xs[fenl]);
bit4=0;
delay(1);
bit4=1;
if(miaoh)
{
w595(xs[miaoh]);
bit5=0;
delay(1);
bit5=1;
}
w595(xs[miaol]);
bit6=0;
delay(1);
bit6=1;
w595(xs[ni]);
bit7=0;
delay(1);
bit7=1;
w595(xs[ni1]);
bit8=0;
delay(1);
bit8=1;
////////////////////////////////////
if(yue)
{
w595(xs[yue]);
bit9=0;
delay(1);
bit9=1;
}
w595(xs[yue1]);
bit10=0;
delay(1);
bit10=1;
if(hao)
{
w595(xs[hao]);
bit11=0;
delay(1);
bit11=1;
}
w595(xs[hao1]);
bit12=0;
delay(1);
bit12=1;
if(xiqi==7)
xiqi=8;
w595(xs[xiqi]);
bit19=0;
delay(1);
bit19=1;
w595(xs[Xsg]);
bit18=0;
delay(1);
bit18=1;
w595(xs[Xss]);
bit17=0;
delay(1);
bit17=1;
}
//\\\\\\\0000000000000000000000000000000000000000000000000000000000000
else
{
if(Menu==0)
{
w595(xs[time[0]]);
bit4=0;
delay(1);
bit4=1;
}
if(Menu==1)
{
w595(xs[time[1]]);
bit3=0;
delay(1);
bit3=1;
}
if(Menu==2)
{
w595(xs[time[2]]);
bit2=0;
delay(1);
bit2=1;
}
if(Menu==3)
{
w595(xs[time[3]]);
bit1=0;
delay(1);
bit1=1;
}
////////////////
if(Menu==4)
{
w595(xs[time[4]]);
bit12=0;
delay(1);
bit12=1;
}
if(Menu==5)
{
w595(xs[time[5]]);
bit11=0;
delay(1);
bit11=1;
}
if(Menu==6)
{
w595(xs[time[6]]);
bit10=0;
delay(1);
bit10=1;
}
if(Menu==7)
{
w595(xs[time[7]]);
bit9=0;
delay(1);
bit9=1;
}
if(Menu==8) //周
{
w595(xs[time[8]]);
bit19=0;
delay(1);
bit19=1;
}
//
if(Menu==9) //年
{
w595(xs[time[9]]);
bit8=0;
delay(1);
bit8=1;
}
if(Menu==10) //年
{
w595(xs[time[10]]);
bit7=0;
delay(1);
bit7=1;
}
/////////////////////////////
if(Menu==11)
{
w595(xs[music[0]]);
bit4=0;
delay(1);
bit4=1;
}
if(Menu==12)
{
w595(xs[music[1]]);
bit3=0;
delay(1);
bit3=1;
}
if(Menu==13)
{
w595(xs[music[2]]);
bit2=0;
delay(1);
bit2=1;
}
if(Menu==14)
{
w595(xs[music[3]]);
bit1=0;
delay(1);
bit1=1;
}
//////////////////////////////////
}
}
///////////////////////////////////////////////////////////////////////
//void RTInputByte(uchar); /* 输入 1Byte */
//uchar RTOutputByte(void); /* 输出?1Byte */
//void W1302(uchar, uchar);
//uchar R1302(uchar);
void Set1302(uchar *); /* 设置时间 */
void Get1302(); /* 读取1302当前时间 */
/////////////////////////////////////////////////////////////////////
///////////////////////////////////////////按键//////////////////////////////////////////////
Key(uchar ky)
{
if(!(Mu&&Up&&Dn)) //是否有键按下&&Up&&Dn
{
if(Keybit2)
{
switch(ky)
{
case 0: { if(!Mu) //分
{//writ1302[0]=ucCurtime[0];
writ1302[1]=(time[0]&0x0f)|(time[1]<<4);//分
writ1302[2]=(time[2]&0x0f)|(time[3]<<4);//时
writ1302[3]=(time[4]&0x0f)|(time[5]<<4);//日
writ1302[4]=(time[6]&0x0f)|(time[7]<<4);//月
writ1302[5]=time[8]&0x0f;//周
writ1302[6]=(time[9]&0x0f)|(time[10]<<4);//年
Set1302(1);
Keybit1=0;
Keybit2=0;
Menu=14;
}
if(!Up)
{ if(time[0]<9)
time[0]=time[0]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[0]>0)
time[0]=time[0]-1;
Keybit2=0;
}
}break;
case 1: { if(!Mu) //分
{Menu=0;
Keybit2=0;
}
if(!Up)
{ if(time[1]<5)
time[1]=time[1]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[1]>0)
time[1]=time[1]-1;
Keybit2=0;
}
}break;
case 2: { if(!Mu) //时
{Menu=1;
Keybit2=0;
}
if(!Up)
{
if(time[3]==2)
{if(time[2]<3)
time[2]=time[2]+1;
}
if(time[3]<=1)
{if(time[2]<9)
time[2]=time[2]+1;
}
Keybit2=0;
}
if(!Dn)
{
if(time[2]>0)
time[2]=time[2]-1;
Keybit2=0;
}
}break;
case 3: { if(!Mu) //时
{Menu=2;
Keybit2=0;
}
if(!Up)
{ if(time[3]<2)
time[3]=time[3]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[3]>0)
time[3]=time[3]-1;
Keybit2=0;
}
}break;
case 4: { if(!Mu) //日
{Menu=8;
Keybit2=0;
}
if(!Up)
{ if(time[4]<9)
time[4]=time[4]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[4]>0)
time[4]=time[4]-1;
Keybit2=0;
}
}break;
case 5: {if(!Mu) //日
{Menu=4;
Keybit2=0;
}
if(!Up)
{ if(time[5]<3)
time[5]=time[5]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[5]>0)
time[5]=time[5]-1;
Keybit2=0;
}
}break;
case 6: {if(!Mu) //月
{Menu=5;
Keybit2=0;
}
if(!Up)
{ if(time[7]==1)
{if(time[6]<2)
time[6]=time[6]+1;
}
if(time[7]<1)
{if(time[6]<9)
time[6]=time[6]+1;
}
Keybit2=0;
}
if(!Dn)
{ if(time[6]>0)
time[6]=time[6]-1;
Keybit2=0;
}
}break;
case 7: {if(!Mu) //月
{Menu=6;
Keybit2=0;
}
if(!Up)
{ if(time[7]<1)
time[7]=time[7]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[7]>0)
time[7]=time[7]-1;
Keybit2=0;
}
}break;
case 8: { if(!Mu) //周
{Menu=3;
Keybit2=0;
}
if(!Up)
{ if(time[8]<7)
time[8]=time[8]+1;
Keybit2=0;
}
if(!Dn)
{ if(time[8]>1)
time[8]=time[8]-1;
Keybit2=0;
}
}break;
case 9: { if(!Mu) //年
{Menu=7;
Keybit2=0;
}
if(!Up)
{ if(time[9]<9)
time[9]=time[9]+1;
Keybit2=0;
}
if(!Dn)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -