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

DS1302程序

时间:10-02 整理:3721RD 点击:
写的DS1302+LCD1602的程序,运行后,年月日显示一直在闪烁,而且日,分,秒还会出现乱码(?),不知道是哪里出问题了。懂的指点一下。谢了。下面是程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit ds_io=P3^4;
sbit rst=P3^5;
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcde=P2^7;
uchar nian,yue,ri,shi,fen,miao,week;
uchar code table[]="20  -  -      ";
uchar code table1[]="   :  :  ";
uchar time_data[7]={13,5,8,16,0,20,50};//年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc();
void read_rtc();
void time_pros();
void delay(uint z)//延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void write_com(uchar com)//LCD1602写命令函数
{
        rs=0;
        rw=0;
        lcde=0;
        P0=com;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;
}
void write_data(uchar dat)//LCD1602写数据函数
{
        rs=1;
        rw=0;
        lcde=0;
        P0=dat;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;
}
void write_sfm(uchar add,uchar dat)//写时分秒函数
{
        uchar a,b;
        a=dat/16;
        b=dat%16;
        write_com(0x80+0x40+add);
    write_data(0x30+a);
    write_data(0x30+b);
}
void write_nyr(uchar add,uchar dat)//写年月日函数
{
         uchar shi,ge;
         shi=dat/16;
         ge=dat%16;
         write_com(0x80+add);
    write_data(0x30+shi);
    write_data(0x30+ge);
}
void write_week(uchar week)//写星期函数
{
        week=week%16;
        write_com(0x80+11);
        switch(week)
        {
                case 1:   write_data('M');
                                  delay(5);
                                  write_data('O');
                                  delay(5);
                                  write_data('N');
                                  break;
                case 2:   write_data('T');
                                  delay(5);
                                  write_data('U');
                                  delay(5);
                                  write_data('E');
                                  break;
      case 3:     write_data('W');
                                  delay(5);
                                  write_data('E');
                                  delay(5);
                                  write_data('N');
                                  break;
            case 4:   write_data('T');
                                  delay(5);
                                  write_data('H');
                                  delay(5);
                                  write_data('U');
                                  break;
                case 5:   write_data('F');
                                  delay(5);
                                  write_data('R');
                                  delay(5);
                                  write_data('I');
                                  break;
      case 6:     write_data('S');
                                  delay(5);
                                  write_data('A');
                                  delay(5);
                                  write_data('T');
                                  break;
                case 7:   write_data('S');
                                  delay(5);
                                  write_data('U');
                                  delay(5);
                                  write_data('N');
                                  break;
        }
}
void init()//初始化函数
{
   uchar i;
   write_com(0x38);//液晶初始化
   write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
   write_com(0x80);
    for(i=0;i<14;i++)//写时钟固定部分
        {
                write_data(table[i]);
                delay(1);
        }
        write_com(0x80+0x40);
    for(i=0;i<9;i++)
        {
                write_data(table1[i]);
                delay(1);
        }
}
void main()
{
         init();
//         set_rtc(); 初次上电是DS1302初始化
    read_rtc();//读出DS1302的时间
         time_pros();//时间转化并在液晶显示
}
void write_ds1302_byte(uchar dat)//向DS1302写一个字节
{
        uchar i;
        for(i=0;i<8;i++)
        {
                sck=0;
                ds_io=dat&0x01;
                dat=dat>>1;
                sck=1;
        }
}
void write_ds1302(uchar add,uchar dat)//向DS1302写数据
{
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
   _nop_();
        write_ds1302_byte(add);
   write_ds1302_byte(dat);
        rst=0;
        _nop_();
        sck=1;
        ds_io=1;
}
uchar read_ds1302(uchar add)//从1302读数据
{
   uchar i,tmp;
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        rst=1;
   _nop_();
        write_ds1302_byte(add);
        for(i=0;i<8;i++)
        {
                tmp=tmp>>1;
                sck=0;
                if(ds_io)
           tmp=tmp|0x80;
                sck=1;
        }
        rst=0;
        _nop_();
        sck=0;
        _nop_();
        ds_io=1;
        return tmp;
}
void set_rtc()//1302上电初始化
{
        uchar i,j;
        for(i=0;i<7;i++)
        {
                j=time_data[i]/10;//取十位
                time_data[i]=time_data[i]%10;//取个位
                time_data[i]=j*16+time_data[i];
        }
        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()//从DS1302读出时间
{
        uchar i;
        for(i=0;i<7;i++)
        {
                time_data[i]=read_ds1302(read_add[i]);
        }
}
void time_pros()//时间转化并显示函数
{
/*        nian=time_data[0];
        week=time_data[1];
        yue=time_data[2];
        ri=time_data[3];
        shi=time_data[4];
        fen=time_data[5];
        miao=time_data[6];
        write_nyr(2,nian);
        write_week(week);
        write_nyr(5,yue);
    write_nyr(8,ri);
    write_sfm(1,shi);
    write_sfm(4,fen);
    write_sfm(7,miao);*/
    write_nyr(2,time_data[0]);
         write_week(time_data[1]);
         write_nyr(5,time_data[2]);
    write_nyr(8,time_data[3]);
    write_sfm(1,time_data[4]);
    write_sfm(4,time_data[5]);
    write_sfm(7,time_data[6]);
}

void main()
{
         init();
//         set_rtc(); 初次上电是DS1302初始化
      while(1)
       {  read_rtc();//读出DS1302的时间
         time_pros();//时间转化并在液晶显示
        }
}     试试看

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

网站地图

Top