|
最近我在藍(lán)橋杯第七屆溫度記錄器的程序時(shí),到最后一步是采集溫度,程序出現(xiàn)問題調(diào)試不了。溫度值一直顯示為0,我想把讀到的十個(gè)溫度數(shù)據(jù)放到一個(gè)數(shù)組內(nèi),然后要用時(shí)從數(shù)組內(nèi)調(diào)出來,但是貌似數(shù)據(jù)沒錄入數(shù)組內(nèi),跪求各位大神幫忙看看程序。我是用郭天祥的開發(fā)板調(diào)的程序,跟大賽的板子稍微不一樣。
我用郭天祥單片機(jī)開發(fā)板寫的溫度記錄器程序,發(fā)現(xiàn)程序前兩個(gè)功能可以實(shí)現(xiàn)。但是到最后溫度采集上一直采集不了溫度數(shù)據(jù),我是將十個(gè)溫度數(shù)據(jù)放到一個(gè)數(shù)組內(nèi),然后在從數(shù)組內(nèi)調(diào)用出來給顯示函數(shù)的。但是發(fā)現(xiàn)溫度顯示一直為00,再者就是8.5的顯示異,F(xiàn)象。之前我單獨(dú)測(cè)試溫度程序時(shí)是單個(gè)溫度值采集發(fā)現(xiàn)程序可行,然后我就直接加下去大程序里,發(fā)現(xiàn)功能不能實(shí)現(xiàn)。多個(gè)溫度值采集如何實(shí)現(xiàn)呢?跪求各位大佬解答
任務(wù).png (78.84 KB, 下載次數(shù): 23)
下載附件
2018-12-4 22:52 上傳
單片機(jī)源碼:
- #include<reg52.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define unit unsigned int
- #define key_input P3
- sbit ds=P2^2; //溫度傳感器信號(hào)線
- 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; */ //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x10; //設(shè)置定時(shí)器模式
- TL1 = 0xCD; //設(shè)置定時(shí)初值
- TH1 = 0xD4; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- EA=1;
- ET1=1;
- }
- ////////////
- //DS18B20函數(shù)//
- /////////
- void delay(unit z)//延時(shí)函數(shù)
- {
- unit x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void dsreset(void) //18B20復(fù)位,初始化函數(shù)
- {
- unit i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit(void) //讀1位函數(shù)
- {
- unit i;
- bit dat;
- ds=0;i++; //i++ 起延時(shí)作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tempread(void) //讀1個(gè)字節(jié)
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里
- }
- return(dat);
- }
- void tempwritebyte(uchar dat) //向18B20寫一個(gè)字節(jié)數(shù)據(jù)
- {
- 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 開始獲取溫度并轉(zhuǎn)換
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc); // 寫跳過讀ROM指令
- tempwritebyte(0x44); // 寫溫度轉(zhuǎn)換指令
- }
- unit get_temp() //讀取寄存器中存儲(chǔ)的溫度數(shù)據(jù)
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread(); //讀低8位
- b=tempread(); //讀高8位
- temp=b;
- temp<<=8; //兩個(gè)字節(jié)組合為1個(gè)字
- temp=temp|a;
- f_temp=temp*0.0625; //溫度在寄存器中為12位 分辨率位0.0625°
- temp=f_temp*10+0.5; //乘以10表示小數(shù)點(diǎn)后面只取1位,加0.5是四舍五入
- f_temp=f_temp+0.05;
- return temp; //temp是整型
- }
- /////////////
- //DS18B20函數(shù)//
- //////////
- /////////
- //DS12C887函數(shù)//
- ////////
- 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函數(shù)//
- //////////
- 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; //設(shè)置定時(shí)初值
- TH1 = 0xD4; //設(shè)置定時(shí)初值
- 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;
- }
- }
- }
復(fù)制代碼
全部資料51hei下載地址:
藍(lán)橋杯實(shí)驗(yàn)-溫度記錄器.zip
(2.7 KB, 下載次數(shù): 49)
2018-12-4 22:42 上傳
點(diǎn)擊文件名下載附件
|
|