历史上的今天
今天是:2024年11月15日(星期五)
2019年11月15日 | PIC单片机上实时时钟PCF8563测试程序
2019-11-15 来源:51hei
..............................PCF8563测试程序主函数............................
...............................................................................
...............................................................................
#include
#include "pcf8563.h"
#include "IIC.h"
__CONFIG(FOSC_INTOSC&WDTE_OFF&MCLRE_OFF); //PIC配置位设置
void init_fosc() //PIC内部晶振设置
{
OSCCON=0x61;
}
...................在PCF8563.h头文件里定义的结构体.....................
struct Time
{
uchar second;
uchar minute;
uchar hour;
uchar day;
uchar week;
uchar month;
uchar year;
};
.....................................................................
struct Time time;
void main()
{
init_fosc();
time.second=55;
time.minute=51;
time.hour=11;
time.day=2;
time.week=6;
time.month=4;
time.year=14;
P8563_Set_Time(); //PCF8563设置时间子函数
nop();nop();
while(1)
{
P8563_Read_Time();//读取PCF8563子程序
TRISB=0b00000000;
PORTB=~time.second;
uint n;
for(n=0;n<600;n++)
{
nop();
}
}
while(1);
}
...............................IIC通讯子程序.................................
.............................................................................
.............................................................................
#include
#include "IIC.h"
void start() //IIC起始程序
{
TRISC5=0; //SCL输出
TRISC4=0; //SDA输出
SDA_OUT=1;
SCL_OUT=1;
nop();
SDA_OUT=0;
nop(); //大于4us
SCL_OUT=0;
}
void stop() //IIC停止子程序
{
TRISC5=0;
TRISC4=0;
SDA_OUT=0;
SCL_OUT=1;
nop(); //大于4us
SDA_OUT=1;
TRISC4 = 1; // 结束后释放总线,sda输入
}
uchar IIC_Get_Ack(void) //检测应答信号
{
TRISC4=1; //应答信号由从机发出,所以SDA设为输入
SCL_OUT=0;
SCL_OUT=1;
nop();
if(SDA_IN==1) //读取SDA状态时,SCL保持高电平
{
ACK=1;
}
else
{
ACK=0;
}
SCL_OUT=0;
return (ACK);
}
void IIC_Ack() //主机向从机应答,发送继续信号
{
TRISC4=0;
TRISC5=0;
SDA_OUT=0;
SCL_OUT=0;
SCL_OUT=1;
nop(); //大于4us
SCL_OUT=0;
SDA_OUT=1;
}
void IIC_NOAck() //主机向从机非应答,停止继续读取
{
TRISC4=0;
TRISC5=0;
SDA_OUT=1;
SCL_OUT=0;
SCL_OUT=1;
nop();
SCL_OUT=0;
SDA_OUT=0;
}
void IIC_Write_Byte(uchar dat) //发送一个字节
{
uchar bitcount=8;
do
{
TRISC4=0;
TRISC5=0;
if((dat&0x80)==0x80) //dat最高位为1,SDA拉高;dat最高位为0,SDA拉低
{
SDA_OUT=1;
}
else
{
SDA_OUT=0;
}
SCL_OUT=0;
SCL_OUT=1;
nop();
SCL_OUT=0; //SCL为低电平时,允许SDA电平变化
dat=dat<<1;
bitcount--;
}while(bitcount);
TRISC4=1;
nop();nop();
}
uchar IIC_Read_Byte() //接受一个字节
{
uchar temp1=0;
uchar bitcount1=8;
TRISC4=1; //SDA设置为输入
TRISC5=0;
do
{
SCL_OUT=0;
SCL_OUT=1;
nop();
if(SDA_IN)
{
temp1=temp1|0x01; //如果SDA为1,则置高temp1最低位
}
else
{
temp1=temp1&0xfe; //如果SDA为0,则置低temp1最低位
}
SCL_OUT=0;
if(bitcount1-1)
{
temp1=temp1<<1;
}
bitcount1--;
}while(bitcount1);
return (temp1);
}
................................PCF8563子程序.......................................
....................................................................................
....................................................................................
#include
#include "PCF8563.h"
#include "IIC.h"
struct DownCounter dcounter;
struct Time time;
uchar Val2BCD(uchar x) //十进制转BCD码子程序
{
return ((x/10)<<4)+((x)&0x0F);
}
uchar PCF8563_Write_Bytes(uchar addr,uchar length,uchar *pbuf) //写入子程序
{
uchar send_da;
uchar i=0;
start();
IIC_Write_Byte(0xA2); //器件地址
do
{;
}while(IIC_Get_Ack());
IIC_Write_Byte(0x02); //器件读取起始位
do
{;
}while(IIC_Get_Ack());
for(i=0;i
{
send_da=*(pbuf++);
IIC_Write_Byte(send_da);
do
{;
}while(IIC_Get_Ack());
}
stop();
nop();nop();
}
uchar PCF8563_Read_Bytes(uchar addr,uchar length,uchar *pbuf) //PCF8563读取子程序
{
uint receive_da;
uchar i=0;
start();
IIC_Write_Byte(0xa2); //器件地址
do
{;
}while(IIC_Get_Ack());
IIC_Write_Byte(0x02); //最小地址
do
{;
}while(IIC_Get_Ack());
start();
IIC_Write_Byte(0xa3); //器件读取地址
do
{;
}while(IIC_Get_Ack());
TRISC4=0;
while(length--)
{
receive_da=IIC_Read_Byte();
*(pbuf++)=receive_da;
IIC_Ack();
}
IIC_NOAck();
stop();
nop();nop();nop();nop();nop();nop();
return pbuf[i];
}
uchar P8563_Read_Time() //PCF8563读取时间子程序
{
uchar temp[7];
PCF8563_Read_Bytes(0x02,0x07,temp);
time.second=BCD2Val(temp[0]&0x7f);
time.minute=BCD2Val(temp[1]&0x7f);
time.hour=BCD2Val(temp[2]&0x1f);
time.day=BCD2Val(temp[3]&0x3f);
time.week=BCD2Val(temp[4]&0x07);
time.month=BCD2Val(temp[5]&0x1f);
time.year=BCD2Val(temp[6]);
return 0;
}
uchar BCD2Val(uchar x) //BCD转十进制
{
return ((x>>4)&0x0f)*10+(x&0x0f);
}
uchar P8563_Set_Time() //PCF8563设置时间子程序
{
uchar temp[7];
uchar i;
for(i=0;i<7;i++)
{
temp[i]=Val2BCD(((uchar *)(&time))[i]);
}
return PCF8563_Write_Bytes(0x02,7,temp);
}
uchar P8563_Set_DownCounter()
{
return PCF8563_Write_Bytes(0x0e,2,(uchar *)&dcounter);
}
uchar P8563_Read_DownCounter()
{
return PCF8563_Read_Bytes(0x0e,2,(uchar *)&dcounter);
}
史海拾趣
|
问: ASIC的中文翻译是专用集成电路,为什么说它是一种嵌入式微处理器呢?FPGA也是一种嵌入式微处理器吗?我听有人说FPGA指的是一种封装结构,这是正确的吗? 答: 用于专用应用场合的处理器就是嵌入式处理器,不管它是可编程的还是不可编程的。 ...… 查看全部问答> |
|
瑞士LEM互感器、LEM电流互感器、LEM电涌保护器、LEM传感器、LEM电压互感器、LEM电量传感器、LEM无线电能表 LEM 是全球电量传感器的知名制造者,也是电量传感器领域的领导者。 LEM集团全球拥有多家公司,销售办事处遍布全球。其中瑞士日内瓦、中 ...… 查看全部问答> |
|
RealView MDK-ARM Version:3.24 CPU是LPC2101 H-JTAG 0.8 软件仿真正常。 现象是仿真器连接都正常。 硬件仿真 在Startup.s中还正常,转向main()函数就死机。 查了好多天了。今天忽然注意到软件仿真的程序地址0x000041A4(比16K还多) 而LPC2 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 在78**、79**系列三端稳压器中最常应用的是TO-220和TO-202两种封装。这两种封装的图形以及引脚序号、引脚功能如附图所示。 图中的引脚号标注方法是按照引脚电位从高到底的顺序标注的。这样 ...… 查看全部问答> |
|
S3C2440平台WinCE5.0中串口发送堵塞现象的疑惑: 本人开发一个软件,使用TQ公司的SKY2440开发板为模板,使用的是从4.2移植到wince5.0使用的BSP包。 该软件需要用到2个串口(COM0和COM1),TCP/UDP编程;修改MDD层的mdd ...… 查看全部问答> |
|
大家好,我请教一个关于2440的问题。我用2440连接一个ITU656接口时序的摄相头,为什么一直接不到同步信号?模块出来的同步开始是(FF,00,00,80),结束是(FF,00,00,90)。2440的ForthWord中的F,V,H是不是同步信号线上的电平?… 查看全部问答> |
|
请问下应变传感器输出的电压信号通过运放放大后,msp是怎么转换模拟信号为数字信号的,149的可以转换ad的输入电压范围是多少啊,有没有相关的程序啊… 查看全部问答> |




