论坛风格切换切换到宽版
  • 21257阅读
  • 52回复

自己写的89C2051控制AD9850的程序,显示用74hc164,原理图也一起来吧。。。 [复制链接]

上一主题 下一主题
离线wycx
 
发帖
1497
只看楼主 倒序阅读 0楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线BG7YDO
发帖
3654
只看该作者 1楼 发表于: 2005-09-12
好人呀,顶一下表示支持
离线wycx
发帖
1497
只看该作者 2楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线wycx
发帖
1497
只看该作者 3楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线wycx
发帖
1497
只看该作者 4楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线BA4II
发帖
27814
只看该作者 5楼 发表于: 2005-09-12
好帖!收藏,谢谢!!
最好再介绍一下实现的经验!
离线wycx
发帖
1497
只看该作者 6楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线BG7YDO
发帖
3654
只看该作者 7楼 发表于: 2005-09-12
'

;89c2051 dds频率合成器
;   p3.4为八位74hc164输入p3.5为时钟
;   50,51,52,53,54,55,56,57存显示缓存 bcd码
;   3d,3e,3f,40,41频率缓存 ad9850contrl 字
;端口定义
;74hc164
dat equ p3.4
clk equ p3.5
;ad9850
data7 equ p3.3
w_clk equ p3.7
fq_ud equ p3.2
;除法地址
dbuf06 equ 20h
dbuf08 equ 3dh
dbuf10 equ 70h
org 0000h
ljmp start
;初始化
start:
    mov 50h,#0h             ;显示频率置初值 可以自选   十进制,单位hz
    mov 51h,#1h
    mov 52h,#0h
    mov 53h,#0h
    mov 54h,#0h
    mov 55h,#0h
    mov 56h,#0h
    mov 57h,#0h
    lcall setup_ad9850
    lcall value
;=======================
;主程序
main:
    acall key
    cjne r3,#0ffh,next         ;有键??
    sjmp main
next:   cjne r3,#0bh,next1         ;ent?
    ljmp key_ent             ;输入数
next1: cjne r3,#0ch,nokey
    acall delay         ;sys?
    ljmp sys
nokey:
ljmp main
value: lcall bcdtobin
    lcall bintof
    ljmp main
    lcall delay20ms
    lcall ad9850
    lcall ad9850
    lcall ad9850
    lcall dir
    ret
;=========================================================;直接输入
;=========================================================key_ent:    
lcall black
    mov r1,#50h
    mov r2,#08h
ent:   acall key
    cjne r3,#0ffh,ent               ;ent
    acall delay20ms
ent2:   acall key
    cjne r3,#0ffh,ent1
    sjmp ent2
ent1:   mov a,r3
    subb a,#09h
    jnc ent
    mov a,r3
    mov @r1,a
    lcall dir
    inc r1
    djnz r2,ent
ent3:   lcall value
ljmp main
key:
    mov r3,#0ffh
    mov p1,#0fh               ;键盘扫描
    mov a,p1
    mov b,a
    cjne a,#0fh,keyhit         ;有键按下?
keyout: mov r3,#0ffh
    ret                   ;无键返回
keyhit: lcall delay20ms           ;去抖动
    mov a,p1
    cjne a,b,keyout           ;干扰返回
    mov p1,#0efh             ;查1行
    mov a,p1
    cjne a,#0efh,key1
    mov p1,#0dfh             ;查2行
    mov a,p1
    cjne a,#0dfh,key2
    mov p1,#0bfh             ;查3行
    mov a,p1
    cjne a,#0bfh,key3
    mov p1,#7fh               ;查4行
    mov a,p1
    cjne a,#7fh,key4
    ljmp keyout               ;返回
key1:                       ;键盘行初值
    mov r3,#00h
    ljmp key5
key2:
    mov r3,#04h
    ljmp key5
key3:
    mov r3,#08h
    ljmp key5
key4:
    mov r3,#0ch
    ljmp key5
key5:
    mov dptr,#keytab
    anl a,#0fh
    mov b,a
    clr a
    mov r0,a
key6:                       ;查表求列值
    mov a,r0
    subb a,#04h
    jnc keyout
    mov a,r0
    movc a,@a+dptr
    inc r0
    cjne a,b,key6
    dec r0
    mov a,r3
    add a,r0
    mov r3,a               ;键值入r3
ret
keytab: db 07h,0bh,0dh,0eh         ;键值表
;=================================
;显示子程序
dir:                           ;显示
  mov r0,#57h                   ;显示初始化
  mov r4,#08h
dir1:
  mov a,@r0
  acall disp
  dec r0
  djnz r4,dir1
  ret
disp:
  clr dat
  clr clk
  mov dptr,#tab
  movc a,@a+dptr
  mov r5,#08h
disp1:
  rrc a
  mov dat,c
  setb clk
  clr clk
  djnz r5,disp1
ret
;=====================
delay:                       ;长延时   自己测试用的
mov r7,#0ffh
d1:
mov r6,#0ffh
d2:
djnz r6,d2
djnz r7,d1
ret
delay20ms:                       ;延时
mov r7,#10h
d3:
mov r6,#0eeh
d4:
djnz r6,d4
djnz r7,d3
ret
black:
    mov r0,#57h
    mov r1,#07h
b1:   mov @r0,#10h
    dec r0
    djnz r1,b1
    mov 50h,#0fh
    acall dir
ret
;=============================
;初始化dds
;dds启动,设置
;初始化dds
setup_ad9850:
clr w_clk ;初始化信号脚
clr fq_ud
setb w_clk ;设置为串行输入
clr w_clk
setb fq_ud
clr fq_ud
ret
;发送数据到dds
ad9850: clr fq_ud
mov a,3dh
lcall send_pllrdata
mov a,3eh
lcall send_pllrdata
mov a,3fh
lcall send_pllrdata
mov a,40h
lcall send_pllrdata
mov a,41h
lcall send_pllrdata
setb fq_ud
clr fq_ud
ret
;--------------------------------------------------
;==================================================
;==================================================
;--------------------------------------------------
send_pllrdata:     ;送数据1字节
  mov r2,#08h
s1: rrc a
  mov data7,c
  setb w_clk
  clr w_clk
  djnz r2,s1
ret;-------------------------------------
;========bcdtobin
bcdtobin:
      mov r1,#40h
binclr:
      mov @r1,#00h
      inc r1
      cjne r1,#48h,binclr
      mov r1,#60h
binclr1:
      mov @r1,#00h
      inc r1
      cjne r1,#68h,binclr1
mov r0,#50h                 ;01-23   50高
                        ;r3
mov r1,#40h                 ;r4       40低
mov r7,#08h
                    ;r2 位数
bcd:     acall pushr0r1
      mov a,@r0
      add a,40h
      mov 40h,a
      mov r0,#40h
      mov r3,#04h
      cjne r7,#01h,bcdout1
      ajmp bcdout
bcdout1:   acall mul2
      acall copy
      mov r0,#40h
      mov r3,#04h
      acall mul2
      mov r0,#40h
      mov r3,#04h
      acall mul2
      acall addr
      acall popr0r1
      inc r0
      djnz r7,bcd
bcdout:
      ret
mul2:     mov a,@r0
        rlc a
        mov @r0,a
        inc r0
        djnz r3,mul2
        ret
copy:     mov r0,#40h
        mov r1,#60h
copy1:     mov a,@r0
        mov @r1,a
        inc r0
        inc r1
        cjne r1,#64h,copy1
        ret
addr:     clr f0
        mov r0,#40h
        mov r1,#60h
add1:
        mov a,@r0
        mov c,f0
        addc a,@r1
        mov f0,c
        mov @r0,a
        inc r0
        inc r1
        cjne r1,#64h,add1
        ret
pushr0r1:   mov a,r0
        mov r2,a
        mov a,r1
        mov r3,a
        ret
popr0r1:   mov a,r2
        mov r0,a
        mov a,r3
        mov r1,a
        ret
;============================================
;除法子程序:
;r3:存放被除数指针,r4:存放除数指针
;商放入r3所指向ram中,余数放入以dbuf10开始的连续ram中,r5表示相除位数, 高位表示被除数位数,低位
;地址高存放高位
bintof:
    lcall chen
    mov r1,#03dh
fclr:
      mov @r1,#00h
      inc r1
      cjne r1,#40h,fclr
      mov r1,#60h
    mov 20h,#0e1h
    mov 21h,#0f5h
    mov 22h,#05h
    mov   r3,#dbuf08
    mov   r4,#dbuf06
    mov   r5,#083h
    lcall   divstart
    ret
divstart:   mov a,r5       ; 除法子程序
        anl a,#0f0h   ;
        mov b,a       ;
        swap a       ;
        mov r6,a       ;r6:表示r3位数,
        anl 05h,#0fh   ;r5:表示r4位数
        dec a         ;
        add a,r3       ;
        mov r3,a       ;
          mov r0,a       ;
divloop1:     mov a,@r0     ;
            jnz divloop2     ;
            dec r0       ;
            djnz r6,divloop1   ;
            ret         ;
divloop2:     mov 03h,r0     ;
            mov a,r4       ;
          dec a         ;
          add a,r5       ;
          mov r1,a       ;
divloop3 :     mov a,@r1     ;
          jnz divloop4     ;
          dec r1       ;
          djnz r5,divloop3   ;高位为零屏去
          ret         ;
divloop4:       mov 02h,r5     ;
            inc r2       ;
            mov r1,#dbuf10     ;
            clr a         ;
divloop5:       mov @r1,a       ;
            inc r1         ;
            djnz r2,divloop5 ;
            nop           ;
            nop           ;
            nop           ;
            nop           ;
            nop           ;
            mov a,r5       ;
            inc a         ;
            swap a         ;  
            orl 05h,a       ;
divloop6:       mov r7,#08h     ;
divloop7:       mov 00h,r3     ;
            mov r1,#dbuf10   ;
            mov a,r5       ;
            anl a,#0fh     ;
            inc a         ;
            mov r2,a       ;
            clr c         ;
            mov a,@r0       ;
            rlc a         ;
            mov @r0,a       ;
divloop8:       mov a,@r1       ;
            rlc a         ;
            mov @r1,a       ;
            inc r1         ;
            djnz r2,divloop8 ;
            mov a,r4       ;
            mov r1,a       ;
            mov r0,#dbuf10   ;
            mov 02h,r5     ;
            lcall substart   ;
            jnc divloop9     ;
            mov 01h,r4     ;
            mov r0,#dbuf10   ;
            mov 02h,r5     ;
            lcall addstart   ;
            sjmp divloop0     ;
divloop9:       mov 00h,r3     ;
            inc @r0       ;
divloop0:       djnz r7,divloop7   ;
            dec r3         ;
            djnz r6,divloop6   ;
            nop           ;
;==================
;以下运算为四舍五收
            mov r0,#dbuf10     ;
            mov r1,#dbuf10     ;
            mov 02h,r5     ;
            nop           ;
            lcall addstart     ;
            mov r0,#dbuf10     ;
            mov 01h,r4     ;
            mov 02h,r5     ;
            nop           ;
            lcall substart     ;
            jc divreturn       ;
            mov a,b       ;
            mov r2,a       ;
            mov 00h,r3     ;
            inc r0         ;
            inc r2         ;
            mov r1,#01h     ;
            nop           ;
            lcall addstart     ;
divreturn:       ret           ;
;========================================
;加法子程序
;@r0+@r1 to @r0,r2 表示相加位数, 高位表示@r0位数,低位表示r1位数
;@r0 @@r1 地址高存放高位
addstart:       clr c
addloop:       mov a,@r0       ;
            addc a,@r1       ;
            mov @r0,a       ;
            inc r0         ;
            inc r1         ;
            dec r2         ;
            mov a,r2       ;
            anl a,#0fh       ;
            jz adlbitz       ;
            xch a,r2       ;
            anl a,#0f0h       ;
            dec a         ;
            anl a,#0f0h       ;
            orl 02h,a       ;
            sjmp addloop     ;
adlbitz:       mov a,r2       ;
            swap a         ;
            dec a         ;
            jz adhbitz       ;
            mov r2,a       ;
adhbitnz:       clr a           ;
            addc a,@r0       ;
            mov @r0,a       ;
            inc r0         ;
            djnz r2,adhbitnz     ;
adhbitz:       ret           ;
;=======================================
;减法子程序:
;@r0-@r1放入@r0中,r2 表示相加位数, 高位表示@r0位数,低位表示@r1位数
;@r0 ,@r1 地址高存放高位
substart:       clr c
subloop :       mov a,@r0       ;
            subb a,@r1       ;
            mov @r0,a       ;
            inc r0         ;
            inc r1         ;
            dec r2         ;
            mov a,r2       ;
            anl a,#0fh       ;
            jz subloop1       ;
            xch a,r2       ;
            anl a,#0f0h       ;
            dec a         ;
            anl a,#0f0h       ;
            orl 02h,a       ;
            sjmp subloop       ;
subloop1:       mov a,r2       ;
            swap a         ;
            dec a         ;
            jz subloop3       ;
            mov r2,a       ;
subloop2:       mov a,@r0       ;
            subb a,#00h     ;
            mov @r0,a       ;
            inc r0         ;
            djnz r2,subloop2     ;
subloop3 :       ret           ;/
chen:                           ;乘2
      mov r0,#40h
      mov r3,#08h
      acall mul2
ret
;=========================================================
tab: db 21h,0f9h,13h,051h,0c9h,45h,05h,0f1h,01h,41h     ;0123456789
    db 81h,0dh,27h,19h,007h,87h,0ffh,0ffh,0ffh,0ffh       ;abcdef 消
;与我的lcd连接有关,,不一定一样
'
班门弄斧,有几个行,有点大意         ...
离线BD0AAI
发帖
3050
只看该作者 8楼 发表于: 2005-09-12
收藏, 数码管还是有点麻烦, 建议用液晶。
离线BD0AAI
发帖
3050
只看该作者 9楼 发表于: 2005-09-12
2051 换成89s51, 可以把164省掉吧?
离线wycx
发帖
1497
只看该作者 10楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线wycx
发帖
1497
只看该作者 11楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线BG6AGB
发帖
915
只看该作者 12楼 发表于: 2005-09-12
其实也省不了多少钱,1602大概刚过20块就能买到

你要显示dds的频率,怎么着也要8个led啊,一个一块钱,每个led一个164,就又是一个一块钱
呵呵~~~
离线BG7YDO
发帖
3654
只看该作者 13楼 发表于: 2005-09-12
'
本来注释很多,可是字数太多了,只好在线改,,所以删的不大好
sys 是本来想再加一个键盘功能入口的,,后来字数太多,子程序删了。。这个地方却没删
bcdtobin没有错,,本来就是这样的,是十进制转二进制。
'
回头一看才知道,我前面的表达有问题,我是新手,老师不要见怪。
老师是不是留了些呀... 开个玩笑。
又一个热心无私的火腿,谢谢您!
离线wycx
发帖
1497
只看该作者 14楼 发表于: 2005-09-12
用户被禁言,该主题自动屏蔽!
离线wycx
发帖
1497
只看该作者 15楼 发表于: 2005-09-13
用户被禁言,该主题自动屏蔽!
离线BG6AGB
发帖
915
只看该作者 16楼 发表于: 2005-09-14
'
合肥的js要我35元一片1602,,,,疯了。。我下狠心买了一片,,用在89s51上了。。。舍不得用在2051上,,,还有,2051io口太少了,,,用不了1602的。。。
还有就是我说的调试的原因。。。可以用这个板子来调程序,,,运行一段,,调一下显示ram------好笨的方法。。。
'


昨天也不知道你去了电子工程学院没有
前天半夜我才知道昨天要去合肥现场做测试,呵呵~~
离线ahzds
发帖
7423
只看该作者 17楼 发表于: 2005-09-14
老乡加油!!!!!!!!
离线BG4UVR
发帖
11266
只看该作者 18楼 发表于: 2005-09-14
建议楼主学习使用c语言来写51程序,保证你用后再也不想用汇编了
离线BG6AGB
发帖
915
只看该作者 19楼 发表于: 2005-09-14
'
建议楼主学习使用c语言来写51程序,保证你用后再也不想用汇编了
'

我也这么建议
毕竟不是什么太注重时间的东西~~
呵呵~~~