niaiwma003 发表于 2012-9-8 16:52:21

我做了一个电子钟出现了乱码在仿真中没有问题

本帖最后由 niaiwma003 于 2012-9-8 17:12 编辑

我做了一个数码管电子钟出现了乱码,21个数码管统一跳乱码,乱码也看不清楚,下面是电路图,在仿真中没有问题请大哥帮我看一下程序,程序那里有问题了帮我修一下,我个大哥磕头了,我万辈感谢。
#include<reg52.h>
#include<intrins.h>
//#include<key.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P3^0;
sbit A=P0^0;
sbit b=P0^1;
sbit C=P0^2;
sbit D=P0^3;
sbit E=P0^4;
sbit H=P0^5;
sbit S=P0^6;
sbit X=P0^7;

sbit SCLK=P3^1;          //DS1302通讯线定义
sbit DIO=P3^2;
sbit RST=P3^3;
sbit dq=P3^4;
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;
sbit k4=P3^0;
sbit speak=P0^0;
uchar code smgw[]={0,1,2,3,4,5,6,7};
uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchartab1;
uchartab2;
uchar nian,yue,ri,zhou,shi,fen,miao,nnian,nyue,nri,wen,a,shan,tt,shan;
uchar knum,k_d_s;
uchar year,month,day;
uchar sw,gw;
uchar tplsb,tpmsb;

uchar codeyear_code[]=
{
   0x4d,0x4A,0xB8,//2001
   0x0d,0x4A,0x4C,//2002
   0x0d,0xA5,0x41,//2003
   0x25,0xAA,0xB6,//2004
   0x05,0x6A,0x49,//2005
   0x7A,0xAd,0xBd,//2006
   0x02,0x5d,0x52,//2007
   0x09,0x2d,0x47,//2008
   0x5C,0x95,0xBA,//2009
   0x0A,0x95,0x4e,//2010
   0x0B,0x4A,0x43,//2011
   0x4B,0x55,0x37,//2012
   0x0A,0xd5,0x4A,//2013
   0x95,0x5A,0xBf,//2014
   0x04,0xBA,0x53,//2015
   0x0A,0x5B,0x48,//2016
   0x65,0x2B,0xBC,//2017
   0x05,0x2B,0x50,//2018
   0x0A,0x93,0x45,//2019
   0x47,0x4A,0xB9,//2020
   0x06,0xAA,0x4C,//2021
   0x0A,0xd5,0x41,//2022
   0x24,0xdA,0xB6,//2023
   0x04,0xB6,0x4A,//2024
   0x69,0x57,0x3d,//2025
   0x0A,0x4e,0x51,//2026
   0x0d,0x26,0x46,//2027
   0x5e,0x93,0x3A,//2028
   0x0d,0x53,0x4d,//2029
   0x05,0xAA,0x43,//2030
   0x36,0xB5,0x37,//2031
   0x09,0x6d,0x4B,//2032
   0xB4,0xAe,0xBf,//2033
   0x04,0xAd,0x53,//2034
   0x0A,0x4d,0x48,//2035
   0x6d,0x25,0xBC,//2036
   0x0d,0x25,0x4f,//2037
   0x0d,0x52,0x44,//2038
   0x5d,0xAA,0x38,//2039
   0x0B,0x5A,0x4C,//2040
   0x05,0x6d,0x41,//2041
   0x24,0xAd,0xB6,//2042
   0x04,0x9B,0x4A,//2043
   0x7A,0x4B,0xBe,//2044
   0x0A,0x4B,0x51,//2045
   0x0A,0xA5,0x46,//2046
   0x5B,0x52,0xBA,//2047
   0x06,0xd2,0x4e,//2048
   0x0A,0xdA,0x42,//2049
   0x35,0x5B,0x37,//2050
   0x09,0x37,0x4B,//2051
   0x84,0x97,0xC1,//2052
   0x04,0x97,0x53,//2053
   0x06,0x4B,0x48,//2054
   0x66,0xA5,0x3C,//2055
   0x0e,0xA5,0x4f,//2056
   0x06,0xB2,0x44,//2057
   0x4A,0xB6,0x38,//2058
   0x0A,0xAe,0x4C,//2059
   0x09,0x2e,0x42,//2060
   0x3C,0x97,0x35,//2061
   0x0C,0x96,0x49,//2062
   0x7d,0x4A,0xBd,//2063
   0x0d,0x4A,0x51,//2064
   0x0d,0xA5,0x45,//2065
   0x55,0xAA,0xBA,//2066
   0x05,0x6A,0x4e,//2067
   0x0A,0x6d,0x43,//2068
   0x45,0x2e,0xB7,//2069
   0x05,0x2d,0x4B,//2070
   0x8A,0x95,0xBf,//2071
   0x0A,0x95,0x53,//2072
   0x0B,0x4A,0x47,//2073
   0x6B,0x55,0x3B,//2074
   0x0A,0xd5,0x4f,//2075
   0x05,0x5A,0x45,//2076
   0x4A,0x5d,0x38,//2077
   0x0A,0x5B,0x4C,//2078
   0x05,0x2B,0x42,//2079
   0x3A,0x93,0xB6,//2080
   0x06,0x93,0x49,//2081
   0x77,0x29,0xBd,//2082
   0x06,0xAA,0x51,//2083
   0x0A,0xd5,0x46,//2084
   0x54,0xdA,0xBA,//2085
   0x04,0xB6,0x4e,//2086
   0x0A,0x57,0x43,//2087
   0x45,0x27,0x38,//2088
   0x0d,0x26,0x4A,//2089
   0x8e,0x93,0x3e,//2090
   0x0d,0x52,0x52,//2091
   0x0d,0xAA,0x47,//2092
   0x66,0xB5,0x3B,//2093
   0x05,0x6d,0x4f,//2094
   0x04,0xAe,0x45,//2095
   0x4A,0x4e,0xB9,//2096
   0x0A,0x4d,0x4C,//2097
   0x0d,0x15,0x41,//2098
   0x2d,0x92,0xB5,//2099
};

uchar codeday_code1={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
uint codeday_code2={0x111,0x130,0x14e};
ucharcodetable_week={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=60;y>0;y--);
}






void write(uchar date)                              //写入DS1302一个字节
{
        uchar temp,i;
        RST=1;
        SCLK=0;
        temp=date;
        for(i=0;i<8;i++)
        {
                SCLK=0;
                if(temp&0x01)
                        DIO=1;
                else
                        DIO=0;
                SCLK=1;
                temp>>=1;
        }       
}

uchar read()                                              //读出DS1302一个字节
{
        uchar a,temp;
        RST=1;
        for(a=8;a>0;a--)
        {       
          temp>>=1;
                SCLK=1;       
                _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
                SCLK=0;
               if(DIO)
                {
                  temp=temp|0x80;
                }
                else
                {
                  temp=temp|0x00;
                }
        }
        return (temp);
}

void write_1302(uchar add,uchar dat)//写DS1302数据
{
   
        RST=0;
        SCLK=0;
        RST=1;
        write(add);
        write(dat);
        SCLK=1;
        RST=0;
}

uchar read_1302(uchar add)                 //读DS1302数据
{
        uchar dat1,dat2;
        RST=0;
        SCLK=0;
        RST=1;
        write(add);
        dat1=read();
        SCLK=1;
        RST=0;
        dat1=ACC;                                                                ///?????
    dat2=dat1/16;                           //数据进制转换
    dat1=dat1%16;                         //十六进制转十进制
    dat1=dat1+dat2*10;
        return(dat1);
}

void ds1302_init()              //1302初始化
{
        RST=0;
        SCLK=0;
        write_1302(0x8e,0x00); //允许写入
/*        write_1302(0x84,0x00);        //24小时制

        write_1302(0x80,0x00);//设置初始值SEC       
        write_1302(0x82,0x59);//设置初始值MIN
        write_1302(0x84,0x23);//设置初始值HR
        write_1302(0x86,0x26);//设置初始值DATE
        write_1302(0x88,0x04);//设置初始值MONTH       
        write_1302(0x8A,0x03);//设置初始值DAY       
        write_1302(0x8C,0x09);//设置初始值YEAR       
                                                                                                        */
        write_1302(0x90,0xa5);//启动充电功能       
        write_1302(0x8e,0x80);
       
}

void Converweek()
{
   uchar temp2;   

        year =nian&0x7f; //加载年月日数据,如为BCD则需转为十进制
        month=yue;
        day =ri;
   year+=100;
   temp2=year+year/0x4;
   temp2=temp2%0x7;
   temp2=temp2+day+table_week;
   if (year%0x4==0&&month<3)temp2-=1;
   zhou=temp2%0x7;
   if(zhou==0)
                   zhou=8;
       
// return week_dat;
}


bit get_moon_day(uchar month_p,uint table_addr)
{
        switch (month_p)
        {
          case 1: {if((year_code&0x08)==0) return(0);else return(1);}
          case 2: {if((year_code&0x04)==0) return(0);else return(1);}
          case 3: {if((year_code&0x02)==0) return(0);else return(1);}
          case 4: {if((year_code&0x01)==0) return(0);else return(1);}
          case 5: {if((year_code&0x80)==0) return(0);else return(1);}
          case 6: {if((year_code&0x40)==0) return(0);else return(1);}
          case 7: {if((year_code&0x20)==0) return(0);else return(1);}
          case 8: {if((year_code&0x10)==0) return(0);else return(1);}
          case 9: {if((year_code&0x08)==0) return(0);else return(1);}
          case 10: {if((year_code&0x04)==0) return(0);else return(1);}
          case 11: {if((year_code&0x02)==0) return(0);else return(1);}
          case 12: {if((year_code&0x01)==0) return(0);else return(1);}
          case 13: {if((year_code&0x80)==0) return(0);else return(1);}
       }
}

voidConversion()
{
   uchartemp1,temp2,temp3,month_p;
   uinttemp4,table_addr;
//   uint dat_return,dat_buffer;
   bitflag_y;
   
   year =nian&0x7f; //加载年月日数据,如为BCD则需转为十进制
        month=yue;
        day =ri;

   table_addr=(year-1)*3;
   
   temp1=year_code&0x60;
   temp1=_cror_(temp1,5);   
   temp2=year_code&0x1f;   
   if(temp1==0x1)
   {
      temp3=temp2-1;
    }
   else
   {
      temp3=temp2+0x1f-1;
    }   
   if (month<10)
   {
      temp4=day_code1+day-1;
    }
   else
   {
      temp4=day_code2+day-1;
    }
   if ((month>0x2)&&(year%0x4==0))
   {
      temp4+=1;
    }
   if (temp4>=temp3)
   {
      temp4-=temp3;
   month=0x1;
      month_p=0x1;
      flag_y=0;
      if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
   else temp1=0x1e;
      temp2=year_code/16;
      while(temp4>=temp1)
   {
         temp4-=temp1;
         month_p+=1;
         if(month==temp2)
       {
         flag_y=~flag_y;
         if(flag_y==0)month+=1;
          }
         else month+=1;
         if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
         else temp1=0x1e;
       }
      day=temp4+1;
    }
   else
   {
      temp3-=temp4;
       year-=1;
      table_addr-=0x3;
      month=0xc;
      temp2=year_code/16;
      if (temp2==0)month_p=0xc;
      else month_p=0xd;
      flag_y=0;
      if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
      else temp1=0x1e;
      while(temp3>temp1)
   {
         temp3-=temp1;
         month_p-=1;
         if(flag_y==0)month-=1;
         if(month==temp2)flag_y=~flag_y;
         if(get_moon_day(month_p,table_addr)==0)temp1=0x1d;
         else temp1=0x1e;
      }
      day=temp1-temp3+1;
    }   
        nnian= year|(nian&0x80);; //将农历信息写进指定变量
        nyue = month;
        nri = day;
        Converweek();
/* dat_buffer=0;
dat_return=0;
dat_buffer=(uint)year;
dat_buffer<<=9;
dat_return|=dat_buffer;
dat_buffer=(uint)month;
dat_buffer<<=5;
dat_return|=dat_buffer;
dat_return|=(uint)day;          */
//return dat_return;
}





/*********************************
************18B20****************
*********************************/


//DS18B20
void delayms(uchar count)                //延时count ms子程序
{
    uchar i,j;
    do
    {
      for(i=5;i>0;i--)
      for(j=98;j>0;j--);
    }while(--count);
}

//延时us
void delayus(uchar us)
{
        while(us--);
}

//产生900US复位脉冲,初始化18b20
void init18b20()
{
        dq=0;                        //
        delayus(100);
        dq=1;                        //产生上升沿后延时15~60us
        while(~dq);
        delayus(8);                //拉低总线60~240us产生应答脉冲
}

//读数据的一位
bit rdbit(void)
{
        bit b;
        dq=0;
        _nop_();
        _nop_();                //保持低至少1us
        dq=1;
        _nop_();                //延时15us以上读时序下降沿后15us 18b20输出属有效
        _nop_();
        b=dq;
        delayus(8);                //读时序不低于60us
        return (b);
}

//读取数据的一个字节
uchar rdbyte(void)
{
        uchar i,j,b;
        b=0;
        for(i=1;i<=8;i++)
        {
                j=rdbit();
                b=(j<<7)|(b>>1);//接收到的数据从最高为往下移
        }
return(b);
}

//写数据的一字解
void wrbyte(uchar b)
{
        uchar j;
        bit btmp;
        for(j=1;j<=8;j++)
        {
                btmp=b&0x01;
                b=b>>1;
                if(btmp)//写1
                {
                        dq=0;
                        _nop_();
                        _nop_();
                        dq=1;
                        delayus(8);//读时隙不低于60us
                }
                else
                {
                        dq=0;//写0
                        delayus(8);//读时隙不低于60us
                        dq=1;
                        _nop_();
                        _nop_();
                }
        }
}

//启动温度转换
/*void convert(void)
{
        init18b20();
        delayms(1);
        wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
        wrbyte(0x44);//开始温度转换
}
                                   */
//读取温度
void rdtemp(void)
{
        init18b20();
        delayms(1);
        wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
        wrbyte(0x44);//开始温度转换
        init18b20();
        delayms(1);
        wrbyte(0xcc);//此命令用于但挂接总线系统 无须提供64为ROM序列号;跳过ROM
        wrbyte(0xbe);//此命令读取暂存器内容
                                                                                       
        tplsb=rdbyte();//温度低8为,其中低四位为小数位
        tpmsb=rdbyte();//温度高8位,其中高5位为符号位
        tplsb >>= 4;
        tpmsb <<= 4;
        gw=tplsb | tpmsb;
        if(gw & 0x80)
                {
                        sw=10;
                        gw=~gw+1;
                }
        else
                {
                        sw=11;

                }

}


void display()
{
       
       miao=read_1302(0x81);          //读秒
       fen=read_1302(0x83);          //读分
       shi=read_1302(0x85);//&0x3f;//读时
       ri=read_1302(0x87);          //读日
       yue=read_1302(0x89);          //读月
       nian=read_1302(0x8d);          //读年
        // zhou=read_1302(0x8B);          //读星期       
          rdtemp();
          Conversion();
          Converweek();


   D=0;E=0;H=1;   //位选
       
               A=0;b=0;C=0;
                P2=smgd;
                delay(1);                                       
                A=1;b=0;C=0;
                P2=smgd;
                delay(1);

               A=0;b=1;C=0;
                P2=smgd;
                delay(1);                                       
                A=1;b=1;C=0;
                P2=smgd;
                delay(1);

                  A=0;b=0;C=1;
                P2=smgd;
                delay(1);
                A=1;b=0;C=1;               
                P2=smgd;
                delay(1);
       

        D=1;
        E=0;
        H=0;
        if(knum==6)
        {                       
                A=0;b=0;C=0;
                P2=0x5b&shan;
                delay(1);
                A=1;b=0;C=0;
                P2=0x3f&shan;
                delay(1);          
                A=0;b=1;C=0;
                P2=smgd&shan;
                delay(1);                                       
                A=1;b=1;C=0;
                P2=smgd&shan;
                delay(1);
        }
        else
        {
                               
                A=0;b=0;C=0;
                P2=0x5b;
                delay(1);
                A=1;b=0;C=0;
                P2=0x3f;
                delay(1);          
          A=0;b=1;C=0;
                P2=smgd;
                delay(1);                                       
                A=1;b=1;C=0;
                P2=smgd;
                delay(1);
        }          
        if(knum==5)
        {                       
                A=0;b=0;C=1;                                //        月
                P2=smgd&shan;
                delay(1);          
                A=1;b=0;C=1;
                P2=smgd&shan;
          delay(1);
        }
        else
        {
                A=0;b=0;C=1;                                //        月
                P2=smgd;
                delay(1);          
                A=1;b=0;C=1;
                P2=smgd;
                delay(1);
        }
        //周
        {
                A=0;b=1;C=1;                                //        星期
                P2=smgd;
                delay(1);
        }

        D=0;
        E=1;
        H=0;
        if(knum==4)
        {                          
                       
                A=0;b=0;C=0;                                   //       日
                P2=smgd&shan;
                delay(1);                                       
                A=1;b=0;C=0;
                P2=smgd&shan;
                delay(1);
        }
        else
        {
                A=0;b=0;C=0;                                   //       日
                P2=smgd;
                delay(1);                                       
                A=1;b=0;C=0;
                P2=smgd;
                delay(1);
        }          
        if(knum==3)
        {       
                        S=0;X=0;
                A=0;b=1;C=0;                                //       时
                P2=smgd&shan;
                delay(1);                                       
                A=1;b=1;C=0;
                P2=smgd&shan;
                delay(1);
        }
        else
        {
                if(shi>12)
                {
                        shi-=12;
                        S=0;X=1;
                        A=0;b=1;C=0;                                //       时
                        P2=smgd;
                        delay(1);                                       
                        A=1;b=1;C=0;
                        P2=smgd;
                        delay(1);
                }
                else
                {
                        S=1;X=0;
                        A=0;b=1;C=0;                                //       时
                        P2=smgd;
                        delay(1);                                       
                        A=1;b=1;C=0;
                        P2=smgd;
                        delay(1);
                }

        }          
        if(knum==2)
        {          
                A=0;b=0;C=1;                           //          分
                P2=smgd&shan;
                delay(1);                                       
                A=1;b=0;C=1;
                P2=smgd&shan;
                delay(1);
        }
        else
        {
                A=0;b=0;C=1;                           //          分
                P2=smgd;
                delay(1);                                       
                A=1;b=0;C=1;
                P2=smgd;
                delay(1);
        }          
        if(knum==1)
        {   
                A=0;b=1;C=1;                                  //          秒
                P2=smgd&shan;
                delay(1);                                       
                A=1;b=1;C=1;
                P2=smgd&shan;
        //        delay(1);
        }
        else
        {
                A=0;b=1;C=1;                                  //秒
                P2=smgd;
                delay(1);                                       
                A=1;b=1;C=1;
                P2=smgd;
        //        delay(1);
        }                                                         
}


void key()
{                   //
       
        uchar temp;
//        display();
       
   
        if(k1==0)
       {
               delay(20);
                if(k1==0)
                {
                        while(!k1);
                        knum++;
                        if(knum==1)
                        {
                                temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
                                write_1302(0x8e,0x00); //允许写,禁止写保护
                                write_1302(0x80,0x80|temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                          write_1302(0x8e,0x80); //打开写保护
       
                        }
                        if(knum==7)
                        {
                                knum=0;
                        //        write_1302 (0x8e,0X00);//禁止写保护       
                        //        write_1302 (0x80,0x7f&temp); //时钟恢复       
                        //        write_1302 (0x8e,0x80);//允许写保护
                          write_1302(0x8e,0x00);
                        write_1302(0x80,0x00|temp);//miao数据写入DS1302
                        write_1302(0x8e,0x80);                       
                        }


                }
       }
       
       if(knum!=0)
       {
              
                        if(k4==0)
               {
                          delay(20);
                        if(k4==0)
                        {
                          while(!k4);
                          //         k_d_s=1;
                                knum=0;
                          write_1302(0x8e,0x00);
                        write_1302(0x80,0x00|temp);//miao数据写入DS1302
                        write_1302(0x8e,0x80);                       
                          
                        }
               }

               if(k2==0)
                {
                        delay(20);
                        if(k2==0)
                        {
                                while(!k2);
                                switch(knum)
                                {
                                        case 1:miao++;                               
                                                        if(miao==60)                               
                                                                miao=0;                                                                       
                                                        temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                        case 2:fen++;
                                                        if(fen==60)                                       
                                                                fen=0;                                       
                                                        temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x82,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护                                        }
                                                        break;
                                        case 3:shi++;
                                                        if(shi==24)                               
                                                                shi=0;
                                                 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x84,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                        case 4:ri++;
                                                switch(yue)
                                                        {
                                                               case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                                                                               if(ri==32)
                                                                                       ri=1;
                                                               break;
                                                               case 4:case 6:case 9:case 11:
                                                                               if(ri==31)
                                                                                       ri=1;
                                                               break;
                                                               case 2:
                                                                               if(nian%4==0||nian%400==0)
                                                                                {
                                                                                        if(ri==30)
                                                                                                ri=1;
                                                                                }
                                                                                else
                                                                                {
                                                                                        if(ri==29)
                                                                                                ri=1;
                                                                                }
                                                                  break;
                                                        }                                                                       
                                                  temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x86,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                                                       
                                        case 5:yue++;
                                                        if(yue==13)
                                                               yue=1;
                                                  temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护       
                                                        break;                               
                                        case 6:nian++;
                                                        if(nian==99)
                                                                nian=0;
                                                  temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x8c,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                }               
                                                  
                        }
                }
                if(k3==0)
                {
                        delay(20);
                        if(k3==0)
                        {
                                while(!k3);
                                switch(knum)
                                {
                                        case 1:miao--;                               
                                                        if(miao==-1)                               
                                                                miao=59;                                                                       
                                                        temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                        case 2:fen--;
                                                        if(fen==-1)                                       
                                                                fen=59;                                       
                                                        temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x82,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护                                        }
                                                        break;
                                        case 3:shi--;
                                                        if(shi==-1)                               
                                                                shi=23;
                                                 temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x84,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                        case 4:ri--;
                                                switch(yue)
                                                        {
                                                               case 1:case 3:case 5:case 7:case 8:case 10:case 12:
                                                                               if(ri==0)
                                                                                       ri=31;
                                                               break;
                                                               case 4:case 6:case 9:case 11:
                                                                               if(ri==0)
                                                                                       ri=30;
                                                               break;
                                                               case 2:
                                                                               if(nian%4==0||nian%400==0)
                                                                                {
                                                                                        if(ri==0)
                                                                                                ri=29;
                                                                                }
                                                                                else
                                                                                {
                                                                                        if(ri==0)
                                                                                                ri=28;
                                                                                }
                                                                  break;
                                                        }                                                                       
                                                  temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x86,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                                                       
                                        case 5:yue--;
                                                        if(yue==0)
                                                               yue=12;
                                                  temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护       
                                                        break;                               
                                        case 6:nian--;
                                                        if(nian==-1)
                                                                nian=99;
                                                  temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码
                                                        write_1302(0x8e,0x00); //允许写,禁止写保护
                                                        write_1302(0x8c,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
                                                  write_1302(0x8e,0x80); //打开写保护
                                                        break;
                                }               
                                                  
                        }
                }
       }
}
void main()
{
        ds1302_init();
        init18b20();
        TMOD=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        shan=0x00;
               
        while(1)
        {       
               
                key();                       
                display();
                               
        }
}

void time0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tt++;
        if(tt==9)
        {
                tt=0;
                shan=~shan;
        }
}

xiaoaf 发表于 2012-9-8 19:16:34

在1302 写 和 读命令的时候最好把中断暂时关闭

niaiwma003 发表于 2012-9-8 20:00:19

xiaoaf 发表于 2012-9-8 19:16 static/image/common/back.gif
在1302 写 和 读命令的时候最好把中断暂时关闭

我是新手,读命令的时候最好把中断暂时关闭,怎么关闭呀 ?我问的请哥不要生气,我是新手,请哥说的详细点谢谢你

ds168 发表于 2012-9-8 21:12:40

{:victory:}{:victory:}{:victory:}

xiaoaf 发表于 2012-9-9 15:18:46

niaiwma003 发表于 2012-9-8 20:00 static/image/common/back.gif
我是新手,读命令的时候最好把中断暂时关闭,怎么关闭呀 ?我问的请哥不要生气,我是新手,请哥说的详 ...

例如这个写字节的函数
void wrbyte(uchar b)
{
      uchar j;
      bit btmp;
   TR0=0;                  //一进入把你用的定时器 先暂时关闭
      for(j=1;j<=8;j++)
      {
                btmp=b&0x01;
                b=b>>1;
                if(btmp)//写1
                {
                        dq=0;
                        _nop_();
                        _nop_();
                        dq=1;
                        delayus(8);//读时隙不低于60us
                }
                else
                {
                        dq=0;//写0
                        delayus(8);//读时隙不低于60us
                        dq=1;
                        _nop_();
                        _nop_();
                }
      }
    TR0=1;//函数退出时再开启, 防止 写和读字节的时候被中断打断
}

more 发表于 2012-9-9 16:21:35

2楼说的没错,我遇到过这样的问题。

niaiwma003 发表于 2012-9-9 19:10:15

xiaoaf 发表于 2012-9-9 15:18 static/image/common/back.gif
例如这个写字节的函数
void wrbyte(uchar b)
{


哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还是程序有问题?请哥在帮我修修,谢谢哥了

gaoyichuan000 发表于 2012-9-9 22:03:31

xiaoaf 发表于 2012-9-9 15:18
例如这个写字节的函数
void wrbyte(uchar b)
{


直接关EA就OK了

xiaoaf 发表于 2012-9-9 22:04:11

niaiwma003 发表于 2012-9-9 19:10 static/image/common/back.gif
哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还 ...

具体是什么样的跳变? 有正常显示的时候么

gaoyichuan000 发表于 2012-9-9 22:04:21

niaiwma003 发表于 2012-9-9 19:10
哥还是不行呀?你的方法我试了,年月日,时分秒,还有温度都是一起跳变看不清楚是什么,是电路有问题?还 ...

没准是你把数码管的线接错了

xiaoaf 发表于 2012-9-9 22:08:41

void write(uchar date)                              //写入DS1302一个字节
uchar read()                                              //读出DS1302一个字节
按我说的这2个函数都要关中断,再开中断

sf49ers 发表于 2012-9-9 22:19:02

既然是新手,就不要想一口吃成胖子
先把按键,读1302,读温度什么的都去掉,只留显示。先把显示调正确了,再一点点加

fghlw 发表于 2012-9-10 07:33:35

时钟一致?硬件连接正常?

zcx2012 发表于 2012-9-10 09:48:54

数码管动态显示点亮后要关闭,还有延时函数可能也要改。

4152 发表于 2012-9-10 10:21:45

同意12L的意见,一步一步来是王道

niaiwma003 发表于 2012-9-11 21:12:23

个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了

niaiwma003 发表于 2012-9-11 21:12:51

4152 发表于 2012-9-10 10:21 static/image/common/back.gif
同意12L的意见,一步一步来是王道

个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了

niaiwma003 发表于 2012-9-11 21:13:24

more 发表于 2012-9-9 16:21 static/image/common/back.gif
2楼说的没错,我遇到过这样的问题。

个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了

niaiwma003 发表于 2012-9-11 21:14:16

xiaoaf 发表于 2012-9-9 22:08 static/image/common/back.gif
void write(uchar date)                              //写入DS1302一个字节
uchar read()                ...

个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了

niaiwma003 发表于 2012-9-11 21:14:45

sf49ers 发表于 2012-9-9 22:19 static/image/common/back.gif
既然是新手,就不要想一口吃成胖子
先把按键,读1302,读温度什么的都去掉,只留显示。先把显示调正确了, ...

个位大哥你们说的我都试了还是和以前一样,一点都没有进展,帮帮忙吧,我在这里给你磕头了

elecfun 发表于 2012-9-11 21:29:51

先确定乱码是DS1302的数据读错了,还是单纯的显示问题。
把读数据那块去掉,自己赋值。

显示那块先一个一个测试,先只显示第一组的,看能不能正常显示。

你电路图太小了,看不清,仿真只能做个参考。

niaiwma003 发表于 2012-9-12 10:43:06

elecfun 发表于 2012-9-11 21:29 static/image/common/back.gif
先确定乱码是DS1302的数据读错了,还是单纯的显示问题。
把读数据那块去掉,自己赋值。



哥,您能把我的这个程序给著名一下程序的部位吗?程序那个地方是数码管显示部分,现在我还分不清楚那里是那里哪,请哥给著名全程序好吗?谢谢你哥

zhdo1983 发表于 2012-9-12 21:42:40

niaiwma003 发表于 2012-9-12 10:43 static/image/common/back.gif
哥,您能把我的这个程序给著名一下程序的部位吗?程序那个地方是数码管显示部分,现在我还分不清楚那里是 ...

我说程序不是你自己写的啊?昏,前面的朋友基本上都说到了,你先去掉显示以外的部分,读取什么的都去掉,看程序是不是正常

css314464 发表于 2012-9-12 21:56:14


同意12L的意见,一步一步来是王道

niaiwma003 发表于 2012-11-20 18:52:51

求大哥帮帮忙该成功好吗?我所有的东西都买好了,就是乱码

wsy2012 发表于 2012-11-20 20:11:02

乱码是"比较正常"还是"非常离谱",来张图。

fox8769 发表于 2012-11-20 22:46:59

楼主能看得懂上面的程序吗?
如果看不懂就别折腾了,别人帮不了你的。
如果看得懂就按照前面的大侠说的一步一步来,先让数码管一个一个显示,然后2个一起显示,然后三个。。。。。然后再加温度。。。
初学的时候直接抄别人的东西并不可耻,当年我的第一个时钟也是抄别人的,但是我能看懂他们写的东西,后来在把数码管改成了LCD,一步一步慢慢玩。

xslff 发表于 2012-11-20 22:57:16

厉害,起步就玩这么复杂的,还好出错了,不然咋入门喔。

niaiwma003 发表于 2012-11-21 18:58:12

大哥们你们说的都对,我是刚入学的,我是在家里在电脑上看的资料,可是我在网站上下载的资料,我就把这个电子钟的电子元件全部买齐了,谁知道焊接完成后不能用,数码管全部同意乱码到最后我就傻脸了,不知道该怎么办了,我就想哭,我把头磕流血的求大哥帮我把这个做成功。我给大哥磕头了。
页: [1]
查看完整版本: 我做了一个电子钟出现了乱码在仿真中没有问题