⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc932_ring.c

📁 LPC900 单片机 RTC模块应用实例,包括有源代码.
💻 C
字号:
/***********************************************************
*文件名:LPC932_Ring.C
*开发: www.zlgmcu.com
*功能: 自动响铃系统控制程序
*日期: 13:01 04-2-28
***********************************************************/

#include "reg932.h"
#include "HI2C_C51.h"

#define	uchar	unsigned char
#define	PCF8563 0xA2

sbit	KEY=P1^7;				//启动开关KEY
sbit	Run=P2^7;				//通过P2^7控制外部继电器的开关达到控制电铃的目的

uchar PCF8563_WriteBuff[0x0F];	
uchar PCF8563_ReadBuff[0x0F];
uchar EEprom_DataBuff[0x2C];

uchar	Temp;					//全局变量

void PCF8563_Init();
void UART_Init();
void WatchDog_Init();
void ReadEEprom(uchar Addr);
void WriteEEprom(uchar Addr);
void ReadChart();
void Delay();
void Clear_WatchDog();

void INT1_ISR()	interrupt 2{		//外部INT1中断,由PCF8563 CLOCKOUT引脚产生,1次/秒
	uchar i;

	EA=0;							//关中断

	IRcvStr(PCF8563,0x00,PCF8563_ReadBuff,0x10);			//从PCF8563读0x10个寄存器,

	for(i=0x10;i<0x2C;i=i+2)		//将读出的寄存器值与响铃时刻表中的时间进行比较
	{
		if( (PCF8563_ReadBuff[3]==EEprom_DataBuff[i])&&(PCF8563_ReadBuff[4]==EEprom_DataBuff[i+1]) )
		{
			Run=1;					//如果有相同的时间,则驱动电铃
			break;
		}else
		{
			Run=0;					//如果不对则关闭继电器。
		}
	}

	INT1=1;							//INT1置高电平
	IE1=0;							//清除外部中断标志
	EA=1;							//开中断
}

void UART_ISR() interrupt 4{
	uchar	i;
	EA=0;							//关中断

	for(i=0;i<0x2C;i++)
	{
		while(RI==0);
		RI=0;						//清接收标志位为0
		Temp=SBUF;

		EEprom_DataBuff[i]=Temp;	//从上位机软件接收PCF8563寄存器的值及响铃时刻表的值到缓冲区
	}

	for(i=0;i<0x2C;i++)				//将缓冲区的值写入EEprom
	{
			Temp=EEprom_DataBuff[i];
			WriteEEprom(i);			//将接收到的数据写入EEPROM
	}

	EA=1;							//开中断
}


//---------------/ Main  /----------------------------
main()
{
	P1M1=0x00;						//设置P1口属性
	P1M2=0x00;
	P2M1=0xC0;						//设置P2口属性						
	P2M2=0xC0;

	SDA=1;							//拉高SDA,SCL
	SCL=1;						

	IT1=1;							//INT1下降沿触发
	EX1=1;							//外部INT1中断使能
	UART_Init();					//串口初始化
	WatchDog_Init();				//看门狗初始化
	ReadChart();			//读取EEprom的值到缓冲区

	while(1)			 		  
	{
		if(KEY==0)					//当启动键按下后,启动系统工作
		{
			
			PCF8563_Init();			//PCF8563初始化
		}
		
		Delay();
		Clear_WatchDog();			//喂狗
	}
}


//---------------/ Init  /-----------------------------
void UART_Init()
{
	SCON=0x50;				//选择BRG作为波特率发生器,8位UART模式
	SSTAT=0x60;				//设置停止位结束产生中断,设置独立的Rx/Tx中断

	BRGR0=0xF0;				//设置内部晶振时的波特率 9600
	BRGR1=0x02;
	BRGCON = 0x03;     		//使能波特率发生器

	ES=1;					//使能串行中断
}

void PCF8563_Init()
{
	uchar i;

	for(i=0;i<0x10;i++)					//从缓冲区读取0x10个字节到PCF8563_WriteBuff
	{
		PCF8563_WriteBuff[i]=EEprom_DataBuff[i];
	}

	ISendStr(PCF8563,0x00,PCF8563_WriteBuff,0x10);	//将读取的值写入PCF8563寄存器
}

void WatchDog_Init()
{
	uchar	i;

	i=WDCON;			//读取WDCON的值
	i|=0xE4;			//设置看门狗时钟分频,及置位WDRUN
	WDL=0xFF;			//装入8位倒计数器的新值

	EA=0;				//关中断
	WDCON=i;			//给WDCON赋值
	WFEED1=0xA5;		//执行清0第一部分
	WFEED2=0x5A;		//执行清0第二部分
	EA=1;				//开中断
}

//-------------------/ EEprom  /------------------------------
void ReadEEprom(uchar Addr)
{
	DEECON=0x00;							//设置模式
	DEEADR=Addr;							//设置地址,并开始读操作
	while((DEECON&0x80)==0);				//等待,直到读操作完成
	Temp=DEEDAT;							//将读出的数据赋给Temp
}

void WriteEEprom(uchar Addr)
{
//	EA=0;									
	DEECON=0x00;							//设置模式
	DEEDAT=Temp;							//设置将要写入的数据
	DEEADR=Addr;							//写入地址,并开始写操作
//	EA=1;					
	while((DEECON&0x80)==0);				//等待直到写完成
}

void ReadChart()
{
	uchar i;

	for(i=0x00;i<0x2C;i++)				//将EEProm中的数据读入缓冲区
	{
		ReadEEprom(i);
		EEprom_DataBuff[i]=Temp;
	}
}

//-------------/ Else /--------------------------------------------

void Delay()
{
	int	i,j;
	for(i=0;i<1500;i++)
	{
		for(j=0;j<1500;j++);
	}
}

void Clear_WatchDog()					//喂狗
{
	EA=0;								//关中断
	WFEED1=0xA5;						//清0序列1
	WFEED2=0x5A;						//清0序列2
	EA=1;								//开中断
}
//--------------/End /--------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -