src.rar
(2.09 KB, 下载次数: 2)
2012-5-9 23:38 上传
点击文件名下载附件
全部代码
DS1302.C代码如下:
#include <reg52.h>
#include "MacroAndConst.h"
#include "ds1302.h"
/*************************************************************************************************
定义静态变量
ds1302驱动引脚:slck/io/rst
**************************************************************************************************/
sbit sclk=P3^4;
sbit io=P3^6;
sbit rst=P3^5;
sbit ACC_7=ACC^7;
/*************************************************************************************************
函数名称:writebyte_ds1302()
函数功能:向DS1302中写一位数据
CPU_frequence:12Mhz
输入:无
输出:一个位bat
调用函数:无
**************************************************************************************************/
void writebyte_ds1302(uchar add,uchar date)
{
uchar i,temp;
bit bitemp;
rst=0;
sclk=0;
rst=1;
for(i=8;i>0;i--)
{
sclk=0;
temp=add;
bitemp=temp&0x01;
io=bitemp;
add=add>>1;
sclk=1;
}
for(i=8;i>0;i--)
{
sclk=0;
temp=date;
bitemp=temp&0x01;
io=bitemp;
date=date>>1;
sclk=1;
}
rst=0;
}
/*************************************************************************************************
函数名称:readbyte_ds1302()
函数功能:从DS1302中读一位数据
CPU_frequence:12Mhz
输入:无
输出:一个位bat
调用函数:无
**************************************************************************************************/
uchar readbyte_ds1302(uchar add)
{
uchar i,temp;
bit bitemp;
rst=0;
sclk=0;
rst=1;
for(i=8;i>0;i--)
{
sclk=0;
temp=add;
bitemp=temp&0x01;
io=bitemp;
add=add>>1;
sclk=1;
}
for(i=8;i>0;i--)
{
ACC_7=io;
sclk=0;
ACC=ACC>>1;
sclk=1;
}
rst=0;
temp=ACC;
return(temp);
}
/*************************************************************************************************
函数名称:initial_ds1302()
函数功能:ds1302初始化
CPU_frequence:12Mhz
输入:无
输出:无
调用函数:无
**************************************************************************************************/
void initial_ds1302()
{
writebyte_ds1302(0x8e,0x00); //开写保护
writebyte_ds1302(0x80,0x25);
writebyte_ds1302(0x82,0x30);
writebyte_ds1302(0x84,0x10);
writebyte_ds1302(0x8e,0x80);
}
DS1302.h代码如下:
#ifndef _ds1302_h_
#define _ds1302_h_
extern void writebyte_ds1302(uchar add,uchar date);
extern uchar readbyte_ds1302(uchar add);
extern void initial_ds1302(void);
#endif
main.c代码如下:
void main()
{
lcd_initial();
initial_ds1302();
while(1)
{
write_com(0x80);
P1=readbyte_ds1302(0x81);
write_date(readbyte_ds1302(0x81));
while(1);
}
}
全部代码:
读到LCD的始终是一个向左的箭头,郁闷了。
求大侠指导!
- /*******************************DS1302写数据(底层协议)**********************************/
- void write_clock(unsigned char ord, unsigned char dd)
- {
- clock_clk=0;
- clock_Rst=0;
- clock_Rst=1;
- clock_out(ord);
- clock_out(dd);
- clock_Rst=0;
- clock_clk=1;
- }
- /***************************1302驱动程序(底层协议)*********************************/
- void clock_out(unsigned char dd)
- {
- ACC=dd;
- clock_dat=a0; clock_clk=1; clock_clk=0;
- clock_dat=a1; clock_clk=1; clock_clk=0;
- clock_dat=a2; clock_clk=1; clock_clk=0;
- clock_dat=a3; clock_clk=1; clock_clk=0;
- clock_dat=a4; clock_clk=1; clock_clk=0;
- clock_dat=a5; clock_clk=1; clock_clk=0;
- clock_dat=a6; clock_clk=1; clock_clk=0;
- clock_dat=a7; clock_clk=1; clock_clk=0;
- }
- /******************************DS1302写入字节(底层协议)***************************/
- unsigned char clock_in(void)
- {
- clock_dat=1;
- a0=clock_dat;
- clock_clk=1; clock_clk=0; a1=clock_dat;
- clock_clk=1; clock_clk=0; a2=clock_dat;
- clock_clk=1; clock_clk=0; a3=clock_dat;
- clock_clk=1; clock_clk=0; a4=clock_dat;
- clock_clk=1; clock_clk=0; a5=clock_dat;
- clock_clk=1; clock_clk=0; a6=clock_dat;
- clock_clk=1; clock_clk=0; a7=clock_dat;
- return(ACC);
- }
- /*****************************DS1302读数据(底层协议)*********************************/
- unsigned char read_clock(unsigned char ord)
- {
- unsigned char dd=0;
- clock_clk=0;
- clock_Rst=0;
- clock_Rst=1;
- clock_out(ord);
- dd=clock_in();
- clock_Rst=0;
- clock_clk=1;
- return(dd);
- }
复制代码大侠,你的代码确认测试OK吗?
我准备拿你的代码做底层测试一下我的板子。
万分感谢,我马上写段代码测试一下板子。
硬件的问题也说不准。
我对了几段代码,和我的时序、延时基本一致,真不懂到底哪里出了问题。
自信研究了一下大侠的代码,发现了一点问题:
从DS1302读数据时候,时钟信号从高电平到低电平的脉冲目的是通知DS1302准备好数据,
所以要先把时钟线由高拉低,延时一段时间读IO口,代码:
SCLK=1;
SCLK=0;
DELAY_US(1);
DAT=IO;
而之前理解有误,总是先读IO口,再把时钟线由高到底,代码:
SCLK=1;
DAT=IO;
DELAY_US(1);
SCLK=0;
所以读出来的数据是错的,大侠帮忙分析一下我的理解对吗?
弄了两天,就是我说的这个问题,改过代码后测试通过了。
一周热门 更多>