找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5443|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

keil多個(gè)子程序合并問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:59542 發(fā)表于 2014-5-13 15:42 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本人以前學(xué)單片機(jī)時(shí)學(xué)的是匯編,所以C語(yǔ)言的keil單片機(jī)編程不是很懂,我打算做一個(gè)酒精測(cè)試儀的課程設(shè)計(jì),這個(gè)是我網(wǎng)上找到的程序代碼,我試著編譯,但是總是報(bào)錯(cuò),想問(wèn)問(wèn)各位大師怎么解決,是設(shè)置的問(wèn)題么,希望能有詳細(xì)的解答,最好附圖解答。以下是程序代碼:

一:主程序
#include <reg52.h>
#include <stdio.h>
#include<LCD1602.h>
#include<Ds1302.h>
#include<AT24c02.h>
#include<ADC0832.h>

#define uint unsigned int
#define uchar unsigned char
//鍵盤(pán)
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
//變量
bit flg=0;

//數(shù)組
uchar  M_time[]={"Time"};      //時(shí)間
uchar  M_Detect[]={"Detect"};  //檢測(cè)
uchar  M_Storage[]={"Storage"};      //存儲(chǔ)
uchar  stor[4];
//以定義函數(shù)
void initial_lcd1602(void);

void delays1(uint n)
{
        while(n--);

}

/***************子程序************************/
void chang_h(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k0==0)
   {wr_data[4]=readtimeR[4]+1;
    if(wr_data[4]>0x23)wr_data[4]=0x00;
   }
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k1==0)
   {wr_data[4]=readtimeR[4]-1;
    if(readtimeR[4]==0x00)wr_data[4]=0x00;
   }  
}
        DS1302_init();
        showdata();
        Display_List_Char(1,0,lcd_time);   
}
/***************************************/
void chang_m(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k0==0)
   {wr_data[5]=readtimeR[5]+1;
    if(wr_data[5]>0x23)wr_data[5]=0x00;
   }
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k1==0)
   {wr_data[5]=readtimeR[5]-1;
    if(readtimeR[5]==0x00)wr_data[5]=0x00;
   }  
}
        DS1302_init();
        showdata();
        Display_List_Char(1,0,lcd_time);   
}

/*************************************/
void chang_s(void)
{
int g;
if(k0==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k0==0)
   {wr_data[6]=readtimeR[6]+1;
    if(wr_data[6]>0x23)wr_data[6]=0x00;
   }
}
if(k1==0)
{for(g=0;g<20;){delays1(100);g++;}
  if(k1==0)
   {wr_data[6]=readtimeR[6]-1;
    if(readtimeR[6]==0x00)wr_data[6]=0x00;
   }  
}
        DS1302_init();
        showdata();
        Display_List_Char(1,0,lcd_time);  
}
/**************************************************/
//主函數(shù)
/**************************************************/
void main()
{   
    uchar i,dd;
        uint g;
    uchar show[4];
    unsigned int data_temp=0;

        initial_lcd1602();
        DS1302_init();
        delays1(100);
        Display_List_Char(0,0,LCD_Code2);
        for(g=0;g<100;){delays1(100);g++;}
       
  while(1)
   {
    if(k0==0|k1==0|k2==0|k3==0)
         {
          write_lcd_command(0x01);   //清屏
      for(g=0;g<100;){delays1(100);g++;}
      Display_List_Char(0,0,M_time);
      Display_List_Char(0,8,M_Detect);
      Display_List_Char(1,0,M_Storage);
      for(g=0;g<10;){delays1(100);g++;}
/**********************時(shí)間**************************/
          if(k0==0)     //時(shí)間
           {
         write_lcd_command(0x01);   //清屏
         do
              { if(k3==0) flg=1;
                    showdata();                      
                Display_List_Char(0,0,lcd_dat+3);
                    Display_List_Char(1,0,lcd_time);
/************************調(diào)時(shí)間**************************/
if(k2==0)
{
do
  {
    Display_One_Char(1,10,'H');
    if(k3==0) flg=1;
        chang_h();
    for(g=0;g<100;){delays1(100);g++;}
    if(k2==0)
     {do
      {
       Display_One_Char(1,10,'M');
       if(k3==0) flg=1;
           chang_m();
       for(g=0;g<100;){delays1(100);g++;}
       if(k2==0)
         {do
           {
            Display_One_Char(1,10,'S');
            if(k3==0) flg=1;
                        chang_s();
            }while(flg==0);                       
          }
       }while(flg==0);          
      }
  }while(flg==0);flg=0;
write_lcd_command(0x01);
}

for(g=0;g<500;){delays1(100);g++;}
                  }        while(flg==0);flg=0;
                    
           }
/*************檢測(cè)*******************/
if(k1==0)
{
write_lcd_command(0x01);
do
  {
  if(k3==0) flg=1;
  data_temp=ADconv();
  stor[0]=data_temp;
  xs_int(196*data_temp,1);
  }while(flg==0);flg=0;

}
/***************存儲(chǔ)****************/
if(k2==0)           
{
write_lcd_command(0x01);   //清屏
do
  {
  if(k3==0) flg=1;
  for(i=0;i<3;)
   {
   // i2c_write(0x00+i,0x63+i/*要存的數(shù)據(jù)*/);
    i2c_write(0x00+i,stor[0]/*要存的數(shù)據(jù)*/);  
    i++;
    }
  _nop_();
  i=0;
  for(i=0;i<3;)
    {
     dd=i2c_read(0x00+i);/*讀地址數(shù)據(jù)*/
     show[i]=dd;
      i++;
    }
  Display_List_Char(1,0,show);
  }while(flg==0);flg=0;
for(g=0;g<500;){delays1(100);g++;}
}
/***************************************/          
     }                           
   }

}

二:液晶顯示程序

#include<reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int

#define LCDPORT P0

sbit RS=P2^6;                                                //RS數(shù)據(jù)命令選擇端,高電平數(shù)據(jù),低電平命令
sbit RW=P2^7;                                                //RW讀寫(xiě)選擇端,高電平讀操作,低電平寫(xiě)操作
sbit EN=P2^0;                                                 //EN使能控制端,E高電平跳變?yōu)榈碗娖綍r(shí)LCD執(zhí)行命令

uchar LCD_Code2[]        ="Welcome:";
uchar LCD_Code[]        ="0123456789ABCDEF-.";

/******************************LCD1602驅(qū)動(dòng)程序*************************************/

void lcd_delay(uchar delaytime)
{
        while(delaytime)delaytime--;
}

void write_lcd_command(uchar write_command)
{
        lcd_delay(40);
        RS=0;
        RW=0;
        LCDPORT=write_command;
        EN=1;
        EN=0;
}
void write_lcd_data(uchar write_data)
{
        lcd_delay(40);
        RS=1;
        RW=0;
        LCDPORT=write_data;
        EN=1;
        EN=0;
}

void Display_One_Char( uchar x,uchar y,uchar dat) //x表示行,y表示列
{
        switch(x)
        {
        case 0:
                write_lcd_command(0x80+y);
                break;
        case 1:
                write_lcd_command(0xc0+y);
                break;
        }
        write_lcd_data(dat);   
}

void Display_List_Char(uchar x,uchar y,uchar *str)
{
        switch(x)
        {
        case 0:
                write_lcd_command(0x80+y);
                break;
        case 1:
                write_lcd_command(0xc0+y);
                break;
        }
        while (*str!='\0')
        {
                write_lcd_data(*str);
                str++;
        }
}


void xs_int(unsigned int shuju,bit t)   //顯示一個(gè)數(shù)字
{unsigned char huancun[6]={0};
unsigned char biaozhi=0,i;
if   (shuju < 10) biaozhi = 1;
else if(shuju < 100) biaozhi = 2;
else if(shuju < 1000) biaozhi = 3;
else if(shuju < 10000) biaozhi = 4;
else if(shuju < 65535) biaozhi = 5;
switch(biaozhi)
   {case 5:huancun[5] = shuju/10000;
    case 4:huancun[3] = shuju%10000/1000;
    case 3:huancun[2] = shuju%1000/100;
    case 2:huancun[1] = shuju%100/10;
    case 1:huancun[0] = shuju%10;
break;
    default:break;
}
for(i=6;i>1;i--)
   {if(i==5)Display_One_Char(1,10,'.');
        else Display_One_Char(t,15-i,0x30+huancun[i-1]); }
Display_One_Char(t,15,'V');
}

void initial_lcd1602(void)                                          //初始化LCD1602
{
        uchar i;
        EN=0;
        for(i=200;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x38);                                //0x38命令,雙行顯示,顯示5x7的點(diǎn)陣字符
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x38);                                //再寫(xiě)一次0x38命令,雙行顯示,顯示5x7的點(diǎn)陣字符
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x0c);                                     //無(wú)光標(biāo),不閃爍
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x06);                            //光標(biāo)右移,文字不移動(dòng)
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x01);                                //清屏
        for(i=4;i>0;i--)
                lcd_delay(248);
}

三:存儲(chǔ)程序

#include<reg52.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int

#define LCDPORT P0

sbit RS=P2^6;                                                //RS數(shù)據(jù)命令選擇端,高電平數(shù)據(jù),低電平命令
sbit RW=P2^7;                                                //RW讀寫(xiě)選擇端,高電平讀操作,低電平寫(xiě)操作
sbit EN=P2^0;                                                 //EN使能控制端,E高電平跳變?yōu)榈碗娖綍r(shí)LCD執(zhí)行命令

uchar LCD_Code2[]        ="Welcome:";
uchar LCD_Code[]        ="0123456789ABCDEF-.";

/******************************LCD1602驅(qū)動(dòng)程序*************************************/

void lcd_delay(uchar delaytime)
{
        while(delaytime)delaytime--;
}

void write_lcd_command(uchar write_command)
{
        lcd_delay(40);
        RS=0;
        RW=0;
        LCDPORT=write_command;
        EN=1;
        EN=0;
}
void write_lcd_data(uchar write_data)
{
        lcd_delay(40);
        RS=1;
        RW=0;
        LCDPORT=write_data;
        EN=1;
        EN=0;
}

void Display_One_Char( uchar x,uchar y,uchar dat) //x表示行,y表示列
{
        switch(x)
        {
        case 0:
                write_lcd_command(0x80+y);
                break;
        case 1:
                write_lcd_command(0xc0+y);
                break;
        }
        write_lcd_data(dat);   
}

void Display_List_Char(uchar x,uchar y,uchar *str)
{
        switch(x)
        {
        case 0:
                write_lcd_command(0x80+y);
                break;
        case 1:
                write_lcd_command(0xc0+y);
                break;
        }
        while (*str!='\0')
        {
                write_lcd_data(*str);
                str++;
        }
}


void xs_int(unsigned int shuju,bit t)   //顯示一個(gè)數(shù)字
{unsigned char huancun[6]={0};
unsigned char biaozhi=0,i;
if   (shuju < 10) biaozhi = 1;
else if(shuju < 100) biaozhi = 2;
else if(shuju < 1000) biaozhi = 3;
else if(shuju < 10000) biaozhi = 4;
else if(shuju < 65535) biaozhi = 5;
switch(biaozhi)
   {case 5:huancun[5] = shuju/10000;
    case 4:huancun[3] = shuju%10000/1000;
    case 3:huancun[2] = shuju%1000/100;
    case 2:huancun[1] = shuju%100/10;
    case 1:huancun[0] = shuju%10;
break;
    default:break;
}
for(i=6;i>1;i--)
   {if(i==5)Display_One_Char(1,10,'.');
        else Display_One_Char(t,15-i,0x30+huancun[i-1]); }
Display_One_Char(t,15,'V');
}

void initial_lcd1602(void)                                          //初始化LCD1602
{
        uchar i;
        EN=0;
        for(i=200;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x38);                                //0x38命令,雙行顯示,顯示5x7的點(diǎn)陣字符
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x38);                                //再寫(xiě)一次0x38命令,雙行顯示,顯示5x7的點(diǎn)陣字符
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x0c);                                     //無(wú)光標(biāo),不閃爍
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x06);                            //光標(biāo)右移,文字不移動(dòng)
        for(i=4;i>0;i--)
                lcd_delay(248);
        write_lcd_command(0x01);                                //清屏
        for(i=4;i>0;i--)
                lcd_delay(248);
}

四:AD轉(zhuǎn)換程序

#include"reg52.h"
#include<intrins.h>
//******************adc0832****************************//
sbit CS=P3^1; //使能。
sbit CLK=P3^2;//時(shí)鐘
sbit Do=P3^3; // 數(shù)據(jù)輸出
sbit Di=P3^3;//數(shù)據(jù)輸入
unsigned char CH=0x02;
//通道的選擇:0x02就是單通道0;0x03就是單通道1;
//0x00就是雙通道ch0=“+”;   ch0=“-”
//0x01就是雙通道ch0=“-”;   ch0=“+”
//*****************************************************//
unsigned char ADconv(void)
{unsigned char i;
unsigned int data_f=0,data_c=0;
Di=1;
CS=1;
_nop_();
CS=0;
Di=1; ;//芯片使能之前的初始化。第一個(gè)下降沿
CLK=1;
_nop_();
_nop_();
/****************************************/
CLK=0; // 確定通道模式、第2個(gè)下降沿
_nop_();
_nop_();
CLK=1;
Di=(bit)(0x02&CH); //設(shè)定通道初始化
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
Di=(bit)(0x01&CH); //設(shè)定通道初始化 .第3個(gè)下降沿
_nop_();
_nop_();
CLK=0; //AD轉(zhuǎn)化的初始化完成。
Di=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
CLK=1;
   

for(i=8;i>0;i--)//得到一個(gè)正常排序的8位數(shù)據(jù)
{
data_f|=Do;
data_f<<=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
}
for(i=8;i>0;i--)//得到一個(gè)反序排列的8位數(shù)據(jù)
{
data_c<<=1;
data_c|=Do;
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();

}

CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();

CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
CS=1;
_nop_();
_nop_();
return data_f;
}

五:時(shí)鐘程序

#include <reg52.h>
#include <stdio.h>

sbit DS1302_CLK = P3^5;
sbit DS1302_IO  = P3^6;
sbit DS1302_RST = P3^7;

uchar lcd_dat[]={" 2009-09-26   6"};
uchar lcd_time[]={"21:50:33"};
uchar wr_data[8]={0x09,0x09,0x26,0x06,0x22,0x59,0x50};
uchar readtimeR[8];
void delays(uint n)
{
        while(n--);

}

/*****************************************************************************
函數(shù)功能:寫(xiě)DS1302一個(gè)字節(jié)子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
void sendbyte(uchar a)
{
        uchar i,temp;
        temp=a;
        for(i=8;i>0;i--)       
    {               
                if(temp&0x01) //先發(fā)低位
                        DS1302_IO=1;
                else
                        DS1302_IO=0;
                temp=temp>>1;
                DS1302_CLK=1;
                delays(5);
                DS1302_CLK=0;
                delays(5);               
    }
}
/*****************************************************************************
函數(shù)功能:讀DS1302一個(gè)字節(jié)子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
uchar readbyte(void)
{
        uchar i,dat=0;
        for(i=8;i>0;i--)  
        {
                DS1302_IO=1;
                dat>>=1;               
                if(DS1302_IO)       
                        dat|=0x80;                               
                DS1302_CLK=1;
                delays(5);
                DS1302_CLK=0;
        }
        return dat;
}  
/*uchar readbyte(void)  
{
        uchar i;
        uchar ucdat=0;
        for(i=8;i>0;i--)
        {
                DS1302_IO=1;
                ucdat>>=1;
                if(DS1302_IO)ucdat|=0x80;
                DS1302_CLK=1;
                delays(2);
                DS1302_CLK=0;
         }
         return(ucdat);
}*/
/*****************************************************************************
函數(shù)功能:寫(xiě)DS1302地址子程序
入口參數(shù):add
入口數(shù)據(jù):dat
*****************************************************************************/
void write_DS1302(uchar address,uchar dat)
{
        DS1302_RST=0;
        delays(10);
        DS1302_CLK=0;
        delays(10);
        DS1302_RST=1;
        delays(5);
        sendbyte(address);
        delays(5);
        sendbyte(dat);
        DS1302_RST=0;
        DS1302_CLK=0;
}
/*****************************************************************************
函數(shù)功能:讀DS1302地址子程序
入口參數(shù):add
出口參數(shù):readtimeR[]
*****************************************************************************/
uchar read_DS1302(uchar address)
{
    uchar timer;
        DS1302_RST=0;
        delays(2);
        DS1302_CLK=0;
        delays(2);
        DS1302_RST=1;
        sendbyte(address);
        timer=readbyte();
        DS1302_RST=0;
        DS1302_CLK=0;
       
        return timer;
}

/*uchar read_DS1302(uchar addr)
{
        uchar timedata;
        DS1302_RST=0;
        delays(2);
        DS1302_CLK=0;
        delays(2);
        DS1302_RST=1;
        sendbyte(addr);
        timedata=readbyte();
        DS1302_CLK=1;
        delays(2);
        DS1302_RST=0;
        return(timedata);
}  */
/*****************************************************************************
函數(shù)功能:初始化DS1302子程序
入口參數(shù):wr_data[](全局變量)
出口參數(shù):
*****************************************************************************/
void DS1302_init()
{
        write_DS1302(0xbe,0x00);
        write_DS1302(0x8e,0x00); //關(guān)閉保護(hù),若寫(xiě)0x80,則開(kāi)啟保護(hù)
        write_DS1302(0x8c,wr_data[0]);                //年
        write_DS1302(0x88,wr_data[1]);                //月
        write_DS1302(0x86,wr_data[2]);                //日          
        write_DS1302(0x8A,wr_data[3]);                //星期
        write_DS1302(0x84,wr_data[4]);                //時(shí)
        write_DS1302(0x82,wr_data[5]);                //分
        write_DS1302(0x80,wr_data[6]);                //秒          
        write_DS1302(0x8e,0x80);
}
/*****************************************************************************
函數(shù)功能:讀DS1302時(shí)間子程序
入口參數(shù):
出口參數(shù):全局變量(year,mouth,data,day,hour,minute,second)
*****************************************************************************/
void read_time(void)
{
        readtimeR[0]=read_DS1302(0x8d);   //年
        readtimeR[1]=read_DS1302(0x89);          //月
        readtimeR[2]=read_DS1302(0x87);          //日
        readtimeR[3]=read_DS1302(0x8b);   //周
        readtimeR[4]=read_DS1302(0x85);          //時(shí)
        readtimeR[5]=read_DS1302(0x83);   //分
        readtimeR[6]=read_DS1302(0x81);          //秒
}

void showdata()
{
        read_time();
        lcd_dat[3]=(readtimeR[0]>>4)+0x30;
        lcd_dat[4]=(readtimeR[0]&0x0f)+0x30;
        lcd_dat[6]=(readtimeR[1]>>4)+0x30;
        lcd_dat[7]=(readtimeR[1]&0x0f)+0x30;
        lcd_dat[9]=(readtimeR[2]>>4)+0x30;
        lcd_dat[10]=(readtimeR[2]&0x0f)+0x30;
        lcd_dat[14]=(readtimeR[3]&0x0f)+0x30;
        lcd_time[0]=(readtimeR[4]>>4)+0x30;
        lcd_time[1]=(readtimeR[4]&0x0f)+0x30;
        lcd_time[3]=(readtimeR[5]>>4)+0x30;
        lcd_time[4]=(readtimeR[5]&0x0f)+0x30;
        lcd_time[6]=(readtimeR[6]>>4)+0x30;
        lcd_time[7]=(readtimeR[6]&0x0f)+0x30;
}
我想百度了一下,他說(shuō)幾個(gè)子程序要放到同一個(gè)子目錄下才行,而后面的未定義警告是由于前面的幾個(gè)報(bào)錯(cuò)造成的,我想求解具體的解決辦法。

QQ截圖20140513153856.png (18.89 KB, 下載次數(shù): 154)

QQ截圖20140513153856.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:44262 發(fā)表于 2014-7-17 17:33 來(lái)自觸屏版 | 只看該作者
原因是因?yàn)槟闳鄙偕厦鎺讉(gè)頭文件,這個(gè)程序不完整
回復(fù)

使用道具 舉報(bào)

板凳
ID:981034 發(fā)表于 2022-1-22 15:39 | 只看該作者
h文件要放入本文件夾里
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表