PC机与单片机温度检测系统的设计
工作需要:下位机采用单片机实现数据的采集并通过串行通信上传数据,上位机利用组态王设计数据显示与曲线绘制的图形界面各位大侠请帮下忙,我还不清楚具体设计流程。若有各方面资料请...
工作需要:下位机采用单片机实现数据的采集并通过串行通信上传数据,上位机利用组态王设计数据显示与曲线绘制的图形界面
各位大侠请帮下忙,我还不清楚具体设计流程。若有各方面资料请留下邮箱,再此先谢过。
感谢zhguyi321的回答 不过我是一个菜鸟 不知有没图片让我看看
这几天才知道我的毕业设计软硬件都要自己弄 单片机那一块要自己焊 不能用市面上能买到的那些集成好的板块 功能不需太多 只要能采集能与电脑串口通信外加数码显示就好 但我单片机硬件这块一点都不懂 不知需要什么元件来焊 怎么焊 希望各位大侠能帮帮忙 若能解决我的问题 我会提高悬赏的
同样感谢hookwei的回答 竟然感兴趣 何不说的详细些 虽然我是前些天才注册的号 但这些天也积攒了一些分 若能很好的回答 我会拿全部分数作为悬赏的 展开
各位大侠请帮下忙,我还不清楚具体设计流程。若有各方面资料请留下邮箱,再此先谢过。
感谢zhguyi321的回答 不过我是一个菜鸟 不知有没图片让我看看
这几天才知道我的毕业设计软硬件都要自己弄 单片机那一块要自己焊 不能用市面上能买到的那些集成好的板块 功能不需太多 只要能采集能与电脑串口通信外加数码显示就好 但我单片机硬件这块一点都不懂 不知需要什么元件来焊 怎么焊 希望各位大侠能帮帮忙 若能解决我的问题 我会提高悬赏的
同样感谢hookwei的回答 竟然感兴趣 何不说的详细些 虽然我是前些天才注册的号 但这些天也积攒了一些分 若能很好的回答 我会拿全部分数作为悬赏的 展开
3个回答
展开全部
给钱的话倒是有兴趣
下位机用51+DS18B20,串口传送数据到PC
---------------------------------------
积分不稀罕的,要是送几个DS18B20倒还不错
若是只是几路温度采集的话,用DS18B20都不用读序列号,一个IO带一个DS18B20就是了,毕业设计不是工业应用,抗干扰都可以不考虑的.
#ifndef _DS18B20_H_
#define _DS18B20_H_
sbit DQ=P0^0;
idata unsigned char TempBuffer[7];
xdata unsigned char DS18B20_ID[8];
unsigned char temp_value,temp1_value;
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_nus(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_nus(40); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_nus(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_nus(20);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_nus(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_nus(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_nus(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_nus(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
temp1_value=a&0x0f;
}
void temp_to_str() //温度数据转换成液晶字符显示
{
TempBuffer[0]=temp_value/10+'0'; //十位
TempBuffer[1]=temp_value%10+'0'; //个位
TempBuffer[2]='.';
TempBuffer[3]=temp1_value*625/1000%10+'0';
TempBuffer[4]=0xdf; //温度符号
TempBuffer[5]='C';
TempBuffer[6]='\0';
if(TempBuffer[0]==0x30)
{
TempBuffer[0]=0x20;//如果十位为0,不显示
}
}
#endif
下位机用51+DS18B20,串口传送数据到PC
---------------------------------------
积分不稀罕的,要是送几个DS18B20倒还不错
若是只是几路温度采集的话,用DS18B20都不用读序列号,一个IO带一个DS18B20就是了,毕业设计不是工业应用,抗干扰都可以不考虑的.
#ifndef _DS18B20_H_
#define _DS18B20_H_
sbit DQ=P0^0;
idata unsigned char TempBuffer[7];
xdata unsigned char DS18B20_ID[8];
unsigned char temp_value,temp1_value;
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_nus(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_nus(40); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_nus(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_nus(20);
}
/***********ds18b20读一个字节**************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_nus(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_nus(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_nus(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_nus(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
temp1_value=a&0x0f;
}
void temp_to_str() //温度数据转换成液晶字符显示
{
TempBuffer[0]=temp_value/10+'0'; //十位
TempBuffer[1]=temp_value%10+'0'; //个位
TempBuffer[2]='.';
TempBuffer[3]=temp1_value*625/1000%10+'0';
TempBuffer[4]=0xdf; //温度符号
TempBuffer[5]='C';
TempBuffer[6]='\0';
if(TempBuffer[0]==0x30)
{
TempBuffer[0]=0x20;//如果十位为0,不显示
}
}
#endif
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我有个采集温度的PC机界面程序(VB)邮箱xmxqiyan@163.com
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询