最近我在蓝桥杯第七届温度记录器的程序时,到最后一步是采集温度,程序出现问题调试不了。温度值一直显示为0,我想把读到的十个温度数据放到一个数组内,然后要用时从数组内调出来,但是貌似数据没录入数组内,跪求各位大神帮忙看看程序。我是用郭天祥的开发板调的程序,跟大赛的板子稍微不一样。
我用郭天祥单片机开发板写的温度记录器程序,发现程序前两个功能可以实现。但是到最后温度采集上一直采集不了温度数据,我是将十个温度数据放到一个数组内,然后在从数组内调用出来给显示函数的。但是发现温度显示一直为00,再者就是8.5的显示异常现象。之前我单独测试温度程序时是单个温度值采集发现程序可行,然后我就直接加下去大程序里,发现功能不能实现。多个温度值采集如何实现呢?跪求各位大佬解答
单片机源码:
- #include<reg52.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define unit unsigned int
- #define key_input P3
- sbit ds=P2^2; //温度传感器信号线
- sbit wela=P2^7;
- sbit dula=P2^6;
- sbit dscs=P1^4;
- sbit dsas=P1^5;
- sbit dsrw=P1^6;
- sbit dsrd=P1^7;
- sbit beep=P2^3;
- bit flag;
- unit temp;
- float f_temp;
- uchar jiange[]={1,5,30,60};
- uchar code table_wela1[]={0xf7,0xef,0xdf};
- uchar code table_wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
- unsigned char code smg[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};
- uchar key1,key2,key_press,key_number,addr,i;
- uchar key_scan(key_number)
- {
- static uchar key_state=0;
- key_input=0xf0;
- key1=key_input&0xf0;
- key_input=0x0f;
- key2=key_input&0x0f;
- key_press=key1|key2;
- switch(key_state)
- {
- case 0:
- if(key_press!=0xff)
- {
- key_state=1;
- }
- break;
-
- case 1:
- if(key_press!=0xff)
- {
- switch(key_press)
- {
- case 0x77: key_number=2;
- break;
- case 0x7b: key_number=3;
- break;
- case 0x7d: key_number=4;
- break;
- case 0x7e: key_number=5;
- break;
- }
- key_state=2;
- }
- else
- {
- key_state=0;
- }
- break;
- case 2:
- if(key_press==0xff)
- {
- key_state=0;
- }
- break;
- }
- return key_number;
- }
- void Timer1Init(void) //1毫秒@11.0592MHz
- {
- /*AUXR |= 0x40; */ //定时器时钟1T模式
- TMOD &= 0x0F; //设置定时器模式
- TMOD |= 0x10; //设置定时器模式
- TL1 = 0xCD; //设置定时初值
- TH1 = 0xD4; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- EA=1;
- ET1=1;
- }
- ////////////
- //DS18B20函数//
- /////////
- void delay(unit z)//延时函数
- {
- unit x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void dsreset(void) //18B20复位,初始化函数
- {
- unit i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit(void) //读1位函数
- {
- unit i;
- bit dat;
- ds=0;i++; //i++ 起延时作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tempread(void) //读1个字节
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
- }
- return(dat);
- }
- void tempwritebyte(uchar dat) //向18B20写一个字节数据
- {
- unit i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //写 1
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;while(i>0)i--;
- }
- else
- {
- ds=0; //写 0
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange(void) //DS18B20 开始获取温度并转换
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc); // 写跳过读ROM指令
- tempwritebyte(0x44); // 写温度转换指令
- }
- unit get_temp() //读取寄存器中存储的温度数据
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread(); //读低8位
- b=tempread(); //读高8位
- temp=b;
- temp<<=8; //两个字节组合为1个字
- temp=temp|a;
- f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
- temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
- f_temp=f_temp+0.05;
- return temp; //temp是整型
- }
- /////////////
- //DS18B20函数//
- //////////
- /////////
- //DS12C887函数//
- ////////
- void write_ds(uchar addr,uchar date)
- {
- P0=0xff;
- dsas=1;
- dsrd=1;
- dsrw=1;
- dscs=0;
- P0=addr;
- dsas=0;
- dsrw=0;
- P0=date;
- dsas=1;
- dsrw=1;
- dscs=1;
- }
- uchar read_ds(uchar addr)
- {
- uchar ds_date;
- P0=0xff;
- dscs=0;
- dsas=1;
- dsrd=1;
- dsrw=1;
- P0=addr;
- dsas=0;
- dsrd=0;
- P0=0xff;
- ds_date=P0;
- dsas=1;
- dsrd=1;
- dscs=1;
- return ds_date;
- }
- ///////////
- //DS12C887函数//
- //////////
- unit cishu,wenshi,wenge;
- unit caiyang_time;
- bit temp_flag;
- uchar wendu[2];
- char miaoshi,miaoge,fenshi,fenge,shishi,shige,shi,fen,miao,realjiange;
- uchar munu;
- uchar munu1[8];
- uchar munu2[6];
- uchar munu3[6];
- unit temperature[10];
- void main()
- {
- uchar display_cishu=0;
- uchar temp,jiange_count;
- Timer1Init();
- while(1)
- {
- miao=read_ds(0);
- miaoshi=miao/10;
- miaoge=miao%10;
- munu2[4]=smg[miaoshi];
- munu2[5]=smg[miaoge];
- fen=read_ds(2);
- fenshi=fen/10;
- fenge=fen%10;
- munu2[2]=smg[fenshi];
- munu2[3]=smg[fenge];
- shi=read_ds(4);
- shishi=shi/10;
- shige=shi%10;
- munu2[0]=smg[shishi];
- munu2[1]=smg[shige];
- munu1[0]=0x40;
- munu1[1]=smg[jiange[jiange_count]/10];
- munu1[2]=smg[jiange[jiange_count]%10];
-
- if(flag==1)
- {
- temp=key_scan(key_number);
- flag=0;
- switch(temp)
- {
- case 2:
- jiange_count++;
- i=0;
- if(jiange_count==4)
- {
- jiange_count=0;
- }
- break;
- case 3:
- munu=1;
- i=0;
- write_ds(0,55);
- write_ds(2,59);
- write_ds(4,23);
- realjiange=jiange[jiange_count];
- break;
- case 4:
- display_cishu++;
- if(display_cishu==10)
- {
- display_cishu=0;
- }
- break;
- case 5: break;
- }
- }
-
- if(temp_flag==1)
- {
-
- temp_flag=0;
- if(caiyang_time<<10)
- {
- EA=0;
- switch(caiyang_time)
- {
- case 0:
- tempchange();
- temperature[0]=get_temp();
- break;
- case 1: tempchange();
- temperature[1]=get_temp();
- break;
- case 2: tempchange();
- temperature[2]=get_temp();
- break;
- case 3: tempchange();
- temperature[3]=get_temp();
- break;
- case 4: tempchange();
- temperature[4]=get_temp();
- break;
- case 5: tempchange();
- temperature[5]=get_temp();
- break;
- case 6: tempchange();
- temperature[6]=get_temp();
- break;
- case 7: tempchange();
- temperature[7]=get_temp();
- break;
- case 8: tempchange();
- temperature[8]=get_temp();
- break;
- case 9: tempchange();
- temperature[9]=get_temp();
- break;
- }
- delay(1);
- EA=1;
- caiyang_time++;
- }
- else
- {
- munu++;
- }
- }
-
- if(munu==2)
- {
- switch(display_cishu)
- {
- case 0: munu3[0]=0x40;
- munu3[1]=smg[0/10];
- munu3[2]=smg[0%10];
- munu3[3]=0x40;
- wenshi=temperature[0]/10;
- wenge=temperature[0]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 1: munu3[0]=0x40;
- munu3[1]=smg[1/10];
- munu3[2]=smg[1%10];
- munu3[3]=0x40;
- wenshi=temperature[1]/10;
- wenge=temperature[1]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 2: munu3[0]=0x40;
- munu3[1]=smg[2/10];
- munu3[2]=smg[2%10];
- munu3[3]=0x40;
- wenshi=temperature[2]/10;
- wenge=temperature[2]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 3:munu3[0]=0x40;
- munu3[1]=smg[3/10];
- munu3[2]=smg[3%10];
- munu3[3]=0x40;
- wenshi=temperature[3]/10;
- wenge=temperature[3]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 4: munu3[0]=0x40;
- munu3[1]=smg[4/10];
- munu3[2]=smg[4%10];
- munu3[3]=0x40;
- wenshi=temperature[4]/10;
- wenge=temperature[4]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 5: munu3[0]=0x40;
- munu3[1]=smg[5/10];
- munu3[2]=smg[5%10];
- munu3[3]=0x40;
- wenshi=temperature[5]/10;
- wenge=temperature[5]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 6: munu3[0]=0x40;
- munu3[1]=smg[6/10];
- munu3[2]=smg[6%10];
- munu3[3]=0x40;
- wenshi=temperature[6]/10;
- wenge=temperature[6]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 7: munu3[0]=0x40;
- munu3[1]=smg[7/10];
- munu3[2]=smg[7%10];
- munu3[3]=0x40;
- wenshi=temperature[7]/10;
- wenge=temperature[7]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 8: munu3[0]=0x40;
- munu3[1]=smg[8/10];
- munu3[2]=smg[8%10];
- munu3[3]=0x40;
- wenshi=temperature[8]/10;
- wenge=temperature[8]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- case 9: munu3[0]=0x40;
- munu3[1]=smg[9/10];
- munu3[2]=smg[9%10];
- munu3[3]=0x40;
- wenshi=temperature[9]/10;
- wenge=temperature[9]%10;
- munu3[4]=smg[wenshi];
- munu3[5]=smg[wenge];
- break;
- }
- }
-
- }
- }
- void timer1() interrupt 3
- {
- static uchar key_count=0,smg_count=0;
- static unit caiyang_time=0;
- TL1 = 0xCD; //设置定时初值
- TH1 = 0xD4; //设置定时初值
- smg_count++;
- key_count++;
- if(key_count==1)
- {
- key_count=0;
- flag=1;
- }
- if(smg_count==1)
- {
- smg_count=0;
- P0=0XFF;
- if(munu==0)
- {
- P0=0XFF;
- dula=1;
- P0=munu1[i];
- dula=0;
- P0=0xff;
- P0=0XFF;
- wela=1;
- P0=table_wela1[i];
- wela=0;
- P0=0XFF;
-
- i++;
- if(i==3)
- {
- i=0;
- }
- }
-
- if(munu==1)
- {
- P0=0XFF;
- dula=0;
- dula=1;
- P0=munu2[i];
- dula=0;
- P0=0xff;
- wela=0;
- P0=0XFF;
- wela=1;
- P0=table_wela[i];
- wela=0;
- P0=0XFF;
-
- i++;
- if(i==6)
- {
- i=0;
- }
- }
-
- if(munu==2)
- {
- P0=0XFF;
- dula=0;
- P0=munu3[i];
- dula=1;
- dula=0;
- P0=0xff;
- wela=0;
- P0=table_wela[i];
- wela=1;
- wela=0;
- i++;
- if(i==6)
- {
- i=0;
- }
- }
-
- }
- if(munu==1)
- {
- caiyang_time++;
- if(caiyang_time==(realjiange*4000))//1s
- {
- caiyang_time=0;
- temp_flag=1;
- }
- }
- }
复制代码
全部资料51hei下载地址:
蓝桥杯实验-温度记录器.zip
(2.7 KB, 下载次数: 49)
|