找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

DS1302数码管时钟求助

[复制链接]
buzaiyouyv 发表于 2013-10-1 21:31:19 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
在网上看了51单片机的教程,下面是程序,对照我的实验板,把段码和位选都改正确了,sck,io,rst等位置也改了,但是数码管一直显示99-99-99,
求大神找原因,万分感谢,我看了一天都没找到问题
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
sbit smgen=P1^0;

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};        //段选
unsigned char code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};           //位选


uchar time_data[7]={1,1,1,1,1,18,1};        //年周月日时分秒

uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};        //寄存器地址  写
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};                //寄存器地址  读
uchar disp[8];

/**********************函数声明************************/
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc(void);
void read_rtc(void);
void time_pros(void);
void display(void);                  
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
        uchar j;
        for(;t>0;t--)
        for(j=110;j>0;j--);
}
/*****************DS1302底层驱动函数**********************/
void write_ds1302_byte(uchar dat)                  //写单个字节地址/数据
{
        uchar i;
        for(i=0;i<8;i++)          //经八次循环后数据/地址写入
        {
                sck=0;
                io=dat&0x01;          //把要写入数据/地址最低位赋给io,其他位置0
                dat=dat>>1;                  //数据右移一位
                sck=1;                          //将数据写入
        }
}

void write_ds1302(uchar add,uchar dat)          //写多个字节地址/数据
{
        rst=0;
        _nop_();
        sck=0;_nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);                //写入地址
        write_ds1302_byte(dat);            //写入数据         
        rst=0;
        _nop_();
        io=1;
        sck=1;
}

uchar read_ds1302(uchar add)                 //读多个字节数据
{
        uchar i,value;
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
        _nop_();
        write_ds1302_byte(add);       //读数据前要先写入数据的地址
        for(i=0;i<8;i++)
        {
                value=value>>1;
                sck=0;
                if(io)
                value=value|0x80;
                sck=1;               

        }
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        sck=1;
        io=1;
        return value;
}
/**************************底层驱动函数**************************/

void set_rtc(void)               
{
        uchar i,j;
        for(i=0;i<7;i++)                           //转换成BCD码
        {
                j=time_data[i]/10;
                time_data[i]=time_data[i]%10;
                time_data[i]=time_data[i]+j*16;               
        }
        write_ds1302(0x8e,0x00);        //去除写保护
        for(i=0;i<7;i++)
        {
                write_ds1302(write_add[i],time_data[i]);
        }
        write_ds1302(0x8e,0x80);        //加写保护
}
                                                          
void read_rtc(void)
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_data[i]=read_ds1302(read_add[i]);
        }       
}

void time_pros(void)                 //处理函数,将BCD码转换成十进制
{
        disp[0]=time_data[6]%16;
        disp[1]=time_data[6]/16;
        disp[2]=10;
        disp[3]=time_data[5]%16;
        disp[4]=time_data[5]/16;
        disp[5]=10;
        disp[6]=time_data[4]%16;
        disp[7]=time_data[4]/16;       
}

void display(void)                   //扫描函数
{
        uchar i;
        for(i=0;i<8;i++)
        {
        P0=smg_du[disp[i]];
        P2=smg_we[i];
        delay_50us(7);
        }
}


void main(void)                   //主函数
{
        set_rtc();                 //时间初始值
        while(1)
        {
                smgen=0;          //段码锁存端
                read_rtc();          //读入时间值
                smgen=1;
                time_pros();   //处理函数,将BCD码转换成十进制
                display();           //扫描函数
        }

}
techxuan 发表于 2013-10-8 00:53:04 | 显示全部楼层
给段代码你参考。

ds1302.rar

2.13 KB, 下载次数: 3, 下载积分: M币 -5

*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 15:06 , Processed in 0.057059 second(s), 13 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表