《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

自行车速度里程表(1-程序)
程序匠人 发表于 2006-3-18 13:23:00  阅读全文 | 回复(1) | 引用通告 | 编辑

最近编了一个自行车速度里程表程序,大家一起分享,程序的基本思路如流程图(自行车速度里程表(2-流程图))所示,速度可用V=S/T,记每一圈的时间。里程记圈数,用记数总圈数除以一公里需要的圈数即要显示的公里数。请大家多提宝贵意见。
            sda equ p1.4               ;EEPROM数据线
            scl equ p1.5                ;EEPROM时钟线
            quan equ 30h                 ;存放圈数
            ;?************************************
            org 00h
            jmp main
            org 03h
            jmp int00
            org 0bh
            reti
            org 13h
            jmp int_1
            org 1bh
            jmp intt1
            org 23h
            reti
            ;*************************************
            ;主程序
             ;*************************************
              org 30h
           main:call clear
           l1:  jb p1.2,key1
                mov quan,#22
                jmp datain
           key1: jb p1.3,key2
                 mov quan,#24
                jmp datain
           key2: jb p1.6,key3
                mov quan,#26
                jmp datain
           key3: jb p1.7,err1
                 mov quan,#28
                jmp datain
           err1:call err
                jmp l1

            datain :call cmd                 ;车圈长度调入子程序
                    mov ie,#10001101b        ;8bh
                    setb tr1
                    clr p3.1
                    call read              ;eeprom数据调入
             l2:    jb p3.0,long          ;里程处理
                    call disv             ;速度处理
                    jmp l2
             long:  call diss
                     jmp l2
     ;***************************************
     ;      初始化
     ;***************************************
     clear:     mov tmod,#90h     ;设置T1,门控,方式一?
                mov tcon,#05h     ;INT0,INT1边沿触发
                setb px0          ; INT0中断优先级最高
                mov sp,#70h       ;设置堆栈
                clr 20h.0
                clr a
                mov r0,#2fh
     clear_loop:inc r0
                mov @r0,a
                cjne r0,#40h,clear_loop
                mov p1,#0ffH          ;p1置高电平
                ret
     ;***************************************
     int00:push acc
           push psw
           inc 54h
           clr a
           cjne a,54h,int0_rom
           inc 55h
           cjne a,55h,int0_rom
           inc 56h
     int0_rom:call romw
              pop psw
              pop acc
           reti
     ;*************************************
     int_1:
                   push acc
                   push psw
                   clr ex1           ;关外部中断一
                   jnb 20h.0,intl1_l1   ;判断标志位,为0未超速
                   mov 33h,#0ffh        ;超速处理
                   mov 34h,#0ffh
                   mov 35h,#0ffh
                   mov 36h,#0ffh
                   jmp intl1_l2
         intl1_l1: mov 33h,tl1         ;计数单元保存
                    mov 34h,th1
                    mov 35h,31h
                    mov 36h,32h
          intl1_l2: mov tl1,#00        ; 计数单元清零
                    mov th1,#00
                    mov 31h,#00
                    mov 32h,#00
                    clr 20h.0
                    setb ex1
                    pop psw
                    pop acc
            reti
  ;**********************************************
           intt1:push acc
                 push psw
                 inc 31h
                 clr  a
                 cjne a,31h,tim1
                 inc 32h
                 cjne a,32h,tim1
                 setb 0h
             tim1:pop psw
                  pop acc
                 ret
    ;********************************************
    ;          出错处理
    ;********************************************
    err:   cpl p3.1
           call delay_1ms
           ret
    ;********************************************
    ;车圈长度调入子程序
    ;********************************************
    cmd:      mov a,30h
              cjne a,#22,cmd_24
              mov 4fh,#00
              mov 4eh,#2dh
              mov 4dh,#0c6h
              mov 4ch,#0c0h
              mov 2fh,#01h         ;一公里转500圈
              mov 2eh,#0f4h
              jmp cmd_out
      cmd_24: cjne a,#24,cmd_26
              mov 4fh,#00h
              mov 4eh,#2dh
              mov 4dh,#0c6h
              mov 4ch,#0c0h
              mov 2fh,#01h             ;一公里转450圈
              mov 2eh,#0c2h
              jmp cmd_out
     cmd_26: cjne a,#26,cmd_28
              mov 4fh,#00h
              mov 4eh,#2dh
              mov 4dh,#0c6h
              mov 4ch,#0c0h
              mov 2fh,#01h                ;一公里400圈
              mov 2eh,#90h                
              jmp cmd_out
     cmd_28: cjne a,#28,cmd_out
              mov 4fh,#00h
              mov 4eh,#2dh
              mov 4dh,#0c6h
              mov 4ch,#0c0h
              mov 2fh,#01h               ;一公里350圈
              mov 2eh,#5eh
     cmd_out: ret
     ;********************************************
     ;eeprom写
     ;********************************************
     romw: mov r3,#0a0h     ;设置器件地址
           mov 4bh,#00      ;eeprom首址
           mov r1,#54h      ;要送出数据首址
           mov r7,#3        ;共三个字节
           setb sda
           setb scl
           clr sda
           mov a,r3
           call subs
           mov a,4bh
           call subs
  w_again: mov a,@r1
           call  subs
           inc r1
           djnz r7,w_again
           clr sda
           call de_w
           setb scl
           call de_w
           setb sda
           ret
   subs:   mov r0,#08h
   subs_loop:clr scl
             rlc a
             mov sda,c
             nop
             setb scl
             call de_w
             djnz r0,subs_loop
             clr scl
             call de_w
             setb scl
 rep:        mov c,sda
             jc rep
             clr scl
             ret
 de_w:       nop
             nop
             ret

    ;********************************************
    read : mov r3,#0a0h     ;设置器件地址
           mov 4bh,#00      ;eeprom首址
           mov r1,#54h      ;要送出数据首址
           mov r7,#3  
          setb sda
          setb scl
          clr sda
          mov a,r3
          call subs
          mov a,4bh
          call subs
          setb sda
          setb scl
          clr sda
          mov a,r3
          setb acc.0
          call subs
  more:   call subr
          mov @r1,a
          inc r1
          djnz r7,more
          clr sda
          call de_w
          setb scl
          call de_w
          setb sda
          ret
 subr:    mov r0,#08
 r_loop:  setb scl
          call de_w
          mov c,sda
          rlc a
          clr scl
          call de_w
          djnz r0,r_loop
          cjne r7,#01h,low1
          setb sda
          jmp setok
   low1:  clr sda
 setok:   call de_w
           setb scl
           call de_w
           clr scl
           call de_w
           setb sda
           ret                         
    ;*********************************************
    ;里程处理
    ;*********************************************
    diss:setb p1.1
         clr p1.0                 ;开里程指示
         call quans
         call play
         ret
  quans:    mov 45h,#00
            mov 44h,#00
            mov 43h,#00
            mov 42h,#00
            mov 41h,#00h
            mov 40h,56h
            mov 3fh,55h
            mov 3eh,54h         ;被除数赋初值
            mov 4ah,#00h
            mov 49h,#00h
            mov 48h,2fh
            mov 47h,2eh          ;除数赋初值
          jmp divst
         ret

    ;****************************************
    ;速度处理子程序
    ;****************************************
    disv:   setb p1.0                ;关里程显示
            clr   p1.1              ;开速度显示
            call kmph                ;调速度转换子程序
            mov a,#0ffh
            cjne a,36h,dsp11         ;与设置速度比较,超速报警
            setb p3.1                ;报警指示灯亮
            jmp exit
   dsp11:   clr p3.1                   ; 关报警指示灯
            call play                  ; 调显示子程序
   exit:    ret
   ;************************
   ;  速度转换子程序     (v=L/t)
   ;************************
   kmph:    mov 45h,#00
            mov 44h,#00
            mov 43h,#00
            mov 42h,#00
            mov 41h,4fh
            mov 40h,4eh
            mov 3fh,4dh
            mov 3eh,4ch         ;被除数赋初值
            mov 4ah,36h
            mov 49h,35h
            mov 48h,34h
            mov 47h,33h          ;除数赋初值
            jmp divst          ;调除法子程序
   kkk:     nop
            call bcdst          ;调bcd码转换子程序
            mov a,50h
            anl a,#0fh
            mov 3ah,a
            mov a,50h
            swap a
            anl a,#0fh
            mov 3bh,a
            mov a,51h
            anl a,#0fh
            mov 3ch,a
            ret
   ; **************************
    ;            除法子程序
    ;**************************
    divst:   setb rs0
             setb rs1           ;用寄存器1
             clr c
             mov a,3eh
             subb a,47h
             mov a,3fh
             subb a,48h
             mov a,40h
             subb a,49h
             mov a,41h
             subb a,4ah
             jnc div_out
             mov r2,#20h
    div_loop:clr c
             mov a,3eh
             rlc a
             mov 3eh,a
             mov a,3fh
             rlc a
             mov 3fh,a
             mov a,40h
             rlc a
             mov 40h,a
             mov a,41h
             rlc a
             mov 41h,a
             mov a,42h
             rlc a
             mov 42h,a
             mov a,43h
             rlc a
             mov 43h,a
             mov a,44h
             rlc a
             mov 44h,a
             mov a,45h
             rlc a
             mov 45h,a
             mov f0,c
             clr c
             mov a,42h
             subb a,47h
             mov r3,a
             mov a,43h
             subb a,48h
             mov r4,a
             mov a,44h
             subb a,49h
             mov r5,a
             mov a,45h
             subb a,4ah
             jb f0,div_loop1
             jc div_loop2
  div_loop1: mov 45h,a
             mov a,r5
             mov 44h,a
             mov a,r4
             mov 43h,a
             mov a,r3
             mov 42h,a
             inc 3eh
 div_loop2:  djnz r2,div_loop
             clr f0
 div_out:    clr rs0
             clr rs1
           jmp kkk
 div_out1:   setb f0
             jmp div_out
    ;*************************
    ; bcd码转换子程序
    ;*************************
   bcdst:    mov r7,#10h
              clr c
              mov 50h,#00
              mov 51h,#00
   bcdst_loop:mov a,3eh
              rlc a
              mov 3eh,a
              mov a,3fh
              rlc a
              mov 3fh,a
              mov a,50h
              addc a,50h
              da a
              mov 50h,a
              mov a,51h
              addc a,51h
              da   a
              mov 51h,a
              djnz r7,bcdst_loop
              ret
   ;**********************
   ;  显示子程序
   ;**********************
   play:        mov r1,#3ah
                mov r2,#0feh
    play_loop:  mov a,r2
                mov p2,a
                mov a,@r1
                anl a,#0fh
                mov dptr,#tab
                movc a,@a+dptr
                mov p0,a
                call delay_1ms                ;显示1ms
                inc r1
                mov a,r2
                jnb p2.2,play_out
                rl a
                mov r2,a
                jmp play_loop
     play_out:  mov p2,#0ffh             ;关显示
                ret
         tab:   db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
                db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
                db 00h
   ;************************
   ;延时1ms子程序
    ;************************
    delay_1ms:mov r7,#6
     delay_l1:mov r6,#2
              djnz r6,$
              djnz r7,delay_l1
              ret
 end

看《匠人手记》,与匠人同行!北航出版,正在热卖!

Re:自行车速度里程表(1-程序)
漫步听雨(游客)发表评论于2007-3-22 13:37:00  个人主页 | 引用 | 返回 | 删除 | 回复

漫步听雨(游客)大哥:你能告诉我这个速度里程表的基本功能呢?要不小妹我有点看不懂呢!

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!