📄 main.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Latest modified Date: 2008-12-14
** Latest Version: v0.1
** Descriptions: 运行RTC进行计时,将所时间值不断的通过串口向上位机发送;
** 通讯波特率115200,8位数据位,1位停止位,无奇偶校验
** 修改中断使能方法,采用FIQEnable ()、IQREnable ()方式
**--------------------------------------------------------------------------------------------------------
** Created by: huangwujiao
** Created date: 2008-11-18
** Version: The original version
** Descriptions:
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "config.h"
#define PCF8563 0xA2 /* 定义子地址 */
#define UART_BPS 115200
#define WRADDR 0x00 /* 定义对PCF8563写单元首地址 */
#define RDADDR 0x02 /* 定义对PCF8563读单元首地址 */
uint8 uiYEAR; /* 年 */
uint8 uiMONTH; /* 月 */
uint8 uiDOM; /* 日 */
uint8 uiDOW; /* 星期 */
uint8 uiHOUR; /* 时 */
uint8 uiMIN; /* 分 */
uint8 uiSEC; /* 秒 */
uint8 send_buf[16]; /* UART0数据接收缓冲区 */
uint8 uiDataBuf[7]; /* 读取时间缓冲区 */
/*********************************************************************************************************
** 函数名称: DelayNS
** 函数功能: 长软件延时
** 输入参数: uiDly 延时参数,值越大,延时越久
** 输出函数: 无
*********************************************************************************************************/
void DelayNS(uint32 uiDly)
{
uint32 i;
for(; uiDly > 0; uiDly--) {
for(i=0; i<50000; i++);
}
}
/*********************************************************************************************************
** 函数名称:UART0_Ini
** 函数功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** 输入参数:无
** 输出参数:无
*********************************************************************************************************/
void UART0_Ini(void)
{
uint16 Fdiv; /* 定义波特率 */
PINSEL0 = (PINSEL0&0xFFFFFFF0) | 0x05; /* 引脚设置 */
U0LCR = 0x83; /* DLAB = 1,可设置波特率 */
Fdiv = (Fpclk / 16) / UART_BPS; /* 设置波特率 */
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
U0FCR = 0x01; /* 使能串口 */
}
/*********************************************************************************************************
** 函数名称: I2cInit
** 函数功能: I2C初始化
** 输入参数: uiFi2c I2C总线频率(最大400K)
** 输出参数: 无
*********************************************************************************************************/
void I2C_Init(uint32 uiFi2c)
{
if (uiFi2c > 400000) uiFi2c = 400000;
PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; /* 设置I2C控制口有效断 */
I2SCLH = (Fpclk / uiFi2c + 1) / 2; /* 设定I2C时钟 */
I2SCLL = (Fpclk / uiFi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40; /* 使能主I2C */
IRQEnable ();
/*
*设置I2C中断
*/
VICIntSelect = 0x00000000; /* 设置所有通道为IRQ中断 */
VICVectCntl0 = (0x20 | 0x09); /* I2C通道分配最高优先级 */
VICVectAddr0 = (int)IRQ_I2C; /* 设置I2C中断向量 */
VICIntEnable = 1 << 9; /* 使能I2C中断 */
}
/*********************************************************************************************************
** 函数名称:SendByte
** 函数功能:向串口UART0发送字节数据,并等待发送完毕。
** 输入参数:data 要发送的数据
** 输出参数:无
*********************************************************************************************************/
void SendByte(uint8 data)
{
U0THR = data; /* 发送数据 */
while( (U0LSR&0x20)==0 ); /* 等待数据发送 */
}
/*********************************************************************************************************
** 函数名称:ISendBuf
** 函数功能:将缓冲区的数据发送回主机。
** 输入参数:buf 数据缓冲区
** no 发送数据的个数
** 输出参数:无
*********************************************************************************************************/
void ISendBuf(uint8 const *buf, uint8 no)
{
uint8 i;
for(i=0; i<no; i++) SendByte(buf[i]);
}
/*********************************************************************************************************
** 函数名称: SendTimeRtc
** 函数功能: 将RTC时间值发送到串口显示
** 输入参数: uiDat 要发送的数据
** 输出函数: 无
*********************************************************************************************************/
void SendTimeRtc (void)
{
uint32 bak; /* 定义局部变量 */
uint32 i;
for(i=0;i<7;i++) {
uiDataBuf[i]= 0; /* 清零缓冲区 */
}
IRcvStr(PCF8563, RDADDR, uiDataBuf, 7); /* 读回时间数据 */
uiSEC = uiDataBuf[0] & 0x7F; /* 屏蔽相关位 */
uiMIN = uiDataBuf[1] & 0x7F;
uiHOUR = uiDataBuf[2] & 0x3F;
uiDOW = uiDataBuf[3] & 0x3F;
uiDOM = uiDataBuf[4] & 0x07;
uiMONTH = uiDataBuf[5] & 0x1F;
uiYEAR = uiDataBuf[6] & 0xFF;
bak = uiYEAR; /* 年 */
send_buf[0] = '2';
send_buf[1] = '0';
send_buf[2] = bak/16+'0';
send_buf[3] = bak%16+'0';
bak = uiMONTH; /* 月 */
send_buf[4] = bak/16+'0';
send_buf[5] = bak%16+'0';
bak = uiDOM; /* 日 */
send_buf[6] = bak/16+'0';
send_buf[7] = bak%16+'0';
bak = uiDOW; /* 星期 */
send_buf[8] = bak/16+'0';
send_buf[9] = bak%16+'0';
bak = uiHOUR; /* 时 */
send_buf[10] = bak/16+'0';
send_buf[11] = bak%16+'0';
bak = uiMIN; /* 分 */
send_buf[12] = bak/16+'0';
send_buf[13] = bak%16+'0';
bak = uiSEC; /* 秒 */
send_buf[14] = bak/16+'0';
send_buf[15] = bak%16+'0';
ISendBuf(send_buf, 16); /* 向上位机发送数据 */
DelayNS(2); /* 等待发送完毕 */
}
/*********************************************************************************************************
** 函数名称:Time0Init
** 函数功能:初始化定时器0,定时时间为1S。
** 输入参数:无
** 输出参数:无
*********************************************************************************************************/
void Time0Init(void)
{
/* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
*Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
*/
T0PR = 99; /* 设置定时器0分频为100分频 */
T0MCR = 0x03; /* 匹配通道0匹配中断并复位T0TC */
T0MR0 = 110592; /* 比较值(1S定时值) */
T0TCR = 0x03; /* 启动并复位T0TC */
T0TCR = 0x01;
}
/*********************************************************************************************************
** 函数名称: Main
** 函数功能: I2C总线对PCF8563进行读写操作
** 输入参数: 无
** 输出参数: 无
*********************************************************************************************************/
int main(void)
{
uint8 td[9]={0x00,0x12,0x00,0x30,0x12,0x05,0x21,0x11,0x08}; /* 定义初始化PCF8563字缓冲区 */
PINSEL0 = 0x00000000; /* 设置I/O清零 */
PINSEL1 = 0x00000000;
UART0_Ini(); /* 初始化串口并启动 */
DelayNS(1); /* 延时 */
I2C_Init(30000); /* I2C初始化,速率300Kbps */
ISendStr(PCF8563,WRADDR,td,0x9); /* 初始化PCF8563 */
DelayNS(5);
Time0Init(); /* 初始化定时器并启动定时功能 */
while(1) {
while( (T0IR&0x01) == 0 ); /* 等待定时时间到 */
T0IR = 0x01; /* 清除中断标志 */
SendTimeRtc(); /* 向上位机发送实时时钟数据 */
}
return(0);
}
/*********************************************************************************************************
** End Of File
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -