找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3512|回复: 1
收起左侧

求助,程序流程图,程序已给。基于单片机的通用数据采集器设计。

[复制链接]
ID:61046 发表于 2014-5-22 09:35 | 显示全部楼层 |阅读模式
org  0080h
Main:   mov  psw,#00h
mov  p0,#0ffh
mov  p1,#0ffh
mov  p2,#0ffh
mov  p3,#0ffh
mov  ip,#00h
mov  ie,#00h
mov  tmod,#00h
mov  tcon,#00h
mov  th0,#00h
mov  tl0,#00h
mov  th1,#00h
mov  tl1,#00h
mov  th2,#00h
mov  tl2,#00h
mov  rcap2h,#00h
mov  rcap2l,#00h
mov  t2con,#00h
mov  scon,#00h
mov  pcon,#00h
mov  sp,SP_NUM
完成中断初始化后,主程序将初始化定时器。
mov  th0,#TH0_NUM ;定时器0置初值,10ms
mov  tl0,#TL0_NUM
mov  tmod,#21h ;定时器0工作模式1,定时器1工作模式2
setb   tr0 ;启动定时器0
mov   ie,#10000010b ;  中断总开,定时器0开
clr    p1.3  ;开cpu运行指示灯
setb   GoGoodFlag  ;初始正常运行标记
clr    StaveDogFlag  ;复位饿狗标记
clr    p3.3  ;初始喂狗线低电平
move   AiTaskWord,#00h  ;复位模拟量输入任务字
move   DoTaskWord,#00h  ;复位数字量输出任务字
;关所有模拟量通道
setb   p1.7 ;7109保持
clr    p3.5
主程序将初始化所有数字量通道,以及相应的外部电路参数。
setb  p3.4               ;读DS12887,禁止数据总线
mov  dptr,#DS12887+10h
movx   a,@dptr         ;读掉电前数字量输出值
mov    Do574Reg,a     ;初始数字量输出影射
clr      p3.4           ;数据总线使能
mov    dptr,#Do574  
movx   @dptr,a         ;初始数字量输出
mov 0fh,#00h;工作寄存器组1~r7初始,串口收发控制字
完成所有数字量通道的初始化后,主程序将按照通信协议定义,初始化上报板位信息命令的答应包。
mov     r1,#SendDateBuffer31
mov     @r1,#09h                ;初始“长度”
Inc      r1
mov     @r1,#01h                ;初始“命令”
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#06h
Inc      r1
mov     @r1,#02h
Inc      r1
mov     @r1,#02h
Inc      r1
mov     @r1,#0ffh
Inc      r1
mov     @r1,#0ffh
接下来初始化上报所有数据命令的答应包。
mov     r1,#SendDateBuffer32
mov     @r1,#2bh
inc      r1
    mov     @r1,#02h
mov     r1,#SendDateBuffer32+04h
    mov     @r1,#14h
mov     r1,#SendDateBuffer32+06h
    mov     @r1,#24h
mov     r1,#SendDateBuffer32+08h
    mov     @r1,#36h
mov     r1,#SendDateBuffer32+0ah
    mov     @r1,#42h
mov     r1,#SendDateBuffer32+1bh
mov     @r1,#52h
完成上报所有数据命令的答应包初始化,主程序继续初始DOU输出命令答应包、CPU复位命令答应包、烟感复位命令答应包和ISP编程命令答应包。
;DOU输出命令答应包
mov     r1,#SendDateBuffer33_03
mov     @r1,#04h
;CPU复位命令答应包
    mov     r1,#SendDateBuffer30
mov     @r1,#01h
Inc      r1
mov     @r1,#30h
;烟感复位命令答应包
    mov     r1,#SendDateBuffer04
mov     @r1,#02h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#00h
;ISP编程命令答应包
mov     r1,#SendDateBuffer40
mov     @r1,#01h             ;“长度”
    Inc      r1
mov     @r1,#40h             ;“命令”
接下来仍然是上报板位信息命令答应包的初始化过程。
mov     r1,#SendDateBuffer01
mov     @r1,#09h
Inc      r1
mov     @r1,#01h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#04h
Inc      r1
mov     @r1,#06h
Inc      r1
mov     @r1,#06h
Inc      r1
mov     @r1,#02h
Inc      r1
mov     @r1,#02h
Inc      r1
mov     @r1,#0ffh
上报板位信息命令答应包的初始化后,主程序将初始化上报所有数据命令答应包。
    mov     r1,#SendDateBuffer02
mov     @r1,#2dh
Inc      r1
mov     @r1,#02h
Inc      r1
mov     @r1,#04h
    mov     r1,#SendDateBuffer02+04h
mov     @r1,#14h
    mov     r1,#SendDateBuffer02+06h
mov     @r1,#24h
    mov     r1,#SendDateBuffer02+08h
mov     @r1,#36h
    mov     r1,#SendDateBuffer02+0ah
mov     @r1,#46h
    mov     r1,#SendDateBuffer02+0ch
mov     @r1,#52h
    mov     r1,#SendDateBuffer02+1dh
mov     @r1,#62h
mov     r1,#SendDateBuffer02+25h
DateBuffer02_move00:    inc   r1
mov     @r1,#00h
cjne   r1,SendDateBuffer02+2dh,DateBuffer02_move00
完成通信协议的初始化过程。
;初始命令错误答应包
mov   r1,#SendDateBufferError
mov   @r1,#01h
;初始正在维修答应包
mov   r1,#SendDateBufferHitch
mov   @r1,#02h
    inc    r1
mov   @r1,#70h
接下来主程序将初始化串口地址、定时器,并启动ICL7109。
;读取串口通信地址
mov   dptr,#DS12887
movc  a,@a+dptr        ;a不必清零
cpl    a
mov   UartNoReg,a
;485总线接受允许
p1.5
;初始化串口
clr    UartGoFlag
clr    OldUartGoFlag
mov   tl1,#T1_NUM     ;波特率19200bit/s
mov   th1,#T1_NUM
mov   tmod,#21h
orl    pcon,#80h       ;波特率增倍
setb   tr1
mov   scon,#01000000b
setb   ren             ;允许接收
setb   es
;初始定时器2,启动ICL7109转换
mov   Aic574Reg,#00h  ;初始通道及页面控制寄存器
mov   th2,#00h        ;最长定时周期
mov   tl2,#00h
mov   rcap2h,#RCAP2H_NUM ;定时器2自重装值1ms
mov   rcap2l,#RCAP2L_NUM
mov   dptr,@AIC
mov   a,#00h
movx   @dptr,a         ;初始预选通0通道
clr     p1.7            ;开模拟量通道
setb    p3.5            ;启动0通道转换
mov    t2con,#0ch      ;外部允许,启动计时功能,自重装
系统上电初期不允许中断,但此时主函数将开放中断。
main_loop:  setb  GoGoodFlag ;正常运行标记
      anl    psw,#11100111b ;使用寄存器工作组0
      mov   ip,#10h        ;串口中断高优先级
      mov   ie,#10110010b ;中断总开,定时器0/2,串口开
;主程序后台任务
      mov   a,AiTaskWord
      jnz    ai_task      ;非0,转,模拟量部分作业
      ljmp   do_task_verify ;跳,判断模拟量部分任务有否
;模拟量输入格式转换部分作业
ai_task:   mov   r4,#00h ;清BCD码低字节寄存
         mov   r5,#00h ;清BCD码高字节寄存
         mov   dptr,#ai_task_bin_bcd_lab
         mov   r6,#00h ;复位b表指针
         mov   r1,AiTaskWord
         mov   a,@r1
         mov   r3,a   ;r3—移位寄存器
ai_task_bin_bcd_loop:  
         mov   a,r3
         rrc     a
         mov   r3,a
         jnc    ai_task_bit_is0 ;该位为0,转
         mov   a,r6
         movc   a,@a+dptr   ;取权低位
         add    a,r4        ;   BCD码低位和
         da     a
         mov   r4,a
         inc    r6         ;ai_task_bin_bcd_lab表指针+1
         mov   a,r6
         movc   a,@a+dptr   ;取权高位
         addc    a,r5        ;   BCD码高位和
         da     a
         mov   r5,a
         inc    r6         ;ai_task_bin_bcd_lab表指针+1
         sjmp   ai_task_byte_ok_ma
ai_task_bit_is0:
         inc    r6        ;ai_task_bin_bcd_lab表指针+2
         inc    r6
ai_task_byte_ok_ma:
         cjne   r6,#16d,ai_task_this_byte ;字节未完,转
         inc    r1
         mov   a,@r1
         mov   r3,a ;高字节bin码进移位寄存器
ai_task_this_byte:
         cjne  r6,#24d,ai_task_bin_bcd_loop :12位未完,转
;bin—BCD转换结束
        mov   a,#SendDateBuffer02-SendDateBuffer32+02h
        add    a,AiTaskWord
        mov   r0,a  ;指向SendDateBuffer02中模拟量的值
        clr     ea   ;关中断,更新同步
        mov    a,r4
        mov    @r0,a  ;更新上报模拟量数据
        inc     r0
        mov    a,r5
        mov    @r0,a
        setb     ea
        mov    AiTaskWord,#00h ;清除任务标记
        ljmp    do_task_verify
;二进制权值表
;每行4个压缩bcd码依次为个_十_千_百
ai_task_bin_bcd_lab:
        db    01h,00h
        db    02h,00h
        db    04h,00h        
        db    08h,00h
        db    16h,00h
        db    32h,00h
        db    64h,00h
        db    28h,01h
        db    56h,02h
        db    12h,05h
        db    24h,10h
        db    48h,20h
;数字量输出反馈的格式转换部分作业
do_task_verify:
       mov   a, DoTaskWord
      jb      acc.7,do_task   ;数字量部分作业
      limp    go_to_sleep
do_task:
      mov    r1,#SendDateBuffer32+03h
      mov    r0,#SendDateBuffer02+03h
do_task_move_loop:
      mov    a,@r1
      mov    @r0,a   ;更新上报DI数据
      inc     r1
      inc     r1
      inc     r0
      inc     r0
     cjne    r1,#SendDateBuffer32+09h,do_task_move_loop
      mov   TaskBit Reg,#00h
      mov   a,#r1     ;取数字量输出反馈值
      jnb     acc.0,do_task_off0
      setb    TaskBit Reg.0
do_task_off0:
      jnb     acc.1,do_task_off1
      setb    TaskBit Reg.2
do_task_off1:
      jnb     acc.2,do_task_off2
      setb    TaskBit Reg.4
do_task_off2:
      jnb     acc.3,do_task_off3
      setb    TaskBit Reg.6
do_task_off3:
      mov    r0,#SendDateBuffer02+09h
      mov    @r0,TaskBitReg   ;更新上报DO0数据
      mov    TaskBitReg,#00h
      mov    a,@r1
      jnb     acc.4,do_task_off4
      setb    TaskBit Reg.0
do_task_off4:
      jnb     acc.5,do_task_off5
      setb    TaskBit Reg.2
do_task_off5:
      jnb     acc.6,do_task_off6
      setb    TaskBit Reg.4
do_task_off6:
      jnb     acc.7,do_task_off7
      setb    TaskBit Reg.6
do_task_off7:
      mov    r0,#SendDateBuffer02+0bh
      mov    @r0,TaskBitReg    ;更新上报DO1数据
      mov    DoTaskWord,#00h  ;清除任务标记
;时时更新串口通信地址
      mov    dptr,#DS12887
      movc    a,@a+dptr        ;a不必清0
      cpl     a
      mov    UartNoReg,a
go_to_sleep:
      orl     pcon,#01h          ;CPU进入空闲方式
      nop
      ljmp  main_loop
;陷阱
      nop
      nop
      call   pc_out_erro


附录3:
Rece:     
mov   a,r7             ;r7=rece_ctrl
Rl     a
Add   a,r7             ;*3
Mov   dptr, #rece_ctrl_lab
Jmp    @a+dptr        ;转接收功能处理
;陷阱
Nop
Nop
Lcall    pc_out_error
;接收控制散转表
Rece_ctrl_lab:
Limp    rece_00
Limp    rece_01
Limp    rece_02
Limp    rece_03
Limp    rece_04
Limp    rece_05
rece_00:
Mov    a,sbuf
Cjne    a,#55h,rece_no_head
Mov    r7,#01h            ;包头,写接收控制字01h
Rece_no_head:
Ljmp    uart_int_over
rece_01:
Mov    a,sbuf
;地址不符合,转
Cjne    a,uartnoreg,address_no
;地址符合,写接收控制字02h,准备接受“长度”
Mov    r7,#02h           
Ljmp    uart_int_over
;地址不符合,写接收控制字,复位接收“包头”
Address_no:
Mov    r0,#00h
Ljmp    uart_int_over
Rece_02:   
Mov    a,sbuf
Anl    a,#07h             ;限制“数据长度”<8
Jinz    rece_02_good
Mov    r7,#00h           
;“数据长度”=0,复位接收控制
Ljmp   uart_int_over
Rece_02_good:
Mov    r6,a              ;存“长度”
Mov    r5,#00h           ;已接收数据长度复位00h
Mov    r4,#00h           ;初始已接收部分校验和
;初始数据接收指针
Mov    r1,#recedatabuffer
Mov    r7,#03h    ;写接收控制字,准备接受“数据包”
Ljmp   uart_int_over
Rece_03:
Mov    a,sbuf
Mov    @r1,a             ;存接收数据
Inc     r1                ;指向下一单元
Add    a,r4               ;接收部分校验和累加
Mov    r4,a               ;存校验和
Inc     r5                ;已接收数据长度+1
Mov    a,r5
Mov    reg0,r6
Cjne    a,reg0,rece_data_no_over
Mov    r7,#04h         
;已接收控制字,准备接收校验和
Rece_data_no_over:
Ljmp    uart_int_over
Rece04:
Mov     a,sbuf
Mov     reg0,r4
Cjne    a,reg0,recechecksum_error ;比较校验和,错,转
Mov    r7,#05h  ;写接收控制字,准备接收包尾
Ljmp    uart_int_over
Recechecksum_error:
Mov    r7,#00h    ;写接收控制字,复位接收包头
Ljmp    uart_int_over
Rece_05:
Mov    a,sbuf
Cjne    a,#0aah,rece_over_error
;非正常结果包尾,转
Clr     ren        ;回应中禁止接收
Setb    p1.5       ;485发送允许
Mov   sbuf,#55h   ;发送“包头(55h)”
Mov    r7,#01h   ;写发送控制字,准备发送地址
Ljmp    uart_int_over
Rece_over_error:
Mov    r7,#00h  ;复位接收控制字,准备接受包头
Ljmp    uart_int_over




附录4:
Send:
Mov    a,r7
Rl      a
Add    a,r7           ;*3
Mov    dptr,#send_ctrl_lab
Jmp    @a+dptr       ;转发送功能处理
;陷阱
Nop
Nop
Lcall    pc_out_error
;发送控制散转表
Send_ctrl_lab:
Ljmp    send_00        ;发送结束
Ljmp    send_01
Ljmp    send_02
Ljmp    send_03
Ljmp    send_04
Ljmp    send_05
;解释,执行“命令”
send_00:
clr      p1.5         ;485接收允许
Setb     ren         ;数据包发送正常结束,允许接受
Mov    a,r6         ;取执行动作代号
rl       a
Add    a,r6
Mov    dptr,#doen_lab  ;指向执行动作散转表
Jmp    @a+dptr
;“命令”执行散转表
Doen_lab:
Ljmp    uart_int_error   ;不执行动作
Ljmp    cpu_reset      ;(30h)执行cpu复位
Ljmp    d_out_me      ;(33h)数字量输出
Ljmp    d_out_nj       ;(03h)数字量输出
Ljmp    fog_reset       ;(04h)烟感复位
Ljmp    isp_ready      ;(40h)准备进入系统编程
Lcall    doen_jmp_error
;执行命令
;执行cpu复位
Cpu_reset:
Setb    starvedogflag    ;停止喂狗好了
Ljmp   uart_int_over
;执行数字量输出
D_out_me:
Mov    r0,#senddatabuffer33_03+2
Mov    a,@r0
Cjne    a,#03h,d_out_me_error
;板槽信息错,转
Mov    r0,#senddatabuffer33_03+3
;指向发送数据缓冲区的通道
Mov    a,@r0
Clr     c
Subb    a,#08d
Jnc     d_out_me_error
;通道大于7,错,转
Mov    a,@r0
Jnz     no_zero          ;非0值,单通道控制,转
Anl    do574reg,#80h
;清数字量输出通道,保留烟感复位专用通道值
Mov    r0,#senddatabuffer33_03+4
Mov    a,@r0          ;取参数
Anl    a,#7fh     ;屏蔽bit7(对应烟感复位专用通道)
Orl    do574reg,a
jmp   and_fog_reset
;指向输出通道屏蔽字表
No_zero:
Move    dptr,#d_out_me_bit_lab
Movc    a,@a+dptr     ;取通道屏蔽字
Mov     reg0,a         ;暂存之
Inc      r0            ;指向发送数据缓冲区的参数
Mov     a,@r0
Jz       turn_off       ;为0,关,转
Mov     a,reg0
Orl      do574reg,a     ;开该通道输出
Sjmp    and_fog_reset
Turn_off:
Mov    a,reg0
Cpl     a
Anl    do574reg,a       ;关该通道输出
And_fog_reset:
Mov    a,do574reg
Mov    dptr,#do574
Movx   @dptr,a        ;数字量输出
Mov    dptr,#ds12887+10h
Movx   @dptr,a        ;保存输出状态
D_out_me_error:
Ljmp    uart_int_over
;数字量输出通道屏蔽字表
D_out_me_bit_lab:
Db    00h,01h,02h,04h  ;第一个值00h恒不取,占位用
Db    08h,10h,20h,40h
;执行数字量输出
D_out_nj:
Mov   r1,#senddatabuffer33_03+02h
Mov   a,@r1          ;取槽位信息
Cjne   a,#03h,d_out_nj_channels_no36
Anl    do574reg,#0f0h
Mov   r1,#senddatabuffer33_03+04h
Mov   a,@r1
Jnb    acc.0,d_out_nj_off0
Setb   do574reg.0
D_out_nj_off0:
Jnb   acc.2,d_out_nj_off1
Setb  do574reg.1
D_out_nj_off1:
Jnb   acc.2,d_out_nj_off2
Setb  do574reg.2
D_out_nj_off2:
Jnb   acc.2,d_out_nj_off3
Setb  do574reg.3
D_out_nj_off3:
Ljmp  d_out_nj_doing
D_out_nj_channels_no36:
Cjne   a,#04h,d_out_nj_error
Anl    do574reg,#8fh
Mov   r1,#senddatabuffer33_03+04h
Mov   a,@r1
Jnb    acc.0,d_out_nj_off4
Setb    do574reg.4
D_out_nj_off4:
Jnb   acc.2,d_out_nj_off5
Setb  do574reg.5
D_out_nj_off5:
Jnb   acc.4,d_out_nj_doing
Setb  do574reg.6
D_out_nj_doing:
Mov   dptr,#do574
Mov   a,do574reg
Movx   @dptr,a        ;输出
Mov   dptr,#ds12887+10h
Movx   @dptr,a        ;保存输出状态
D_out_nj_error:
Ljmp   uart_int_over
;执行烟感复位
Fog_reset:
Anl    do574reg,#7fh
Mov   a,do574reg       ;开烟感复位
Mov   dptr,#do574
Movx   @dptr,a
Mov    dptr,#ds12887+10h
Movx   @dptr,a         ;保存输出状态
Mov  fog_reset_counter,#fog_reset_counter_num
Ljmp  uart_int_over
;准备进入在系统编程
Isp_ready:
Pop    a               ;丢弃串口中断断点
Pop    a
Ljmp   0045h
;发送地址
Send_01:
Mov   sbuf,uartnoreg     ;发送“地址”
Mov   r7,#02h          ;写发送控制字
Ljmp  uart_int_over
;发送数据长度,分析接收的命令
;执行动作寄存器复位
Send_02:
Mov   r6,#00h
Jb     p3.2,sys_good     ;系统正常,转
Mov   r1,#senddatabufferhitch  ;维修应答
Ljmp  send_long
Sys_good:
Mov   r1,#recedatabuffer      ;指向接收的命令
Mov   a,@r1
Cjne   a,#32h,order_no32
Mov   r1,#senddatabuffer32    ;上报数据
Ljmp   send_long
Order_no32:
Cjne   a,#02h,order_no02
Mov   r1,#senddatabuffer02    ;上报数据
Ljmp   send_long
Order_no02:
Cjne   a,#33h,order_no33
Mov   r6,#04h               ;计数四次
Mov   r1,#senddatabuffer33_03   
Order33_move_loop:
Inc    r1
Inc    r0
Mov   a,@r1
Mov   @r0,a
Djnz   r6,Order33_move_loop
Ljmp   r6,#02h              ;数字量输出
Mov   r1,#senddatabuffer33_03  
Ljmp   send_long
Order_no33:
Cjne    a,#03h,Order_no03
Mov    r6,#04h               ;计数四次
Mov    r1,#recedatabuffer-1
Mov    r0,#senddatabuffer33_03
Order03_move_loop:
Inc    r1
Inc    r0
Mov   a,@r1
Mov   @r0,a
Djnz   r6,Order03_move_loop
Mov   r6,#03h                 ;数字量输出
Mov   r1,#senddatabuffer33_03
Ljmp   send_long
Order_no03:
Cjne    a,#04h,Order_no04
Mov    r6,#04h              
Mov    r1,#senddatabuffer04
Ljmp   send_long
Order_no04:
Cjne    a,#31h,Order_no31            
Mov    r1,#senddatabuffer31
;上报板位信息
Ljmp   send_long
Order_no31:
Cjne    a,#01h,Order_no01
Mov    r1,#senddatabuffer01
Ljmp   send_long
Order_no01:
Cjne    a,#40h,Order_no40
Mov    r6,#05h  
;执行动作寄存器,isp编程            
Mov    r1,#senddatabuffer40
Ljmp   send_long
Order_no40:
Cjne    a,#30h,Order_error
Mov    r6,#01h
;写执行动作寄存器,cpu复位            
Mov    r1,#senddatabuffer30
Ljmp   send_long
Order_error:
Mov   r0,#recedatabuffer
Mov   r1,#senddatabuffererror+1
Mov   a,@r0
Mov   @r1,a              ;获得非法的命令
Mov    r1,#senddatabuffererror      ;发送长度
Send_long:
Mov   a,@r1             ;取发送数据长度
Mov   r5,a               ;写发送长度
Mov   sbuf,a             ;发送长度
Inc    r1                 ;指向命令
Mov   r7,#03h            ;写发送控制字
Mov   r4,#00h            ;复位发送部分校验和
Ljmp   uart_int_over
;发送数据包
Send_03:
Mov    a,@r1
Mov    sbuf,a             ;发送数据
Add    a,r4               ;校验和累加
Mov    r4,a
Inc     r1                 ;数据指针+1
Inc     r5                 ;发送长度-1
Cjne   r5,#00h,send_data_no_over   ;数据未完成,转
Mov   r7,#04h         ;数据包发送完,写发送控制字
Send_data_no_over:
Ljmp   uart_int_over
;发送校验和
Send_04:
Move   sbuf,r4
Mov    r7,#05h       ;写发送控制字
Ljmp   uart_int_over
;发送包尾
Send_05:
Mov    sbuf,#0aah
Mov    r7,#00h       ;写发送控制字
Uart_int_over:
Pop     dph
Pop     dpl
Pop     psw
Pop     acc
Setb    ea
reti
回复

使用道具 举报

ID:62064 发表于 2014-6-17 19:21 | 显示全部楼层
真的蛮好的哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表