qq_35487230
LYPRCO
采纳率0%
2021-03-06 15:31

急!!如内容所示!!!

 为什么我在.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

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • hushui hushui 1月前

    代码太乱.

    .h里面函数声明加 external 试试 

    点赞 评论 复制链接分享

为你推荐