在用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;
}
}
}
}
}
}
}
}
}
|