📄 lpc932_ring.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 + -