51单片机温度采集系统 30
程序现在只能实现温度的正常显示但是要实现把显示的温度数据发送给VB界面可以显示出波形图现在程序不能正常发送数据!请各位朋友看下程序那里出错了????程序中是否要加入中断函...
程序现在只能实现温度的正常显示 但是要实现把显示的温度数据发送给VB界面可以显示出波形图 现在程序不能正常发送数据!请各位朋友看下程序那里出错了???? 程序中是否要加入中断函数?
#include<reg51.H>
#include<absacc.H>
#include <intrins.h>
#include<stdio.h>
#define XTAL 110592;//CPU晶振频率#define baudrate 9600 //通信波特率
#define uchar unsigned char#define uint unsigned int
//不带小数点
uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//带小数点
uchar code TAB1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
sbit DQ=P3^3; //定义DS18B20的端口DQ
void delay(uint i) //精确延时程序
{
while(i--);
}
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void display(int k)//数码管显示
{
P2=0xf7;
P0=0x39; //显示C
DelayMS(1);
P2=0xfb;
P0=0x63;//显示°
DelayMS(1);
P2=0xfd;
P0=TAB1[k%10];//显示个位
DelayMS(1);
P2=0xfe;
P0=TAB[k/10%10];//显示十位
DelayMS(1);
}
init_DS(void) //DS18B20初始化
{
uchar x=0;
DQ=1; //DQ复位
delay(8); //延时
DQ=0; //单片机拉低总线
delay(85); //延时
DQ=1; //释放总线,单片机拉高总线
delay(14);
x=DQ; //稍作延时后,如果X=0则初始化成功,X=1则失败
delay(20);
}
Read(void) //读一个字节
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>=1; //让脉冲读到的位数据,依次从高位移到低位
DQ=1; //释放总线
if(DQ) //控制器进行采样
dat|=0x80; //读出数据放入高位,最后右移到低位
delay(4); //延时
}
return(dat);
}
write(uchar dat) //写一个字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0; //拉低总线
DQ=dat&0x01; //从低位开始写入
delay(5);
DQ=1; //写完后释放总线
dat>>=1;
}
delay(4); //延时
}
Readtem(void) //获取温度
{
uchar a=0,b=0;
float t=0,t1;
init_DS(); //初始化
write(0xcc);//跳过读序列号操作
write(0x44);//启动温度转换
delay(125);
init_DS(); //初始化
write(0xcc);//跳过读序列号操作
write(0xbe);// 读温度寄存器
a=Read();//读取温度低位LSB
b=Read();//读取温度低位HSB
t1=(a&0x0f)*0.0625;//取小数部分
t=((b<<4)|(a>>4));//取整数部分
return(t);
}
void init(void) //串口初始化
{
EA=1; //中断总允许
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给定时器赋初值 TL1=0xfd;
SCON=0x50;
TR1=1;//启动定时器1
IE=0x00;//禁止任何中断
}
void send_char(uchar c) //传送温度数据
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void main()//主函数
{
float tp;
init();
while(1)
{
tp=Readtem(); //读取温度
display((uint) tp); //显示温度
if(RI) //是否有数据到来
{
RI=0;
send_char((uchar) tp);//传送采集的温度
}
}
} 展开
#include<reg51.H>
#include<absacc.H>
#include <intrins.h>
#include<stdio.h>
#define XTAL 110592;//CPU晶振频率#define baudrate 9600 //通信波特率
#define uchar unsigned char#define uint unsigned int
//不带小数点
uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//带小数点
uchar code TAB1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
sbit DQ=P3^3; //定义DS18B20的端口DQ
void delay(uint i) //精确延时程序
{
while(i--);
}
void DelayMS(uint ms)
{
uchar i;
while(ms--) for(i=0;i<120;i++);
}
void display(int k)//数码管显示
{
P2=0xf7;
P0=0x39; //显示C
DelayMS(1);
P2=0xfb;
P0=0x63;//显示°
DelayMS(1);
P2=0xfd;
P0=TAB1[k%10];//显示个位
DelayMS(1);
P2=0xfe;
P0=TAB[k/10%10];//显示十位
DelayMS(1);
}
init_DS(void) //DS18B20初始化
{
uchar x=0;
DQ=1; //DQ复位
delay(8); //延时
DQ=0; //单片机拉低总线
delay(85); //延时
DQ=1; //释放总线,单片机拉高总线
delay(14);
x=DQ; //稍作延时后,如果X=0则初始化成功,X=1则失败
delay(20);
}
Read(void) //读一个字节
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>=1; //让脉冲读到的位数据,依次从高位移到低位
DQ=1; //释放总线
if(DQ) //控制器进行采样
dat|=0x80; //读出数据放入高位,最后右移到低位
delay(4); //延时
}
return(dat);
}
write(uchar dat) //写一个字节
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0; //拉低总线
DQ=dat&0x01; //从低位开始写入
delay(5);
DQ=1; //写完后释放总线
dat>>=1;
}
delay(4); //延时
}
Readtem(void) //获取温度
{
uchar a=0,b=0;
float t=0,t1;
init_DS(); //初始化
write(0xcc);//跳过读序列号操作
write(0x44);//启动温度转换
delay(125);
init_DS(); //初始化
write(0xcc);//跳过读序列号操作
write(0xbe);// 读温度寄存器
a=Read();//读取温度低位LSB
b=Read();//读取温度低位HSB
t1=(a&0x0f)*0.0625;//取小数部分
t=((b<<4)|(a>>4));//取整数部分
return(t);
}
void init(void) //串口初始化
{
EA=1; //中断总允许
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给定时器赋初值 TL1=0xfd;
SCON=0x50;
TR1=1;//启动定时器1
IE=0x00;//禁止任何中断
}
void send_char(uchar c) //传送温度数据
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void main()//主函数
{
float tp;
init();
while(1)
{
tp=Readtem(); //读取温度
display((uint) tp); //显示温度
if(RI) //是否有数据到来
{
RI=0;
send_char((uchar) tp);//传送采集的温度
}
}
} 展开
4个回答
展开全部
1、没有认真看你的程序,因为程序跟硬件电路密切相关,不知道你的硬件是如何设计的。
2、首先规划你的通讯协议,即计算机与单片机之间的通讯协议,按照通讯协议编程。
3、一般单片机接收指令使用串口中断,发送数据直接在主程序中完成
希望能够帮上你!
2、首先规划你的通讯协议,即计算机与单片机之间的通讯协议,按照通讯协议编程。
3、一般单片机接收指令使用串口中断,发送数据直接在主程序中完成
希望能够帮上你!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
程序不能正常发送数据!
----
怎么知道不能正常发送?有什么现象?
----
怎么知道不能正常发送?有什么现象?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
改了一下
void init(void) //串口初始化
{
//EA=1; //中断总允许 这里不需要
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给定时器赋初值 TL1=0xfd;
SCON=0x50;
TR1=1;//启动定时器1
EA=0;//这就是 禁止任何中断 IE=0x00;//禁止任何中断
}
void init(void) //串口初始化
{
//EA=1; //中断总允许 这里不需要
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给定时器赋初值 TL1=0xfd;
SCON=0x50;
TR1=1;//启动定时器1
EA=0;//这就是 禁止任何中断 IE=0x00;//禁止任何中断
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
朋友,你看看VB的发部记录就知道了,它的辉煌在2000以前,现在都有VC++和JAVA。现在学它,等着失业吧。
参考资料: 学VB后找工作的感想。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |