标题:
关于第七届蓝桥杯单片机温度记录器程序问题
[打印本页]
作者:
kyrie1997
时间:
2018-12-4 22:54
标题:
关于第七届蓝桥杯单片机温度记录器程序问题
最近我在蓝桥杯第七届温度记录器的程序时,到最后一步是采集温度,程序出现问题调试不了。温度值一直显示为0,我想把读到的十个温度数据放到一个数组内,然后要用时从数组内调出来,但是貌似数据没录入数组内,跪求各位大神帮忙看看程序。我是用郭天祥的开发板调的程序,跟大赛的板子稍微不一样。
我用郭天祥单片机开发板写的温度记录器程序,发现程序前两个功能可以实现。但是到最后温度采集上一直采集不了温度数据,我是将十个温度数据放到一个数组内,然后在从数组内调用出来给显示函数的。但是发现温度显示一直为00,再者就是8.5的显示异常现象。之前我单独测试温度程序时是单个温度值采集发现程序可行,然后我就直接加下去大程序里,发现功能不能实现。多个温度值采集如何实现呢?跪求各位大佬解答
任务.png
(78.84 KB, 下载次数: 23)
下载附件
2018-12-4 22:52 上传
单片机源码:
#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)
2018-12-4 22:42 上传
点击文件名下载附件
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1