微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于DS1302时钟芯片程序问题

关于DS1302时钟芯片程序问题

时间:10-02 整理:3721RD 点击:
源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={"20  -  -   MON"};
uchar code table2[]={"  :  :  "};
uchar write_time[6]={13,7,17,11,10,0};
uchar write_com[6]={0x8c,0x88,0x86,0x84,0x82,0x80};
uchar i,miao,fen,shi,nian,yue,ri,text1=0;

/*DS1302时钟芯片与单片机引脚连接定义*/
sbit SCLK=P3^6;
sbit CE=P3^5;
sbit IO=P3^4;
/*1602LCD液晶显示屏与单片机引脚连接定义*/
sbit RS=P2^6;
sbit RW=P2^5;
sbit LCDE=P2^7;
void lcd_mang()
{
   RS=0;
   RW=1;
   LCDE=1;
   _nop_();
        _nop_();
        _nop_();
        _nop_();
   while(P0&0x80);
     LCDE=0;
}

/*延时函数*/
void delay(uchar z)
{
        uchar x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/*定时器初始化函数*/
void timer_init()
{
        TMOD=0x01;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}


/*1602LCD地址端定义*/
void write_1602com(uchar com)
{
    lcd_mang();
        RS=0;
        RW=0;
        LCDE=0;
        P0=com;
        delay(5);
        LCDE=1;
        delay(5);
        LCDE=0;
}
/*1602LCD数据端定义*/
void write_1602date(uchar date)
{
    lcd_mang();
        RS=1;
        RW=0;
        LCDE=0;
        P0=date;
        delay(5);
        LCDE=1;
        delay(5);
        LCDE=0;
}
/*1602LCD初始化*/
void LCD1602_init()
{
        write_1602com(0x38);
        write_1602com(0x0c);
        write_1602com(0x06);
        write_1602com(0x01);
        write_1602com(0x80+1);
        for(i=0;i<14;i++)
        {
                write_1602date(table1);
        }
        write_1602com(0x80+0x40+4);
        for(i=0;i<8;i++)
        {
                write_1602date(table2);
        }
}

/*CPU给DS1302写一个字节*/
void write_1302byte(uchar date)
{
        CE=1;
        for(i=0;i<8;i++)        //循环8次写入数据
        {
                SCLK=0;
                IO=date&0x01;   //取低字节
                date=date>>1;   //每取一次右移一次
                SCLK=1;
        }
}

/*CPU从DS1302读一个字节*/
uchar read_1302byte(uchar add)
{
        uchar text1=0x00;
        CE=0;
        _nop_();
        _nop_();
        SCLK=0;
        _nop_();
        _nop_();
        CE=1;
        _nop_();
        _nop_();
        write_1302byte(add);
        for(i=0;i<8;i++)
        {
                if(IO)          //关键点,判断IO口繁忙与否
                text1=text1|0x80;
                SCLK=0;
                text1=text1>>1;
                _nop_();
                _nop_();
                _nop_();
                SCLK=1;
        }
        return(text1);
}
/*写入DS1302,给出指定的地址与数据*/
void write_1302(uchar add,uchar date)
{
        _nop_();
        SCLK=0;
        _nop_();
        CE=1;
        _nop_();
        write_1302byte(add);
        write_1302byte(date);
        _nop_();
}

/*BCD码转换十进制码*/
uchar BCD_Decimal(uchar bcd)
{
        uchar decimal;
        decimal=bcd>>4;
        decimal=decimal*10+(bcd&0x0f);
        return(decimal);
}
/*DS1302初始化*/
void DS1302_init()
{
        uchar j;
        CE=0;
        _nop_();
        SCLK=0;
        _nop_();
        for(i=0;i<6;i++)
        {        
                j=write_time/10;
                write_time=write_time%10;
                write_time=j*16+write_time;
        }
        write_1302(0x8e,0x00);
        for(i=0;i<6;i++)
        {
                write_1302(write_com,write_time);//在执行一次该语句后,为何会跳出for循环?导致设置初始时钟时只能设置一个,求赐教
        }
        write_1302(0x8e,0x80);
        
}
/*时分秒函数*/
void write_sfm(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;
        write_1602com(add);
        write_1602date(0x30+shi);
        write_1602date(0x30+ge);
}
/*年月日函数*/
void write_nyr(uchar add,uchar date)
{
        uchar shi,ge;
        shi=date/10;
        ge=date%10;        
        write_1602com(add);
        write_1602date(0x30+shi);
        write_1602date(0x30+ge);
}
void main()
{
        LCD1602_init();
        timer_init();
        DS1302_init();
}

void timer0() interrupt 1
{
        TH0=(65536-1000)/256;                //1ms
        TL0=(65536-1000)%256;
        miao=BCD_Decimal(read_1302byte(0x81));
        fen=BCD_Decimal(read_1302byte(0x83));
        shi=BCD_Decimal(read_1302byte(0x85));
        nian=BCD_Decimal(read_1302byte(0x8d));
        yue=BCD_Decimal(read_1302byte(0x89));
        ri=BCD_Decimal(read_1302byte(0x87));               
        write_sfm(0x80+0x40+10,miao);
        write_sfm(0x80+0x40+7,fen);
        write_sfm(0x80+0x40+4,shi);
        write_nyr(0x80+3,nian);
        write_nyr(0x80+6,yue);
        write_nyr(0x80+9,ri);        
}

@摆渡手8023 @jianhong_wu @瓶水143
来自小组: 51单片机群

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top