微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么我的程序编译错误呢,求大神指导

为什么我的程序编译错误呢,求大神指导

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit CLK1=P2^4;
sbit CW1=P2^5;
sbit CLK2=P2^6;
sbit CW2=P2^7;
int  k,i;
int m,n,e1,e2,e;
uint h;
/***************************************
     延时函数
/**************************************/
delay(){
for(m=0;m<10000;m++){;}
for(m=0;m<10000;m++){;}
for(m=0;m<10000;m++){;}
for(m=0;m<10000;m++){;}
for(m=0;m<10000;m++){;}
}
/***************************************
     时钟函数
/**************************************/
void ds1302(void)
{  sbit SCK=P0^7;  
   sbit SDA=P2^0;  
   sbit RST=P1^7;

/*复位脚*/
#define RST_CLR RST=0/*电平置低*/
#define RST_SET RST=1/*电平置高*/
/*双向数据*/
#define IO_CLR SDA=0/*电平置低*/
#define IO_SET SDA=1/*电平置高*/
#define IO_R SDA/*电平读取*/
/*时钟信号*/
#define SCK_CLR SCK=0/*时钟信号*/
#define SCK_SET SCK=1/*电平置高*/
#define ds1302_sec_add   0x80  //秒数据地址
#define ds1302_min_add   0x82  //分数据地址
#define ds1302_hr_add   0x84  //时数据地址
#define ds1302_date_add   0x86  //日数据地址
#define ds1302_month_add  0x88  //月数据地址
#define ds1302_day_add   0x8a  //星期数据地址
#define ds1302_year_add   0x8c  //年数据地址
#define ds1302_control_add  0x8e  //控制数据地址
#define ds1302_charger_add  0x90      
#define ds1302_clkburst_add  0xbe
uchar time_buf1[8] = {20,9,3,15,6,51,00,6};//空年月日时分秒周
uchar time_buf[8] ;//空年月日时分秒周

    ds1302_init();
    ds1302_write_time();
    while(1)
    {
           ds1302_read_time();
    }
}

void  delayus(uchar a)            //延迟                        
{
    uchar i,j;
     for(i=0;i<a;i++)
      for(j=0;j<110;j++);
}
/*向DS1302写入一字节数据*/
void ds1302_write_byte( uchar addr, uchar d) {
unsigned char i;
RST_SET;     /*启动DS1302总线*/
/*写入目标地址:addr*/
addr = addr & 0xFE;/*最低位置零*/
for (i = 0; i < 8; i ++) {
  if (addr & 0x01) {
   IO_SET;
   }
  else {
   IO_CLR;
   }
  SCK_SET;
  SCK_CLR;
  addr = addr >> 1;
  }
/*写入数据:d*/
for (i = 0; i < 8; i ++) {
  if (d & 0x01) {
   IO_SET;
   }
  else {
   IO_CLR;
   }
  SCK_SET;
  SCK_CLR;
  d = d >> 1;
  }
RST_CLR;     /*停止DS1302总线*/
}
/*从DS1302读出一字节数据*/
uchar ds1302_read_byte(uchar addr) {
unsigned char i;
unsigned char temp;
RST_SET;     /*启动DS1302总线*/
/*写入目标地址:addr*/
addr = addr | 0x01;/*最低位置高*/
for (i = 0; i < 8; i ++) {
  if (addr & 0x01) {
   IO_SET;
   }
  else {
   IO_CLR;
   }
  SCK_SET;
  SCK_CLR;
  addr = addr >> 1;
  }
/*输出数据:temp*/
for (i = 0; i < 8; i ++) {
  temp = temp >> 1;
  if (IO_R) {
   temp |= 0x80;
   }
  else {
   temp &= 0x7F;
   }
  SCK_SET;
  SCK_CLR;
  }
RST_CLR;     /*停止DS1302总线*/
return temp;
}
/*向DS302写入时钟数据*/
void ds1302_write_time(void) {
    unsigned char i,tmp;
for(i=0;i<8;i++){           //BCD处理
  tmp=time_buf1[i]/10;
  time_buf[i]=time_buf1[i]%10;
  time_buf[i]=time_buf[i]+tmp*16;
}
ds1302_write_byte(ds1302_control_add,0x00);   //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80);    //暂停
//ds1302_write_byte(ds1302_charger_add,0xa9);   //涓流充电
ds1302_write_byte(ds1302_year_add,time_buf[1]);  //年
ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
ds1302_write_byte(ds1302_date_add,time_buf[3]);  //日
ds1302_write_byte(ds1302_day_add,time_buf[7]);  //周
ds1302_write_byte(ds1302_hr_add,time_buf[4]);  //时
ds1302_write_byte(ds1302_min_add,time_buf[5]);  //分
ds1302_write_byte(ds1302_sec_add,time_buf[6]);  //秒
ds1302_write_byte(ds1302_day_add,time_buf[7]);  //周
ds1302_write_byte(ds1302_control_add,0x80);   //打开写保护
}
/*从DS302读出时钟数据*/
void ds1302_read_time()
{
     unsigned char i,tmp;
time_buf[1]=ds1302_read_byte(ds1302_year_add);  //年
time_buf[2]=ds1302_read_byte(ds1302_month_add);  //月
time_buf[3]=ds1302_read_byte(ds1302_date_add);  //日
time_buf[4]=ds1302_read_byte(ds1302_hr_add);  //时
time_buf[5]=ds1302_read_byte(ds1302_min_add);  //分
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7F;//秒
time_buf[7]=ds1302_read_byte(ds1302_day_add);  //周

for(i=0;i<8;i++)
      {           //BCD处理
  tmp=time_buf[i]/16;
  time_buf1[i]=time_buf[i]%16;
  time_buf1[i]=time_buf1[i]+tmp*10;
      }

}
/*DS302初始化函数*/
void ds1302_init(void) {
RST_CLR;   /*RST脚置低*/
SCK_CLR;   /*SCK脚置低*/
    ds1302_write_byte(ds1302_sec_add,0x00);     
}
/************************************
       AD转换程序
***************************************/
void adc0809(void)
{
    uchar code LEDData[]=
  {
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
  };
    sbit OE  = P1^4;
    sbit EOC = P1^5;
    sbit ST  = P1^6;
    sbit CLK = P1^3;
    uchar AD_DATA[5];
    int i;
        TMOD = 0x02;
        TH0  = 0x14;
        TL0  = 0x00;
        IE   = 0x82;
        TR0  = 1;
       
         while(1)
         {  
                P1   = 0x7c;
                 ST = 0;
                ST = 1;
                ST = 0;
                while(EOC == 0);
                OE = 1;
                AD_DATA[0]=P3;
                Display_Result(AD_DATA[0]);
                OE = 0;
                   DelayMS(500);
                P1   = 0x7b;
                 ST = 0;
                ST = 1;
                ST = 0;
                while(EOC == 0);
                OE = 1;
            AD_DATA[1]=P3;
                Display_Result(AD_DATA[1]);
                OE = 0;
                   DelayMS(500);
                P1   = 0x7a;
                 ST = 0;
                ST = 1;
                ST = 0;
                while(EOC == 0);
                OE = 1;
                AD_DATA[2]=P3;
                Display_Result(AD_DATA[2]);
                OE = 0;
                   DelayMS(500);
                P1   = 0x79;
                 ST = 0;
                ST = 1;
                ST = 0;
                while(EOC == 0);
                OE = 1;
                AD_DATA[3]=P3;
                Display_Result(AD_DATA[3]);
                OE = 0;
                   DelayMS(500);
            P1 = 0x78;
                 ST = 0;
                ST = 1;
                ST = 0;
                while(EOC == 0);
                OE = 1;
                AD_DATA[4]=P3;
                Display_Result(AD_DATA[4]);
                OE = 0;
                   DelayMS(500);
          
          }
          
}
void Timer0_INT() interrupt 1
{
        CLK = !CLK;
}
void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<120;i++);
        }
  }
/***************************************
     数码管函数
**************************************/
void Display_Result(uchar d)
{
  for(i=0;i<100;i++)
  {
        P2 = 0xf7;
        P0 = LEDData[d%10];
        DelayMS(5);
        P2 = 0xfb;
        P0 = LEDData[d%100/10];
        DelayMS(5);
        P2 = 0xfd;
        P0 = LEDData[d/100];
        DelayMS(5);
  }
}
void motor_foreward_forever()
{
    time=1;
        TMOD=0x01;
        CW1=1;
        CLK1=0;
        CW2=1;
        CLK2=0;
        delay();
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
void motor_reversal_forever()
{
   time=1;
        TMOD=0x01;
        CW1=0;
        CLK1=0;
        CW2=0;
        CLK2=0;
        delay();
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
/***************************************
    视日跟踪系统电机控制
**************************************/
void motor_forever()
{
  void timer0(void) interrupt 1 using 1
  {
  TR0=0;
  CLK1=!CLK1;
  CLK2=!CLK2;
  for(m=0;m<30;m++)
        {
                ;
        }
  CLK1=!CLK1;
  CLK2=!CLK2;
  TH0=(65536-1000)/256;
  TL0=(65536-1000)%256;
  TR0=1;
  }
  if(6<time_buf[4]<12)
   {
     motor_foreward_forever();
   }
  else
   {
     motor_reversal_forever();
   }
}
void motor1_forward_appoint()
{
   TMOD=0x01;
        CW1=0;
        CLK1=0;
        i=1;
        delay();

        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
void motor1_reversal_appoint()
{
   TMOD=0x01;
        CW1=1;
        CLK1=0;
        i=1;
        delay();

        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
void motor2_forward_appoint()
{
   TMOD=0x01;
        CW2=0;
        CLK2=0;
        i=1;
        delay();

        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
void motor2_reversal_appoint()
{
   TMOD=0x01;
        CW2=1;
        CLK2=0;
        i=1;
        delay();

        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        do {}
        while (1);
}
/***************************************
         光电跟踪系统电机控制
**************************************/
void motor_appoint()
{
  if((AD_DATA[1]>AD_DATA[3])&&((AD_DATA[1]-AD_DATA[3])>=e1))
  { n=AD_DATA[1]-AD_DATA[3];
        void timer0(void) interrupt 1 using 1
   {                           
     if (i<=1080*n) /*脉冲数*/
      {                        
           TR0=0;
       CLK1=!CLK1;
       for(m=0;m<30;m++)
            {
                  ;
            }
       CLK1=!CLK1;
           i++;
      }
       
     TH0=(65536-1000)/256;
     TL0=(65536-1000)%256;
     TR0=1;
   }
    motor1_forward_appoint();
  }
   else if((AD_DATA[1]<AD_DATA[3])&&((AD_DATA[3]-AD_DATA[1])>=e1))
    { n=AD_DATA[3]-AD_DATA[1];
      void timer0(void) interrupt 1 using 1
       {                           
         if (i<=1080*n) /*脉冲数*/
          {                        
                TR0=0;
            CLK1=!CLK1;
            for(m=0;m<30;m++)
                 {
                       ;
                 }
            CLK1=!CLK1;
                i++;
          }
       

         TH0=(65536-1000)/256;
         TL0=(65536-1000)%256;
         TR0=1;
    }
    motor1_reversal_appoint();
   }
   if((AD_DATA[2]>AD_DATA[4])&&((AD_DATA[2]-AD_DATA[4])>=e2))
  { n=AD_DATA[2]-AD_DATA[4];
    void timer0(void) interrupt 1 using 1
     {                           
       if (i<=1080*n) /*脉冲数*/
        {                        
             TR0=0;
         CLK2=!CLK2;
         for(m=0;m<30;m++)
              {
                    ;
              }
         CLK2=!CLK2;
             i++;
        }
       

       TH0=(65536-1000)/256;
       TL0=(65536-1000)%256;
       TR0=1;
    }
    motor2_forward_appoint();
   }
   else if((AD_DATA[2]<AD_DATA[4])&&((AD_DATA[4]-AD_DATA[2])>=e2))
  { n=AD_DATA[4]-AD_DATA[2];
    void timer0(void) interrupt 1 using 1
   {                           
     if (i<=1080*n) /*脉冲数*/
    {                        
         TR0=0;
     CLK=!CLK;
     for(m=0;m<30;m++)
          {
                ;
          }
     CLK2=!CLK2;
         i++;
     }
       

     TH0=(65536-1000)/256;
     TL0=(65536-1000)%256;
     TR0=1;
   }
    motor2_reversal_appoint();
   }
}
main(void)
{ e=150;
  e1=5;
  e2=5;
  ds1302();
  if(6<time_buf1[4]<18)
   {adc0809();
     if(AD_DATA[0]<e)
           motor_forever();
        else motor_appoint();
        }
  else end
}
         

哎呦我去了,你顺说一下什么错误呗!

你这个写的好混乱,,,

我是把好多整合到一块的,他说我的DS1302三个引脚没定义。

void ds1302(void)
{??sbit SCK=P0^7;??
? ?sbit SDA=P2^0;??
? ?sbit RST=P1^7
''''''
把引脚定义放在程序开头试一试

试过,错误更多了

附加.C(158): error C231: 'ds1302_write_time': redefinition
附加.C(179): error C231: 'ds1302_write_time': redefinition
附加.C(182): error C231: 'ds1302_read_time': redefinition
附加.C(202): error C231: 'ds1302_read_time': redefinition
附加.C(204): error C231: 'ds1302_init': redefinition
附加.C(209): error C231: 'ds1302_init': redefinition
这是为什么呢?

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

网站地图

Top