×
单片机 > 单片机程序设计 > 详情

AT89C2051+AD7545正弦信号发生器

发布时间:2020-06-08 发布时间:
|
;********************************************************************;

;说明:
;1.本程序使用AT89C2051单片机驱动DA转换器AD7545输出单相50Hz正弦波信号 ;
;2.在P3.5口输出与正弦波同相同步的方波信号,该方波信号可用于在正弦信号 ;
;的过零处将正弦信号切断.                                             ;
;作者:Free Zheng                                                    ;
;********************************************************************;
DACL    EQU     P1                  ;定义低8位数据输出口
DACH    EQU     P3                  ;定义高8位数据输出口
DASHUT  EQU     00H                 ;数据
LED     EQU     P3.7                ;定义指示灯输出口

        ORG     00H                 ;起始地址
        AJMP    MAIN                ;跳转至主程序
        ORG     03H                 ;外部中断0入口
        RETI                        ;中断返回
        ORG     0BH                 ;定时器0中断入口
        RETI                        ;直接返回
        ORG     13H                 ;外部中断1入口
        RETI                        ;直接返回
        ORG     1BH                 ;定时器1中断入口
        RETI                        ;直接返回
        ORG     23H                 ;串口中断入口
        RETI                        ;直接返回

        ORG     30H                 ;主程序入口

MAIN:   MOV     DACL,#DASHUT        ;数据输出口输出0
        MOV     DACH,#DASHUT        ;数据输出口输出0
        MOV     R0,#0               ;R0=0
        MOV     R1,#0               ;R1=0
        MOV     R2,#40H             ;R2=40H

START:
        NOP                         ;空操作,用于延时
        NOP
        NOP
        NOP
        NOP
        NOP
LABEL3:
        MOV     DPTR,#SIN1          ;正弦函数表格地址
        MOV     A,R0                ;把R0里面的数据送累加器
        MOV     DPL,R0              ;数据指针寄存器低8位
        MOVC    A,@A+DPTR           ;查表
        MOV     R7,A                ;所得值送入R7
        INC     R0                  ;寄存器加1
        MOV     A,R0                ;把R0里面的数据送累加器
        MOVC    A,@A+DPTR           ;查表
        MOV     DACL,A              ;所得值输出至低8位数据输出口
        MOV     A,R7                ;把第一次查得值送入累加器
        CJNE    R0,#100,SQUAREL     ;如果R0的值不等于100则跳转至SQUAREL标号处执行
        MOV     R2,#0F0H            ;否则送把0FH送入R2
        JMP     SQ1                 ;跳转至SQ1标号处执行
SQUAREL:
        NOP                         ;空操作,用于延时
        NOP
        NOP
SQ1:
        ORL     A,R2                ;把R2中的内容叠加至累加器
        MOV     DACH,A              ;把累加器内容送至高8位数据输出口
        ACALL   DELAY               ;调用延时程序
        CJNE    R0,#200,START       ;如果R0的值不等于200则跳转至START标号处执行
        NOP                         ;空操作
        JMP     LABLE1              ;跳至LABLE1标号处执行
NEXT:
        NOP                         ;空操作,用于延时
        NOP
        NOP
        NOP
        NOP
        NOP
LABEL4:
        MOV     DPTR,#SIN2          ;
        MOV     A,R1
        MOV     DPL,R1
        MOVC    A,@A+DPTR
        MOV     R6,A
        INC     R1
        MOV     A,R1
        MOVC    A,@A+DPTR
        MOV     DACL,A
        MOV     A,R6
        CJNE    R1,#100,SQUAREH
        MOV     R2,#00H
        JMP     SQ2
SQUAREH:
        NOP
        NOP
        NOP
SQ2:
        ORL     A,R2
        MOV     DACH,A
        ACALL   DELAY
        CJNE    R1,#200,NEXT
        NOP
        JMP     LABLE2

        NOP
        NOP
        LJMP    MAIN
LABLE1:
        MOV     R0,#0
        JMP     LABEL4

        NOP
        NOP
        LJMP    MAIN
LABLE2:
        MOV     R1,#0
        JMP     LABEL3

        NOP
        NOP
        LJMP    MAIN

DELAY:
        MOV     R3,#8
DEL1:
        DJNZ    R3,DEL1
        RET

        NOP
        NOP
        LJMP    MAIN

        ORG     100H

SIN1:

DW      2048,   2080,   2112,   2144,   2177,   2209,   2241,   2273,   2305,   2337,   2368,   2400,   2432,   2463,   2495,   2526,   2557,   2588,   2619,   2650
DW      2681,   2711,   2742,   2772,   2802,   2832,   2861,   2891,   2920,   2949,   2978,   3006,   3035,   3063,   3091,   3118,   3145,   3172,   3199,   3226
DW      3252,   3278,   3303,   3328,   3353,   3378,   3402,   3426,   3450,   3473,   3496,   3519,   3541,   3563,   3584,   3605,   3626,   3646,   3666,   3686
DW      3705,   3724,   3742,   3760,   3777,   3794,   3811,   3827,   3843,   3858,   3873,   3887,   3901,   3915,   3928,   3940,   3952,   3964,   3975,   3986
DW      3996,   4005,   4015,   4023,   4032,   4039,   4047,   4053,   4060,   4066,   4071,   4076,   4080,   4084,   4087,   4090,   4092,   4094,   4095,   4095
DW      4095,   4095,   4095,   4094,   4092,   4090,   4087,   4084,   4080,   4076,   4071,   4066,   4060,   4053,   4047,   4039,   4032,   4023,   4015,   4005
DW      3996,   3986,   3975,   3964,   3952,   3940,   3928,   3915,   3901,   3887,   3873,   3858,   3843,   3827,   3811,   3794,   3777,   3760,   3742,   3724
DW      3705,   3686,   3666,   3646,   3626,   3605,   3584,   3563,   3541,   3519,   3496,   3473,   3450,   3426,   3402,   3378,   3353,   3328,   3303,   3278
DW      3252,   3226,   3199,   3172,   3145,   3118,   3091,   3063,   3035,   3006,   2978,   2949,   2920,   2891,   2861,   2832,   2802,   2772,   2742,   2711
DW      2681,   2650,   2619,   2588,   2557,   2526,   2495,   2463,   2432,   2400,   2368,   2337,   2305,   2273,   2241,   2209,   2177,   2144,   2112,   2080

        ORG     300H

SIN2:

DW      2048,   2016,   1984,   1952,   1919,   1887,   1855,   1823,   1791,   1759,   1728,   1696,   1664,   1633,   1601,   1570,   1539,   1508,   1477,   1446
DW      1415,   1385,   1354,   1324,   1294,   1264,   1235,   1205,   1176,   1147,   1118,   1090,   1061,   1033,   1005,   978 ,   951 ,   924 ,   897 ,   870
DW      844 ,   818 ,   793 ,   768 ,   743 ,   718 ,   694 ,   670 ,   646 ,   623 ,   600 ,   577 ,   555 ,   533 ,   512 ,   491 ,   470 ,   450 ,   430 ,   410
DW      391 ,   372 ,   354 ,   336 ,   319 ,   302 ,   285 ,   269 ,   253 ,   238 ,   223 ,   209 ,   195 ,   181 ,   168 ,   156 ,   144 ,   132 ,   121 ,   110
DW      100 ,   91  ,   81  ,   73  ,   64  ,   57  ,   49  ,   43  ,   36  ,   30  ,   25  ,   20  ,   16  ,   12  ,   9   ,   6   ,   4   ,   2   ,   1   ,   0
DW      0   ,   0   ,   1   ,   2   ,   4   ,   6   ,   9   ,   12  ,   16  ,   20  ,   25  ,   30  ,   36  ,   43  ,   49  ,   57  ,   64  ,   73  ,   81  ,   91
DW      100 ,   110 ,   121 ,   132 ,   144 ,   156 ,   168 ,   181 ,   195 ,   209 ,   223 ,   238 ,   253 ,   269 ,   285 ,   302 ,   319 ,   336 ,   354 ,   372
DW      391 ,   410 ,   430 ,   450 ,   470 ,   491 ,   512 ,   533 ,   555 ,   577 ,   600 ,   623 ,   646 ,   670 ,   694 ,   718 ,   743 ,   768 ,   793 ,   818
DW      844 ,   870 ,   897 ,   924 ,   951 ,   978 ,   1005,   1033,   1061,   1090,   1118,   1147,   1176,   1205,   1235,   1264,   1294,   1324,   1354,   1385
DW      1415,   1446,   1477,   1508,   1539,   1570,   1601,   1633,   1664,   1696,   1728,   1759,   1791,   1823,   1855,   1887,   1919,   1952,   1984,   2016

        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN
        NOP
        NOP
        LJMP    MAIN

        END



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码