十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
java不可能直接调用传感器的啊。。。就算是单片机那也有系统的啊。。具体和硬件交互是系统负责的啊。。。
十年的博乐网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整博乐建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“博乐网站设计”,“博乐网站推广”以来,每个客户项目都认真落实执行。
234567891011121314151617181920212223242526 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public class ClientSocket { public static void main(String[] args)throws Exception{ getString(); } //获取本机全部MAC地址 private static void getString() throws IOException{ Process p = Runtime.getRuntime().exec("cmd /C ipconfig /all"); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String str = null; String Name_Mac = ""; while((str=br.readLine())!=null){ try { if(!str.substring(0, 1).equals(" ")) Name_Mac += str+" "; else if(str.indexOf("Physical Address")!=-1){ Name_Mac += str.substring(str.indexOf(":")+1)+"\n"; } } catch (Exception e) {} } System.out.println(Name_Mac); }}
//测试结果,Mac我必须修改一下,Sorry,另外请封装返回参数
Windows IP Configuration Ethernet adapter VMware Network Adapter VMnet8: 00-50-56-C0-0X-XX
Ethernet adapter VMware Network Adapter VMnet1: 00-50-56-C0-0X-XX
Ethernet adapter 无线网络连接: 74-E5-43-63-D4-XX
//------------------------------------------------------------------
//DS18B20温度传感器输出显示,运行本例时,外界温度将显示在1602LCD上
//------------------------------------------------------------------
#include reg52.h
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ=P2^2;
sbit dula=P2^6; //定义锁存器锁存端
sbit wela=P2^7;
sbit rs=P3^5; //定义1602液晶RS端
sbit lcden=P3^4;//定义1602液晶LCDEN端
sbit s1=P3^0; //定义按键--功能键
sbit s2=P3^1;//定义按键--增加键
sbit s3=P3^2;//定义按键--减小键
sbit s4=P3^6;//闹钟查看键
sbit rd=P3^7;
sbit beep=P2^3; //定义蜂鸣器端
uchar code Temp_Disp_Title[]={" Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};
uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00};
uchar display1[3]={0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;//当前读取的温度整数部分
uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值
uchar Display_Digit[]={0,0,0,0}; //待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志
//-------------------------------------
//延时1
//-------------------------------------
void delay1(uint x)
{
uchar i;
while(x--) for(i=0;i200;i++);
}
//-------------------------------------
//延时2
//-------------------------------------
void Delay(uint x)
{
while(x--);
}
//------------------------------------
//忙检查
//------------------------------------
void write_com(uchar com)//液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void Write_LCD_Data(uchar date)//液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
//-----------------------------
//设置LCD显示位置
//---------------------------------
void Set_Disp_Pos(uchar Pos)
{
write_com(Pos|0x80);
}
//-----------------------------
//LCD初始化
//---------------------------------
void Initialize_LCD()
{
uchar num;
rd=0; //软件将矩阵按键第4列一端置低用以分解出独立按键
dula=0;//关闭两锁存器锁存端,防止操作液晶时数码管会出乱码
wela=0;
lcden=0;
write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置显示初始坐标
for(num=0;num14;num++)//显示年月日星期
{
Write_LCD_Data(Temp_Disp_Title[num]);
delay1(5);
}
}
//-------------------------------------
//函数功能:初始化DS18B20
//出口参数:status---DS18B20是否复位成功的标志
//-------------------------------------
uchar Init_DS18B20()
{
uchar status; //储存DS18B20是否存在的标志,status=0,表示存在;status=1,表示不存在
DQ=1;Delay(8); //先将数据线拉高 //略微延时约6微秒
DQ=0;Delay(90); //再将数据线从高拉低,要求保持480~960us
//略微延时约600微秒 以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ=1;Delay(8); //释放数据线(将数据线拉高) //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
status=DQ;Delay(100); //让单片机检测是否输出了存在脉冲(DQ=0表示存在) //延时足够长时间,等待存在脉冲输出完毕
DQ=1; // 将数据线拉高
return status; //返回检测成功标志
}
//-------------------------------------
//函数功能:读一字节
//出口参数:dat---读出的数据
//-------------------------------------
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_(); // 先将数据线拉高 //等待一个机器周期
for (i=0;i8;i++)
{
DQ=0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat=1;
_nop_();//等待一个机器周期
DQ=1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
_nop_();_nop_(); //延时约6us,使主机在15us内采样
if (DQ) dat|=0x80; //如果读到的数据是1,则将1存入dat,如果是0则保持原值不变
Delay(30); //延时3us,两个读时序之间必须有大于1us的恢复期
DQ=1; // 将数据线拉高,为读下一位数据做准备
}
return dat;
}
//-------------------------------------
//函数功能:写一字节
//入口参数:dat---待写入的数据
//-------------------------------------
void WriteOneByte(uchar dat)
{
uchar i;
for (i=0;i8;i++)
{
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat 0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
Delay(5); //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
dat=1; //将dat中的各二进制位数据右移1位
}
}
//-------------------------------------
//函数功能:读取温度值
//出入口参数:无
//-------------------------------------
void Read_Temperature()
{
if(Init_DS18B20() == 1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC); // 跳过读序号列号的操作
WriteOneByte(0x44); // 启动温度转换
Init_DS18B20(); //将DS18B20初始化
WriteOneByte(0xCC); //跳过读序号列号的操作
WriteOneByte(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
Temp_Value[0]=ReadOneByte(); //温度低8位
Temp_Value[1]=ReadOneByte(); //温度高8位
DS18B20_IS_OK=1;
}
}
//-------------------------------------
//函数功能:在LCD上显示当前温度
//入口参数:
//-------------------------------------
void Display_Temperature()
{
uchar i;
//延时值与负数标识
uchar t=150,ng=0;
//高5位全为1(0xF8)则为负数,为负数时取反加1,并设置负数标示
if ((Temp_Value[1] 0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1后如果低字节为00表示有进位,进位位再加到高字节上
ng=1; //负数标示置1
}
Display_Digit[0]=df_Table[Temp_Value[0] 0x0F]; //查表得到温度小数部分
//获取温度整数部分(高字节的低3位与低字节中的高4位,无符号)
CurrentT=((Temp_Value[0] 0xF0)4)|((Temp_Value[1] 0x07)4);
//将整数部分分解为3位待显示数字
Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];
Display_Digit[2]=CurrentT%100/10;//十位
Display_Digit[1]=CurrentT%10;//个位
//刷新LCD显示缓冲
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先将'0'转换成整数48,然后与前面数字相加,得到相应数字的ASCII字符
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //个位
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位
//高位为0时不显示
if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';
//高位为0且次高位为0时,次高位不显示
if(Display_Digit[2]==0 Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//负数符号显示在恰当位置
if(ng)
{
if (Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行显示标题
Set_Disp_Pos(0x00);
for(i=0;i16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_Disp_Pos(0x40); //在第二行显示当前温度
for(i=0;i16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//显示温度符号
//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);
Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);
Set_Disp_Pos(0x4E);Write_LCD_Data('C');
}
//-------------------------------------
//函数功能:主函数
//入口参数:
//-------------------------------------
void main()
{
Initialize_LCD();
Read_Temperature();
Delay(50000);
Delay(50000);
while (1)
{
Read_Temperature();
if (DS18B20_IS_OK) Display_Temperature();
delay1(100);
}
}
亲,可以RF24L01有增强版的模块,传输距离据说可达2Km,其51驱动网上一大把,过程大概是这样:把读取的温度16进制数存到一个寄存器,把这个寄存器的内容发送给RF24L01,启动发送。电脑端也要搞一个单片机,驱动24L01,当收到信号,会产生中断,单片机把数据读出来,通过串口传给PC即可(推荐使用usb转串口的小板子,就几块钱,使用很方便,不需要给板子加max232了)。PC串口收到数据,在串口助手中勾选16进制显示,就是16进制的温度了,或者单片机把16进制的温度转化成字符串形式发到PC,这样串口助手不用勾选16进制显示,直接就能显示成温度。
不要使用inputStream.available(),如果我没有记错的话,available返回的是没有被阻断的字节数(已经被缓冲的内容),可以尝试read(byte b[])方法,然后通过返回值是否-1来判断,如下。
int bytesRead = inputStream.read(readBuffer);
while (bytesRead != -1) {
readStr += new String(readBuffer).trim();
bytesRead = inputStream.read(readBuffer);
}
到底是真实的温控、还是模拟的温控 。。。。。。。。。如果是真实的温控,这么大工作的话题,放这不太合适