keil怎样将c语言多个程序合并,keil多个子程序合并问题

博主在使用Keil进行C语言单片机编程时遇到问题,尝试合并多个程序时出现编译错误。文章中提供了主程序和AD转换、DS1302时钟芯片相关的子程序代码,并询问如何正确合并这些子程序以消除编译错误。解决方案可能涉及子程序的组织结构和包含头文件的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本人以前学单片机时学的是汇编,所以C语言的keil单片机编程不是很懂,我打算做一个酒精测试仪的课程设计,这个是我网上找到的程序代码,我试着编译,但是总是报错,想问问各位大师怎么解决,是设置的问题么,希望能有详细的解答,最好附图解答。以下是程序代码:

一:主程序

#include

#include

#include

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

//键盘

sbit k0=P1^0;

sbit k1=P1^1;

sbit k2=P1^2;

sbit k3=P1^3;

//变量

bit flg=0;

//数组

uchar M_time[]={"Time"}; //时间

uchar M_Detect[]={"Detect"}; //检测

uchar M_Storage[]={"Storage"}; //存储

uchar stor[4];

//以定义函数

void initial_lcd1602(void);

void delays1(uint n)

{

while(n--);

}

/***************子程序************************/

void chang_h(void)

{

int g;

if(k0==0)

{for(g=0;g0x23)wr_data[4]=0x00;

}

}

if(k1==0)

{for(g=0;g0;i--)

lcd_delay(248);

write_lcd_command(0x06); //光标右移,文字不移动

for(i=4;i>0;i--)

lcd_delay(248);

write_lcd_command(0x01); //清屏

for(i=4;i>0;i--)

lcd_delay(248);

}

四:AD转换程序

#include"reg52.h"

#include

//******************adc0832****************************//

sbit CS=P3^1; //使能。

sbit CLK=P3^2;//时钟

sbit Do=P3^3; // 数据输出

sbit Di=P3^3;//数据输入

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; ;//芯片使能之前的初始化。第一个下降沿

CLK=1;

_nop_();

_nop_();

/****************************************/

CLK=0; // 确定通道模式、第2个下降沿

_nop_();

_nop_();

CLK=1;

Di=(bit)(0x02&CH); //设定通道初始化

_nop_();

CLK=0;

_nop_();

_nop_();

CLK=1;

Di=(bit)(0x01&CH); //设定通道初始化 .第3个下降沿

_nop_();

_nop_();

CLK=0; //AD转化的初始化完成。

Di=1;

CLK=1;

_nop_();

_nop_();

CLK=0;

_nop_();

CLK=1;

for(i=8;i>0;i--)//得到一个正常排序的8位数据

{

data_f|=Do;

data_f1;

DS1302_CLK=1;

delays(5);

DS1302_CLK=0;

delays(5);

}

}

/*****************************************************************************

函数功能:读DS1302一个字节子程序

入口参数:

出口参数:

*****************************************************************************/

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);

}*/

/*****************************************************************************

函数功能:写DS1302地址子程序

入口参数:add

入口数据: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;

}

/*****************************************************************************

函数功能:读DS1302地址子程序

入口参数:add

出口参数: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);

} */

/*****************************************************************************

函数功能:初始化DS1302子程序

入口参数:wr_data[](全局变量)

出口参数:

*****************************************************************************/

void DS1302_init()

{

write_DS1302(0xbe,0x00);

write_DS1302(0x8e,0x00); //关闭保护,若写0x80,则开启保护

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]); //时

write_DS1302(0x82,wr_data[5]); //分

write_DS1302(0x80,wr_data[6]); //秒

write_DS1302(0x8e,0x80);

}

/*****************************************************************************

函数功能:读DS1302时间子程序

入口参数:

出口参数:全局变量(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); //时

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;

}

我想百度了一下,他说几个子程序要放到同一个子目录下才行,而后面的未定义警告是由于前面的几个报错造成的,我想求解具体的解决办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值