標(biāo)題:
關(guān)于第七屆藍(lán)橋杯單片機(jī)溫度記錄器程序問題
[打印本頁]
作者:
kyrie1997
時(shí)間:
2018-12-4 22:54
標(biāo)題:
關(guān)于第七屆藍(lán)橋杯單片機(jī)溫度記錄器程序問題
最近我在藍(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的顯示異常現(xiàn)象。之前我單獨(dú)測試溫度程序時(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)擊文件名下載附件
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1