|
楼主 |
发表于 2013-5-10 22:57:39
|
显示全部楼层
CHIP SN8P2705A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 12M_X'tal ; Crystal/Resonator: 10Mhz~16Mhz
.Code_Option Fcpu #2 ; Fcpu = Fosc/4
.Code_Option Security Enable
//}}SONIX_CODE_OPTION
;*******************包含系统自定义宏文件***************
.NOLIST
INCLUDESTD MACRO1.H
INCLUDESTD MACRO2.H
INCLUDESTD MACRO3.H
;********************常量定义**************************
.CONST
pledsegm EQU P4M ;p4.0-p4.7接到数码管段选
pledseg EQU P4 ;数码管段选
pledseg7 EQU P4.7 ;数码管dp段
wei0m EQU FP20M ;第一位数码管引脚方向
wei0p EQU FP20 ;第一位数码管选通引脚
wei1m EQU FP00M ;第二位数码管引脚方向
wei1p EQU FP00 ;第二位数码管选通引脚
pm_trd EQU fP55M ;标准电阻引脚方向
pm_nsr EQU fP56M ;热敏电阻引脚方向
Pm_rc EQU fp57M ;检测引脚方向
p_trd EQU fP55 ;标准电阻充电引脚
p_nsr EQU fP56 ;热敏电阻充电引脚
P_rc EQU fp57 ;检测引脚输入引脚
//*/
/* pm_trd EQU fP15M ;标准电阻引脚方向
pm_nsr EQU fP14M ;热敏电阻引脚方向
Pm_rc EQU fp13M ;检测引脚方向
p_trd EQU fP15 ;标准电阻充电引脚
p_nsr EQU fP14 ;热敏电阻充电引脚
P_rc EQU fp13 ;检测引脚输入引脚
// pur_d EQU P5UR*/
; lkuptab中数据个数定义
lkupnum EQU 41
;*********************变量宏定义***********************
.DATA
ledbuf ds 1
sysflag ds 1
time0 ds 1 ;时间标志位1
time1 ds 1 ;时间标志位2
gewei ds 1
shiwei ds 1
time2 ds 1
num1 ds 1
xiaoshu ds 1
baiwei ds 1
time3 ds 1
fbtmint EQU sysflag.0 ;系统最小时间标志
key_short EQU sysflag.1 ;短按时间标志位
rcflat ds 1
frout EQU rcflat.0 ;开始放电标志位
frcend EQU rcflat.1 ;充电结束标志位
trdtmh ds 1 ;标准电阻充电时间记录高字节
trdtml ds 1 ;标志电阻充电时间记录低字节
nsrtmh ds 1 ;热敏电阻充电时间记录高字节
nsrtml ds 1 ;热敏电阻充电时间记录低字节
lowp ds 1 ;
highp ds 1
middlehp ds 1
middlep ds 1 ;拆半查法指针变量定义
subflag ds 1
subflag1 equ subflag.0 ;测温请求
frcout equ subflag.1
rcmdode ds 1 ;RC模式
rcntvvv ds 1
rcnt ds 1
wk00 ds 1 ;乘法
wk02 ds 1
wk03 ds 1
wk04 ds 1
wk05 ds 1
wk06 ds 1
wk07 ds 1
wk01 ds 1
wk08 ds 1
wk09 ds 1
wk10 ds 1
// wk07 ds 1*/
/* wk00c ds 1 ;除法
wk01c ds 1
wk02c ds 1
wk03c ds 1
wk04c ds 1
wk05c ds 1
wk06c ds 1
wk07c ds 1
wk08c ds 1
wk09c ds 1
wk10c ds 1
wk00d ds 1
wk01d ds 1
wk02d ds 1
wk03d ds 1
wk04d ds 1
//*/
.CODE
;*****************程序上电/复位入口地址*****************
org 00h
jmp reset
;*********************中断入口地址**********************
ORG 008H
jmp intrrupter
;*********************程序代码开始地址******************
org 10h
/*******************************************************
子函数名称:reset
子程序功能:I/O,变量、中断等系统初始化
*******************************************************/
reset:
;端口初始化
mov_ pledsegm,#0xff ;设置数码管I/O口,为输出
mov_ pledseg,#0x7f ;初始化数码管显示8
bset wei0m ;初始化第一个数码管
bset wei1m
bclr wei0p ;初始化第二个数码管
bclr wei1p
bclr pm_trd
bclr pm_nsr
bclr pm_rc
// mov a,#0x00 ;不设置为上拉
// mov pur_d,a
;变量初始化
mov_ time0,#0x00 ;时间计数位清零
mov_ time1,#0x00 ;时间计数位清零
bclr key_short ;短按键标志清零
bclr fbtmint ;防抖动标志位清零
clr ledbuf ;数码管显示位值清零
clr gewei ;各位清零
clr shiwei ;十位清零
clr subflag ;请求标志位清零
clr rcmdode ;模式初始化为0
bclr frcout ;充电标志清零
clr time3 ;检测温度快慢变量清零
bset subflag1
clr middlep
clr num1
;中断初始化处理
clr intrq ;清所有的中断请求标志位
bclr fgie ;关闭总中断
mov_ tc1m,#0x00 ;设置TC1定时器为64分频
mov_ tc1c,#0xc2 ;装入初值,FCPU=1MHZ,64分频,定时10ms
mov_ tc1r,#0xc2 ;装入初值,FCPU=1MHZ,64分频,定时10ms
bset faload1 ;自动装初值
bset ftc1ien ;使能中断
bset ftc1enb ;开始计时
bset fgie ;开总中断
;主函数循环扫描
main:
jmp display0
main10:
mov a,time3
cmprs a,#200 ;每个1s检测一次温度
jmp mnrc
//mov_ pledseg,#0x7f ;把数据送到数码管显示
bset subflag1
clr time3
//main10:
jmp mnrc
/******************************************************
程序名称:mnrc
程序说明:有测温请求时,subflag1=1
测温完成时,subflag=0,并将数据存放在TMpintl和Tmpadecl中
输入参数:测温请求标志subflag1
输出参数:具体的温度为tmpintl(整数部分)、tmpdecl(小数部分)
程序功能:rc充放电测温
******************************************************/
mnrc:
jmp drcnt
mm0:
bts1 subflag1 ;是否有测温请求
jmp mnrc90
mov a,rcmdode
@jmp_a 5
jmp mnrc10 ;放电
jmp mnrc20 ;标准电阻充电
jmp mnrc10 ;放电
jmp mnrc30 ;热敏电阻充电
jmp mnrc40 ;计算温度值
;放电
mnrc10:
bts0 frcout
jmp mnrc60
bset frcout
bclr p_trd
bset pm_trd
bclr p_nsr
bset pm_nsr
bclr p_rc
bset pm_rc
mov a,#6
mov rcnt,a
jmp mnrc90
;标准电阻充电
mnrc20:
clr trdtmh
clr trdtml
bset p_trd
bset pm_trd
bclr pm_rc
bclr pm_nsr
mnrc21:
incms trdtml
jmp $+2
incms trdtmh
bts1 p_rc
jmp mnrc21
nop
jmp mnrc80
;热敏电阻充电
mnrc30:
clr nsrtmh
clr nsrtml
bset p_nsr
bset pm_nsr
bclr pm_rc
bclr pm_trd
mnrc31:
incms nsrtml
jmp $+2
incms nsrtmh
bts1 p_rc
jmp mnrc31
nop
jmp mnrc80
;计算温度值(计算热敏电阻值)
mnrc40:
// mov_ nsrtmh,#0x00
// mov_ nsrtml,#0xfe
// mov_ nsrtmh,#0x20
// mov_ nsrtmh,#0x20
mov_ wk01,nsrtmh ;双字节乘法入口参数数据准备
mov_ wk02,nsrtml ;被乘数(热敏电阻充电时间)
mov_ wk06,#0x27
mov_ wk07,#0x10 ;标准电阻为12KΩ
jmp mul_hex2b ;调用双字节乘法子函数
mm1:
mov_ wk03,wk04 ;4字节除法入口参数数据准备
mov_ wk04,wk05
mov_ wk05,wk06
mov_ wk06,wk07
// mov_ trdtmh,#0x00
// mov_ trdtml,#0xdf
mov_ wk01,trdtmh ;4字节除法入口参数数据准备
mov_ wk02,trdtml ;除数(标准电阻充电时间)
jmp div_hex4bt02b ;调用除法指令*/
mm2:
mov_ h,wk05
mov_ l,wk06
jmp lkuphalf
// jmp mnrc80
mnrc60:
// bts1 frcout
// jmp mnrc90
// decms rcnt ;每次减1
mov a,rcnt
bts1 fz
jmp mnrc90
bclr frcout
jmp mnrc80
mnrc80:
incms rcmdode ;模式加1
mov a,rcmdode
sub a,#5 ;若模式为5,则清零
jnc mnrc90
clr rcmdode
bclr subflag1 ;清除测温请求标志
mnrc90:
jmp main
drcnt:
bts1 frcout
jmp drcnt90
mov a,rcnt
bts0 fz
jmp drcnt90
decms rcnt
nop
drcnt90:
jmp mm0
/*******************************************************
子函数名称:display0
子程序功能:在数码管上显示相应的数字
*******************************************************/
display0:
cjb_ middlep,#10,yy0
cjb_ middlep,#20,yy1
cjb_ middlep,#30,yy2
cjb_ middlep,#40,yy3
cjb_ middlep,#50,yy4
cjb_ middlep,#60,yy5
nop
nop
mov_ shiwei,#4
mov_ gewei,#0
jmp display30
yy0:
mov_ shiwei,#0
mov_ gewei,middlep
jmp display30
yy1:
mov_ shiwei,#1
mov a,middlep
sub a,#10
mov gewei,a
jmp display30
yy2:
mov_ shiwei,#2
mov a,middlep
sub a,#20
mov gewei,a
jmp display30
yy3:
mov_ shiwei,#3
mov a,middlep
sub a,#30
mov gewei,a
jmp display30
yy4:
mov_ shiwei,#4
mov a,middlep
sub a,#40
mov gewei,a
jmp display30
yy5:
mov_ shiwei,#5
mov a,middlep
sub a,#50
mov gewei,a
jmp display30
display30:
cja_ time1,#1,display10
bclr wei0p
bset wei1p
mov_ ledbuf,gewei
jmp display20
display10:
cja_ time1,#2,display20
bset wei0p
bclr wei1p
mov_ ledbuf,shiwei
jmp display20
display20:
nop
nop
b0mov y,#ledcode$m
b0mov z,#ledcode$l ;显示表首地址
mov a,ledbuf
add z,a
bts1 fc
jmp display1
incms y
nop
display1:
movc ;查表,地位放在ACC,高位
;放在R寄存器中
mov pledseg,a ;把数据送到数码管显示
//jmp $
// jmp mnrc80
// ret
jmp main10
/*******************************************************
子函数名称:lkuphalf
子程序功能:双字节温度查表
如口条件:被比较的数h,l(高、低位)
lkuptab时表中的数据个数
出口信息:被寻找数据在lkuptab表中,最近的组号在middlep中
*******************************************************/
lkuphalf:
clr lowp
mov a,#lkupnum-1
mov highp,a
lkuphalf10:
mov a,highp
bset fc
sub a,lowp
cmprs a,#01h
jmp $+2
jmp lkuphalf90
clr middlehp
mov a,lowp
add a,highp
bts0 fc
incms middlehp
mov middlep,a
rrcm middlehp
rrcm middlep
b0mov y,#lkuptab$m
b0mov z,#lkuptab$l
mov a,middlep
add z,a
bts0 fc
incms y
movc
xch a,r
bset fc
sub a,h
jz lkuphalf30
jc lkuphalf40
lkuphalf20:
mov a,middlep
mov highp,a
decms middlep
jmp lkuphalf10
jmp lkuphalf10
lkuphalf30:
xch a,r
bset fc
sub a,l
jz lkuphalf90
jnc lkuphalf20
lkuphalf40:
mov a,middlep
mov lowp,a
incms middlep
jmp lkuphalf10
lkuphalf90:
jmp mnrc80
/*******************************************************
子函数名称:div_hex1bto1b
子程序功能:一个字节的HEX除以一个字节的HEX
如口条件:被乘数WK02WK03,高位在WK02,地位在WK03;
乘数WK06WK07,高位在WK06,地位在WK07
出口信息:积在WK04/WK05/WK06/WK07中,高位在WK04,地位在WK07
*******************************************************/
/*******************************************************
子函数名称:mul_hex2b
子程序功能:二个字节的HEX相乘
如口条件:被乘数WK02WK03,高位在WK02,地位在WK03;
乘数WK06WK07,高位在WK06,地位在WK07
出口信息:积在WK04/WK05/WK06/WK07中,高位在WK04,地位在WK07
*******************************************************/
mul_hex2b:
clr wk03
clr wk04
mov a,#10h
b0mov wk00,a
b0bclr fc
mul_mlp:
rrcm wk03
rrcm wk04
rrcm wk05
rrcm wk06
b0bts1 fc
jmp mul_mln
b0mov a,wk02
add wk04,a
b0mov a,wk01
adc wk03,a
mul_mln:
decms wk00
jmp mul_mlp
rrcm wk03
rrcm wk04
rrcm wk05
rrcm wk06
jmp mm1
/*******************************************************
子函数名称:div_hex4bt02b
子程序功能:四个字节的HEX除以二个字节的HEX
如口条件:被除数(BYDIVID)WK03WK04WK05WK06,高位在WK03
除数(DIVID)WK01WK02,高位在WK01
出口信息:商(RESULT)WK03WK04WK05WK06,高位在WK03
余数(REST)WK07WK08,高位在WK07
*******************************************************/
div_hex4bt02b:
mov a,#32
b0mov wk00,a
clr wk08
clr wk07
div_hex4bt02b0:
b0bclr fc
rlcm wk06
rlcm wk05
rlcm wk04
rlcm wk03
rlcm wk08
rlcm wk07
b0bts0 fc
jmp save_fc_1
b0bclr wk09.7
jmp save_next
save_fc_1:
b0bset wk09.7
save_next:
b0mov a,wk08
sub a,wk02
b0mov y,a
b0mov a,wk07
sbc a,wk01
b0mov z,a
b0bts1 fc
jmp div_hex4bt02b11
div_hex4bt02b11:
b0mov a,y
b0mov wk08,a
b0mov a,z
b0mov wk07,a
incms wk06
div_hex4bt02b1:
decms wk00
jmp div_hex4bt02b0
jmp mm2
div_hex4bt02b1_1:
b0bts1 wk09.7
jmp div_hex4bt02b1
jmp div_hex4bt02b11
/*******************************************************
子函数名称:intrrupter
子程序功能:中断服务子程序,检测是否为按键有效区别长短按
之分
*******************************************************/
intrrupter:
push ;保护数据
bts1 ftc1ien
jmp int_exit
bts0 ftc1irq
jmp int_tc0hk
jmp int_exit
/*******************************************************
子函数名称:int_tc0hk
子程序功能:TC0中断服务子程序,检测是否为按键有效区别长短
按之分。
*******************************************************/
int_tc0hk:
incms time1
mov a,time1
cmprs a,#3
jmp kkk
mov_ time1,#0
kkk:
incms time3
mov a,time3
cmprs a,#201
jmp int_exit
mov_ time3,#0
jmp int_exit
int_exit:
bclr ftc1irq ;执行完毕之后,清除所有中断请求
pop ;还原数据
reti
;********************七段显示码表(共阴极)**********************
ledcode:
; 0 1 2 3
dw 0x3F 0x06 0x5B 0x4F
; 4 5 6 7
dw 0x66 0x6D 0x7D 0x07
; 8 9 A B
dw 0x7F 0x6F 0X77 0X7C
; C D E F
dw 0x39 0x5e 0x79 0x71
;********************温度和热敏电阻的阻值的对应关系***************
lkuptab:
dw 6bd6h,673bh,62dch,5each,5ab2h,56f3h,5353h,4fe2h,4ca5h,4983h;0--9℃
dw 4662h,43aah,4101h,3e60h,3be9h,399eh,3775h,3571h,3319h,3125h;10--19℃
dw 2f4eh,2d7fh,2bcah,2a22h,2892h,2710h,259fh,243dh,22e9h,21a5h;20--39℃
dw 206eh,1f43h,1e26h,1d15h,1c0eh,1b11h,1a20h,1939h,1859h,1783h;30--49℃
dw 16b5h ;40℃
ENDP |
|