www.pudn.com > main_c.rar > main_c.c
/*/////////////////////////////////////////////////////
文件名 : main.c
功 能 : Time helper 主模块
控制器 : AT89S52
时钟 : 11.0592
编译器 : Keil C51 7.0
*/////////////////////////////////////////////////////
#include "common.h"
sbit LED = P3^5;
sbit BEEP = P1^4;
sbit BEEP_EX= P0^0;
sbit RADIO = P3^7;
#define SETLED LED=0
#define CLRLED LED=1
#define SETBEEP BEEP_EX=BEEP=0
#define CLRBEEP BEEP_EX=BEEP=1
#define SETRADIO RADIO=0;
#define CLRRADIO RADIO=1;
uchar g_time[3]; //时间计数器 存储格式:h,m,s
uchar g_alarm_time[3]; //报警时间缓冲 存储格式:h,m,alarm index
uchar g_minflag=0; //过分钟标记
//延时
void DelayMs(uint n)
{
uint i;
uchar j;
for(i=0;i>4)+48;//年高
disbuf[1]=(p[6]&0x0f)+48;//年低
disbuf[2]='-';
disbuf[3]=(p[5]>>4)+48;//月高
disbuf[4]=0;
lcd_displaystring(disbuf,0);
disbuf[0]=(p[5]&0x0f)+48;//月低
disbuf[1]='-';
disbuf[2]=(p[4]>>4)+48;//日高
disbuf[3]=(p[4]&0x0f)+48;//日低
disbuf[4]=0;
lcd_displaystring(disbuf,2);
disbuf[0]=32;
disbuf[1]=p[3]+48;
disbuf[2]='d';
disbuf[3]='a';
disbuf[4]='y';
disbuf[5]=0;
lcd_displaystring(disbuf,4);
disbuf[0]=((p[2]&0x3f)>>4)+48;//小时
disbuf[1]=(p[2]&0x0f)+48;
disbuf[2]=':';
disbuf[3]=' ';
disbuf[4]=0;
lcd_displaystring(disbuf,7);
disbuf[0]=(p[1]>>4)+48;
disbuf[1]=(p[1]&0x0f)+48;
disbuf[2]=0;
lcd_displaystring(disbuf,9);
}
//进入计时模式功能函数
void EnterClockMode(void)
{
uchar *p=RTC_GetBuffer();
while(1)
{
RTC_ClearError();
RTC_UpdateData(1);
if(RTC_GetError())
{
lcd_displaystring("RTC error! retry...",0);
SETLED;
DelayMs(500);
CLRLED;
DelayMs(500);
}
else
break;
}
g_time[0]=((p[2]&0x3f)>>4)*10+(p[2]&0x0f);//h
g_time[1]=(p[1]>>4)*10+(p[1]&0x0f);//m
g_time[2]=0;//s
BeginDisplayTime(p);
GetNextAlarmTime();
RTC_SetSQWOutput(1,1);//1Hz output
IT1=1;//外部中断1边沿触发
EX1=1;//外部中断1允许
}
//离开计时模式
void LeaveClockMode(void)
{
EX1=0;//外部中断1禁止
RTC_SetSQWOutput(0,0);//1Hz output disable
}
//外部中断1,信号来自DS1307 1Hz 输出
void IntSQW1Hz() interrupt 2
{
g_time[2]++;
if(g_time[2]==60)
{
g_time[2]=0;
g_minflag=1;
}
}
////////////////////////////////////////////////////
/*为串口操作存储器提供的6个函数*/
void WriteEeprom(void)
{
uchar i,addr;
uchar *p=Uart_GetBuffer();
p[0]=0xaa;
Uart_Send(1);//回应
Uart_Recv(10,UART_WAIT);
addr=p[0]*24;
eep_writestring(addr,p+1,4);
addr+=4;
for(i=0;i<2;i++)
{
p[0]=0xaa;
Uart_Send(1);//回应
Uart_Recv(10,UART_WAIT);
eep_writestring(addr,p,10);
addr+=10;
}
p[0]=0xaa;
Uart_Send(1);//回应
}
void ReadEeprom(void)
{
uchar i;
uchar *p=Uart_GetBuffer();
for(i=0;i<120;)
{
eep_readstring(i,p,2);
Uart_Send(2);
i+=2;
}
}
//写DS1307 ram
void WriteRTCRam(void)
{
uchar i;
uchar *p=Uart_GetBuffer();
for(i=0;i<5;i++)
{
p[0]=0xaa;
Uart_Send(1);
Uart_Recv(10,UART_WAIT);
RTC_WriteRAM(i*10,p,10);
}
p[0]=0xaa;
Uart_Send(1);
}
//读DS1307 ram
void ReadRTCRam(void)
{
uchar i;
uchar *p=Uart_GetBuffer();
for(i=0;i<5;i++)
{
RTC_ReadRAM(i*10,p,10);
Uart_Send(10);
}
}
//设置当前时间
void SetCurrentTime()
{
uchar i;
uchar *p=Uart_GetBuffer();
uchar *p1=RTC_GetBuffer();
p[0]=0xaa;
Uart_Send(1);//确认准备好
Uart_Recv(7,UART_WAIT);//读时间数据
for(i=0;i<7;i++)
p1[i]=p[i];
RTC_UpdateData(0);//写ds1307
p[0]=0xaa;//确认操作成功
Uart_Send(1);
}
//获取当前时间
void GetCurrentTime()
{
uchar i;
uchar *p=Uart_GetBuffer();
uchar *p1=RTC_GetBuffer();
RTC_UpdateData(1);//从DS1307读时间数据
for(i=0;i<7;i++)
p[i]=p1[i];
Uart_Send(7);
}
///////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//报警功能函数////////////////////////////////////////////
void Alarm(uchar index)
{
uchar temp[5],i;
uint *p=(uint *)temp;
//显示报警字符
lcd_clear();
for(i=0;i<5;i++)
{
eep_readstring(index*24+4+i*4,temp,4);
temp[4]=0;
lcd_displaystring(temp,i*2);
}
//读报警类型及持续时间
eep_readstring(index*24+2,temp,2);
if(temp[0]==1)//led alarm
{
for(i=0;i1 &&temp[0]<6)//play music
{
for(i=0;i