|
发表于 2013-7-30 23:36:25
|
显示全部楼层
我来贴个1302程序,产品上用的(STM8,51没问题),说下STM32也调不过,写不进,示波器发现写是电平上拉不到VDD,这次做个新样,随便换个IO口试试
/****************************************
*函数名称:DS1302int(void)
*功 能:DS1302初始化
*参 数:无
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302int(void)
{
DS1302RSTCLR;
DS1302IOSET;
DS1302CLKCLR;
delay_us(100);//延时1mS
DS1302RSTSET;
}
/****************************************
*函数名称:DS1302WByte(unsigned char b)
*功 能:发送数据程序
*参 数:b=数据
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302WByte(unsigned char b)
{
unsigned char a;
for(a=8;a!=0;a--)
{
if(b&1)
DS1302IOSET;
else
DS1302IOCLR;
b>>=1;
DS1302CLKSET;
delay_us(5);//延时1US
DS1302CLKCLR;
delay_us(5);//延时1US
}
}
/****************************************
*函数名称:DS1302RByte(void)
*功 能:接收数据程序
*参 数:无
*返回 值:返回读到数据
*版 本:V1.0
*修改日期:13-01-01
****************************************/
unsigned char DS1302RByte(void)
{
unsigned char a,b;
DS1302IO_IN(); //将数据口设置为输入状态
DS1302IOSET; //拉高电平以使后面读取
delay_us(5);//延时1US
for(a=8;a!=0;a--)
{
b>>=1;
if(DS1302IO_R)
b|=0x80;
DS1302CLKSET;
delay_us(5);//延时1US
DS1302CLKCLR;
delay_us(5);//延时1US
}
DS1302IO_OUT();//将数据口设置为输出状态
return b;
}
/****************************************
*函数名称:DS1302DSJ(unsigned char *p)
*功 能:读出寄存器0-7 的内容
*参 数:*p=读出数组指针
*返回 值:返回读到数据组
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302DSJ(unsigned char *p)//读出寄存器0-7 的内容程序设置如下
{
unsigned char a;
DS1302int();//复位
DS1302WByte(0XBF);//写入命令
for(a=8;a!=0;a--)
{
*p=DS1302RByte();
p++;
}
DS1302RSTCLR;
}
/****************************************
*函数名称:DS1302JSJ(unsigned char *p)
*功 能:写入寄存器0-7 的内容
*参 数:*p=写入数组指针
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302JSJA(unsigned char *p)
{
unsigned char a;
DS1302int();//复位
DS1302WByte(0XBE);//写入命令
for(a=8;a!=0;a--)
{
DS1302WByte(*p);
p++;
}
DS1302RSTCLR;
}
/****************************************
*函数名称:DS1302JBH(void)
*功 能:寄存器写保护
*参 数:无
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302JBH(void)
{
DS1302int();//复位
DS1302WByte(0X8E);//写入命令
DS1302WByte(0X80);//写入数据
DS1302RSTCLR;
}
/****************************************
*函数名称:DS1302JZBH(void)
*功 能:解除寄存器写保护
*参 数:无
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302JZBH(void)
{
DS1302int();//复位
DS1302WByte(0X8E);//写入命令
DS1302WByte(0X00);//写入数据
DS1302RSTCLR;
}
/****************************************
*函数名称:DS1302JD(void)
*功 能:充电选择
*参 数:无
*返回 值:无
*版 本:V1.0
*修改日期:13-01-01
****************************************/
void DS1302JD(void)
{
DS1302int();//复位
DS1302WByte(0X90);//写入命令
DS1302WByte(0XA9);//写入数据
DS1302RSTCLR;
} |
|