单片机与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

}
单片机端子程序附上
如图,这是串口助手里得到的画面
展开
 我来答
UX之家
2012-04-19 · TA获得超过1843个赞
知道小有建树答主
回答量:760
采纳率:50%
帮助的人:312万
展开全部
我有一个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);
// }

}
}
董卫卫14934
2012-04-14 · 超过11用户采纳过TA的回答
知道答主
回答量:83
采纳率:0%
帮助的人:35.7万
展开全部
你用的是dht11温湿度传感器吧!这个我做过,串口发送的数据是直接采集过来的二进制代码,发送前,先转换成字符在发送,就可以在串口调试助手或者上位机上看到,直接显示的温度,和湿度值了,
还有一点这个传感器,精度达不到小数点后两位
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lslk89
2012-04-12 · 超过11用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:20.4万
展开全部
你所说的计算机端的程序指的是上位机显示吧,这个你倒是可以看看VB,编写起来相对统一。对于你那温度显示的问题,你可以仔细看看你对应的温度转换程序代码,问题出在这儿的可能性比较大!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yryqscmhkx
2012-04-09 · 超过11用户采纳过TA的回答
知道答主
回答量:245
采纳率:0%
帮助的人:128万
展开全部
1.单片机与电脑之间用RS232协议通信,通信线路即串口线上传输的信号是数字例如STC的单片机。其指令系统同C51。 3.单片机与电脑之间存在电平不同问题,,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式