delphi温度采集数据处理程序

delphi温度采集数据处理程序,第1张

http://blog.csdn.net/anykey_1/archive/2005/02/17/290930.aspx

delphi做串口真的很麻烦键帆.

你烂哗可以看看上边那篇文章.

具稿历雹体的串口我没做过.

一下程序是51单片机的程序贺者野。P0口是八段数码管,wela、dula分别是数码管位选和段选。 DS18S20接在P2^2口。

//安装目录下的EXE文件打开后可在电脑上显示当前温度

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2 //define interface of DS18B20

sbit dula=P2^6

sbit wela=P2^7

uint pre_temp=0 //储存当前温度值,以减少串口工作频率

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}

void delay(uint count) //delay

{

uint i

while(count)

{

i=200

while(i>0)

i--

count--

}

}

///////功能:串口初始化,波特率9600,嫌山方式1///////

void Init_Com(void)

{

TMOD = 0x20

PCON = 0x00

SCON = 0x50

TH1 = 0xFd

TL1 = 0xFd

TR1 = 1

}

void dsreset(void) //send reset and initialization command 18B20复位,初始化函数

{

uint i

DS=0

i=103

while(i>0)i--

DS=1

i=4

while(i>0)i--

}

bit tmpreadbit(void) //read a bit 读1位数据函数

{

uint i

bit dat

DS=0i++ //i++ for delay

DS=1i++i++

dat=DS

i=8while(i>0)i--

return (dat)

}

uchar tmpread(void) //read a byte date 读1字节函数

{

uchar i,j,dat

dat=0

for(i=1i<=8i++)

{

j=tmpreadbit()

dat=(j<<7)|(dat>>1) //读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat)

}

void tmpwritebyte(uchar dat) //write a byte to ds18b20 向1820写禅喊一个字节数据函数

{

uint i

uchar j

bit testb

for(j=1j<=8j++)

{

testb=dat&0x01

dat=dat>>1

if(testb) //write 1

{

DS=0

i++i++

DS=1

i=8while(i>0)i--

}

else

{

DS=0 //write 0

i=8while(i>0)i--

DS=1

i++i++

}

}

}

void tmpchange(void) //DS18B20 begin change 开始获取数据并转换

{

dsreset()

delay(1)

tmpwritebyte(0xcc) // address all drivers on bus 写跳过读ROM指令

tmpwritebyte(0x44) // initiates a single temperature conversion 写温度转换指令

}

uint tmp() //get the temperature 读取寄存器中存储的温度数据

{

float tt

uchar a,b

uint temp // variable of temperature

dsreset()

delay(1)

tmpwritebyte(0xcc)

tmpwritebyte(0xbe)

a=tmpread() //读低8位

b=tmpread() //读高8位

temp=b

temp<<=8 //two byte compose a int variable 两个字节组合为1个字

temp=temp|a

tt=temp*0.0625 //温度在寄存器中是12位,分辨率是0.0625

temp=tt*10+0.5 //乘10表示小数点后只取1位,加0.5是四折五入

return temp

}

// 读 DS18B20 的rom,本程序没有调用该函数,保留以保证程序的完整性

// void readrom() //read the serial

// {

// uchar sn1,sn2

// dsreset()

// delay(1)

// tmpwritebyte(0x33)

// sn1=tmpread()

// sn2=tmpread()

// }

void display(uint temp) //显示程序

{

uchar A1,A2,A2t,A3,ser

uchar serial_flag = 0 //每当产生新温度时通过串口进行更新,此为标志位

if ( temp != pre_temp )

{

serial_flag = 1

pre_temp = temp

}

A1=temp/100

A2t=temp%100

A2=A2t/10

A3=A2t%10

dula=0

P0=table[A1] //显示百位

if ( serial_flag )

{

ser = temp/256 //发送串口数据高位

SBUF = ser

}

dula=1

dula=0

wela=0

P0=0x7e

wela=1

wela=0

delay(1)

dula=0

P0=table1[A2] //显示十位

if ( serial_flag )

{

ser = temp%256 //发送串口数据低位

SBUF = ser

}

dula=1

dula=0

wela=0

P0=0x7d

wela=1

wela=0

delay(1)

P0=table[A3] //显示个位

if ( serial_flag )

{

ser = 0xff //发送串口同步标志信号,后跟着的高位信号不可能达到此值,除非是在孙悟空在八卦炉里

SBUF = ser

}

dula=1

dula=0

P0=0x7b

wela=1

wela=0

delay(1)

}

void main()

{

uchar a

Init_Com()

do

{

tmpchange()

// delay(200)

for(a=10a>0a--)

{

display(tmp())

}

}while(1)

}

单片机要用串口发送采集的温度。肯定是要增加串口通信程序的,首先要初始化串口,设置串口工作方式和波特率,必须与上机的波特率完全相同。再桥蚂设定简单的通信协议,就是发送温度时,是以十六进制数发送,还是发送字符型,还是发送单片机转换后的十进制数,发送几个字节。单片机与上位机之间的通信要用一条USB转串口线,或USB转TTL模块,电脑上要安装驱动程序,虚拟出一个串口来。你的上位机的程序,可能需要做些修改,USB转串口虚拟串口号是多少,要根据安装驱动程序及USB线所插USB口确定。还有上面说的简单的通信协议,波特率蔽消脊都没有考宏渗虑吧,只是做了界面设计吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12404085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存