微机项目:任意波形发生器

原代码源于网络,但没有注释,在一天的琢磨后终于理解其原理,特将注释补上

先上图:

设计要求:

(1)构建proteus仿真平台:DAC+串口+LCD+示波器

(2)至少显示三种波形,可在示波器显示。

(3)上位机通过串口选择要输出的波形、幅度、频率。

(4)通过LCD显示该波形的峰峰值、频率等信息。

结果分析:

周期:5.51ms 幅度:4.53V

周期:2.72ms 幅度:4.53V

周期:2.816ms 幅度:4.53V

完整代码:

;R0: 代表三种模式

;R1: 正弦中的输入地址偏移量

;R2,R3: 延时函数的两个计数

;R4: 中间量

;R5: 方波的输出,FF->0->FF

;R6: 频率控制,R6=TH=TL

;R7: 三角波的输出,递增->递减->递增

;P1.7: 改变波形

;P1.6: 增加频率

;P1.5: 降低频率

ORG 0000H

LJMP MAIN

MAIN:

MOV R4, #2

MOV TMOD,#20H ;计时器工作在模式2

MOV R0,#02H ;输出模式默认为2,即方波

MOV A,#0FFH

MOV P1,A ;先将P1全部置于高电平

MOV A,#70H

MOV SP,A ;初始化SP指针

MOV R6,#0FFH ;设置TH初值为FF

REMAIN:CLR TR1 ;计数器停止

MOV TH1,R6 ;设置TH值为R6

SETB TR1 ;计时器启动

LCALL JM ;跳转至LCD显示

CJNE R0,#01,SHIFT ;如果R0不是1,跳至SHIFT(切换输出波形)

TRI: CJNE R7,#0FFH,TRI_1 ;三角波部分

CLR 20H ;如果R7==FF(最大值),20H=0(改变斜率正负)

TRI_1: CJNE R7,#00H, TRI_2 ; 如果R7!=FF(最大值)判断是否为0

SETB 20H ;如果为0,20H=1(上升)

TRI_2: JNB TF1, TRI_5 ;时钟计数未溢出,跳往TRI_3

CLR TF1 ;如果溢出,清空TF位

JB 20H, TRI_3 ;如果20H=1(上升),跳往TRI_4

DEC R7 ;如果20H=0(下降),R7--

SJMP TRI_4 ;跳往 TRI_6

TRI_3: INC R7 ; 20H=1(上升),R7++

TRI_4: MOV P3,R7 ;输出R7

LCALL DISPLAY ;跳往LCD显示函数

TRI_5:

MOV A,P1 ;判断外界输入的类型

ORL A,#1FH ;低5位全置1

CPL A ;取反,如果有按钮被按下(低三位有低电平),A值就不为0

JZ TRI_6 ;如果A为0则无事发生,跳转至TRI_5

LCALL DELAY ;再重复一遍,确认按钮确实被按下,防止电路内部异常

MOV A,P1 ;

ORL A,#1FH ;

CPL A ;

JZ TRI_6 ;

LJMP CHANGESTATE;如果按钮按下,跳往至改变波形函数

TRI_6: LJMP TRI

SHIFT:JC SIN ;0号模式就跳往SIN

REC:JNB TF1,REC_4 ;R0不是0也不是1,那么必为2 ,进入方波函数

CLR TF1 ;清空溢出位

DJNZ R5, REC_1 ;如果R5=0,说明目前为低电平,跳往REC_2

MOV R5,#0FFH

CPL 20H

REC_1:JB 20H, REC_2 ;如果20H=1,即指示要输出高电平,跳往

; REC_3 20H=24H.0

MOV P3,#00H ;输出清零

SJMP REC_3 ;跳往 REC_4

REC_2:MOV P3,#0FFH ;所有输出口置1,方波的高电平

REC_3:LCALL DISPLAY ;LCD展示当前状态

REC_4:MOV A,P1 ;上面已提到

ORL A,#1FH ;

CPL A ;

JZ REC_5 ;如果按钮未按下,继续循环,跳往REC_5

LCALL DELAY ;与上文相同

MOV A,P1 ;

ORL A,#1FH ;

CPL A ;

JZ REC_5 ;

LCALL CHANGESTATE ;

REC_5:LJMP REC

SIN:NOP ;nop

MOV DPTR,#TABSIN ;加载SIN数值表头

SIN_1: JNB TF1,SIN_2 ;计时器未溢出,跳往SIN_2

CLR TF1 ;溢出后,重置TF1

INC R1 ; R1++,偏移量+1

MOV A,R1 ; a=R1

MOVC A,@A+DPTR ;pointer=DPTR+R1,表头+偏移量

;MOV B, #2

;DIV AB ;------------------------------------------------

;MOV B, R4

;MUL AB

MOV P3,A ;输出值

LCALL DISPLAY ;显示当前状态

SIN_2: MOV A,P1 ;同上

ORL A,#1FH ;

CPL A ;

JZ SIN_3 ;

LCALL DELAY ;

MOV A,P1 ;

ORL A,#1FH ;

CPL A ;

JZ SIN_3 ;

LCALL CHANGESTATE ;

SIN_3: LJMP SIN_1 ;goto SIN_1

CHANGESTATE:

JB P1.7,CS_1 ;如果1.7口没被按下,前往CS_1

INC R0 ;如果1.7被按下,R0++

CJNE R0,#03H, CS_1 ;如果R0!=3, CS_1

MOV R0,#00H ;如果R0为4(溢出),R0置零

CS_1: JB P1.6, CS_2 ;如果1.6口没被按下, CS_2

MOV A, R6

ADD A, #10 ;设置步长为10

MOV R6, A ;R6+=10

CS_2: JB P1.5, CS_3 ;如果1.5口没被按下, CS_3

MOV A, R6

SUBB A, #10 ;步长10

MOV R6, A ; R6-=10

CS_3: MOV A,P1 ;1.4被按下

CPL A ;expmple:1011 ->0100

JNZ CS_3 ;loop until button is not pressed

LJMP REMAIN

JM:MOV DPTR,#TABNUM ;

MOV A,R6 ;A=R6,代表计数器溢出速度

MOV B,#100 ;

DIV AB ;得到百位

MOVC A,@A+DPTR ;display 百位

MOV 14H,A ;14H:LCD dispaly_1

MOV A,B

MOV B,#10

DIV AB ;得到十位

MOVC A,@A+DPTR

MOV 15H,A ;15H:LCD dispaly_2

MOV A,B ;得到个位

MOVC A,@A+DPTR

MOV 16H,A ;16H:LCD dispaly_2

MOV DPTR,#TABWM ;dispaly"TRI""REC""SIN"

MOV A,R0 ;获得当前模式

MOV B,#03H

MUL AB ;if R0=0,number(0,1,2)

MOV 10H,A ;if R0=1,number(3,4,5)

MOVC A,@A+DPTR ;if R0=2,number(6,7,8)

MOV 11H,A ; |

INC DPTR ; |

MOV A,10H ; |

MOVC A,@A+DPTR ; |

MOV 12H,A ; >--- DISPLAY

MOV A,10H ; |

INC DPTR ; |

MOVC A,@A+DPTR ; |

MOV 13H,A ; /

RET

;================================以下display==========================

DISPLAY:

SETB P2.1 ;control T2

MOV P0,#0FEH ;1111 1110点亮最低位

CLR P2.1 ;T2=0

MOV P0,#0FFH ;清零

SETB P2.0 ;control T1

MOV P0,11H ;11H传给P0,11H为A+DPTR的值

CLR P2.0 ;T1=0

MOV P0,#0FFH

LCALL DELAY

SETB P2.1 //第五位

MOV P0,#0FDH //1111 1101

CLR P2.1 //

MOV P0,#0FFH // SAME AS ABOVE

SETB P2.0 //

MOV P0,12H //

CLR P2.0 //

MOV P0,#0FFH //

LCALL DELAY

SETB P2.1

MOV P0,#0FBH

CLR P2.1

MOV P0,#0FFH //同上

SETB P2.0

MOV P0,13H

CLR P2.0

MOV P0,#0FFH

LCALL DELAY

SETB P2.1

MOV P0,#0F7H

CLR P2.1

MOV P0,#0FFH //同上

SETB P2.0

MOV P0,14H

CLR P2.0

MOV P0,#0FFH

LCALL DELAY

SETB P2.1

MOV P0,#0EFH

CLR P2.1

MOV P0,#0FFH //同上

SETB P2.0

MOV P0,15H

CLR P2.0

MOV P0,#0FFH

LCALL DELAY

SETB P2.1

MOV P0,#0DFH

CLR P2.1

MOV P0,#0FFH //同上

SETB P2.0

MOV P0,16H

CLR P2.0

MOV P0,#0FFH

LCALL DELAY

RET

;============================以上display===============================

DELAY:MOV R2,#0FFH; for(R2=0;R2<FF;R2++)

MOV R3,#1; {for(R3=1;R3<=2;R3--)

LOOP: ; {if(R3==0)

DJNZ R3,LOOP; R3=2;}

MOV R3,#2; }

DJNZ R2,LOOP;

RET;

;===========================以下表格=====================================

TABNUM: DB 3FH,06H,5BH,4FH,66H ;LCD 0~9

DB 6DH,7DH,07H,7FH,6FH

TABWM: DB 6DH,06H,37H,07H,77H ;LCD SIN,RET&TRI S I N T R

DB 30H,77H,79H,39H ;LCD I R E C

TABSIN:

DB 80H,83H,86H,89H,8DH,90H,93H,96H

DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH

DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H

DB 0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8H

DB 0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9H

DB 0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5H

DB 0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH

DB 0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDH

DB 0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6H

DB 0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAH

DB 0E9H,0E7H,0E5H,0E3H,0E1H,0DEH,0DDH,0DAH

DB 0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7H

DB 0C5H,0C2H,0BFH,0BCH,0BAH,0B7H,0B4H,0B1H

DB 0AEH,0ABH,0A8H,0A5H,0A2H,9FH,9CH,99H

DB 96H,93H,90H,8DH,89H,86H,83H,80H

DB 80H,7CH,79H,78H,72H,6FH,6CH,69H

DB 66H,63H,60H,5DH,5AH,57H,55H,51H

DB 4EH,4CH,48H,45H,43H,40H,3DH,3AH

DB 38H,35H,33H,30H,2EH,2BH,29H,27H

DB 25H,22H,20H,1EH,1CH,1AH,18H,16H

DB 15H,13H,11H,10H,0EH,0DH,0BH,0AH

DB 09H,08H,07H,06H,05H,04H,03H,02H

DB 02H,01H,00H,00H,00H,00H,00H,00H

DB 00H,00H,00H,00H,00H,00H,01H,02H

DB 02H,03H,04H,05H,06H,07H,08H,09H

DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H

DB 16H,18H,1AH,1CH,1EH,20H,22H,25H

DB 27H,29H,2BH,2EH,30H,33H,35H,38H

DB 3AH,3DH,40H,43H,45H,48H,4CH,4EH

DB 51H,55H,57H,5AH,5DH,60H,63H,66H

DB 69H,6CH,6FH,72H,76H,79H,7CH,80H

END

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值