基于51单片机和AD590温度传感器温度采集的程序

基于51单片机和AD590温度传感器温度采集的程序,第1张

这是一个项目中的汇编程序,供你参考

org 000h

jmp main

org 0030h

main:

mov r0,#40h

mov dptr,#0bff8h 指向0809首地址

movx @dptr,a 启动A/D转换

tt1:

movx a,@dptr 读数

movx @r0,a存数

movx @dptr,a 启动A/D转换

lcall delay128us 等待转换完毕(至少128us)

movx a,@dptr

mov @r0,a

lcall tran模数-数据转换

lcall disp数据的静态显示

lcall delay1s

sjmp main

数据转换

tran: 数据转换

mov r0,#40h

mov r3,#00h

mov a,@r0 把r0中的数给a

mov b,#03h 标度变换 3格一度

div ab

mov r3,b

mov b,#0ah 将标度变换结果的整数部分进行BCD码转换

div ab

mov @r0,a 将十位数送显示缓冲单元

inc r0 指向缓冲单元下一地址

mov @r0,b 将个位数送显示缓冲单元

mov a,r3标度转换结果小数部分处理

mov b,#03h 实现三格一度

mul ab

inc r0

mov @r0,a 送显示缓冲单元

lop: ret

静态显示子程序-串入并出

disp:

mov dptr,#tab

mov r0,#40h r0指向缓存区首地址

mov a,@r0将整数位数给a

movc a,@a+dptr 利用表格计算十位七段LED数码管的段码

mov 40h,a将段码结果送入40h

inc r0 r0指向缓存区下一地址

mov a,@r0将个位数给a

movc a,@a+dptr 利用表格计算个位七段LED数码管的段码

mov 41h,a将段码结果送入41h

inc r0 r0指向缓存区棚侍下一地址

mov a,@r0将小数给a

movc a,@a+dptr 利用表格计算小伍举数位七段LED数码管腔和碧的段码

mov 42h,a将段码结果送入42h

最后一位清零

mov 43h,#00h

mov a,43h

mov r7,#8

ccc: jb acc.7,aaa

clr p3.0

jmp bbb

aaa: setb p3.0

bbb: setb p3.1

clr p3.1

rl a

djnz r7,ccc

小数位数显示

mov a,42h

mov r7,#8

cc:

jb acc.7,aa

clr p3.0

jmp bb

aa: setb p3.0

bb: setb p3.1

clr p3.1

rl a

djnz r7,cc 所有位检测后顺序执行

个位数显示

orl 41h,#80h 个位数后置小数点

mov a,41h

mov r7,#8

dd: jb acc.7,ee

clr p3.0

jmp ff

ee: setb p3.0

ff: setb p3.1

clr p3.1

rl a

djnz r7,dd

十位数数显示

mov a,40h

mov r7,#8

gg: jb acc.7,hh

clr p3.0

jmp ii

hh: setb p3.0

ii: setb p3.1

clr p3.1

rl a

djnz r7,gg

tab: db 3fh,06h,5bh,4fh,66h

db 6dh,7dh,07h,7fh,6fh

lop1:

ret

ADC0809转换所需时间

delay128us:

mov r5,#30

delay1:

mov r7,#5

delay2:

nop

nop

djnz r7,delay2

djnz r5,delay1

ret

为使数据显示稳定延时

delay1s:

mov r4,#10

delay00:

mov r5,#100

delay11:

mov r7,#249

delay22:

nop

nop

djnz r7,delay22

djnz r5,delay11

djnz r4,delay00

Ret

.温度传感器AD590基本知识

AD590产生的电流与绝对温度成正比,它可接收的工作电压为4V-30V,检测的温度范围为-55℃-+150℃,它有非常好的线性输出性能,温度每增加1℃,其电流增加1uA。

AD590温度与电流的关系如下表所示

摄氏温度

AD590电流

经10KΩ电压

0℃

273.2 uA

2.732V

10℃

283.2 uA

2.832 V

20℃

293.2 uA

2.932 V

30℃

303.2 uA

3.032 V

40℃

313.2 uA

3.132 V

50℃

323.2 uA

3.232 V

60℃

333.2 uA

3.332 V

100℃

373.2 uA

3.732 V

AD590引脚图

2.实验任务

利用AD590温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809的其中一个通道进行A/D转换,将转换的结果进行温度值变换之后送入数码管显示。

3.电路原理图

图4.30.1

4.系统板上硬件连线

(1).把“单片机系统”区域中的P1.0-P1.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。

(2).把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。

(3).把“单片机系统”区域中的P3.0与“模数转换模块”区域中的ST端子用导线相连接。

(4).把“单片机系统”区域中的P3.1与“模数转换模块”区域中的OE端子用导线相连接。

(5).把“单片机系统”区域中的P3.2与“模数转换模块”区域中的EOC端子用导线相连接。

(6).把“单片机系统”区域中的P3.3与“模数转换模块”区域中的CLK端子用导线相连接。

(7).把“模数转换模块”区域中的A2A1A0端子用导线连接到“电源模块”区域中的GND端子上。

(8).把“模数转换模块”区域中的IN0端子用导线连接到自制烂前的AD590电路上。

(9).把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子上。

5.程序设计内容

(1). ADC0809的CLK信号由单片机的P3.3管脚提供

(2). 由于AD590的温度变化范围在-55℃-+150℃之间,经过10KΩ之后采样到的电压变化在2.182V-4.232V之间,不超过5V电压所表示的范围,因此参考电压取电源电压VCC,(实测VCC=4.70V)。由此可计算出经过A/D转换之后的摄氏温度显示的数据为:

如果(D*2350/128)<2732,则显示的温度值为-(2732-岩烂(D*2350/128))

如果(D*2350/128)≥2732,则显示的温度值为+((D*2350/128)-2732)

6.汇编源程序

(略)

7.C语言源程粗历漏序

#include <AT89X52.H>

#include <ctype.h>

unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f}

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}

unsigned char dispbuf[8]={10,10,10,10,10,10,0,0}

unsigned char dispcount

unsigned char getdata

unsigned long temp

unsigned char i

bit sflag

sbit ST=P3^0

sbit OE=P3^1

sbit EOC=P3^2

sbit CLK=P3^3

sbit LED1=P3^6

sbit LED2=P3^7

sbit SPK=P3^5

void main(void)

{

ST=0

OE=0

TMOD=0x12

TH0=0x216

TL0=0x216

TH1=(65536-4000)/256

TL1=(65536-4000)%256

TR1=1

TR0=1

ET0=1

ET1=1

EA=1

ST=1

ST=0

getdata=148

while(1)

{

}

}

void t0(void) interrupt 1 using 0

{

CLK=~CLK

}

void t1(void) interrupt 3 using 0

{

TH1=(65536-4000)/256

TL1=(65536-4000)%256

if(EOC==1)

{

OE=1

getdata=P0

OE=0

temp=(getdata*2350)

temp=temp/128

if(temp<2732)

{

temp=2732-temp

sflag=1

}

else

{

temp=temp-2732

sflag=0

}

i=3

dispbuf[0]=10

dispbuf[1]=10

dispbuf[2]=10

if(sflag==1)

{

dispbuf[7]=11

}

else

{

dispbuf[7]=10

}

dispbuf[3]=0

dispbuf[4]=0

dispbuf[5]=0

dispbuf[6]=0

while(temp/10)

{

dispbuf[i]=temp%10

temp=temp/10

i++

}

dispbuf[i]=temp

ST=1

ST=0

}

P1=dispcode[dispbuf[dispcount]]

P2=dispbitcode[dispcount]

dispcount++

if(dispcount==8)

dispcount=0


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存