为什么我在.c文件中定义了,在.h中声明了,然而在其他文件中引用的时候还显示如下图,求大神赐教!!!!!c和h都在一个文件夹下,
****************************************************************************
//DS18B20findandnum.c
#include <reg51.h>
#include "shengming.h"
#include "DS18B20.h"
//#include "lcd1602.h"
//#include "I2C.h"
#include "UART.h"
#include "delay.h"
void main()
{
int num=0;
int i7,i2;
i7=0;i2=0;
P1=1;
Uart_SendByte(0x00);
P1=2;
i7--;
num=ROM_sousuo();
P1=3;
P0=ROMcun[0][2];
for(i7=0;i7<10;i7++)
{
for(i2=0;i2<8;i2++)
{
Uart_SendByte(ROMcun[i7][i2]);
}
for(i2=0;i2<4;i2++)
Uart_SendByte(0x00);
}
P1=num;
}
****************************************************************************
//delay.c
#include "delay.h"
/**************************************************
延时函数。。。
**************************************************/
void delay500us(void) //误差
{ u8 i;
i = 75;
while(i--);//延时642us
}
void delay60us(void) //误差
{
u8 i;
i = 8;
while(i--);
}
void yanshi(u8 xms)
{
int i,j;
for(i=xms;i>0;i--)
for(j=130;j>0;j--);
}
****************************************************************************
//delay.h
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include "shengming.h"
void delay500us(void);
void delay60us(void);
void yanshi(u8 xms);
#endif
****************************************************************************
//shengming.h
#ifndef __SHENGMING_H__
#define __SHENGMING_H__
#define u16 unsigned int
#define u8 unsigned char
//typedef unsigned int u16;
//typedef unsigned char u8;
#endif
****************************************************************************
//ds18b20.c
// DS18B20温度传感器模块及单总线常用指令模块 //
/*************************************************/
#include "DS18B20.h"
/**************************************************
延时函数。。。
**************************************************/
//void delay500us(void) //误差
//{ int i;
// i = 75;
// while(i--);//延时642us
//}
//void delay60us(void) //误差
//{
// int i;
// i = 8;
// while(i--);
//}
//void yanshi(u8 xms)
//{
// int i,j;
// for(i=xms;i>0;i--)
// for(j=130;j>0;j--);
//}
/**************************************************
模块名称:DS18B20初始化模块
主要函数:Ds18init();
主要输入:无
主要输出:当初始化成功时返回0,失败返回1;
注意:初始化不成功会卡死???
**************************************************/
bit Ds18init() //初始化
{
DQ=0;
delay500us();
DQ=1;
delay60us();
while(DQ) return 0;
delay500us();
return 1; //0为初始化成功
}//*/
/**************************************************
模块名称:DS18B20写1字节模块
主要函数:write_data(u8 date);
主要输入:一字节数据;
主要输出:无
注意:数据类型为8位2进制数;
**************************************************/
void write_data(u8 date) //写数据
{
u8 i;
for(i=0;i<8;i++)
{
DQ=0; //拉低
_nop_(); //延时1us
DQ=date&0x01; //数据输入总线,注意超时
delay60us(); //度过60us的数据输入期
DQ=1; //释放总线
date>>=1; //最后位移
}
}//*/
/**************************************************
模块名称:DS18B20读1字节模块
主要函数:read_data();
主要输入:无
主要输出:一字节数据
注意:数据类型为8位2进制数;
**************************************************/
u8 read_data() //读数据
{u8 date,i;
for(i=0;i<8;i++)
{ date>>=1; //提前位移
DQ=0; //拉低
_nop_(); //延时1us
DQ=1; //要释放总线,离谱,图上又没画
_nop_();_nop_();_nop_();_nop_(); //延时1us
if(DQ) //判断总线
date|=0x80; //**
delay60us(); //度过总60us的读数据期
DQ=1;
}
return date;
}//*/
/**************************************************
模块名称:DS18B20写1位模块
主要函数:write_1b(bit date);
主要输入:一位数据;
主要输出:无
注意:数据类型为1位2进制数;
**************************************************/
void write_1b(bit date)
{
DQ=0; //拉低
_nop_(); //延时1us
DQ=date; //数据输入总线,注意超时
delay60us(); //度过60us的数据输入期
DQ=1; //释放总线
}//*/
/**************************************************
模块名称:DS18B20读1位模块
主要函数:read_1b();
主要输入:无
主要输出:一位数据
注意:数据类型为1位2进制数;
**************************************************/
bit read_1b()
{ bit date;
DQ=0; //拉低
_nop_(); //延时1us
DQ=1; //要释放总线,离谱,图上又没画
_nop_();_nop_();_nop_();_nop_(); //延时1us
date=DQ; //判断总线 //**
delay60us(); //度过总60us的读数据期
DQ=1;
return date;
}//*/
/**************************************************
模块名称:DS18B20读一个ROM模块
主要函数:read_rom(u8 *romcode);
主要输入:无
主要输出:64位ROM——以数组形式输出
注意:数据类型为8位2进制数;
**************************************************/
u8 read_rom(u8 *romcode)
{ u8 i;
while(!Ds18init());
write_data(0x33);
for(i=0;i<8;i++)
{
romcode[i]=read_data();
}
return romcode;
}//*/
/**************************************************
模块名称:DS18B20搜索ROM模块
主要函数:ROM_sousuo();
主要输入:***
主要输出:***
注意:***;
**************************************************/
u8 ROMcun[10][8]={0}; //ROM储存数组
int ROM_sousuo()
{u8 ROM_ceshi[8]={0,0,0,0,0,0,0,0};
int ss,num=0;
bit alarm,rb1,rb2,flag=0;
u8 i,j;
for(i=0;i<10;i++)
{
Ds18init();
write_data(0xf0);
for(j=0;j<64;j++)
{
rb1=read_1b();
rb2=read_1b();
if(rb1==1)
{
if(rb2==1) //11 未找到
{
alarm=1;
j=64;
}
else //10 此位为1
{
write_1b(1);
ROMcun[i][j/8] |= 0x01<<(j%8); //此位写1
}
}
else
{
if(rb2==1) //01 此位为0
{
write_1b(0);
}
else///// 00有矛盾要分开 ROM_ceshi[8]; /////////////////////////////////////////////////////////
{
flag=0;
for(ss=7;ss>j/8;ss--) //判断标位以左是否为0;XXXX为0则flag==0、不为0则flag==1。
{
if(ROM_ceshi[ss] != 0) {ss=8;break;}//不为零则ss=8;为0则ss不为8
}
if( (ss!=8) && ((ROM_ceshi[j/8]>>(j%8+1)) == 0)) flag=1;//判断标位以左是否为0;为0则flag=1、不为0则flag=0。
//P0=flag;//标位以左为0,则P0置0000 0001 ***qop***
if(( (ROM_ceshi[j/8]) & (0x01<<(j%8)) ) == 0) // 标位为0; 标位,指ROM的对应测试位
{
if(flag == 1) // 标位为0同时标位以左为0
{ // 标位置1;走0;、、
(ROM_ceshi[j/8]) |= (0x01<<(j%8));//标位置1
write_1b(0);
}
else // 标位为0同时此位以左为1
{ // 标位不变;走1;
write_1b(1);
ROMcun[i][j/8] |= 0x01<<(j%8); // 此位写1
}
}
else // 此位为1
{
if(flag == 1) // 标位为1同时标位以左为0
{ // 标位置0;走1;
(ROM_ceshi[j/8]) &= (~(0x01<<(j%8)));//标位置0
write_1b(1);
ROMcun[i][j/8] |= 0x01<<(j%8); // 此位写1
}
else // 标位为1同时标位以左为1
{ // 标位不变;走0;
write_1b(0);
}
}
}
}
}
for(ss=0;ss<8;ss++) //判断测试位是否都为0// *****************当测试位又一次为0时则标志着已经搜索完毕***************
{
if(ROM_ceshi[ss] != 0) {ss=99;break;}//不为零则ss=99;为0则ss不为99
}
if(ss!=99) i=10; /////////// ss!=99则说明测试数组由0变1再变0??????
num++;
}
return num;
}//*/
/**************************************************
模块名称:提取指定DS18B20温度模块
主要函数:wendutiqu(u8 *romcode);
主要输入:u8&8值一维数组
主要输出:int型温度
注意:
**************************************************/
int wendutiqu(int num) //温度提取
{
u8 MSB,LSB;
int temp=0,i;
Ds18init();
delay500us();
delay500us();
//write_data(0xcc);
write_data(0x55);P1=2;/////////////***********************************
for(i=0;i<8;i++)
{
write_data(ROMcun[num][i]);/////////////////////////////////////////
} P1=3;/////////////***********************************
write_data(0x44);
//等待数据转换
yanshi(1000);yanshi(1000);yanshi(1000);
Ds18init();
delay500us();
delay500us();
//write_data(0xcc);
write_data(0x55);
for(i=0;i<8;i++)
{
write_data(ROMcun[num][i]);
}
write_data(0xbe);
LSB=read_data();
MSB=read_data();
Ds18init();
temp=MSB;
temp<<=8;
temp=temp|LSB;
return temp;
}//*/
/**************************************************
模块名称:DS18B20温度处理与转换模块
主要函数:shujuchuli(int temp,u8 *tempzhi);
主要输入:int型温度数据,
主要输出:以u8数组形式输出各位数据
注意:输出为lcd1602型
数组对应关系:0 1 2 3 4 5 6
- 百 十 个 . 点1 点2
**************************************************/
void shujuchuli(int temp,u8 *tempzhi) //温度处理与转换
{
float tp;
char code shuzi09[13]="0123456789.- ";
if(temp< 0)//温度为负
{
tempzhi[0] = shuzi09[11]; //-
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tempzhi[0] = shuzi09[12];
tp=temp;
temp=tp*0.0625*100+0.5;
}
tempzhi[1] = shuzi09[temp/10000]; //百
tempzhi[2] = shuzi09[temp%10000/1000]; //十
tempzhi[3] = shuzi09[temp%1000/100]; //个
tempzhi[4] = shuzi09[10]; //.
tempzhi[5] = shuzi09[temp%100/10]; //点1
tempzhi[6] = shuzi09[temp%10]; //点2
P0=temp;
}//*/
****************************************************************************
//ds18b20.h
/**************************************************
模块名称:DS18B20温度传感器模块及单总线常用指令模块
主要函数:初始化;写发数据;搜索ROM;读取ROM;温度转换;
主要输入:无
主要输出:无
注意:此为头文件,各函数说明看.c
**************************************************/
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include <reg51.h>
#include <intrins.h>
#include "shengming.h"
#include "delay.h"
sbit DQ=P3^7; //总线接口定义
extern u8 ROMcun[10][8]; //ROM储存数组,改第一象限修改容量
bit Ds18init(); //初始化函数
void write_data(u8 date); //写1字节函数
u8 read_data(); //读1字节函数
void write_1b(bit date); //写1位函数
bit read_1b(); //读1位函数
int ROM_sousuo(); //搜索ROM函数
int wendutiqu(int num); //提取指定DS18B20温度
void shujuchuli(int temp,u8 *tempzhi); //温度处理与转换
#endif
****************************************************************************
//UART.c
//UART串口传输模块//
#include "UART.h"
u8 recv_data;
bit recv_flag=0;
void Uart_SendByte(u8 date)
{
SBUF=date;
while(!TI);
TI=0;
}
void UartInit(void) //4800bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1; //允许串口中断
EA=1; //允许中断
}//*/
/*void UART_int() interrupt 4
{
if(RI)
{
RI=0;
recv_data=SBUF;
recv_flag=1;
}
if(TI)
{
TI=0;
}
}//*/
****************************************************************************
//UART.h
/**************************************************
模块名称:UART串口传输模块
主要函数:Uart_SendByte();
主要输入:Uart_SendByte()(发送函数)的8位数据;
主要输出:当recv_flag==1时recv_data(接收数据)
注意:使用Uart_SendByte()要先初始化(执行UartInit();)
**************************************************/
#ifndef __UART_H__
#define __UART_H__
#include <reg51.h>
#include "shengming.h"
extern u8 recv_data; //接收存储
extern bit recv_flag;//接收标志
void Uart_SendByte(u8 date);//发送数据函数
void UartInit(void); //4800bps@11.0592MHz
#endif