#include "stc15.h"
#include "intrins.h" //_nop_()函数包含在其中
#include "string.h" //memset()函数包含在其中
void num_to_str(unsigned char a,unsigned char *str); //不带符号
void INT1_init(void); //外部中断1子函数
//------------------ UART相关 ----------------------------------
#define FOSC 11059200 //晶振频率
//#define BAUD 9600 //UART波特率
//#define BAUD 19200 //UART波特率
#define BAUD 115200 //UART波特率
void Uart_init(void);
void Uart_SendString(unsigned char *s);
//------------------- I2C相关 -----------------------------------
void Delay_n_nop(void);
void IIC_Start(void);
void IIC_Stop (void);
void IIC_Ack(void);
void IIC_NAK(void);
void IIC_SendByte(unsigned char val);
unsigned char IIC_ReadByte(void);
bit IIC_ChkAck(void);
void IICWriteData(unsigned char RegAdd, unsigned char Data);
unsigned char IICReadData(unsigned char RegAdd) reentrant;
void IICRead_nData(unsigned char RegAdd,unsigned char Len,unsigned char* Datas);
//-------------------- RTC相关 ---------------------------------
//PCF8563T RTC芯片 片内16个BYTE寄存器地址
#define RTC_CTR_STA1 0x00 //控制器1 (模式等)
#define RTC_CTR_STA2 0x01 //控制器2 (中断设置部分)
#define RTC_SEC 0x02 //秒 是否确保准确的时钟
#define RTC_MIN 0x03 //分
#define RTC_HR 0x04 //24小时制
#define RTC_DAYS 0x05 //日(0~30/31)
#define RTC_WEEK 0x06 //星期(0~30/31)
#define RTC_MON_CENT 0x07 //月/世纪
#define RTC_YEARS 0x08 //年
#define RTC_AL_MIN 0x09 //分钟报警
#define RTC_AL_HR 0x0A //小时报警
#define RTC_AL_DAY 0x0B //天报警
#define RTC_AL_WEEK 0x0C //星期报警
#define RTC_CLKOUT 0x0D //时钟输出控制
#define RTC_Set_TIMER 0x0E //倒计数定时器设置
#define RTC_TIMER 0x0F //倒计数定时器值n
#define RTC_Debug
#define RTC_DEBUG
#define WRITE 0x0A2 //PCF8563 芯片寻址(10100010)写
#define READ 0x0A3 //PCF8563 芯片寻址(10100011)读
sbit IIC_SDA=P5^5; //RTC数据引脚
sbit IIC_SCL=P5^4; //RTC数据引脚
data unsigned char bdata com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
unsigned char RTC_Time[8]; //秒,分,时,日,星期,月,年,世纪
void RTC_Set_Mod(bit isTestMod,bit isENPowerReset,bit isRun);
void RTC_Set_Time(unsigned char Mynian,unsigned char Myyue,unsigned char Myri,unsigned char Myxingqi,
unsigned char Myshi,unsigned char Myfen,unsigned char Mymiao,
bit is_19shiji,bit is_AccurateTime);
void RTC_TIMER_Mod(bit EN_TIMER,unsigned char Mod_TIMER_CNT);
void RTC_Set_CLKOUT(bit EN_CLKOUT,unsigned char Mod_CLKOUT);
void RTC_init(void);
void RTC_Read_Time(void);
void Show_Time_toUART(void);
unsigned char Flag_data_fresh;
//-----------------------------------------------
void main(void)
{
Flag_data_fresh=0;
Uart_init();
INT1_init();
RTC_init();
while(1)
{
if(Flag_data_fresh==1)
{
Flag_data_fresh=0;
Uart_SendString("1s定时 中断显示\r\n");
Show_Time_toUART();
}
}
}
//----------------------------------------------------------
long int intpow(int base,int power)
{
long int xdata dat=1;
while(power--) dat*=base;
return dat;
}
void num_to_str(unsigned char a,unsigned char *str)//不带符号
{
char xdata temp[8];
char *temp1=temp;
char i=0;
memset(str,0,8);
memset(temp,0,8);
while(a/10)
{
*temp1=a%10+'0'; //先低位
temp1++;
a=a/10;
}
*temp1=a%10+'0';
for(i=0;i<strlen(temp);i++) //高低位交换
{
*str=*(temp+strlen(temp)-i-1);
str++;
}
}
bit GetCharBit(char dat,char n_bit) //n_bit=1~8
{
bit b=(dat>>(n_bit-1))&0x01;
return b;
}
void INT1_init(void) //外部中断1配置
{
IT1=1; //下降沿中断
EX1=1;
EA =1;
}
void Uart_init(void)
{
//用定时器1(模式0)作为波特率发生器19200bps
SCON=0x50; //8位 方式1,允许接收
AUXR=0x40; //T1x12=1
TMOD&=0x0F; //T1 16位重装
TH1=(65536-(FOSC/12/4/BAUD)*intpow(12,GetCharBit(AUXR,7)))>>8; //定时器1高8位
TL1=65536-(FOSC/12/4/BAUD)*intpow(12,GetCharBit(AUXR,7)); //定时器1低8位
TR1=1;
ES=0;
EA=1;
}
void Uart_SendString(unsigned char *s)
{
unsigned char xdata len;
len =strlen(s);
for(;len;len--)
{
SBUF=*s++;
while(!TI);
TI=0;
}
}
//--------------- I2C相关函数 ------------------------------
void Delay_n_nop(void) //晶振频率为11.0592MHz延时函数
{
_nop_();_nop_();_nop_();_nop_();
}
void IIC_Start(void) //启动读写时序
{ // SCL线是高电平时,SDA线从高电平向低电平切换表示起始条件
IIC_SDA=1;Delay_n_nop();
IIC_SCL=1;Delay_n_nop();
IIC_SDA=0;Delay_n_nop();
IIC_SCL=0;Delay_n_nop();
}
void IIC_Stop (void) //停止操作。
{ //SCL是高电平时,SDA线由低电平向高电平切换表示停止条件
IIC_SDA=0;
IIC_SCL=1;Delay_n_nop();
IIC_SDA=1;Delay_n_nop();
IIC_SCL=1;Delay_n_nop();
}
void IIC_Ack(void) //应答,负 时钟脉冲
{
IIC_SDA=0;Delay_n_nop();
IIC_SCL=1;Delay_n_nop();
IIC_SCL=0;Delay_n_nop();
IIC_SDA=1;Delay_n_nop();
}
void IIC_NAK(void) //NAK 正 时钟脉冲 读数完毕
{
IIC_SDA=1;Delay_n_nop();
IIC_SCL=1;Delay_n_nop();
IIC_SCL=0;Delay_n_nop();
}
bit IIC_ChkAck(void)
{
bit receive=1;
unsigned int i=20; //1T单片机 stc15f2k
IIC_SDA=1;Delay_n_nop();
IIC_SCL=1;Delay_n_nop();
do{
receive=IIC_SDA;
}while((receive)&&(i--));
IIC_SCL=0;Delay_n_nop();
return receive;
}
void IIC_SendByte(unsigned char val) //8位移位输出。
{
unsigned char i;
IIC_SCL=0;
com_data=val; //val传递给com_data,com_data为bdata定义的一个字符型全局变量。
for(i=0;i<8;i++)
{
IIC_SDA=mos_bit;
Delay_n_nop(); //com_data的最高位(mos_bit)移位输出。
IIC_SCL=1;Delay_n_nop(); //产生时钟脉冲。
IIC_SCL=0;Delay_n_nop();
com_data<<=1; // com_data左移一位
}
}
unsigned char IIC_ReadByte(void) //Read one byte but do not send acknowledgement signal
{
char i;
com_data=0;
for(i=0;i<8;i++) //先传高位
{
com_data<<=1; // com_data左移一位
IIC_SCL=1;Delay_n_nop(); //产生时钟脉冲。
low_bit=IIC_SDA; //com_data的最高位(mos_bit)移位输入。
IIC_SCL=0;Delay_n_nop();
}
return com_data;
}
//在RegAdd开始的地方写入1个数据Data
void IICWriteData(unsigned char RegAdd,unsigned char Data)
{
IIC_Start();
IIC_SendByte(WRITE);
if (IIC_ChkAck())
{ //Check acknowledge signal
#ifdef RTC_DEBUG //Only for debug
Uart_SendString("write Device Write Address Error \r\n"); //Print error information
#endif
IIC_Stop(); //Output a STOP signal
return; //If acknowledgement signal is read as 1, then return to end
}
IIC_SendByte(RegAdd);
if (IIC_ChkAck())
{ //Check acknowledgement signal
#ifdef RTC_DEBUG //Only for debug
Uart_SendString("write Sensor Reg Address NACK \r\n"); //Print error information
#endif
IIC_Stop(); //Output a STOP signal
return; //If acknowledgement signal is read as 1, then return to end
} //If acknowledgement signal is read as 0, then go to next step
IIC_SendByte(Data);
if (IIC_ChkAck())
{ //Check acknowledgement signal
#ifdef RTC_DEBUG //Only for debug
Uart_SendString("write Sensor Data NACK \r\n"); //Print error information
#endif
IIC_Stop(); //Output a STOP signal
return;