DS1302的分寄存器读写异常求助
代码如下/*硬件连接方式
sbit DS1302_SCLK =P2^7; //时钟
sbit DS1302_IO =P2^6;//数据
sbit DS1302_CE =P2^5; //使能
*/
#define SECOND_W0x80 //对秒寄存器进行写操作
#define SECOND_R0x81 //对秒寄存器进行读操作
#define MINUTE_W0x82 //对分寄存器进行写操作
#define MINUTE_R 0x83 //对分寄存器进行读操作
#define HOUR_W 0x84 //对小时寄存器进行写操作
#define HOUR_R 0x85 //对小时寄存器进行读操作
/**************************************************************************
* 名 称: void DS1302_write_byte(uchar dat)
* 功 能: 向DS1302写入一个字节数据
* 说 明:
* 输 入: dat 要写入的数据
* 输 出:
**************************************************************************/
void DS1302_write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++) //开始传输8个字节的数据
{
DS1302_SCLK=0; //初始时钟线置为0
DS1302_IO=dat&0x01; //取最低位,注意DS1302的数据和地址都是从最低位开始传输的
DS1302_SCLK=1; //时钟线拉高,制造上升沿,SDA的数据被传输
dat>>=1; //数据右移一位,准备传输下一位数据
}
}
/**************************************************************************
* 名 称: uchar DS1302_read_byte()
* 功 能: 从DS1302读一个字节的数据
* 说 明:
* 输 入:
* 输 出: 读出的数据 返回给 dat
**************************************************************************/
uchar DS1302_read_byte()
{
uchar i,dat;
for(i=0;i<7;i++)
{
DS1302_SCLK=0;
if(DS1302_IO==1)
{
dat=dat|0x80;
}
else
{
dat=dat&0x7f;
}
DS1302_SCLK=1; //产生下跳沿
dat=dat>>1;
}
return (dat);
}
/**************************************************************************
* 名 称: void DS1302_write(uchar addr,uchar dat)
* 功 能:
* 说 明:
* 输 入: 寄存器地址addr,要写入的数据dat
* 输 出:
**************************************************************************/
void DS1302_write(uchar addr,uchar dat)
{
DS1302_CE=0;
DS1302_SCLK=0;
DS1302_CE=1; //打开使能
DS1302_write_byte(addr);
DS1302_write_byte(dat);
DS1302_SCLK=1;
DS1302_CE=0; //关闭使能
}
/**************************************************************************
* 名 称: uchar DS1302_read(uchar addr)
* 功 能: 从DS1302读取地址addr数据
* 说 明:
* 输 入: uchar addr
* 输 出: 返回的数据 dat
**************************************************************************/
uchar DS1302_read(uchar addr)
{
uchar dat;
DS1302_CE=0;
DS1302_SCLK=0;
DS1302_CE=1; //打开使能
DS1302_write_byte(addr);
dat=DS1302_read_byte();
DS1302_SCLK=1;
DS1302_CE=0; //打开使能
return dat;
}
/**************************************************************************
* 名 称: void DS1302_init()
* 功 能: DS1302初始化
* 说 明:
* 输 入:
* 输 出:
***************************************************************************/
void DS1302_init()
{
DS1302_CE=0;
DS1302_SCLK=0;
DS1302_write(0x8e,0x00); //对0x8e寄存器操作,去掉写保护,对最高位WP写0
DS1302_write(0x90,0xab); //对0x8e寄存器操作,去掉写保护,对最高位WP写0
//对DS1302写入时间 20:24:22
DS1302_write(HOUR_W,0x13); //设置小时,模式24h制,
DS1302_write(0X82,0x13); //设置分钟
DS1302_write(SECOND_W,0x30); //设置秒并且使DS1302开始走时
DS1302_write(0x8e,0x80); //进行写保护
}
uchar time_buf={0,0,0,0,0,0,0}; //秒 分 时 日 月 星期 年
void read_time()
{
DS1302_write(0x8e,0x00); //对0x8e寄存器操作,去掉写保护,对最高位WP写0
hour=DS1302_read(HOUR_R);
minute=DS1302_read(0X83);
second=DS1302_read(SECOND_R);
//将读取到的16进制数时间转化为10进制
time_buf=second/16*10+second%16;
time_buf=minute/16*10+minute%16;
time_buf=hour/16*10+hour%16;
temp_second_shiwei=time_buf/10; //秒十位
temp_second_gewei =time_buf%10; //秒个位
temp_minute_shiwei=time_buf/10; //分十位
temp_minute_gewei =time_buf%10; //分个位
temp_hour_shiwei=time_buf/10; //时十位
temp_hour_gewei =time_buf%10; //十个位
}
单片机是stc12c5a60s2 12M晶振
时寄存器和秒寄存器的写入和读出都是正常的,就是分寄存器一直显示的是85,不知道是什么原因
注:显示程序肯定是没有问题的
希望高手帮忙解答下
页:
[1]