打印

我的多点ds18b20温度测控程序

[复制链接]
6520|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
戒指320|  楼主 | 2009-8-6 23:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序是我6月的毕业设计,现贴来与大家分享。
/**********************************************
file name: 18b20.asm
author:  wang kai
date:  2009 03 19
discription:
  Fcpu= 4MHz/4
  Remote Chip:HS5104
history:
***********************************************/
CHIP sn8p2604A
//{{SONIX_CODE_OPTION
.Code_Option Noise_Filter Enable
.Code_Option Reset_Pin P02
.Code_Option Watch_Dog Disable ; Disable Watchdog
.Code_Option High_Clk 4M_X'tal; Crystal/Resonator: 2Mhz~10Mhz
.Code_Option Fcpu  #2     ; Fcpu = Fosc/4
.Code_Option Security Enable
.Code_Option LVD  LVD_L  ; 2.0V Reset
//}}SONIX_CODE_OPTION
.NOLIST
includestd macro1.h
includestd macro2.h
includestd macro3.h
.DATA
write_byte DS 1  
write_reg DS 1
flag  DS 1
ini_flag EQU flag.0
buzz1  EQU flag.1
buzz2  EQU flag.2
buzz3  EQU flag.3
motf1  EQU flag.4
motf2  EQU flag.5
motf3  EQU flag.6
read_2byte DS 1 ;数据字节寄存器,读2个字节
read_byte DS 1 ;数据位寄存器,8位
read_reg DS 2 ;读出数据存储寄存器
xsu1  DS 1 ;小数最高位
xsu2  DS 1 ;小数次高位
xsu3  DS 1 ;小数次低位(保留未送出显示)
xsu4  DS 1 ;小数最低位(保留未送出显示)
zsu1  DS 1 ;整数最高位(保留未送出显示)
zsu2  DS 1 ;整数次高位
zsu3  DS 1 ;整数最低位
zsu2A  DS 1  
zsu3A  DS 1
xsu1A  DS 1
zsu2B  DS 1  
zsu3B  DS 1
xsu1B  DS 1
zsu2C  DS 1  
zsu3C  DS 1
xsu1C  DS 1
BCD_temper DS 1
cov_temper DS 1
ledbuf  DS 4
zhengshu DS 1
xiaoshu  DS 1  
time1  DS 1
time2  DS 1
time3  DS 1
time4  DS 1
time5  DS 1
time6  DS 1
time7  DS 1
time8  DS 1
time9  DS 1
time_400ms DS 1
time_1s  DS 1
rxdata_1 DS 1
rxdata_2 DS 1
rxcnt  DS 1
rxdata  Ds 1
r_l  DS 1
r_h  DS 1
_ircount DS 1
mod  DS 1
wk_0  DS 1
wk_1  DS 1
rom8  DS 8
rxdptr  DS 1
led_dptr DS 1
tesk_dptr DS 1
new_key  DS 1
old_key  DS 1
abuf  DS 1
kflag  DS 1
key_cnt  DS 1
wk00  DS 1
wk01  DS 1
alarmA  DS 1
alarmB  DS 1
alarmC  DS 1
chang  DS 1
zhengshuA DS 1
zhengshuB DS 1
zhengshuC DS 1
ir_good  EQU chang.7
_pre_status EQU chang.6
note_flag EQU chang.5
accbuf  DS 1
giecnt  DS 1
buzzcnt  DS 1
motcnt10 DS 1
motcnt11 DS 1
motcnt12 DS 1
motcnt20 DS 1
motcnt21 DS 1
motcnt22 DS 1
motcnt30 DS 1
motcnt31 DS 1
motcnt32 DS 1
time_ok  DS 1
reset_cnt DS 1
note_cnt DS 1  
.CONST
data_busm EQU p0m.1
data_bus EQU p0.1  ;DQ
pseg  EQU p2
pdot  EQU p2.7
com0  EQU p5.0
com1  EQU p5.1
com2  EQU p5.2
com3  EQU p5.3
_ir  EQU p0.0  ;红外接收口
mot1  EQU p1.5
mot2  EQU p1.6
mot3  EQU p1.7
.CODE
org 00h
jmp reset
org 08h
jmp isr
org 10h
;**********************************************
;        初始化
;**********************************************
reset:
b0mov y,#0
b0mov z,#7fh
clr_bank0:
clr @yz
decms z
jmp clr_bank0
clr @yz
mov a,#35
mov alarmA,a
mov alarmB,a
mov alarmC,a
mov a,#00100100b
mov tc1m,a
mov a,#193
mov tc1c,a
mov tc1r,a
bclr ftc1irq
bset ftc1enb
bclr ft0ien
mov a,#01110000b
mov t0m,a
mov a,#193   ;125us
mov t0c,a
bclr ft0irq
bset ft0ien
bset ft0enb
bset fgie
mov a,#00000001b
mov p0ur,a
;**********************************************
;             主程序
;**********************************************
main:
call sys_init
mov a,#5ah   ;清看门狗
mov wdtr,a
time_base:    ;timebase=4ms
bts1 ftc1irq
jmp time_base
bclr ftc1irq
call reset_pin
call mnstate
call mntesk
call mnkey_scan
call mnkey_event
call mn_ifred_key
call note
call mnalarm_test
call mnbuzz_out
call mnmot_control
jmp main
;**********************************************
;                 状态选择
;**********************************************
mnstate:
incms wk00
mov a,wk00
cmprs a,#250
jmp state90
clr wk00   ;1s
incms wk01
mov a,wk01
cmprs a,#10   ;10s一个状态
jmp state90
clr wk01
mov a,tesk_dptr
cmprs a,#6
jmp state10
jmp state20
state10:
incms tesk_dptr  ;tesk_dptr状态指示
jmp state90
state20:
clr tesk_dptr
bclr chang.0
state90:
ret
;**********************************************
;执行各个状态的任务  4-7个状态
;**********************************************
mntesk:
mov a,tesk_dptr
b0add pcl,a
jmp show_A   ;显示A点温度
jmp show_B   ;显示B点温度
jmp show_C   ;显示C点温度
jmp get_tmp   ;转换温度
jmp alarm_seta  ;A点报警温度设定
jmp alarm_setb  ;B点报警温度设定
jmp alarm_setc  ;C点报警温度设定

相关帖子

沙发
戒指320|  楼主 | 2009-8-6 23:03 | 只看该作者
;*************;状态1***************                       
show_A:                                       
        mov        a,zsu2A
        mov        ledbuf,a
        mov        a,zsu3A
        mov        ledbuf+1,a
        mov        a,xsu1A
        mov        ledbuf+2,a
        mov        a,#0ah
        mov        ledbuf+3,a
        call        led_display
        jmp        tesk90
;*************;状态2***************
show_B:                               
        mov        a,zsu2B
        mov        ledbuf,a
        mov        a,zsu3B
        mov        ledbuf+1,a
        mov        a,xsu1B
        mov        ledbuf+2,a
        mov        a,#0bh
        mov        ledbuf+3,a
        call        led_display
        jmp        tesk90
;*************;状态3***************
show_C:                                       
        mov        a,zsu2C
        mov        ledbuf,a
        mov        a,zsu3C
        mov        ledbuf+1,a
        mov        a,xsu1C
        mov        ledbuf+2,a
        mov        a,#0ch
        mov        ledbuf+3,a
        call        led_display
        jmp        tesk90
;*************;状态4***************
get_tmp:                               
        bclr        fgie
        mov        a,#0eh
        mov        ledbuf,a
        mov        a,ledbuf       
        call        movc_buf
        mov        a,#00001001b
        mov        p5,a
        bclr        pdot       
        call        mnconv_t                ;发转换命令,所有器件开始温度转换
        call        wait_1s                        ;等待1s
        call        mnget_temp                ;读出第一个器件温度
        call        mntemp_cov
        mov        a,zhengshu
        mov        zhengshuA,a
        call        mnBCD_cov
        mov        a,zsu2
        mov        zsu2A,a
        mov        a,zsu3
        mov        zsu3A,a
        mov        a,xsu1
        mov        xsu1A,a
        call        mnget_temp1                ;读出第二个器件温度
        call        mntemp_cov
        mov        a,zhengshu
        mov        zhengshuB,a
        call        mnBCD_cov
        mov        a,zsu2
        mov        zsu2B,a
        mov        a,zsu3
        mov        zsu3B,a
        mov        a,xsu1
        mov        xsu1B,a
        call        mnget_temp2                ;读出第三个器件温度
        call        mntemp_cov
        mov        a,zhengshu
        mov        zhengshuC,a
        call        mnBCD_cov
        mov        a,zsu2
        mov        zsu2C,a
        mov        a,zsu3
        mov        zsu3C,a
        mov        a,xsu1
        mov        xsu1C,a
        clr        tesk_dptr
        bset        fgie
        jmp        tesk90
;*************;状态5***************
alarm_seta:                       
        bts1        kflag.5
        jmp        alarm_seta10
        bset        note_flag       
        incms        alarmA
        bclr        kflag.5
alarm_seta10:
        bts1        kflag.6
        jmp        alarm_seta20
        bset        note_flag
        decms        alarmA
        bclr        kflag.6
alarm_seta20:
        b0mov        y,#zsu_tab$m                ;取出整数查找表首地址
        b0mov        z,#zsu_tab$l
        mov        a,alarmA
        add        z,a                        ;查找表地址指向整数值对应的BCD码
        bts0        fc
        incms        y
        movc
        mov        BCD_temper,a                ;整数低2位转化为BCD码
        and        a,#0fh
        mov        zsu3,a                        ;存入整数最低位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a
        swap        BCD_temper
        mov        zsu2,a       
        mov        ledbuf,a
        mov        a,zsu3
        mov        ledbuf+1,a
        mov        a,#0
        mov        ledbuf+2,a
        mov        a,#0ah
        mov        ledbuf+3,a
        call        led_display
        jmp        tesk90       
;*************;状态6***************
alarm_setb:                               
        bts1        kflag.5
        jmp        alarm_setb10
        bset        note_flag       
        incms        alarmB
        bclr        kflag.5
alarm_setb10:
        bts1        kflag.6
        jmp        alarm_setB20
        bset        note_flag
        decms        alarmB
        bclr        kflag.6
alarm_setB20:
        b0mov        y,#zsu_tab$m                ;取出整数查找表首地址
        b0mov        z,#zsu_tab$l
        mov        a,alarmB
        add        z,a                        ;查找表地址指向整数值对应的BCD码
        bts0        fc
        incms        y
        movc
        mov        BCD_temper,a                ;整数低2位转化为BCD码
        and        a,#0fh
        mov        zsu3,a                        ;存入整数最低位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a
        swap        BCD_temper
        mov        zsu2,a       
        mov        ledbuf,a
        mov        a,zsu3
        mov        ledbuf+1,a
        mov        a,#0
        mov        ledbuf+2,a
        mov        a,#0bh
        mov        ledbuf+3,a
        call        led_display
        jmp        tesk90
;*************;状态7***************
alarm_setc:                               
        bts1        kflag.5
        jmp        alarm_setC10       
        bset        note_flag
        incms        alarmC
        bclr        kflag.5
alarm_setC10:
        bts1        kflag.6
        jmp        alarm_setC20
        bset        note_flag
        decms        alarmC
        bclr        kflag.6
alarm_setC20:
        b0mov        y,#zsu_tab$m                ;取出整数查找表首地址
        b0mov        z,#zsu_tab$l
        mov        a,alarmC
        add        z,a                        ;查找表地址指向整数值对应的BCD码
        bts0        fc
        incms        y
        movc
        mov        BCD_temper,a                ;整数低2位转化为BCD码
        and        a,#0fh
        mov        zsu3,a                        ;存入整数最低位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a
        swap        BCD_temper
        mov        zsu2,a       
        mov        ledbuf,a
        mov        a,zsu3
        mov        ledbuf+1,a
        mov        a,#0
        mov        ledbuf+2,a
        mov        a,#0ch
        mov        ledbuf+3,a
        call        led_display
tesk90:
        ret

使用特权

评论回复
板凳
戒指320|  楼主 | 2009-8-6 23:04 | 只看该作者
;**********************************************
;功能说明:发出温度转换命令
;**********************************************
mnconv_t:
        call        ini_18b20                ;初始化
        bts1        ini_flag                ;检查初始化标志
        jmp        mnconv_t90                ;为0,重新初始化   
        mov        a,#0cch                        ;为1,初始化成功
        call        write_18b20                ;发出跳过ROM命令
        mov        a,#44h
        call        write_18b20                ;发出温度转化命令
mnconv_t90:
        ret
;**********************************************
;功能说明:等待1s ,让器件完成温度转换0.992993s
;**********************************************
wait_1s:
        mov        a,#250
        mov        time8,a
        mov        a,#6
        mov        time9,a               
wait_1s1:
        call        delay_480us
        decms        time8
        jmp        wait_1s1
        decms        time9
        jmp        wait_1s1               
wait_1s90:
        nop
        ret
;**********************************************
;功能说明:匹配第一个器件,并读出温度
;出口参数:read_reg[0],read_reg[1]
;**********************************************
mnget_temp:
        mov_        rom8,#28h
        mov_        rom8+1,#04fh
        mov_        rom8+2,#38h
        mov_        rom8+3,#0f0h
        mov_        rom8+4,#01h
        mov_        rom8+5,#00h
        mov_        rom8+6,#00h       
        mov_        rom8+7,#2fh
        call        rom_match                ;匹配rom
        mov        a,#0beh
        call        write_18b20                ;发出读温度命令
        call        read_18b20_temp                ;调用读程序,读出两字节
        nop
mnget_temp90:
        ret
;**********************************************
;功能说明:匹配第二个器件,并读出温度
;出口参数:read_reg[0],read_reg[1]
;**********************************************
mnget_temp1:
        mov_        rom8,#28h
        mov_        rom8+1,#0f7h
        mov_        rom8+2,#12h
        mov_        rom8+3,#0f0h
        mov_        rom8+4,#01h
        mov_        rom8+5,#00h
        mov_        rom8+6,#00h       
        mov_        rom8+7,#0cch       
        call        rom_match                ;匹配rom
        mov        a,#0beh
        call        write_18b20                ;发出读温度命令
        call        read_18b20_temp                ;调用读程序,读出两字节
        nop
mnget_temp190:
        ret
;**********************************************
;功能说明:匹配第三个器件,并读出温度
;出口参数:read_reg[0],read_reg[1]
;**********************************************
mnget_temp2:       
        mov_        rom8,#28h
        mov_        rom8+1,#80h
        mov_        rom8+2,#41h
        mov_        rom8+3,#0f0h
        mov_        rom8+4,#01h
        mov_        rom8+5,#00h
        mov_        rom8+6,#00h       
        mov_        rom8+7,#0ah
        call        rom_match                ;匹配rom
        mov        a,#0beh
        call        write_18b20                ;发出读温度命令
        call        read_18b20_temp                ;调用读程序,读出两字节
        nop
mnget_temp290:
        ret
;**********************************************
;功能说明:18b20初始化,初始化成功ini_flag置1
;出口参数:ini_flag,初始化成功ini_flag置1,失败置0
;**********************************************
ini_18b20:
        bclr        ini_flag                ;初始化成功标志清0       
        bset        data_busm                ;设为输出口
        bset        data_bus                ;总线置1       
        nop                                ;延时1us
        bclr        data_bus                ;总线置0               
        call        delay_480us                ;延时480us
        bset        data_bus                ;总线置1
        call        delay_25us                ;延时25us
        bclr        data_busm                ;设为输入,释放总线,等待接收18b20发出的回应信号
        bts0        data_bus                ;18b20是否存在?
        jmp        ini_faid                ;总线为1,无回应,初始化失败
        bset        ini_flag                ;回应0,初始化成功,标志置1
        call        delay_240us                ;回应0,延时240us                               
        jmp        exit
ini_faid:
        bclr        ini_flag                ;初始化失败,标志清0
        jmp        exit
exit:
        bset        data_bus                ;总线置1
        ret
delay_25us:                           
        mov        a,#7
        mov        time1,a                       
        decms        time1
        jmp        $-1
        ret
delay_480us:                           
        mov        a,#160
        mov        time2,a
        decms        time2
        jmp        $-1
        ret
delay_240us:
        mov        a,#80
        mov        time3,a
        decms        time3
        jmp        $-1
        ret
;**********************************************
;功能说明:向18b20中写入数据
;入口参数:累加器A,累加器A的数放进write_reg,然后移位进数据线P1.4
;**********************************************
write_18b20:
        mov        write_reg,a
        mov        a,#8
        mov        write_byte,a       
write1:
        bset        data_busm                ;设为输出口
        bclr        data_bus                ;数据线拉低
        nop
        nop       
        nop
        nop                                ;延时4us
        rrcm        write_reg                ;一位数据输出
        bts0        fc
        jmp        $+3                       
        bclr        data_bus                ;输出0
        jmp        @f
        bset        data_bus                ;输出1
@@:        call        delay_45us                ;延时45us
        bset        data_bus                ;数据线拉高1us
        bclr        data_busm
        nop                                       
        djnz        write_byte,write1        ;8位数据输出完?
        bset        data_bus                ;完数据线拉高,否则返回write1
        bset        data_busm
        ret
delay_45us:
        mov        a,#14
        mov        time4,a
        decms        time4
        jmp        $-1
        ret
;**********************************************
;功能说明:从18b20中读出温度数据
;         (在此函数中只读出了2字节的温度数据)
;出口参数:read_reg,读出的数据存入read_reg和read_reg+1
;**********************************************       
read_18b20_temp:
        b0mov        y,#read_reg$m
        b0mov        z,#read_reg$l       
        mov        a,#2                        ;2
        mov        read_2byte,a       
read1:
        mov        a,#8
        mov        read_byte,a       
read2:               
        bset        data_busm                ;设为输出口
        bclr        data_bus                ;拉低
        nop                                ;延时>1us
        nop
        bclr        data_busm                ;释放总线,变为输入口
        bts0        data_bus                ;读数
        jmp        $+3                       
        bclr        fc                        ;读出0
        jmp        @f
        bset        fc                        ;读出1
@@:        rrcm        @yz                        ;存数
        call        delay_50us                ;延时50us
        bset        data_bus                ;数据线拉高               
        djnz        read_byte,read2                ;8位数读完?
        incms        z                        ;数据存储器地址加1
        djnz        read_2byte,read1        ;2字节数读完?
        ret
delay_50us:                               
        mov        a,#19
        mov        time5,a
        decms        time5
        jmp        $-1
        ret
;**********************************************
;功能说明:匹配rom
;入口参数:rom8
;**********************************************
rom_match:
        call        ini_18b20               
        bts1        ini_flag               
        jmp        rom_match90               
        mov        a,#55h               
        call        write_18b20
        b0mov        h,#8
        b0mov        y,#rom8$m
        b0mov        z,#rom8$l
rom_match10:
        mov        a,@yz
        call        write_18b20
        mov        a,#1
        incms        z
        nop       
        decms        h
        jmp        rom_match10
rom_match90:       
        ret
;**********************************************
;功能说明:把存入read_reg中的温度值分为整数和小数部分,
;         分别存入zhengshu和xiaoshu存储器中
;入口参数:read_reg,read_reg+1寄存器
;出口参数:zhengshu,xiaoshu寄存器
;**********************************************       
mntemp_cov:
        mov        a,#0f0h                ;舍去温度低位中小数点后的四位温度数值
        and        a,read_reg
        mov        cov_temper,a        ;数据暂存于cov_temper
        swap        cov_temper
        mov        zhengshu,a        ;得到温度值低四位
        mov        a,read_reg
        and        a,#0fh
        mov        xiaoshu,a        ;低四位小数存储在xiaoshu单元
        mov        a,read_reg+1        ;取温度值高四位
        and        a,#07h
        mov        cov_temper,a        ;数据暂存于cov_temper
        swap        cov_temper
        xor        zhengshu,a        ;8位整数存储在zhengshu单元
        ret                       
;**********************************************
;功能说明:BCD_cov,温度数据转化为BCD码,以方便数码管显示
;入口参数:xiaoshu,zhengshu
;出口参数:xsu1,xsu2,xsu3,xsu4,zsu1,zsu2,zsu3
;**********************************************
mnBCD_cov:
xsu_BCD:
        b0mov        y,#xsu_tab$m                ;取出小数查找表首地址
        b0mov        z,#xsu_tab$l
        mov        a,xiaoshu               
        add        z,a                        ;查找表地址指向小数值对应的BCD码
        bts0        fc
        incms        y
        movc                                ;查表
        mov        BCD_temper,a                  ;小数低2位转化为BCD码
        and        a,#0fh
        mov        xsu4,a                        ;存入小数最低位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a               
        swap        BCD_temper
        mov        xsu3,a                        ;存入小数次低位
                       
        mov        a,r                        ;小数高2位转化为BCD码
        mov        BCD_temper,a
        and        a,#0fh
        mov        xsu2,a                        ;存入小数次高位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a
        swap        BCD_temper
        mov        xsu1,a                        ;存入小数最高位
zsu_bcd:
        b0mov        y,#zsu_tab$m                ;取出整数查找表首地址
        b0mov        z,#zsu_tab$l
        mov        a,zhengshu
        add        z,a                        ;查找表地址指向整数值对应的BCD码
        bts0        fc
        incms        y
        movc
        mov        BCD_temper,a                ;整数低2位转化为BCD码
        and        a,#0fh
        mov        zsu3,a                        ;存入整数最低位
        mov        a,BCD_temper
        and        a,#0f0h
        mov        BCD_temper,a
        swap        BCD_temper
        mov        zsu2,a                        ;存入整数次高位
                       
        mov        a,r                          ;整数高1位转化为BCD码(最高位为0,最高127度)
        mov        BCD_temper,a
        and        a,#0fh
        mov        zsu1,a                        ;存入整数最高位
        ret

使用特权

评论回复
地板
戒指320|  楼主 | 2009-8-6 23:04 | 只看该作者
;**********************************************
;功能说明:数码管显示
;入口参数:ledbuf/ledbuf+1/ledbuf+2/ledbuf+3
;         com0          com1    com2      com3
;**********************************************
led_display:
        mov        a,led_dptr                       
        incms        led_dptr
        b0add        pcl,a
        jmp        led0
        jmp        led1
        jmp        led2
        jmp        led3
led0:
        mov        a,ledbuf
        call        com_off
        call        movc_buf
        bset        com0
        bclr        com1
        bclr        com2
        bclr        com3       
        bclr        pdot
        jmp        led_display90
led1:
        mov        a,ledbuf+1
        call        com_off
        call        movc_buf
        bset        com1
        bclr        com0
        bclr        com2
        bclr        com3
        bset        pdot
        jmp        led_display90
led2:
        mov        a,ledbuf+2       
        call        com_off
        call        movc_buf
        bset        com2
        bclr        com0
        bclr        com1
        bclr        com3
        bclr        pdot
        jmp        led_display90
led3:
        mov        a,ledbuf+3       
        call        com_off
        call        movc_buf
        bset        com3
        bclr        com2
        bclr        com1
        bclr        com0
        bclr        pdot
        clr        led_dptr       
        jmp        led_display90
led_display90:
        ret
;===============
movc_buf:
        b0mov   y,#table$m
            b0mov   z,#table$l
        add     z,a
        bts0        fc
        incms        y
        movc
        mov        pseg,a                        ;送段码
        ret
;**********************************************
;功能说明:按键扫描
;出口参数:keyflag
;**********************************************
mnkey_scan:
        bset        p1.4
        mov        a,#00010111b
        mov        p1ur,a
        bclr        p1.3
        mov        a,#11101000b
        mov        p1m,a
        mov        a,p1
        and        a,#00000111b
        mov        new_key,a
        bset        p1.3                        ;输出低到输入上拉中间要经过输出1
        mov        a,#00001111b
        mov        p1ur,a
        bclr        p1.4
        mov        a,#11110000b
        mov        p1m,a
        mov        a,p1
        mov        abuf,a
        rlcm        abuf
        rlcm        abuf
        rlcm        abuf
        mov        a,abuf
        and        a,#00111000b
        or        a,new_key                ;a=00******
        cmprs        a,#00111111b
        jmp        get_key
        jmp        ret10
ret10:
        mov        new_key,a
        mov        old_key,a
        clr        key_cnt
        jmp        key_scan90
get_key:
        mov        new_key,a
        cmprs        a,old_key
        jmp        ret10                        ;不相等
        incms        key_cnt
        mov        a,key_cnt
        cmprs        a,#8                        ;消抖32ms
        jmp        key_scan90               
        bts0        new_key.0                ;读键值
        jmp        k2       
        bset        kflag.1                        ;k1
k2:
        bts0        new_key.1
        jmp        k3       
        bset        kflag.2                        ;k2
k3:
        bts0        new_key.2
        jmp        k4       
        bset        kflag.3                        ;k3
k4:
        bts0        new_key.3
        jmp        k5       
        bset        kflag.4                        ;k4
k5:
        bts0        new_key.4
        jmp        k6       
        bset        kflag.5                        ;k5
k6:
        bts0        new_key.5
        jmp        key_scan90       
        bset        kflag.6                        ;k6
key_scan90:
        ret       
;**********************************************
;          按键事件定义
;**********************************************
mnkey_event:
        bts1        kflag.1
        jmp        key_event00
        bset        note_flag
        mov        a,#4       
        mov        tesk_dptr,a
        bset        chang.0
        bclr        kflag.1
        clr        wk00
        clr        wk01
key_event00:
        bts1        kflag.2
        jmp        key_event10
        bset        note_flag
        bts1        chang.0                        ;功能键按下没?
        jmp        m0       
        jmp        m01
m0:
        mov        a,#0
        mov        tesk_dptr,a
        clr        wk00
        clr        wk01       
        bclr        kflag.2
        jmp        key_event10
m01:
        mov        a,#4
        mov        tesk_dptr,a
        bclr        kflag.2
        clr        wk00
        clr        wk01
key_event10:
        bts1        kflag.3
        jmp        key_event20
        bset        note_flag
        bts1        chang.0                        ;功能键按下没?
        jmp        m1       
        jmp        m11
m1:
        mov        a,#1
        mov        tesk_dptr,a
        clr        wk00
        clr        wk01       
        bclr        kflag.3
        jmp        key_event20
m11:
        mov        a,#5
        mov        tesk_dptr,a
        bclr        kflag.3
        clr        wk00
        clr        wk01       
key_event20:       
        bts1        kflag.4
        jmp        key_event30
        bset        note_flag
        bts1        chang.0                        ;功能键按下没?
        jmp        m2       
        jmp        m21
m2:
        mov        a,#2
        mov        tesk_dptr,a
        clr        wk00
        clr        wk01       
        bclr        kflag.4
        jmp        key_event30
m21:
        mov        a,#6
        mov        tesk_dptr,a
        bclr        kflag.4
        clr        wk00
        clr        wk01
key_event30:       
key_event90:
        ret
;**********************************************
;        中断服务 红外解码子程序
;        遥控键值放在rxdata里
;**********************************************
isr:
        b0xch        a,accbuf
        push
        bclr        ft0irq
        mov        a,#193
        add        t0c,a
        bts1        ir_good
        jmp        go_ir
        incms        giecnt
        mov        a,giecnt
        cmprs        a,#250
        jmp        exit_int
        incms        _ircount
        clr        giecnt
        mov        a,_ircount
        cmprs        a,#8
        jmp        exit_int       
        bclr        ir_good       
        clr        _ircount       
go_ir:                               
        mov     a,rxdptr                        ;解码开始
        nop
        nop
        add           pcl,a
        Jmp     Receive_process10               ;接受8ms 高电平
        Jmp     Receive_process11               ;
        Jmp     Receive_process20               ;接受数据码
;**********************************************
;       导航码载波信号长度校验>=5ms
;**********************************************
Receive_process10:
        b0bts1  _ir
        jmp     receive_error_code0                ;<2ms is error
        incs    r_l
        b0mov   r_l,a                                ;125uSx40=5mS,从信号的中间处识别
        sub     a,#40                               
        b0bts1  fc                                             
        jmp     exit_int                        ;退出接收程序
        jmp     receive_next_step                ;receive_next_process         
receive_process11:
        b0bts1  _ir
        jmp     receive_next_process
        incs        r_l
        b0mov   r_l,a
        sub     a,#76                                 ;125us*76=9.5ms
        b0bts1  fc                              ;
        jmp     exit_receive110
        clr     RxData
        jmp     receive_error_code0                ;error
;********************
receive_process20:                              ;开始高电平的长度
        bts1  _ir
        jmp     receive_process21                ;识别码值
        bset        _pre_status
        incs        r_h
        b0mov   r_h,a
             sub     a,#12                                 ;11*125=1.37ms
        bts1  fc                             
        jmp     exit_int
        bclr        _pre_status
        jmp     receive_error_code0                ;错误
receive_process21:                                      ;开始低电平的长度
        bts0        _pre_status
        jmp        receive_process22
        incs    r_l
        b0mov   r_l,a
        sub     a,#12                         
        b0bts1  fc                             
        jmp     exit_int
        jmp     receive_error_code0                ;错误
receive_process22:
        bclr        _pre_status
        b0mov   a,r_l
        cmprs        a,#1                                 
        bts1        Fc
        jmp     receive_error_code0                ;error
        b0mov   a,r_h                                ;判断 低电平 的长度
        cmprs        a,#1                                ; 单个下限
        bts1        Fc
        jmp     receive_error_code0                ;error       
        b0mov   a,r_l                                ;r_l>r_h为0码
        cmprs        a,r_h                                ;r_l<r_h为1码
        nop       
        rlcm    RxData_1                        ; 把C里面的值一个个的往里面移       
        rlcm    RxData_2
        mov        a,r_h
        add        a,r_l                                ;判断一个完整的码长度
        cmprs        a,#10                                  ;解码的最小值
        bts1        fc
        jmp     receive_error_code0                ;错误
        cmprs        a,#15                                ;解码的最大值
        bts0        fc
        jmp     receive_error_code0                ;错误
receive_process30:
        incms        rxcnt                                ;接收码元个数计数
        mov        a,rxcnt
        Sub        a,#11      
        bts1        fc
        jmp        receive_process32
        clr        rxcnt
        mov     a,RxData_2
        cmprs   a,#06h                                ;引导码正确吗?
        jmp     receive_error_code0
        mov     a,RxData_1
        mov     RxData,a
        bset        ir_good
        clr        RxData_1
        jmp        receive_error_code0
receive_process32:   
        mov        a,#1
        mov        r_l,a
        clr     r_h
        jmp     exit_int
receive_error_code0:                                ;接收错误处理
        clr     r_l
        clr     r_h
        clr     Rxdptr
        clr     RxData_2
        clr     RxData_1
        jmp     exit_int
receive_next_process:                                ;任务切换               
        clr     r_l   
        clr     r_h                               
receive_next_step:
        incms   Rxdptr
        jmp     exit_int
exit_receive110:
        clr    rxcnt
exit_int:
        pop
        b0xch        a,accbuf
        reti

使用特权

评论回复
5
戒指320|  楼主 | 2009-8-6 23:05 | 只看该作者
;**********************************************
;          红外按键处理
;**********************************************
mn_ifred_key:
event:        mov        a,rxdata       
        cmprs        a,#0d0h
        jmp        _ifred_key10
        bset        kflag.1
_ifred_key10:
        cmprs        a,#0c0h
        jmp        _ifred_key20
        bset        kflag.2
_ifred_key20:
        cmprs        a,#0c1h
        jmp        _ifred_key30
        bset        kflag.3       
_ifred_key30:
        cmprs        a,#0c4h
        jmp        _ifred_key40
        bset        kflag.4       
_ifred_key40:
        cmprs        a,#0c8h
        jmp        _ifred_key50
        bset        kflag.6       
_ifred_key50:
        cmprs        a,#0c2h
        jmp        _ifred_key90
        bset        kflag.5       
_ifred_key90:
        clr        rxdata
        ret
;**********************************************
;             报警检测
;**********************************************
mnalarm_test:
        mov        a,zhengshuA
        sub        a,alarmA
        bts1        fc
        jmp        alarm_test10                ;没到报警温度
        bset        buzz1                        ;到了报警温度
        bset        motf1       
        bclr        time_ok.1
        jmp        alarm_test11
alarm_test10:
        bclr        buzz1
alarm_test11:
        mov        a,zhengshuB
        sub        a,alarmB
        bts1        fc
        jmp        alarm_test20                ;没到报警温度
        bset        buzz2                        ;到了报警温度
        bset        motf2       
        bclr        time_ok.2
        jmp        alarm_test21
alarm_test20:
        bclr        buzz2
alarm_test21:
        mov        a,zhengshuC
        sub        a,alarmC
        bts1        fc
        jmp        alarm_test30                ;没到报警温度
        bset        buzz3                        ;到了报警温度
        bset        motf3       
        bclr        time_ok.3
        jmp        alarm_test90
alarm_test30:
        bclr        buzz3
alarm_test90:
        ret
;**********************************************
;              报警
;**********************************************
mnbuzz_out:
        bts1        buzz1
        jmp        buzz_out10
        jmp        buzz_out30
buzz_out10:       
        bts1        buzz2
        jmp        buzz_out20
        jmp        buzz_out30
buzz_out20:
        bts1        buzz3
        jmp        buzz_out90
        jmp        buzz_out30
buzz_out30:
        incms        buzzcnt
        mov        a,buzzcnt
        cmprs        a,#125                        ;0.5s高,0.5s低
        jmp        buzz_out90
        mov        a,#00010000b
        xor        p5,a
buzz_out90:
        ret
;**********************************************
;        电机控制:电机启动后,运行5min 停转
;**********************************************
mnmot_control:
        bts1        motf1
        jmp        mot_control20       
        bts1        time_ok.1
        jmp        mot_control10
        jmp        mot_control20
mot_control10:
        bset        mot1       
        incms        motcnt10
        mov        a,motcnt10
        cmprs        a,#250
        jmp        mot_control21
        clr        motcnt10                ;1s
        incms        motcnt11
        mov        a,motcnt11
        cmprs        a,#60                       
        jmp        mot_control21
        clr        motcnt11                ;1min
        incms        motcnt12
        mov        a,motcnt12
        cmprs        a,#5                       
        jmp        mot_control21
        clr        motcnt12                ;5min
        bset        time_ok.1
        bclr        motf1
mot_control20:
        bclr        mot1
mot_control21:
        bts1        motf2
        jmp        mot_control30
        bts1        time_ok.2
        jmp        mot_control22
        jmp        mot_control30
mot_control22:
        bset        mot2
        incms        motcnt20
        mov        a,motcnt20
        cmprs        a,#250
        jmp        mot_control31
        clr        motcnt20                ;1s
        incms        motcnt21
        mov        a,motcnt21
        cmprs        a,#60
        jmp        mot_control31
        clr        motcnt21                ;1min
        incms        motcnt22
        mov        a,motcnt22
        cmprs        a,#5
        jmp        mot_control31
        clr        motcnt22                ;5min
        bset        time_ok.2
        bclr        motf2
mot_control30:
        bclr        mot2
mot_control31:
        bts1        motf3
        jmp        mot_control90
        bts1        time_ok.3               
        jmp        mot_control40
        jmp        mot_control41       
mot_control40:
        bset        mot3
        incms        motcnt30
        mov        a,motcnt30
        cmprs        a,#250
        jmp        mot_control90
        clr        motcnt30                ;1s
        incms        motcnt31
        mov        a,motcnt31
        cmprs        a,#60
        jmp        mot_control90
        clr        motcnt31                ;1min
        incms        motcnt32
        mov        a,motcnt32
        cmprs        a,#5
        jmp        mot_control90
        clr        motcnt32                ;5min
        bset        time_ok.3
        bclr        motf3       
mot_control41:
        bclr        mot3
mot_control90:
        ret
;**********************************************
;            蜂鸣器指示
;**********************************************
note:
        bts1        note_flag
        jmp        note90
        bset        p5.4
        incms        note_cnt
        mov        a,note_cnt
        cmprs        a,#50
        jmp        note90
        bclr        p5.4
        clr        note_cnt
        bclr        note_flag
note90:
        ret
;**********************************************
;            P0.2 reset
;**********************************************
reset_pin:
        bts1        p0.2
        jmp        reset_pin10
        jmp        reset_pin90
reset_pin10:
        incms        reset_cnt
        mov        a,reset_cnt
        cmprs        a,#15
        jmp        reset_pin90
        clr        reset_cnt
        jmp        reset
reset_pin90:
        ret
;**********************************************
;          关com口
;**********************************************
com_off:
        bclr        com0
        bclr        com1
        bclr        com2
        bclr        com3
        ret
;**********************************************
;           系统初始化
;**********************************************
sys_init:
        mov        a,#0ffh
        mov        p2m,a
        mov        p5m,a
        bclr        p0m.0
        bset        p5m.4
        bset        p1m.5
        bset        p1m.6
        bset        p1m.7
        ret
;**********************led table*******************
table:        ;共阴0   1   2   3   4   5   6   7   8   9   a    b  c   d   e   f
        dw  3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h

xsu_tab:                                ;小数BCD查找表
        dw 0000h,0625h,1250h,1875h
        dw 2500h,3125h,3750h,4375h
        dw 5000h,5625h,6250h,6875h
        dw 7500h,8125h,8750h,9375h                               
zsu_tab:                                ;整数BCD查找表
        dw 0000h,0001h,0002h,0003h,0004h,0005h,0006h,0007h
        dw 0008h,0009h,0010h,0011h,0012h,0013h,0014h,0015h
        dw 0016h,0017h,0018h,0019h,0020h,0021h,0022h,0023h
        dw 0024h,0025h,0026h,0027h,0028h,0029h,0030h,0031h
        dw 0032h,0033h,0034h,0035h,0036h,0037h,0038h,0039h
        dw 0040h,0041h,0042h,0043h,0044h,0045h,0046h,0047h
        dw 0048h,0049h,0050h,0051h,0052h,0053h,0054h,0055h
        dw 0056h,0057h,0058h,0059h,0060h,0061h,0062h,0063h
        dw 0064h,0065h,0066h,0067h,0068h,0069h,0070h,0071h
        dw 0072h,0073h,0074h,0075h,0076h,0077h,0078h,0079h
        dw 0080h,0081h,0082h,0083h,0084h,0085h,0086h,0087h
        dw 0088h,0089h,0090h,0091h,0092h,0093h,0094h,0095h
        dw 0096h,0097h,0098h,0099h,0100h,0101h,0102h,0103h
        dw 0104h,0105h,0106h,0107h,0108h,0109h,0110h,0111h
        dw 0112h,0113h,0114h,0115h,0116h,0117h,0118h,0119h
        dw 0120h,0121h,0122h,0123h,0124h,0125h,0126h,0127h
        endp

使用特权

评论回复
6
戒指320|  楼主 | 2009-8-6 23:08 | 只看该作者
程序太长,分四次发了。

使用特权

评论回复
7
程序匠人| | 2009-8-6 23:10 | 只看该作者
不错。
注释可以再多一些。

使用特权

评论回复
8
auzxj| | 2009-8-7 00:02 | 只看该作者
汇编,无限崇拜楼主中。。。。。。。。。。

使用特权

评论回复
9
沈洁| | 2009-8-7 00:52 | 只看该作者
汇编确实很厉害啊,好久没看到如此厉害的汇编了啊

使用特权

评论回复
10
雁舞白沙| | 2009-8-7 11:39 | 只看该作者
不错

使用特权

评论回复
11
木字四点水| | 2009-8-7 16:03 | 只看该作者
:lol,其实还是比较喜欢汇编

使用特权

评论回复
12
一朝成名| | 2009-8-7 16:05 | 只看该作者
不用汇编n多年~~

使用特权

评论回复
13
XZL| | 2009-8-7 16:41 | 只看该作者
1# 戒指320
谢谢你的分享,十年前就用汇编写过DS18B20的程序了;P

使用特权

评论回复
14
戒指320|  楼主 | 2009-8-7 20:27 | 只看该作者
13楼
我十年前 还不认识英语字母呢。

使用特权

评论回复
15
ningling_21| | 2009-8-8 08:06 | 只看该作者
汇编的高手哦........

使用特权

评论回复
16
戒指320|  楼主 | 2009-8-8 22:04 | 只看该作者
呵呵

使用特权

评论回复
17
红金龙吸味| | 2009-8-8 22:33 | 只看该作者
看见汇编头痛

使用特权

评论回复
18
xueyingdao| | 2009-8-9 10:12 | 只看该作者
楼主在实际使用中是怎么区分多点的?(特定的ds18b20 怎么和特定的测温位置对应的) 是不是需要提前获得ds18b20的id?

使用特权

评论回复
19
戒指320|  楼主 | 2009-8-9 12:49 | 只看该作者
是啊,我提前先读出了没个器件的器件地址,然后用这些地址做的匹配。

使用特权

评论回复
20
dudongdao| | 2009-8-9 15:34 | 只看该作者
把你后来用C改写的发出来

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

290

帖子

2

粉丝