打印

C51 模块化问题

[复制链接]
3690|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DK521|  楼主 | 2011-8-5 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
Chaos_zc| | 2011-8-5 22:38 | 只看该作者
需要声明外部函数。声明前加extern,表明函数体在别的文件中

使用特权

评论回复
板凳
原野之狼| | 2011-8-6 09:04 | 只看该作者
在SMB.c中声明B函数为extern即可。

使用特权

评论回复
地板
DK521|  楼主 | 2011-8-6 10:01 | 只看该作者
3# 原野之狼
如果我再建一个“.C”文件,需要调用在SMG.H中声明的函数(此函数中还调用B函数),那么还要在SMG.H中声明B函数吗?

使用特权

评论回复
5
DK521|  楼主 | 2011-8-6 10:03 | 只看该作者
2# Chaos_zc


我用模块化的时候,编译没有错,可是 老是提示 目标不能建立,这是怎么回事?

使用特权

评论回复
6
原野之狼| | 2011-8-6 10:10 | 只看该作者
3# 原野之狼  
如果我再建一个“.C”文件,需要调用在SMG.H中声明的函数(此函数文件)中还调用B函数),那么还要在SMG.H中声明B函数吗?
DK521 发表于 2011-8-6 10:01

在该.c文件中再次extern B函数。

使用特权

评论回复
7
DK521|  楼主 | 2011-8-6 13:11 | 只看该作者
在该.c文件中再次extern B函数。
原野之狼 发表于 2011-8-6 10:10




我用模块化建了3个C文件,一个H文件,没个C文件编译都没有错,但老是提示"target not created" 这是怎么回事呀?

使用特权

评论回复
8
DK521|  楼主 | 2011-8-6 13:13 | 只看该作者
是3个C文件,两个H文件   其中2个C分别对应2个H,还有一个C是主函数文件。。

使用特权

评论回复
9
DK521|  楼主 | 2011-8-6 13:14 | 只看该作者
6# 原野之狼

高手,上面打错了一个数,是3个C文件,两个H文件   其中2个C分别对应2个H,还有一个C是主函数文件。。

使用特权

评论回复
10
原野之狼| | 2011-8-6 13:33 | 只看该作者
把和模块接口相关代码贴出来  我看下它们互相之间是如何引用的

使用特权

评论回复
11
DK521|  楼主 | 2011-8-6 14:13 | 只看该作者
10# 原野之狼

第一个C文件(作用是把DS18B20的温度读取,在液晶1602上显示)
#include <reg52.h>
#include "lcd.h"
#include "dsb.h"
#define uchar unsigned char
#define uint unsigned int
uchar date[4];
void main(void)
{
          uchar i;
          float Temp;
             LCD_init();
         Temp=ReadTemp();
     date[3]=0x30+Temp/10;              //十位
     date[2]=0x30+((int)Temp%10);       //个位
     date[1]=0x2e;                     //小数点
     Temp=Temp*10;
     date[0]=0x30+(int)Temp%10;         //小数部分第一位
  for(i=3;i>0;i--)
  {
   write_dat(date);
  }

第二个C(液晶1602)
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RS=P1^4;
sbit RW=P1^5;
sbit E=P1^6;
void delay (uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_cmd(uchar cmd)
{  
    RS=0;
    RW=0;
P0=cmd;
E=0;
delay(10);
E=1;
delay(5);
E=0;
delay(5);
}
  void write_DATA(uchar DATA)
{  
    RS=1;
    RW=0;
P0=DATA;
E=0;
delay(5);
E=1;
delay(5);
E=0;
delay(5);
}
void LCD_init()
{   delay(500);
write_cmd(0x38);//显示设置,16*2设置,5*7点阵,8位数据接口
    delay(5);
write_cmd(0x0c);//开显示,显示光标,光标闪烁
    delay(5);
write_cmd(0x06);//写入数据后地址加一,屏幕不移动
    delay(5);
write_cmd(0x01);//清屏
delay(5);
write_cmd(0x80);//数据地址指向第一行,第一个位置
    delay(5);

}
void main()
{
LCD_init();
write_DATA('A');

第一个H
#ifndef  __LCD_H__
#define __LCD_H__
extern  void LCD_init(void);
extern  void write_dat(unsigned char dat);
#endif   

}
第三个C(DS18B20)
#include <reg52.h>
sbit DQ=P2^0;
#define uchar unsigned char
#define uint unsigned int
unsigned char dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
void delay(uchar N)
{
while(N--);
}
void dat(int pos,uint d)
{P0=dis[d];
P1|=0x0f;
P1&=0xff-(0x01<<pos);
}
void display(float T)
{          uint Tem;
     Tem=T*10;
     dat(0,Tem/100);
     delay(500);
     dat(1,(int)(T)%10);
     delay(500);
     P1 |= 0x0f;                 //显示“.”
        P1 &= 0xfb;
        P0=0x7f;
     delay(500);
     dat(3,Tem%10);
     delay(500);
}
      
void init_DS18b20()
{
uchar  x=0;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(3);
x=DQ;     
delay(20);
}
void write_ds(uchar dat)
{uchar i;
for(i=0;i<8;i++)
  
  {
  DQ=0;
  DQ=dat&0x01;
  delay(5);
  DQ=1;
  dat>>=1;
  }
}
uchar read_ds()
{ uchar i=0;
    uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=1;
dat>>=1;
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
float ReadTemp()
{   
   unsigned char a=0,b=0;
   unsigned int t=0;
   float tt;
   init_DS18b20();
   write_ds(0xcc);
   write_ds(0x44);
   init_DS18b20();
   write_ds(0xcc);
   write_ds(0xbe);
   a=read_ds();
   b=read_ds();
   t=b;
   t<<=8;
   tt=t|a;
   tt=tt*0.0625;
return(tt);
}
void main()
{
float Temp;
init_DS18b20();
Temp=ReadTemp();
while(1)
{
init_DS18b20();
Temp=ReadTemp();
display(Temp);
}
}

第二个H
#ifndef  __DS18B20_H__
#define  __DS18B20_H__

extern  float ReadTemp(void);
#endif


  
}

使用特权

评论回复
12
DK521|  楼主 | 2011-8-6 14:54 | 只看该作者
[img][/img]

使用特权

评论回复
13
DK521|  楼主 | 2011-8-6 14:55 | 只看该作者
unit.rar (35.1 KB)

使用特权

评论回复
14
DK521|  楼主 | 2011-8-6 14:56 | 只看该作者
10# 原野之狼


就是那个RAR文件

使用特权

评论回复
15
lwslws201| | 2011-8-6 15:09 | 只看该作者
:victory:

使用特权

评论回复
16
原野之狼| | 2011-8-6 16:22 | 只看该作者
怎么弄出好几个main来了?

使用特权

评论回复
17
DK521|  楼主 | 2011-8-6 16:41 | 只看该作者
怎么弄出好几个main来了?
原野之狼 发表于 2011-8-6 16:22


你能帮我 稍微改下吗??

使用特权

评论回复
18
DK521|  楼主 | 2011-8-6 16:42 | 只看该作者
到底哪出错了?

使用特权

评论回复
19
zdhwangep| | 2011-8-6 19:55 | 只看该作者
关于模块化编程资料,我试过,没问题。

单片机C语言模块化编程.pdf

1.34 MB

使用特权

评论回复
20
yisure| | 2011-8-6 21:44 | 只看该作者
一个c对应一个h。我从网上视频中学的,可以的。然后在找一个能解释编译过程的**,读读就会了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

56

帖子

1

粉丝