?? 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 + -