在keil中编译以下程序时出现所有定义变量都是undefined identifier是什么原因啊? 急!!
#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchari;sbitlcdrs=p3^0;...
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs =p3^0;
sbit lcdrw =p3^1;
sbit lcden=p3^2;
sbit d1=p1^0;
sbit d2=p1^1;
uchar code t0[]="the temperature";
uchar code t1[]="is ";
uchar code wendu[]="0123456789";//乱码
sbit DQ=p3^7;//定义ds18b20总线IO
//液晶显示模块
void delay(uint z)
{
uint x,y;
for (x=100;x>1;x--)
for (y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
p2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
p2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for (i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--);
}
void Init_DS18B20()//初始化DS1820
{
unsigned char x=0;
DQ=1;//DQ复位
tmpDelay(8);//稍作延时
DQ=0;//单片机将DQ拉低
tmpDelay(80);//精确延时 大于480us
DQ=1;//拉高总线
tmpDelay(14);
x=DQ;
tmpDelay(20);
}
unsigned char ReadOneChar()//读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>1;
}
}
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//连续读两个字节数据//读低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//两字节合成一个整型变量
tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表是0.0625度
t=tt*10+0.5;//放大十,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(t);
}
void display()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>37)
{d1=0;d2=1;delay(500);}
if(num1<10)
{d1=1;d2=0;delay(500);}
else
{d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
}
void main()
{
init_lcd();
while(1)
{
display();
delay(10);
}
} 展开
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs =p3^0;
sbit lcdrw =p3^1;
sbit lcden=p3^2;
sbit d1=p1^0;
sbit d2=p1^1;
uchar code t0[]="the temperature";
uchar code t1[]="is ";
uchar code wendu[]="0123456789";//乱码
sbit DQ=p3^7;//定义ds18b20总线IO
//液晶显示模块
void delay(uint z)
{
uint x,y;
for (x=100;x>1;x--)
for (y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
p2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
p2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for (i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--);
}
void Init_DS18B20()//初始化DS1820
{
unsigned char x=0;
DQ=1;//DQ复位
tmpDelay(8);//稍作延时
DQ=0;//单片机将DQ拉低
tmpDelay(80);//精确延时 大于480us
DQ=1;//拉高总线
tmpDelay(14);
x=DQ;
tmpDelay(20);
}
unsigned char ReadOneChar()//读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>1;
}
}
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//连续读两个字节数据//读低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//两字节合成一个整型变量
tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表是0.0625度
t=tt*10+0.5;//放大十,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(t);
}
void display()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>37)
{d1=0;d2=1;delay(500);}
if(num1<10)
{d1=1;d2=0;delay(500);}
else
{d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
}
void main()
{
init_lcd();
while(1)
{
display();
delay(10);
}
} 展开
1个回答
展开全部
//没问题了,你的P口应该用大写。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs =P3^0;
sbit lcdrw =P3^1;
sbit lcden=P3^2;
sbit d1=P1^0;
sbit d2=P1^1;
uchar code t0[]="the temperature";
uchar code t1[]="is ";
uchar code wendu[]="0123456789";//乱码
sbit DQ=P3^7;//定义ds18b20总线IO
//液晶显示模块
void delay(uint z)
{
uint x,y;
for (x=100;x>1;x--)
for (y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for (i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--);
}
void Init_DS18B20()//初始化DS1820
{
unsigned char x=0;
DQ=1;//DQ复位
tmpDelay(8);//稍作延时
DQ=0;//单片机将DQ拉低
tmpDelay(80);//精确延时 大于480us
DQ=1;//拉高总线
tmpDelay(14);
x=DQ;
tmpDelay(20);
}
unsigned char ReadOneChar()//读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>1;
}
}
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//连续读两个字节数据//读低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//两字节合成一个整型变量
tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表是0.0625度
t=tt*10+0.5;//放大十,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(t);
}
void display()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>37)
{d1=0;d2=1;delay(500);}
if(num1<10)
{d1=1;d2=0;delay(500);}
else
{d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
}
void main()
{
init_lcd();
while(1)
{
display();
delay(10);
}
}
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar i;
sbit lcdrs =P3^0;
sbit lcdrw =P3^1;
sbit lcden=P3^2;
sbit d1=P1^0;
sbit d2=P1^1;
uchar code t0[]="the temperature";
uchar code t1[]="is ";
uchar code wendu[]="0123456789";//乱码
sbit DQ=P3^7;//定义ds18b20总线IO
//液晶显示模块
void delay(uint z)
{
uint x,y;
for (x=100;x>1;x--)
for (y=z;y>1;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x01);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for (i=0;i<16;i++)
{
write_date(t0[i]);
delay(0);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
write_date(t1[i]);
delay(0);
}
}
//温度采集模块
void tmpDelay(int num)//延时函数
{
while(num--);
}
void Init_DS18B20()//初始化DS1820
{
unsigned char x=0;
DQ=1;//DQ复位
tmpDelay(8);//稍作延时
DQ=0;//单片机将DQ拉低
tmpDelay(80);//精确延时 大于480us
DQ=1;//拉高总线
tmpDelay(14);
x=DQ;
tmpDelay(20);
}
unsigned char ReadOneChar()//读一个字节
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
tmpDelay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
tmpDelay(5);
DQ=1;
dat>>1;
}
}
unsigned int Readtemp()//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//连续读两个字节数据//读低八位
b=ReadOneChar();//高八位
t=b;
t<<=8;
t=t|a;//两字节合成一个整型变量
tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表是0.0625度
t=tt*10+0.5;//放大十,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(t);
}
void display()
{
unsigned int num,num1;
unsigned int shi,ge,xiaoshu;
num=Readtemp();
num1=num/10;
if(num1>37)
{d1=0;d2=1;delay(500);}
if(num1<10)
{d1=1;d2=0;delay(500);}
else
{d1=1;d2=1;}
shi=num/100;
ge=num/10%10;
xiaoshu=num%10;
write_com(0x80+0x40+5);
write_date(wendu[shi]);
write_com(0x80+0x40+6);
write_date(wendu[ge]);
write_com(0x80+0x40+7);
write_date(0x2e);
write_com(0x80+0x40+8);
write_date(wendu[xiaoshu]);
}
void main()
{
init_lcd();
while(1)
{
display();
delay(10);
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询