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

急,如下图,定义的任何变量,无论覆不覆初值,都会变成-1,本人新手一枚,望大神指导,感激不尽!!!

#include <reg51.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
//声明
sbit DQ=P3^7;							//总线接口定义

u8 ROMcun[10][8]={0}; 			//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);	//温度处理与转换

void delay500us(void);
void delay60us(void);
void yanshi(u8 xms);

void Uart_SendByte(u8 date);//发送数据函数
void UartInit(void);		//4800bps@11.0592MHz
//主函数
void main()
{ int i2=0,i7=0,num=0;
	UartInit();
	num=ROM_sousuo();
	P1=num;
	i2+=9;
	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(0x05);
            }
			while(1);
}

/**************************************************
 模块名称:ds18b20
**************************************************/

/**************************************************
 模块名称: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]; //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;
}//*/

/**************************************************
延时函数。。。
**************************************************/
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--);
}
//UART串口传输模块//
//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;
 }
}//*/
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • huanhuilong 幻灰龙 1月前

    你能把你的代码拆成多个文件么?每个函数单独测试,看下是哪个地方出问题,这样都给出来太多了。而且你的代码有依赖内部的头文件,别人也没法执行。

    点赞 评论 复制链接分享

为你推荐