单片机与PC的通信的问题
单片机与PC通信,单片机一次从串行口输出40位数据数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正...
单片机与PC通信,单片机一次从串行口输出40位数据
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
现在想把数据接收过来并且实时转换成温度湿度值。
温度过来的是00000011 11000000,则显示Temp=3.75摄氏度,计算机端的程序怎么写?
SendData(U8 *a)
{
outdata[0] = a[0];
outdata[1] = a[1];
outdata[2] = a[2];
outdata[3] = a[3];
outdata[4] = a[4];
count = 1;
SBUF=outdata[0];
}
void Delay(U16 j)
{ U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
单片机端子程序附上
如图,这是串口助手里得到的画面 展开
数据格式:8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据
+8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据
+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
现在想把数据接收过来并且实时转换成温度湿度值。
温度过来的是00000011 11000000,则显示Temp=3.75摄氏度,计算机端的程序怎么写?
SendData(U8 *a)
{
outdata[0] = a[0];
outdata[1] = a[1];
outdata[2] = a[2];
outdata[3] = a[3];
outdata[4] = a[4];
count = 1;
SBUF=outdata[0];
}
void Delay(U16 j)
{ U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
单片机端子程序附上
如图,这是串口助手里得到的画面 展开
4个回答
展开全部
我有一个DHT11的程序,自己参考下吧。
///////////////////////////////////数码管显示的DHT11湿温度示例程序//////////////////////////////20101031 参考沈老师的资料//////////////////////////////////////
//#include"stc12c5406ad.h"
#include"reg51.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
//数码管是LG5641BH。左边2个温度,右边2个湿度
uchar duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit LED1=P1^0; // 控制第一盏LED 从上 第四个数码管
sbit LED2=P1^1; // 控制第二盏LED 往下 第三个数码管
sbit LED3=P1^2; // 控制第三盏LED 数 第一个数码管
sbit LED4=P1^3; // 控制第四盏LED 第二个数码管
sbit pw=P1^0; // DHT11数据线端口
uchar rh_h,rh_l,temp_h,temp_l,check_data,dat=0;
uchar r_rh_h,r_rh_l,r_temp_h,r_temp_l,r_check_data;
uchar check;
//
uchar c[6],d[1];
////////////////////////// /100u秒延时函数/////////////////////////////////////
void delay(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
for(j=110;j>0;j--);
}
////////////////////////延时10us的i为11/////////////////////////////// /////////
void delay10us(uchar i)
{
while(i--);
}
/////////////////////////////// //数码管显示函数////////////////////////////////////////////////
void display(uchar shidu,uchar wendu)
{
uchar i=280; //这个I延时不能少,100S,300s都导致DHT11死机了,就是进入死循环了
while(i--) //这个与DHT11的采集和转换周期有关系,要有一定的延时来保证一个采样
{ //周期地完成,以便顺利进行下一次的采样和输出。
//bai=shu/100;
//shi=shu%100/10;
//ge=shu%10;
LED3=0; //点亮最左一盏
LED4=1;
LED2=1;
LED1=1;
P1=duan[wendu/10];
delay(50);
LED3=1;
LED4=0; //点亮第二盏
LED2=1;
LED3=1;
LED1=1;
P1=duan[wendu%10];
delay(50);
LED4=1;
LED2=0; //点亮第三盏
LED4=1;
LED3=1;
LED1=1;
P1=duan[shidu/10];
delay(50);
LED2=1;
LED1=0; //点亮第四盏
LED4=1;
LED3=1;
LED2=1;
P1=duan[shidu%10];
delay(50);
LED1=1;
}
}
/////////////////////////DHT11核心程序///////////////////////////////////////
void dht11_com(void) //此函数是读数正确性与否的的决定性因素
// 主要问题是调整好此处的延时时间
{
uchar j;
bit wei;
// TH0=0x00; // 定时器清零
// TL0=0x00;
for(j=0;j<8;j++)
{
// flag=2; //延时
//并等待
// while((!pw)&&flag++); //低电平结束
// while(pw);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
while(!pw);
if(pw)
{
delay10us(11); // 高电平持续时间
delay10us(11); // 为26us-28us的是0
delay10us(11);
delay10us(11);
// delay10us(2);
// delay10us(2);
wei=0; //
// 延时约50us如果还是高电平则被认为是1否则为0
if(pw) wei=1; //
// 高电平持续时间
// 为70us的是1
// flag=2;
// while(pw&&flag++);
dat<<=1;
dat|=wei; //DHT11数据是高位先出,这里将八位组成一个字节
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// if(pw) //如果是高电平,开启定时器0
// {
// TR0=1; //计算一个正脉冲的宽度
// }
// while(pw);
// TR0=0;
// a=TL0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
// if(a>28)
// wei=1;
// else
// wei=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
uint getbyte1(void)
{
uint i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
///////// j=getbit();////////////////////////////////////////////////////////////////////////
dat=(dat<<1)|j;
}
return dat;
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
void init(void) //定时器和传感器初始化
{
uint i;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
uchar flag;
// TMOD=0x09;
// EX0=0;
*/
///////////////////////////////////////////数据采集函数/////////////////////////////////////////////////////////
void shujushenchen(void)
{
pw=0; //主机上拉电阻拉低
delay(20); //开始信号 延时二十MS
pw=1; //主机拉高
// for(i=0;i<30;i++); //等待响应 延时30US
// delay10us(11);
delay10us(11);
delay10us(11);
pw=1; //设为输入模式
while(pw); //等待响应低电平
if(!pw) //如果从机DHT11发出响应信号
{
// flag=2;
// while((!pw)&&flag++); //等待从机响应信号延时约80US
delay10us(11);
delay10us(11);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11);
while(!pw);
if(pw) //如果从机响应结束
{
// flag=2;
// while(pw&&flag++); //等待从机结束高电平状态
delay10us(11);
delay10us(11);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11); //此过程约80us
while(pw);
// 此后开始接受数据
dht11_com(); //接受第一个字节即湿度的整数八位
// rh_h=dat;
c[0]=dat;
dht11_com(); // 以下的以此类推
// rh_l=dat;
c[1]=dat;
dht11_com();
// temp_h=dat;
c[2]=dat;
dht11_com();
// temp_l=dat;
c[3]=dat;
dht11_com();
// check_data=dat;
c[4]=dat;
pw=1; // 接受完最后一个字节后由主机拉高,以便下一次采集数据
//数据验证
// check=(rh_h+rh_l+temp_h+temp_l);
c[5]=(c[0]+c[1]+c[2]+c[3]);
//前四个字节之和是否等于最后一个字节如等,则说明数据传送正确
if(/*(check==check_data)*/d[0]==c[4]) //如果数据传送正确
{
r_rh_h=1;
r_rh_l=rh_l;
r_temp_h=temp_h;
r_temp_l=temp_l;
}
}
}
}
///////////////////////////////////////主函数/////////////////////////////////////////////////////////////
void main(void)
{
// uchar i;
delay(2000); //等待1秒钟越过不稳定状态
while(1)
{
shujushenchen(); //采集数据 c
// 生成数据
//送到数码管显示
// for(i=0;i<6;i++)
// {
display(c[0],c[2]); //湿度
// display(c[2]); //温度
delay(50);
// }
}
}
///////////////////////////////////数码管显示的DHT11湿温度示例程序//////////////////////////////20101031 参考沈老师的资料//////////////////////////////////////
//#include"stc12c5406ad.h"
#include"reg51.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
//数码管是LG5641BH。左边2个温度,右边2个湿度
uchar duan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit LED1=P1^0; // 控制第一盏LED 从上 第四个数码管
sbit LED2=P1^1; // 控制第二盏LED 往下 第三个数码管
sbit LED3=P1^2; // 控制第三盏LED 数 第一个数码管
sbit LED4=P1^3; // 控制第四盏LED 第二个数码管
sbit pw=P1^0; // DHT11数据线端口
uchar rh_h,rh_l,temp_h,temp_l,check_data,dat=0;
uchar r_rh_h,r_rh_l,r_temp_h,r_temp_l,r_check_data;
uchar check;
//
uchar c[6],d[1];
////////////////////////// /100u秒延时函数/////////////////////////////////////
void delay(uint xs)
{
uint i,j;
for(i=xs;i>0;i--)
for(j=110;j>0;j--);
}
////////////////////////延时10us的i为11/////////////////////////////// /////////
void delay10us(uchar i)
{
while(i--);
}
/////////////////////////////// //数码管显示函数////////////////////////////////////////////////
void display(uchar shidu,uchar wendu)
{
uchar i=280; //这个I延时不能少,100S,300s都导致DHT11死机了,就是进入死循环了
while(i--) //这个与DHT11的采集和转换周期有关系,要有一定的延时来保证一个采样
{ //周期地完成,以便顺利进行下一次的采样和输出。
//bai=shu/100;
//shi=shu%100/10;
//ge=shu%10;
LED3=0; //点亮最左一盏
LED4=1;
LED2=1;
LED1=1;
P1=duan[wendu/10];
delay(50);
LED3=1;
LED4=0; //点亮第二盏
LED2=1;
LED3=1;
LED1=1;
P1=duan[wendu%10];
delay(50);
LED4=1;
LED2=0; //点亮第三盏
LED4=1;
LED3=1;
LED1=1;
P1=duan[shidu/10];
delay(50);
LED2=1;
LED1=0; //点亮第四盏
LED4=1;
LED3=1;
LED2=1;
P1=duan[shidu%10];
delay(50);
LED1=1;
}
}
/////////////////////////DHT11核心程序///////////////////////////////////////
void dht11_com(void) //此函数是读数正确性与否的的决定性因素
// 主要问题是调整好此处的延时时间
{
uchar j;
bit wei;
// TH0=0x00; // 定时器清零
// TL0=0x00;
for(j=0;j<8;j++)
{
// flag=2; //延时
//并等待
// while((!pw)&&flag++); //低电平结束
// while(pw);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
// delay10us(11);
while(!pw);
if(pw)
{
delay10us(11); // 高电平持续时间
delay10us(11); // 为26us-28us的是0
delay10us(11);
delay10us(11);
// delay10us(2);
// delay10us(2);
wei=0; //
// 延时约50us如果还是高电平则被认为是1否则为0
if(pw) wei=1; //
// 高电平持续时间
// 为70us的是1
// flag=2;
// while(pw&&flag++);
dat<<=1;
dat|=wei; //DHT11数据是高位先出,这里将八位组成一个字节
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// if(pw) //如果是高电平,开启定时器0
// {
// TR0=1; //计算一个正脉冲的宽度
// }
// while(pw);
// TR0=0;
// a=TL0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
// if(a>28)
// wei=1;
// else
// wei=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
uint getbyte1(void)
{
uint i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
///////// j=getbit();////////////////////////////////////////////////////////////////////////
dat=(dat<<1)|j;
}
return dat;
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
void init(void) //定时器和传感器初始化
{
uint i;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
uchar flag;
// TMOD=0x09;
// EX0=0;
*/
///////////////////////////////////////////数据采集函数/////////////////////////////////////////////////////////
void shujushenchen(void)
{
pw=0; //主机上拉电阻拉低
delay(20); //开始信号 延时二十MS
pw=1; //主机拉高
// for(i=0;i<30;i++); //等待响应 延时30US
// delay10us(11);
delay10us(11);
delay10us(11);
pw=1; //设为输入模式
while(pw); //等待响应低电平
if(!pw) //如果从机DHT11发出响应信号
{
// flag=2;
// while((!pw)&&flag++); //等待从机响应信号延时约80US
delay10us(11);
delay10us(11);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11);
while(!pw);
if(pw) //如果从机响应结束
{
// flag=2;
// while(pw&&flag++); //等待从机结束高电平状态
delay10us(11);
delay10us(11);
delay10us(11);
delay10us(11);
// delay10us(11);
// delay10us(11); //此过程约80us
while(pw);
// 此后开始接受数据
dht11_com(); //接受第一个字节即湿度的整数八位
// rh_h=dat;
c[0]=dat;
dht11_com(); // 以下的以此类推
// rh_l=dat;
c[1]=dat;
dht11_com();
// temp_h=dat;
c[2]=dat;
dht11_com();
// temp_l=dat;
c[3]=dat;
dht11_com();
// check_data=dat;
c[4]=dat;
pw=1; // 接受完最后一个字节后由主机拉高,以便下一次采集数据
//数据验证
// check=(rh_h+rh_l+temp_h+temp_l);
c[5]=(c[0]+c[1]+c[2]+c[3]);
//前四个字节之和是否等于最后一个字节如等,则说明数据传送正确
if(/*(check==check_data)*/d[0]==c[4]) //如果数据传送正确
{
r_rh_h=1;
r_rh_l=rh_l;
r_temp_h=temp_h;
r_temp_l=temp_l;
}
}
}
}
///////////////////////////////////////主函数/////////////////////////////////////////////////////////////
void main(void)
{
// uchar i;
delay(2000); //等待1秒钟越过不稳定状态
while(1)
{
shujushenchen(); //采集数据 c
// 生成数据
//送到数码管显示
// for(i=0;i<6;i++)
// {
display(c[0],c[2]); //湿度
// display(c[2]); //温度
delay(50);
// }
}
}
展开全部
你用的是dht11温湿度传感器吧!这个我做过,串口发送的数据是直接采集过来的二进制代码,发送前,先转换成字符在发送,就可以在串口调试助手或者上位机上看到,直接显示的温度,和湿度值了,
还有一点这个传感器,精度达不到小数点后两位
还有一点这个传感器,精度达不到小数点后两位
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你所说的计算机端的程序指的是上位机显示吧,这个你倒是可以看看VB,编写起来相对统一。对于你那温度显示的问题,你可以仔细看看你对应的温度转换程序代码,问题出在这儿的可能性比较大!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.单片机与电脑之间用RS232协议通信,通信线路即串口线上传输的信号是数字例如STC的单片机。其指令系统同C51。 3.单片机与电脑之间存在电平不同问题,,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询