📄 12864
字号:
addr++;
}
}
/***********************/
/* 主函数 */
/***********************/
void main()
{
unsigned int i;
TMOD=0x11;
EA=1;
EX1=1;
ET1=1;
ET0=1;
TH1=0;
TL1=0;
IT1=1;
count=0;
ir_enable=0;
id=0; //闹钟初如值设定
alarm=0;
alarm_controls=0;
alarm_min=0x00;
alarm_hour=0x00;
W1302(0xc0,alarm_hour);
W1302(0xc2,alarm_min);
P15=0;
Set1302(&inittime);
init();
rst=0;
delay(2);
rst=1;
_nop_();
_nop_();
psb=1;
send_dictate(0x34);
delay(2);
send_dictate(0x02);
delay(2);
send_dictate(0x30);
cgram();
send_dictate(0x01);
while(1)
{
if(ir_enable)
{
ir_key();
ir_enable=0;
init();
}
sec=R1302(0x81);
sec&=0x7f;
sec=sec/16*10+sec%16;
if(alarm==1&&(sec!=sec_temp))
{
sec_temp=sec;
P15=~P15;
}
i=ReadTemperature();
if(sec==0x00)
{
min=R1302(0x83);
min=min/16*10+min%16;
alarm=0;
P15=0;
if(alarm_controls==1)
if(alarm_hour==hour)
if(alarm_min==min)
alarm=1;
}
if(min==0)
{
hour=R1302(0x85);
hour=hour/16*10+hour%16;
}
if(hour==0)
{
day=R1302(0x87);
week=R1302(0x8b);
day=day/16*10+day%16;
Conversion(0,year,month,day);
}
if(day==1)
{
month=R1302(0x89);
month=month/16*10+month%16;
}
if(month==1)
{
year=R1302(0x8d);
year=year/16*10+year%16;
jieqi1= calendar_calculate_solar_term_1();
jieqi2= calendar_calculate_solar_term_2();
}
if(id==0)
{
send_dictate(0x80);
send_data(shuzi[2]);
send_data(shuzi[0]);
if((mode==1)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
send_data(shuzi[year/10]);
send_data(shuzi[year%10]);
}
send_data(riqi[0]);
send_data(riqi[1]); //"年"
if((mode==2)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
send_data(shuzi[month/10]);
send_data(shuzi[month%10]);
}
send_data(riqi[2]);
send_data(riqi[3]); //"月"
if((mode==3)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
send_data(shuzi[day/10]);
send_data(shuzi[day%10]);
}
send_data(riqi[4]);
send_data(riqi[5]); //"日"
send_data(riqi[18]);
send_data(riqi[19]); //空白
send_dictate(0x90);
send_data(riqi[6]);
send_data(riqi[7]);
send_data(riqi[8]);
send_data(riqi[9]); //"农历"
send_data(shuzi3[month_moon/10*2]);
send_data(shuzi3[month_moon/10*2+1]);
if(month_moon==3)
{
send_data(0xc8);
send_data(0xfd);
}
else
{
send_data(shuzi4[month_moon%10*2]);
send_data(shuzi4[month_moon%10*2+1]);
}
send_data(riqi[2]);
send_data(riqi[3]); //"月"
if(day_moon!=10)
{
send_data(rongli[day_moon/10*2]);
send_data(rongli[day_moon/10*2+1]);
if((day_moon%10)==3)
{
send_data(0xc8);
send_data(0xfd);
}
else
{
send_data(shuzi2[day_moon%10*2]);
send_data(shuzi2[day_moon%10*2+1]);
}
}
else //初十特殊处理
{
send_data(rongli[0]);
send_data(rongli[1]);
send_data(shuzi2[0]);
send_data(shuzi2[1]);
}
send_data(riqi[4]);
send_data(riqi[5]); //日
send_dictate(0x88);
send_data(riqi[10]);
send_data(riqi[11]);
send_data(riqi[12]);
send_data(riqi[13]); //"星期"
if((mode==4)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
if(week==3)
{
send_data(0xc8);
send_data(0xfd);
}
else
{
send_data(xingqi[week*2]);
send_data(xingqi[week*2+1]);
}
}
send_data(riqi[18]);
send_data(riqi[19]); //空白
if((mode==5)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
send_data(shuzi[hour/10]);
send_data(shuzi[hour%10]);
}
send_data(shuzi[10]);
if((mode==6)&&flash==1)
{
send_data(0x20);
send_data(0x20);
}
else
{
send_data(shuzi[min/10]);
send_data(shuzi[min%10]);
}
send_data(shuzi[10]);
send_data(shuzi[sec/10]);
send_data(shuzi[sec%10]); //当前时间
send_dictate(0x98);
if(day<=jieqi1)
{
send_data(jieqi[month*8]);
send_data(jieqi[month*8+1]);
send_data(jieqi[month*8+2]);
send_data(jieqi[month*8+3]);
send_data(shuzi[jieqi1/10]);
send_data(shuzi[jieqi1%10]); //农历节气
}
else
{
if(day<=jieqi2&&day>jieqi1)
{
send_dictate(0x98);
send_data(jieqi[month*8+4]);
send_data(jieqi[month*8+5]);
send_data(jieqi[month*8+6]);
send_data(jieqi[month*8+7]);
send_data(shuzi[jieqi2/10]);
send_data(shuzi[jieqi2%10]); //农历节气
}
else
{
send_data(riqi[18]);
send_data(riqi[19]); //空白
send_data(riqi[18]);
send_data(riqi[19]); //空白
send_data(riqi[18]);
send_data(riqi[19]); //空白
}
}
send_data(riqi[18]);
send_data(riqi[19]); //空白
send_data(riqi[14]);
send_data(riqi[15]);
send_data(riqi[16]);
send_data(riqi[17]); //"室温"
send_data(shuzi[i/100]);
send_data(shuzi[i/10%10]);
send_data(shuzi[11]);
send_data(shuzi[i%10*5]); //当前温度
}
else
{
send_dictate(0x80);
send_data(riqi[20]);
send_data(riqi[21]); //"闹钟"
send_data(riqi[22]);
send_data(riqi[23]);
send_data(riqi[18]);
send_data(riqi[19]); //空白
send_data(riqi[18]);
send_data(riqi[19]); //空白
if(alarm_controls==1)
{
send_data(riqi[24]);
send_data(riqi[25]); //"开"
}
else
{
send_data(riqi[26]);
send_data(riqi[27]); //"关"
}
send_dictate(0x88);
if(mode==7&&flash==1)
{
send_data(riqi[18]);
send_data(riqi[19]); //空白
}
else
{
send_data(shuzi[alarm_hour/10]);
send_data(shuzi[alarm_hour%10]); //闹钟时
}
send_data(shuzi[10]); //":"
if(mode==8&&flash==1)
{
send_data(riqi[18]);
send_data(riqi[19]); //空白
}
else
{
send_data(shuzi[alarm_min/10]);
send_data(shuzi[alarm_min%10]); //闹钟时
}
}
}
}
/********DS1302读写程序***************
/********************************************************************
函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************
函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************
函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************
函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); //控制命令,WP=0,允许写操作
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); // 秒 分 时 日 月 星期 年
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); // 控制命令,WP=1,写保护
}
//初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
//delay(4);
}
//读取温度
ReadTemperature(void)
{
unsigned char a=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -