C51单片机开发板红外线控制1602LCD显示器的程序没看懂,求高手解释~
voidIR_IN()interrupt0using0{unsignedcharj,k,N=0;EX0=0;delay(15);if(IRIN==1){EX0=1;ret...
void IR_IN() interrupt 0 using 0
{
unsigned char j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)
{ IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
lcd_pos(0x4b);
lcd_wdat(IRCOM[6]); //第一位数显示
lcd_pos(0x4c);
lcd_wdat(IRCOM[5]); //第二位数显示
beep();
EX0 = 1;
} 展开
{
unsigned char j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)
{ IRCOM[5]=IRCOM[5]+0x37;}
else
IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{ IRCOM[6]=IRCOM[6]+0x37;}
else
IRCOM[6]=IRCOM[6]+0x30;
lcd_pos(0x4b);
lcd_wdat(IRCOM[6]); //第一位数显示
lcd_pos(0x4c);
lcd_wdat(IRCOM[5]); //第二位数显示
beep();
EX0 = 1;
} 展开
3个回答
2011-07-21
展开全部
详情请在百度文库搜索:10单片机轻松入门之十DS18B20温度传感器
程序如下:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; sbit EN=P3^2; sbit RW=P3^1; sbit wela=P3^3; sbit DQ=P3^4; uchar i; uint num; uint shi,ge,xiaoshu; uchar code t0[]="The temperature "; uchar code t1[]=" is "; uchar code wendu[]="0123456789";
void delay(uint x)
void delay1(uint x)
/*****************液晶写指令***************/
void write_com(uchar com)
/*****************液晶写数据指令***************/
void write_date(uchar date)
/*****************液晶初始化指令***************/
void init() { write_com(0x38); delay(20); write_com(0x0f); delay(20);
write_com(0x06); delay(20); write_com(0x80); for(i=0;i<16;i++) write_com(0x80+0x40); for(i=0;i<16;i++)
}
/*************DS18B20温度读取模块*************/
void tmpDelay(int u) //延时函数
void Init_DS18B20() //初始化ds1820
unsigned char ReadOneChar() //读一个字节 return(dat); }
void WriteOneChar(unsigned char dat) //写一个字节 }
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 main() { init(); num=Readtemp(); shi=num/100; ge=num/10%10; xiaoshu=num%10;
write_com(0xc0+5); write_date(wendu[shi]);
write_com(0xc0+6); write_date(wendu[ge]);
write_com(0xc0+7); write_date(0x2e);
write_com(0xc0+8);
write_date(wendu[xiaoshu]); while(1); }
另外,站长团上有产品团购,便宜有保证
程序如下:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; sbit EN=P3^2; sbit RW=P3^1; sbit wela=P3^3; sbit DQ=P3^4; uchar i; uint num; uint shi,ge,xiaoshu; uchar code t0[]="The temperature "; uchar code t1[]=" is "; uchar code wendu[]="0123456789";
void delay(uint x)
void delay1(uint x)
/*****************液晶写指令***************/
void write_com(uchar com)
/*****************液晶写数据指令***************/
void write_date(uchar date)
/*****************液晶初始化指令***************/
void init() { write_com(0x38); delay(20); write_com(0x0f); delay(20);
write_com(0x06); delay(20); write_com(0x80); for(i=0;i<16;i++) write_com(0x80+0x40); for(i=0;i<16;i++)
}
/*************DS18B20温度读取模块*************/
void tmpDelay(int u) //延时函数
void Init_DS18B20() //初始化ds1820
unsigned char ReadOneChar() //读一个字节 return(dat); }
void WriteOneChar(unsigned char dat) //写一个字节 }
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 main() { init(); num=Readtemp(); shi=num/100; ge=num/10%10; xiaoshu=num%10;
write_com(0xc0+5); write_date(wendu[shi]);
write_com(0xc0+6); write_date(wendu[ge]);
write_com(0xc0+7); write_date(0x2e);
write_com(0xc0+8);
write_date(wendu[xiaoshu]); while(1); }
另外,站长团上有产品团购,便宜有保证
展开全部
详情请在百度文库搜索:10单片机轻松入门之十DS18B20温度传感器
程序如下:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; sbit EN=P3^2; sbit RW=P3^1; sbit wela=P3^3; sbit DQ=P3^4; uchar i; uint num; uint shi,ge,xiaoshu; uchar code t0[]="The temperature "; uchar code t1[]=" is "; uchar code wendu[]="0123456789";
void delay(uint x)
void delay1(uint x)
/*****************液晶写指令***************/
void write_com(uchar com)
/*****************液晶写数据指令***************/
void write_date(uchar date)
/*****************液晶初始化指令***************/
void init() { write_com(0x38); delay(20); write_com(0x0f); delay(20);
write_com(0x06); delay(20); write_com(0x80); for(i=0;i<16;i++) write_com(0x80+0x40); for(i=0;i<16;i++)
}
/*************DS18B20温度读取模块*************/
void tmpDelay(int u) //延时函数
void Init_DS18B20() //初始化ds1820
unsigned char ReadOneChar() //读一个字节 return(dat); }
void WriteOneChar(unsigned char dat) //写一个字节 }
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 main() { init(); num=Readtemp(); shi=num/100; ge=num/10%10; xiaoshu=num%10;
write_com(0xc0+5); write_date(wendu[shi]);
write_com(0xc0+6); write_date(wendu[ge]);
write_com(0xc0+7); write_date(0x2e);
write_com(0xc0+8);
write_date(wendu[xiaoshu]); while(1); }
程序如下:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS=P3^0; sbit EN=P3^2; sbit RW=P3^1; sbit wela=P3^3; sbit DQ=P3^4; uchar i; uint num; uint shi,ge,xiaoshu; uchar code t0[]="The temperature "; uchar code t1[]=" is "; uchar code wendu[]="0123456789";
void delay(uint x)
void delay1(uint x)
/*****************液晶写指令***************/
void write_com(uchar com)
/*****************液晶写数据指令***************/
void write_date(uchar date)
/*****************液晶初始化指令***************/
void init() { write_com(0x38); delay(20); write_com(0x0f); delay(20);
write_com(0x06); delay(20); write_com(0x80); for(i=0;i<16;i++) write_com(0x80+0x40); for(i=0;i<16;i++)
}
/*************DS18B20温度读取模块*************/
void tmpDelay(int u) //延时函数
void Init_DS18B20() //初始化ds1820
unsigned char ReadOneChar() //读一个字节 return(dat); }
void WriteOneChar(unsigned char dat) //写一个字节 }
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 main() { init(); num=Readtemp(); shi=num/100; ge=num/10%10; xiaoshu=num%10;
write_com(0xc0+5); write_date(wendu[shi]);
write_com(0xc0+6); write_date(wendu[ge]);
write_com(0xc0+7); write_date(0x2e);
write_com(0xc0+8);
write_date(wendu[xiaoshu]); while(1); }
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
电路怎么不发出来呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询