导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]温控系统全套放上来,大家帮忙看看

* 105973: [求助]温控系统全套放上来,大家帮忙看看

   flyfoxjiang 
flyfoxjiang发表的帖子 

 [求助]温控系统全套放上来,大家帮忙看看
最近在做毕业设计,硬件电路已经搭好,CPU 用的是 AT89S52

本人做的是温控系统
原理图为


此主题相关图片如下:
按此在新窗口浏览图片

P1接键盘

P0接数码管的ABCDEFG
P1.0 P1.1 接数码管的片选

P3.0接三极管 来控制 继电器  然后来控制加热电阻

P3.4接 18B20

我的要求是

从键盘上输入一个温度(两位数) 然后和实际的温度检测出来的温度 相比较 前者大 继电器断开,前者小,继电器吸合,加热(JQ 输出高电平继电器吸合)

我的温度检测和显示部分的程序调试完成,能正确显示,键盘输入子程序 也有
我两个结合起来 就不能正确运行
有DX帮个忙,看看怎么结合起来

注明:按下键盘上的A 才开始温度 设定,在按A之前按任何键无效
         B 是确定,按下B后 才开始进行比较


源程序1
;这是关于DS18B20的读写程序,数据脚IN,晶振12MHZ
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到两个数码管上


;单片机内存分配申明!
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
in equ P3.4
FF2 equ P2.0
FF1 EQU P2.1
ORG 0000H

MAIN:
LCALL GET_TEMPER;调用读温度子程序

;进行温度显示,这里我们用两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度

mov p2,#00h
MOV A,29H
MOV B,28H
MOV C,B.0;将28H中的最低位移入C
RRC A
MOV C,B.1
RRC A
MOV C,B.2
RRC A
MOV C,B.3
RRC A
MOV 29H,A

LCALL DISPLAY;调用数码管显示子程序
;
AJMP MAIN


; 这是DS18B20复位初始化子程序
INIT_1820:
SETB IN
NOP
CLR IN
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB IN;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB IN,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
;CLR P1.7;检查到DS18B20就点亮P1.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
;CLR P1.1
LJMP TSR7

TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB IN
RET


; 读出转换后的温度值
GET_TEMPER:
SETB IN
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
;CLR P1.2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
;CLR P1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820

;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL D1MS;DISPLAY

LCALL INIT_1820;准备读温度前先复位

MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820

MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820

LCALL READ_18200; 将读出的温度数据保存到35H/36H
;CLR P1.4

RET

;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR IN
MOV R3,#6
DJNZ R3,$
RRC A
MOV IN,C
MOV R3,#23
DJNZ R3,$
SETB IN
NOP
DJNZ R2,WR1
SETB IN
RET

; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB IN
NOP
NOP
CLR IN
NOP
NOP
NOP
SETB IN

MOV R3,#9
RE10:
DJNZ R3,RE10

MOV C,IN

MOV R3,#23
RE20:
DJNZ R3,RE20

RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;显示子程序
display: mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#4
dpl1: mov r1,#250 ;显示1000次
dplop: mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p0,a ;送出个位的7段代码
clr FF2 ;开个位显示
acall d1ms ;显示1ms
setb FF2
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p0,a ;送出十位的7段代码
clr FF1 ;开十位显示
acall d1ms ;显示1ms
setb FF1
djnz r1,dplop ;100次没完循环
djnz r0,dpl1 ;4个100次没完循环
ret

;1MS延时(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET

;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
end

键盘程序

伪定义
        KEYBUF    EQU    30H     ;键值暂存单元,查表时用
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
  ORG     0000H       ;程序执行开始地址
  AJMP    MAIN                ;跳至MAIN执行
;*************************************
;*                                   *
;*        主  程  序             *
;*                                   *
;*************************************
                ORG     0040H
MAIN:           MOV     P1,#0FFH
                CLR     P2.0
                LCALL   KEYSCAN      ;主体程序。调用查键子程序
                       
      ;转MAIN循环
  NOP     ;软件陷阱
  NOP
  NOP
  MOV   A,KEYBUF
  MOV P0,A  
  LJMP MAIN
;*************************************
;*                                   *
;* 键盘工作子程序(4 * 4 阵列)      *
;* 出口为各键工作程序入口 P1口      *
;*************************************
KEYSCAN:
     MOV P1,#0FFH;清P1口,初始化键低电平有效
     CLR P1.4;清P1.4口
     MOV A,P1;读P1口状态
     ANL A,#0FH;清高4位,保留低四位低电平有效
     XRL A,#0FH;异或相同则为0不同结果为1,为0则表示无键被按下(这一行)
     JZ NOKEY1;为0则转下一行键值处理
     LCALL DL10MS;有键按下则延时10ms再测一次抗干扰
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY1;是干扰则转下一行键值处理程序
     MOV A,P1
     ANL A,#0FH;保留低四?
KB1:
     CJNE A,#0EH,KB2;如果值为#0E则为P1.4与P1.0组合的键
     MOV KEYBUF,#0;赋键值
     LJMP KEYWORK;转键处理
KB2: CJNE A,#0DH,KB3;如果值为#0D则为P1.4与P1.1组合的键
     MOV KEYBUF,#1
     LJMP KEYWORK
KB3: CJNE A,#0BH,KB4;如果值为#0B则为P1.4与P1.2组合的
     MOV KEYBUF,#2
     LJMP KEYWORK
KB4: CJNE A,#07H,KB5;如果值为#07则为P1.4与P1.3组合的
     MOV KEYBUF,#3
     LJMP KEYWORK
KB5: NOP


NOKEY1:
     MOV P1,#0FFH
     CLR P1.5
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY2
     LCALL DL10MS
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY2
     MOV A,P1
     ANL A,#0FH
     CJNE A,#0EH,KB6
     MOV KEYBUF,#4
     LJMP KEYWORK
KB6: CJNE A,#0DH,KB7
     MOV KEYBUF,#5
     LJMP KEYWORK
KB7: CJNE A,#0BH,KB8
     MOV KEYBUF,#6
     LJMP KEYWORK
KB8: CJNE A,#07H,KB9
     MOV KEYBUF,#7
     LJMP KEYWORK
KB9: NOP


NOKEY2:
     MOV P1,#0FFH
     CLR P1.6
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY3
     LCALL DL10MS
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY3
     MOV A,P1
     ANL A,#0FH
     CJNE A,#0EH,KB10
     MOV KEYBUF,#8
     LJMP KEYWORK
KB10: CJNE A,#0DH,KB11
     MOV KEYBUF,#9
     LJMP KEYWORK
KB11: CJNE A,#0BH,KB12
     MOV KEYBUF,#10
     LJMP KEYWORK
KB12: CJNE A,#07H,KB13
     MOV KEYBUF,#11
     LJMP KEYWORK

KB13: NOP


NOKEY3:
     MOV P1,#0FFH
     CLR P1.7
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY4
     LCALL DL10MS
     MOV A,P1
     ANL A,#0FH
     XRL A,#0FH
     JZ NOKEY4
     MOV A,P1
     ANL A,#0FH
     CJNE A,#0EH,KB14
     MOV KEYBUF,#12
     LJMP KEYWORK
KB14: CJNE A,#0DH,KB15
     MOV KEYBUF,#13
     LJMP KEYWORK
KB15: CJNE A,#0BH,KB16
     MOV KEYBUF,#14
     LJMP KEYWORK
KB16: CJNE A,#07H,KB17
     MOV KEYBUF,#15
     LJMP KEYWORK
KB17: NOP

NOKEY4:
     LJMP MAIN

KEYWORK:
      MOV A,KEYBUF;得到键值
      MOV  DPTR,#TABLE
      MOVC A,@A+DPTR;查行键值送ACC
      MOV P0,A;


WAITFREE:
     MOV A,P1;以下程序等待键释放
     MOV KEYBUF,#00H
     ANL A,#0FH
     XRL A,#0FH
     JNZ WAITFREE
     RET
;
;*************************************
;*                                   *
;*          延时513 us              *
;*                                   *
;*************************************
;
;513微秒延时程序
DELAY:          MOV     R2,#0FEH
DELAY1:         DJNZ    R2,DELAY1
  RET
;
;
;
;*************************************
;*                                   *
;*             延时10ms             *
;*                                   *
;*************************************
;
;10毫秒延时程序
DL10MS:         MOV     R3,#14H
DL10MS1:        LCALL   DELAY
                DJNZ    R3,DL10MS1
          RET
;
TABLE:                                  ;七段显示器数据定义
     DB  0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234
     DB  92H,  82H,  0F8H, 80H,  90H    ; 56789
     DB  88H,  83H,  0C6H,  0A1H, 86H ; ABCDE
     DB  8EH           ; F
     END              ;程序结束

我不知道怎么合到一起 自己试了好多天了,还是没结果,希望DX们来帮我看看
我不是电子专业我学的是自动化,对单片机不行,要是PLC,电气类的就熟悉多了!

本人联系方式:QQ93517814
email:shamofeihu888@163.com

如果没有人免费帮我做的话,我也可以给点报酬!



发表时间:2007年5月18日10:02:51

  
回复该帖

本主题共有 4 帖,分页:>>>>>该主题的所有内容[4]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  106014.[详细]看来真的是外行了
摘要:你的P1口的P1.0与P1.1 是复用的? 老兄的原理图实在是不敢恭维.  至于软件,建议你把引脚定义好好的重新组合一下吧,会免去很多麻烦的.......(125字)
- [芯芯][813次] 2007年5月18日

  106081.[详细][求助]温控系统全套放上来,大家帮忙看看
摘要:哦 不好意思,我疏忽了,是P0.1P0.1 用来片选的 键盘是随便画个的 我自己焊了个矩阵的键盘 P1.0-P1.3列 P1.4-P1.7行  我不知道&nbs......(262字)
- [flyfoxjiang][868次] 2007年5月19日

[上一篇帖子]:[分享]好的学习网站给大家分享http://www.xinworks.com/bbs/?u=7242
[下一篇帖子]:请问如何编程,用AVRmega8515和12位AD678进行数据采集请问如何编程,用AVRmega8