你能把你的代码拆成多个文件么?每个函数单独测试,看下是哪个地方出问题,这样都给出来太多了。而且你的代码有依赖内部的头文件,别人也没法执行。
急,如下图,定义的任何变量,无论覆不覆初值,都会变成-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条回答
为你推荐
- C语言临时变量赋不赋初值效率上有差异吗?
- 新手提问:关于Pycharm中定义的变量,为何代码无法自动补全?
- python
- 1个回答
- 为什么宏定义变量不能作为函数参数传入?
- c语言
- 1个回答
- 一个关于C语言的BUG:定义int变量时靠近char的变量会变成0
- C语言中,先定义一个变量有多个值,然后分别使用
- c语言
- 2个回答
- 编译报错的问题,局部变量a没有赋初值,为什么没有编译报错?求大神解释下
- 用接口名定义了一个变量,这是什么意思?
- 编程语言
- java
- 3个回答
- MFC如何一个类调用在另一个类中的.cpp中定义的static成员变量
- 类成员变量
- mfc
- 3个回答
- 两个for循环,下一个for的变量不能是上一个for的变量?
- java
- for循环
- x
- 6个回答
- 在paint之前定义变量,然后用drawline,就是画不出来图像,如何才能往paint里引入变量
- graphics
- java
- awt
- paint
- 1个回答
- 静态变量的初值为jvm默认的初值吗?
- java
- 静态变量
- jvm
- 4个回答
- android studio配置环境变量,adb文件没找到,望大神解答;
- 图片
- android-studio
- cmd
- gradle
- path
- 1个回答
- jq无法修改全局变量的问题,还请大神指点一二
- 全局变量
- javascript
- html5
- jquery
- 6个回答
- const定义变量时可以不赋值吗?
- c
- 3个回答
- Java 应该如何分辨 创建对象与定义对象变量的区别(如图中的题目)
- java
- 6个回答
- C语言简单的全局变量定义问题
- 图片
- c
- 全局变量
- 4个回答
- for的外面为什么不能定义变量?
- 标识符声明
- 未声明
- c语言
- 变量定义
- 结构体
- 7个回答
- c++ extern 声明 另一个文件中的定义的extern const 变量
- 全局变量
- c++
- extern
- 3个回答
- 如何定义一个针对线程的全局变量?(C++)
- 全局变量
- c++
- 线程
- 8个回答
- 关于在循环中变量的定义问题
- 变量
- 变量定义
- 3个回答