基于16F877单片机的散热器控制系统设计.docx
- 文档编号:6328799
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:18
- 大小:19.26KB
基于16F877单片机的散热器控制系统设计.docx
《基于16F877单片机的散热器控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于16F877单片机的散热器控制系统设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于16F877单片机的散热器控制系统设计
附录二
程序清单:
LISTP=16F877
INCLUDE"P16F877.INC"
;存器定义
STATUSEQU03H;定义状态寄存器地址
PORTCEQU07H;定义端口C的数据寄存器地址
TRISCEQU87H;定义端口C的方向寄存器
PORTDEQU08H;定义端口D的数据寄存器地址
TRISDEQU88H;定义端口D的方向寄存器
PCLEQU02H;定义程序的指针寄存器
INTCONEQU0BH;定义中断控制寄存器地址
PIE1EQU8CH;定义外设中断使能寄存器1
T1CONEQU10H;定义TEMR1控制寄存器地址
TMR1LEQU0EH;定义TMR1低字节地址
TMR1HEQU0FH;定义TMR1高字节地址
;变量声明
NUMDISPEQU20H;定义显示寄存器变量
DLYCNT1EQU21H;定义软件延时变量
DLYCNT2EQU22H;定义软件延时变量
WREG1EQU23H;定义工作寄存器变量
WREG2EQU24H
WREG3EQU25H
WREG4EQU26H
COUNT1EQU27H
TEMPER_LEQU28H;定义温度显示缓冲区变量(低位)
TEMPER_HEQU29H;定义温度显示缓冲区变量(高位)
TEMPER_NUMEQU30H;转换后温度显示缓冲区变量
TEMPER_NUM1EQU31H;室内温度存储变量
TEMPER_NUM2EQU32H;定义采暖表面温度存储变量
NUM_SETEQU33H;显示设定位变量
CNTEQU34H;定义工作寄存器变量
FLAGEQU35H;报警标志位变量
;常量声明
RP1EQU06H;定义状态寄存器中的页选位RP1
RP0EQU05H;定义状态寄存器中的页选位RP0
ZEQU02H;定义状态寄存器中的0标志位Z
CEQU00H;定义状态寄存器中的0标志位C
#DEFINEFR(PORTD,6)
#DEFINESR(PORTD,7)
#DEFINEDQ(PORTB,2)
#DEFINEDIR(TRISB,2)
ORG00H
GOTOMAIN;转主程序
ORG04H
GOTOINT_PR1;转T1中断服务子程序
ORG60H
MAIN:
CLRFFR;报警标志清零
MOVLWox16
MOVLWF46H;预置室内上限温度初值
MOVLWox10H
MOVWF47H;预置室内下限温度初值
MOVLWox5F
MOVWF48H;预置采暖表面温度初值
MOVLWox00
MOVWF49H
MOVLWoB0H;定时器50ms定时常数
MOVWFTMR1L
MOVLW3CH
MOVWFTMR1H
MOVLWox12C;置15s软计数器初置
MOVWFCNT
BSFPIE1,TMR1IE;允许定时器1中断
MOVLWOC0H
MOVWFINTCON;开放中断
BSFT1CON,TMR1ON;启动定时器1
MAIN1:
CALLDISPLY;调显示子程序
CALLKEYBOARD_PRO;调键盘管理子程序
RETLW00H
***********************中断服务子程序*************************
INT_PR1:
MOVLWOB0H
MOVWFTMR1L
MOVLWox3C
MOVWFTMR1H;重置定时器1初值
MOVLWox12C
MOVWFCNT;重置软计数器初值
DECFSZCNT,1;15s到否,不到返回
GOTOHERE
CALLTIN_18B20;调用温度检测子程序
MOVLWTEMP1
MOVWFBT1;当前温度送显示缓冲区
MOVLWTEMP2
MOVWFBT0
CALLDISPLY1;显示当前温度
CALLALARM;调用温度越限报警子程序
HERE:
RETFIE
***********************键盘子程序*************************
KEYBOARD_PRO:
CALLQUERY_KEY
BTFSCSTATUS,Z
GOTOKEYBOARD_RET;;无键按下,返回
CALLDELAY
CALLDELAY;加长延时时间,消除抖动
CALLQUERY_KEY
BTFSCSTATUS,Z
GOTOKEYBOARD_RET;误读键,返回
MOVFPORTB,0
MOVWFPORT_BUF;读取键扫描值
BTFSSPORT_BUF,0
GOTOSECOND_KEY;第一个键没按下
MOVLWox00;第一个键按下,该键号值为
CALLWAIT_KEY00H
CALLKEY_00
SECOND_KEY:
BTFSSPORT_BUF,0
GOTOTHIRD_KET;第二键没按下
MOVLW01H;第二个键按下时,该键号值为
CALLWAIT_KEY01H
CALLKEY_01
WRIT_KEY:
CALLQUERY_KEY;等待键释放
BTFSSSTATUS,Z
GOTOWAIT_KEY;未释放,等待
BSFAGC_STA,KEY_FLAG;置键盘按下标志
MOVFKEY_VALUE,0
GOTOKEYBOARD_RET
RETURN;扫描结束,返回
QUERY_KEY:
;全扫描,判断有无键按下
BANKSELPORTB
MOVFPORTB,0
XORLW0FH;变正逻辑,高电平有键按下
ANDLW0FH;屏蔽高4位,Z=0有键按下
RETURN
KEYBOARD_RET:
RETURN
延时程序:
DELAY:
MOVLWoxC8H
MOVWFREG
DEL1:
NOP
NOP
DECFSZREG,1
GOTODEL1
RETURN
KEY_00:
;00键号功能处理(-1键)
BTFSSPORTB_BUF,0;测试00号键端口的电平
GOTOKEY_01状态
MOVLWox47
MOVWFFSR
DECFINDF,1;温度上限值-1
MOVLWox16
SUBWFINDR,0
BTFSSSTATUS,C;判断温度上限值借位否?
CLRFINDR
GOTOCALLKEYBOARD_PR0
KEY_01:
;01号键功能处理(+1键)
BTFSSPORTB_BUF,1
GOTOKEY_00
MOVLWox47H
MOVWFFSR
INCFINDF,1;温度下限值+1
MOVLWox10
SUBWFINDF,0
BTFSCSTATUS,C;判断温度下限值借位否?
CALLKEYBOARD_PRO
GOTOBB
BB:
MOVLWox16
MOVWFINDF
***********************温度显示子程序*************************
DISPLY:
CLRFPORTC ; 清口C
CLRFPORTD ; 清口D
CLRFNUMDISP
BSFSTATUS,RP0 ;选存储体1
BCFSTATUS,RP1
CLRFTRISC ;置口C为输出
CLRFTRISD ;置口D为输出
BCFSTATUS,RP0 ;选存储体0
;对显示的数据进行二-十进制编码
BCD:
MOVFNUMDISP,0
ANDLWox0F
XORLWox0A
BTFSSSTATUS,Z
GOTODISPLY1
MOVLW06H
ADDWFNUMDISP
;显示十位BCD数,对应LED
(1)
DISPLY1:
SWAPFNUMDISP,0
ANDLWox0F;取十位BCD数
CALLCODETAB;取段码
MOVWFPORTC;送段码至口C
MOVLWox01;LED为共阴极
MOVWFPORTD;选通十位LED
CALLDLYTIM;调用延时子程序
;显示个位BCD数,对应LED
(2)
MOVFNUMDISP,0
ANDLWox0F;取个位BCD数
CALLCODETAB;取段码
MOVWFPORTC;送段码口至C
MOVLWox02
MOVWFPORTD;选通个位LED
CALLDLYTIM
显示两位设定温度值的子程序如下:
DISPLY2:
CLRFNUM_SET
MOVLWox13
MOVWFNUM_SET
MOVFNUMSET,0
ANDLWox0F
XORLWox0A
BTFSSSTATUS,Z
GOTODISPLY2
MOVLW06H
ADDWFNUMDISP_3
DISPLY3:
ANDLWox0F;取十位BCD数
CALLCODETAB;取段码
MOVWFPORTC;送段码至口C
MOVLWox03;LED共阴极
MOVWFPORTD;选通十位LED
CALLDLYTIM;调用延时子程序
MOVFNUM_SET,0
ANDLWox0F;取个位BCD数
CALLCODETAB;取段码
MOVWFPORTC;送段码至口C
MOVLWox04
MOVWFPORTD;选通个位LED
CALLDLYTIM;调用延时子程序
RETURN
LED段选码表
CODETAB:
ADDWFPCL;加偏移量至PCL
RETLWB‘00111111’;0的段码
RETLWB‘00000110’;1的段码
RETLWB‘01011011’;2的段码
RETLWB‘01001111’;3的段码
RETLWB‘01100110’;4的段码
RETLWB‘01101101’;5的段码
RETLWB‘01111101’;6的段码
RETLWB‘00000111’;7的段码
RETLWB‘01111111’;8的段码
RETLWB‘01101111’;9的段码
;延时子程序
DLYTIM:
MOVLWox60
MOVWFDLYCNT1
CLRFDLYCNT2
DLOOP:
DECFSZDLYCNT2
GOTODLOOP
DECFSZDLYCNT1
GOTODLOOP
RETURN
***********************温度检测子程序*************************
TIN_18B20:
BCFSTATUS,RP1
BSFSTATUS,RP0
BCFINTCON,GIE;使用DS18B20一定要禁止任
CALLINT何中断
MOVLWoxCC
CALLWRITE;送入跳过ROM命令
MOVLWox44
CALLWRITE;送入温度转换命令
CALLTEMPER_COV
CALLINT;温度转换完全,再次初始
MOVLWox55化DS18B20
CALLWRITE;送入匹配ROM命令
MOVLWox28
CALLWRITE;发第一个DS18B20序列号
MOVLWox10(28H,10H,46H,E2H,00H,
CALLWRITE00H,00H,7EH)
MOVLWox46
CALLWRITE
MOVLWoxE2
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox7E
CALLWRITE
MOVLWoxBE
CALLWRITE;送入读温度暂存器命令
CALLREAD
MOVLWox51
MOVWFFSR
MOVWFINDR;读出温度值低字节存入51H
CALLREAD
MOVLWox50
MOVWFFSR
MOVWFINDR;读出温度值高字节存入50H
CALLINT;再次初始化DS18B20
MOVLWox55
CALLWRITE;送入匹配ROM命令
MOVLWox28
CALLWRITE;发第2个DS18B20
MOVLWox24(28H,24H,C5H,39H,00H,
CALLWRITE00H,00H,5FH)
MOVLWoxC5
CALLWRITE
MOVLWox39
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox00
CALLWRITE
MOVLWox5F
CALLWRITE
MOVLWoxBE
CALLWRITE;送入读温度暂存器命令
CALLREAD
MOVLWox53
MOVFFSR
MOVWFINDR;读出温度值低字节存入
CALLREAD53H
MOVLWox52
MOVFFSR
MOVWFINDR;读出温度值高字节存入
BSFINTCON,GIE52H
RETURN
INT:
;初始化DS18B20子程序
BCFINTCON,GIE
L0:
BCFDQ;DS18B20总线为低复位
MOVLWoxC8电平
MOVWFCNT
L1:
DECFSZCNT,1;总线复位电平保持60us
GOTOL1
BSFDQ;释放DS18B20总线
MOVLWox14
MOVWFCNT
L4:
DECFSZCNT,1;释放DS18B20总线保持
GOTOL460us
BCFSTATUS,C;清存在信号
MOVLWox00
IORWFDQ,0
MOVWFCOUNT1
DECFSZCOUNT1,1;判断是否存在,若不
GOTOL0存在,则重新来
NOP
MOVLWox50
MOVWFCNT
L5:
IORWFDQ,0
GOTOL3
NOP
DECFSZCNT,1
GOTOL5
CALLL0
L3:
MOVLWoxF0
MOVWFCNT
L2:
DECFSZCNT,1
GOTOL2
RETURN
WRITE:
;向DS18B20写操作
BCFINTCON,GIE命令子程序
MOVLWox08;写入DS18B20的位数
MOVWFWREG1一个字节8个位
WR1:
BSFDQ
MOVLWox08
MOVWFWREG2;把一个字节分成8
RRCFWREG2个位环移给C
BCFDQ;写入DS18B20总线
WR2:
要处于复位状态
DCFSZWREG2,1;DS18B20总线复位
GOTOWR2保持16us
NOP
BTFSSDQ;写入一个位
BCFSTATUS,C
BTFSCDQ
BSFSTATUS,C
MOVLWox14
MOVWFWREG2
WR3:
DECFSZWREG2,1;等待40us
GOTOWR3
DECFSZWREG1,1;写入下一个位
GOTOWR1
BSFDQ;重新释放DS18B20
RETURN总线
READ:
BCFINTCON,GIE
MOVLWox08;连续读8个位
MOVWFWREG4
RE1:
CLRFDQ;读前总线保持为低
MOVLWox04
MOVWFWREG2
NOP
BSFDQ;开始读,总线释放
RE2:
DECFSZWREG2,1;持续8us
GOTORE2
BTFSSDQ;从DS18B20总线读BCFSTATUS,C得一个位
BTFSCDQ
BSFSTATUS,C
RRFDATE,1;把读得的位值环移
MOVLWox14给A
MOVWFWREG3
RE3:
DECFSZWREG3,1;持续60us
GOTORE3
DECFSZWREG4,1;读下一个位
GOTORE1
BSFDQ;重新释放DS18B20
RETURN总线
***********************16位转8位子程序*************************
TEMPER_COV:
MOVLWox50
MOVWFTEMPER_H;第一个DS18B20温度值
MOVLWox51低字节送入显示缓冲变量
MOVWFTEMPER_L;读出的温度数据转换成
CALLTEMPER_COV0;BCD码
MOVFPTEMPER_NUM,TEMPER_NUM1;保存变换后的温度
MOVLWox52数据
MOVWFTEMPER_H;将第2个DS18B20
MOVLWox53温度值低字节送往显
MOVWFTEMPER_L示缓冲变量中
CALLTEMPER_COV2
MOVFPTEMPER_NUM,TEMPER_NUM2;保存变换后的温度
TEMPER_COV0:
数据
MOVLWoxF8
CPFSLTTEMPER_H;判断温度值是否小于?
GOTOTEM0;若不是,跳转TEM0
MOVLWox01;若是,则置标志位FLAG
MOVWFFLAG
MOVLWox50
MOVWFTEMPER_H
COMFTEMPER_H,1;高位温度值取反
MOVLWox51
MOVWFTEMPER_L
COMFTEMPER_L,1;低位温度值取反
INCFTEMPER_L,1
TEM0:
MOVLWoxF0
ANDWFTEMPER_L,1
SWAPFTEMPER_L,0
MOVWFTEMPER_NUM
MOVFTEMPER_L,0
BTFSCTEMPER_L,3
INCFTEMPER_NUM,1
GOTOTEMPER_COV1
TEMPER_COV1:
MOVLWox0F
ANDWFTEMPER_H,1
SWAPFTEMPER_H,0
XORWFTEMPER_NUM,1
CALLDISPLY1
RETURN
TEMPER_COV2:
MOVLWoxF8
CPFSLTTEMPER_H
GOTOTEM0
MOVLWox01
MOVWFFLAG
MOVLWox52
MOVWFTEMPER_H
COMFTEMPER_H,1
MOVLWox53
MOVWFTEMPER_L
COMFTEMPER_L,1
INCFTEMPER_L,1
RETURN
***********************温度报警子程序*************************
ALARM:
BCFFR
MOVFTEMPER_NUM1,1;取第一个DS18B20温度值
MOVLWox10
MOVWFox47,0;ox47单元内容位ox10
CPFSEQTEMPER_NUM1;测量值是否等于下限值?
GOTOLOOP0;不等时,转向LOOP0
BCFSR;相等时,固态继电器断开
BCFFR
CALLDISPLY
LOOP0:
CPFSGTTEMPER_NUM1;测量值是否大于下限值?
GOTOLOOP1
GOTOLOOP2;是,则转向LOOP2
LOOP1:
BCFSR
BCFFR
CALLDISPLY
LOOP2:
MOVLWox16
MOVWFox46,0;ox46单元的内容是ox16
MOVFTEMPER_NUM,1
CPFSLTTEMPER_NUM1;测量值是否小于上限值?
GOTOLOOP3;不是,则转向LOOP3
GOTOLOOP4;是,则转向LOOP4
LOOP3:
BSFFR;高于上限值,蜂鸣器报警
BSFSR
CALLDISPLY
LOOP4:
BCFFR
BCFSR
CALLDISPLY
ALARM1:
;采暖表面温度报警处理
BCFFR
MOVFTEMPER_NUM2,1;取第二个DS18B20温度值
MOVLWox5F
MOVWFox48,0
CPFSGTTEMPER_NUM2;测量值是否大于上限值?
GOTOLOOP5;不是,则转向于LOOP5
GOTOLOOP6;是,则转向于LOOP6
LOOP6:
BSFSR;高于上限值,固态继电器断开
BSFFR;高于上限值,蜂鸣器报警
CALLDISPLY
LOOP5:
BCFFR
BCFSR
CALLDISPLY
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 16 F877 单片机 散热器 控制系统 设计