在用12864显示温度距离数据的时候,不进入while(1)循环,显示正常,进入之后,改变数组bb和cc的值,再次显示就出现了乱码,可能是哪些原因呢?有没有碰到过类似的问题的?#include <REGX52.H>
#include <stdio.h>
#include "LCD.H"
#include "18B20.H"
#include "delay.h"
sbit k1=P1^0;//功能键
sbit k2=P1^1;//调整键
sbit csb=P2^7;//Trig
sbit csbint=P3^2;//Echo
sbit bg=P2^6;
sbit fmq=P3^3;//蜂鸣器
unsigned char aa[]={'D','i','s','t','a','n','c','e',':'}; //Distance
unsigned char bb[]={' ',' ',' ',' ','.',' ',' ',' '};//用于显示温度值
unsigned char cc[]={'A','.','A','A','m'};
unsigned char zf,a1,a2,a3,xs,e,n,m,z; //zf 温度正负标志位;a1,a2,a3,按键设定程序中定值的米、分米、厘米临时存储变量
//xs,e 用于按键程序中设定位闪动显示的变量;flag,未用,n,m,z是背光控制标志位变量,改变报警值时控制闪烁循环;
unsigned int dz,k,s,j,bgz,k;//dz为报警值
int temp;
float temperature,csbc,wdz;
bit wh;
main()
{
TH0=0;//T0用于计时,计算超声波返回脉冲的宽度 51单片机自加1计数
TL0=0;
TMOD=0X11; //T1,T0为16位定时器 实际只使用了定时器0
EA=0;
bg=0;
n=0;
m=0;
z=0;
init();//LCD初始化
Init_DS18B20();//DS18B20初始化
dz=80;//调值 设定报警值
bb[6]=0xa1;//显示摄氏度符号
bb[7]=0xe6;
e=4;
cc[0]=dz/100+'0';
cc[2]=dz/10%10+'0';
cc[3]=dz%10+'0';
LCD_Write_String(0,0," 超声波测距仪 ");
LCD_Write_String(0,1,"距离:");
LCD_Write_String(0,2,"温度:");
LCD_Write_String(0,3,"阈值:");
LCD_Write_String(3,3,cc);
while(1)
{
temp=ReadTemperature();
fmq=1;
DelayMs(100);
if(temp<0)
{
temp=-(temp-1);
zf=1;//zf 温度正负标志位 zf为1是温度为负
bb[0]='-';
}
else
{
zf=0;
bb[0]=' ';
}
csb=0; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
csb=1;
ET0=1; //启动计数器T0,用以计时
TR0=1;
EA=1;
j=80; //延时
while(j--)
{
}
csbint=1;
j=0;
while(csbint) //判断接收回路是否收到超声波的回波
{
j++;
if(j>=2500) //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
csbint=0;
}
TR0=0;
s=TH0*256+TL0; //读取时间数据
TH0=0;
TL0=0;
wdz=0.00000607*temp; //温度补偿计算
if(zf==0)
{
csbc=0.03315+wdz;
}
else csbc=0.03315-wdz;
csbc=csbc/2;
s=s*csbc-8;
if(s<5) //测量值小于下限
{
cc[0]='-';
cc[2]='-';
cc[3]='-';
}
else if(s>500) //测量值大于上限
{
cc[0]='C';
cc[2]='C';
cc[3]='C';
}
else
{
cc[0]=s/100+'0';
cc[2]=s/10%10+'0';
cc[3]=s%10+'0';
}
if(s<dz)//调节报警声音的频率
{
bgz=s*5;
for (k=0;k<bgz;k++)
{
DelayUs2x(150);
fmq=!fmq; //BEEP取反
}
}
bb[1]=temp/1000+0x30;
bb[2]=temp/100%10+0x30;//显示十位
bb[3]=temp%100/10+0x30;//显示个位
bb[5]=temp%10+0x30; //小数
if(zf==0)
{
if(temp<1000)
{
bb[1]=' ';
if(temp<100)
{
bb[2]=' ';
}
}
}
else
{
if(temp<1000)
{
bb[0]=' ';
bb[1]='-';
if(temp<100)
{
bb[0]=' ';
bb[1]=' ';
bb[2]='-';
}
}
}
LCD_Write_String(3,2,bb);//显示测得的温度
LCD_Write_String(3,1,cc);//显示测得的距离
while(!k2) //液晶背面开关
{
n=1;
}
if(n==1)
{
bg=~bg; //bg=0;时开背光灯
n=0;
}
if(!k1) //按键处理程序
{
TR1=0;
TR0=0;
cc[0]='A';
cc[1]='.';
cc[2]='A';
cc[3]='A';
cc[4]='m';
LCD_Write_String(3,3,cc);
k=500;
while(k)
{
k--;
DelayMs(2);
}
cc[0]=dz/100+'0';
cc[2]=dz/10%10+'0';
cc[3]=dz%10+'0';
LCD_Write_String(3,3,cc);
a1=dz/100;
a2=dz/10%10;
a3=dz%10;
n=1;
while(n)
{
if(!k2)
{
while(!k2);//等待松手
e=1;
xs=3;
a1+=1;
if(a1>5)
a1=0;
cc[0]=a1+'0';
}
if (e==1)
{
xs++;
cc[0]=a1+'0';
if(xs>6)
{
xs=0;
e=0;
}
}
else
{
cc[0]=' ';
xs++;
if(xs>3)
{
xs=0;
e=1;
}
}
LCD_Write_String(3,3,cc);
if(!k1)
{
while(!k1);
cc[0]=a1+'0';
m=1;
while(m)
{
if(!k2)
{
while(!k2);
e=1;
xs=3;
a2+=1;
if(a2>9)
a2=0;
cc[2]=a2+'0';
LCD_Write_String(3,3,cc);
}
if (e==1)
{
xs++;
cc[2]=a2+'0';
if(xs>6)
{
xs=0;
e=0;
}
}
else
{
cc[2]=' ';
xs++;
if(xs>3)
{
xs=0;
e=1;
}
}
LCD_Write_String(3,3,cc);
if(!k1)
{
while(!k1);
cc[2]=a2+'0';
z=1;
while(z)
{
if(!k2)//改变报警值
{
while(!k2);
e=1;
xs=3;
a3+=1;
if(a3>9)
a3=0;
cc[3]=a3+'0';
LCD_Write_String(3,3,cc);
}
if (e==1)//控制闪烁
{
xs++;
cc[3]=a3+'0';
if(xs>6)
{
xs=0;
e=0;
}
}
else
{
cc[3]=' ';
xs++;
if(xs>3)
{
xs=0;
e=1;
}
}
LCD_Write_String(3,3,cc);
if(!k1)
{
while(!k1);
dz=a1*100+a2*10+a3;
n=0;
m=0;
z=0;
}
}
}
}
}
}
}
}
}
|