小菜一个,用proteus作了一个温控 ,把图和原程序发上来了,高手顺便给俺指点一下吧,呵呵。温度精确到0.1,不检测负温度,工作在65-90度之间。呵呵
我在做的时候遇到的一个最大的问题就是自己的存储空间分配,和堆栈搞错了,吸取教训了,给大家一个比较值得思考的问题吧,大家看到了那个电机了吧,如果电机开始转,那个显示就会闪,如果不转电机就不闪,大家考虑下哈,呵呵,想要源文件的留下邮箱哦。还有这里用共阴极数码管,下边用三极管驱动,如果不用三极管呢,出问题了,呵呵,单片机的吸入电流大约3ma 而数码管如果全亮有80ma的电流啊。小心了
;温度控制系统
;电信一班2005级
;樊朋
;按下开始键,开始工作,不按下任何键,显示当前温度。
;按下开始键之后,如果不按设置键,则以最高温度90 C为限,工作。
;如果按下设置键,则开始显示可以设置的温度,然后按下
;++++键,则开始调整温度,如果这时再次按下设置键,则开始工作。
;工作到,指定的温度值,之后停止工作,如果超过了,则,开启电机,
;散热,如果低于温度值,则关闭电机,同时,开始加热。
;*****************
;以下为定义的各个数据线和一个标志位
settemp bit p1.0
addtemp bit p1.1
run bit p1.6
deheat bit p1.7
dq bit p3.7
dataxiao bit p2.7
datage bit p2.6
datashi bit p2.5
databai bit p2.4
flag bit 00h
;*****************
;以下位为温度值存储的位置
templ equ 30h
temph equ 31h
tempxiao equ 32h;温度值的小数
tempge equ 33h
tempshi equ 34h
tempbai equ 35h;
tempint equ 36h
tempgreat equ 37h
tempbelow equ 38h
;*****************
;要显示的温度存放的位置
dispbai equ 39h;显示百位
dispshi equ 3ah
dispge equ 3bh
dispxiao equ 3ch
dispaddr equ 3dh;显示地址
;*****************
;以下为程序的开始
org 0000h
ajmp main
org 0003h
ajmp check
org 0030h
main:
mov sp,#50h
mov tempgreat,#91
mov tempbelow,#89
mov tempint,#65
clr deheat
clr run
clr 01h;用作set键的标志
setb ex0;允许外部中断
setb ea;允许中断
setb it0;下降沿中断
xx:
;*********
lcall gettemp
;*********
lcall process
;*********
lcall runxx
;***********
ajmp xx
;***************
;以下为ds1822的一系列操作
gettemp:
lcall resetxx
mov a,#0cch;跳过rom
lcall write
mov a,#44h;启动温度转换
lcall write
lcall display
lcall resetxx
mov a,#0cch
lcall write
mov a,#0beh
lcall write
lcall read
ret
resetxx:
clr ea
setb dq
nop
nop
clr dq
mov r7,#255
djnz r7,$
setb dq
mov r7,#30
djnz r7,$
jnb dq,setflag
clr flag
ajmp next
setflag:
setb flag
next:
mov r7,#120
djnz r7,$
jnb flag,resetxx
setb dq
clr ie0
setb ea
ret
write:clr ea;在ds1822操作期间不允许中断
setb dq
mov r6,#8
clr c
writing:
clr dq
mov r7,#5
djnz r7,$
rrc a
mov dq,c
mov r7,#30
djnz r7,$
setb dq
nop
djnz r6,writing
clr ie0
setb ea
ret
read:clr ea;;在ds1822操作期间不允许中断
setb dq
mov r0,#templ
mov r6,#8
mov r5,#2
clr c
reading:
clr dq
nop
nop
setb dq
nop
nop
nop
nop
mov c,dq
rrc a
mov r7,#30
djnz r7,$
setb dq
djnz r6,reading
mov @r0,a
inc r0
mov r6,#8
setb dq
djnz r5,reading
clr ie0
setb ea
ret
;*****************
;以下为显示的一系列操作
;影响a
display:
mov r4,#200
disploop:
mov a,dispxiao
mov p2,#0ffh
mov p0,a
mov p2,#07fh
lcall delay2ms
mov a,dispge
mov p2,#0ffh
mov p0,a
mov p2,#0bfh
setb p0.7
lcall delay2ms
mov a,dispshi
mov p2,#0ffh
mov p0,a
mov p2,#0dfh
lcall delay2ms
jb f0,dispfuhao
mov a,dispbai
ajmp zhenhao
dispfuhao:
mov a,#40h;先是负号
zhenhao:
mov p2,#0ffh
mov p0,a
mov p2,#0efh
lcall delay2ms
djnz r4,disploop
ret
;*******************
;以下为数据处理部分
;影响r7,a,b,sp
process:
mov r7,templ
mov a,r7
push acc
anl a,#0fh
mov tempxiao,a
pop acc
anl a,#0f0h
swap a
mov templ,a
mov a,temph
; push acc
; jb acc.3,setf0
; ajmp clrf0
;setf0:setb f0
anl a,#0fh
swap a
orl a,templ
jb acc.7,negative
clr f0
ajmp positive
negative:
setb f0
cpl a
add a,#1
positive:
mov tempint,a
subprocess:
mov a,tempint
mov b,#100
div ab
mov tempbai,a
xch a,b
mov b,#10
div ab
mov tempshi,a
mov tempge,b
mov a,tempxiao
mov dptr,#tablexiao
movc a,@a+dptr
mov dptr,#tableinter
movc a,@a+dptr
mov dispxiao,a
mov a,tempge
mov dptr,#tableinter
movc a,@a+dptr
mov dispge,a
mov a,tempshi
mov dptr,#tableinter
movc a,@a+dptr
mov dispshi,a
mov a,tempbai
mov dptr,#tableinter
movc a,@a+dptr
mov dispbai,a
ret
;*****************
;检测是否有键按下
;影响sp,r4,
check:clr ea;关中断
clr run
clr deheat
push acc;保护现场
mov a,r4;
push acc;
clr p1.5;此处为看下是否进入中断
x0:jb p1.0,x1;+++没有按下则继续检测
call tempadd;按下键之后,温度加
call subprocess
mov r4,#2
call disploop;因为人为的按键很慢,所以在这里延迟一下,以免直接跳到x1处跳出
;
;mov a,r4
;push acc
x1:mov r4,#50
call disploop;调用显示
jnb p3.2,x2
;pop acc
;mov r4,a
;
ajmp x0
x2:
;mov r4,#3
;call disploop;因为人为的按键很慢,所以在这里延迟一下,以免又引起中断
; setb run;重新开始加热
pop acc
mov r4,a
pop acc
clr ie0
setb ea
setb p1.5;看下是否出中断
reti
;****************
;加温度值
;影响a
tempadd:push acc;保护现场
mov a,tempint
add a,#1
push acc
subb a,#90
jc x3
mov tempint,#65
pop acc
ajmp x4
x3:clr c
pop acc
mov tempint,a
subb a,#65
jnc x4
mov tempint,#65
mov a,tempint
subb a,#2
mov tempbelow,a
add a,#4
mov tempgreat,a
ret
x4:
mov a,tempint
subb a,#2
mov tempbelow,a
add a,#4
mov tempgreat,a
pop acc
ret
;****************
;运行风扇或加热
;此程序影响a
runxx:clr c
mov a,tempint
subb a,tempgreat
jc x5
setb deheat;电机转散热
;lcall display
clr run
ret
x5:
clr c
mov a,tempint
subb a,tempbelow
jnc x6
clr deheat
setb run
ret
x6:clr deheat
clr run
ret
;此程序影响r5,r6
DELAY2MS:
MOV R6, #3
LOOP3: MOV R5, #200
DJNZ R5, $
DJNZ R6, LOOP3
RET
;******************
;表格数据
tablexiao:
DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
tableinter:
DB 03FH,006H,05BH,04FH,066H
DB 06DH,07DH,07H,07FH,06FH
end
用户174314 2009-5-6 10:46
用户1451188 2007-12-19 23:23
呵呵 大虾来看我的窝窝 高兴哈 Q1 Q2你看错了 P26 P28 呵呵 还有DS1822 DS18B20差不多。谢谢指点。
光藕 我不是很懂 请教
wang1jin 2007-12-19 15:37
看了下硬件.怎么Q1 Q2同时接在P26
用了光耦为什么还要共地...
温度IC没用过这型号...是不是18B20
另外用51的最好用PNP管驱动效果会比较好.
HE HE...
用户1451188 2007-12-16 23:09