搜索内容

有一个问题?

如果您有任何疑问,可以在下面询问或输入您要寻找的!

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

技术聚客 未结 1 1118
LYPRCO
LYPRCO 2021-03-08 00:39

#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条回答
  • 2021-03-08 00:48

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

    0 讨论(0)
提交回复