大家帮我看看这个简单的基于89c51单片机与labview的温度检测系统为什么不能运行。
下面是我的具体的单片机C程序与labview程序图,其中单片机程序与labview程序单独运行都是没问题的,但是连接起来就不能运行了。盼望高手们的指点,提出能够使它真正运...
下面是我的具体的单片机C程序与labview程序图,其中单片机程序与labview程序单独运行都是没问题的,但是连接起来就不能运行了。盼望高手们的指点,提出能够使它真正运行起来!(希望您能够亲自运行一下,我自己是在单片机开发板上实验的)
#include<reg52.h>#include <stdio.h>#include <stdlib.h>#define uchar unsigned char#define uint unsigned int sbit DQ=P3^7;//51单片机的P3^7与18B20的数据输入端口相连接uchar temp1,temp2;uchar i;bit Flag;
uint ReData,SenData;//延时void delay(uint m){ while(m--);}
//复位程序void ow_rest(void){ uchar feedback=0; DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(14); feedback=DQ; delay(20);}//从单总线上读字节uchar read_byte(void){ uchar value=0; for(i=0;i<8;i++) { DQ=0; value>>=1; DQ=1; if(DQ) { value|=0x80; } delay(4); } return(value);}//详单总线上写字节void write_byte(uchar val){ for(i=0;i<8;i++) { DQ=0; DQ=val&0x01; //val>>=1; delay(5); DQ=1; val>>=1; }}//读取温度void read_temperature(void){ ow_rest(); write_byte(0xcc); write_byte(0x44); delay(10); ow_rest(); write_byte(0xcc); write_byte(0xbe); temp1=read_byte(); temp2=read_byte();}//主程序void main(){ uint temp; bit flag; SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; //定时器工作方式2 PCON|= 0x80; //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592) TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M) TL1 = 0xF3; TR1 = 1; ES = 1; //开串口中断 EA = 1; // 开总中断
while(1) { read_temperature(); temp=temp2*256+temp1; if(temp2>0xf8) { flag=1; temp=~temp+1; } temp=temp*0.0625; SenData=temp; if (Flag==1) { SBUF=SenData; //SUBF接受/发送缓冲器 while(TI==0); TI=0; Flag=0; } } }
/**************************************************** 串口中断程序******************************************************/void ser_int (void) interrupt 4 using 1{ if(RI == 1) //RI接受中断标志 { RI = 0; //清除RI接受中断标志 ReData = SBUF; //SUBF接受/发送缓冲器 Flag=1; }} 展开
#include<reg52.h>#include <stdio.h>#include <stdlib.h>#define uchar unsigned char#define uint unsigned int sbit DQ=P3^7;//51单片机的P3^7与18B20的数据输入端口相连接uchar temp1,temp2;uchar i;bit Flag;
uint ReData,SenData;//延时void delay(uint m){ while(m--);}
//复位程序void ow_rest(void){ uchar feedback=0; DQ=1; delay(8); DQ=0; delay(80); DQ=1; delay(14); feedback=DQ; delay(20);}//从单总线上读字节uchar read_byte(void){ uchar value=0; for(i=0;i<8;i++) { DQ=0; value>>=1; DQ=1; if(DQ) { value|=0x80; } delay(4); } return(value);}//详单总线上写字节void write_byte(uchar val){ for(i=0;i<8;i++) { DQ=0; DQ=val&0x01; //val>>=1; delay(5); DQ=1; val>>=1; }}//读取温度void read_temperature(void){ ow_rest(); write_byte(0xcc); write_byte(0x44); delay(10); ow_rest(); write_byte(0xcc); write_byte(0xbe); temp1=read_byte(); temp2=read_byte();}//主程序void main(){ uint temp; bit flag; SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD|= 0x20; //定时器工作方式2 PCON|= 0x80; //TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592) TH1 = 0xF3; // //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M) TL1 = 0xF3; TR1 = 1; ES = 1; //开串口中断 EA = 1; // 开总中断
while(1) { read_temperature(); temp=temp2*256+temp1; if(temp2>0xf8) { flag=1; temp=~temp+1; } temp=temp*0.0625; SenData=temp; if (Flag==1) { SBUF=SenData; //SUBF接受/发送缓冲器 while(TI==0); TI=0; Flag=0; } } }
/**************************************************** 串口中断程序******************************************************/void ser_int (void) interrupt 4 using 1{ if(RI == 1) //RI接受中断标志 { RI = 0; //清除RI接受中断标志 ReData = SBUF; //SUBF接受/发送缓冲器 Flag=1; }} 展开
2个回答
展开全部
单片机程序没什么问题,所以你的下位机只有发送温度数据给上位机,看到了串口中断函数,但没看到单片机主进程读串口的操作。你的主进程没延时,当温度超限后发送会很频繁。
Labview程序不建议这样写,你把读控件和写控件放一个While循环里了,当2个开关同时打开会出问题,你可以用顺序结构,或者不要"写控件"(因为你只要读串口).
还有你一个循环要1000ms有点慢,可以减少点.给你个诀窍,Labview程序也是可以调试的,你可以增加探针看问题在哪里。
Labview程序不建议这样写,你把读控件和写控件放一个While循环里了,当2个开关同时打开会出问题,你可以用顺序结构,或者不要"写控件"(因为你只要读串口).
还有你一个循环要1000ms有点慢,可以减少点.给你个诀窍,Labview程序也是可以调试的,你可以增加探针看问题在哪里。
迪凯特科技(北京)有限公司
2023-07-28 广告
2023-07-28 广告
单片机串口通信的原理是利用单片机的串口通信模块,通过把数据转化为一位一位的用时序方式传送数据,实现单片机与外部设备之间的数据通信。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以...
点击进入详情页
本回答由迪凯特科技(北京)有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询