功能:
系统采用STC89C52作为单片机采用汇编语言撰写可产生三角波、方波、正弦波三种波形DAC芯片采用的是DAC0832,外加一个运放做波形处理
仿真电路图:
参考代码:
ORG 0000H;定义存储标志位的地址SELEQU 30H ;存波形的地址 00:方波 01:三角波 02:正弦波RANGE EQU 31H ;存幅值的地址FREQ EQU 32H ;存频率的地址INC_F1 EQU 35H ;三角波自加或自减标识,=幅值/255INC_F2 EQU 36H ;三角波自加或自减标识,=幅值/255RAN_SIN EQU 37H ;正弦波幅值;定义按键的地址AN_COM EQU P2.1 ;发出低电平,用于检测按键AN_FREQ EQU P2.2 ;调节频率按键AN_RANGE EQU P2.3 ;调节幅度按键AN_SEL EQU P2.4 ;变换波形按键AN_RST EQU P3.1;定义12864的控制端E EQU P2.0 ;数据或命令读写驱动信号,操作时应拉高,操作完拉低即可RW EQU P2.6 ;读写控制端RS EQU P2.5 ;选择写控制命令或数据命令CS1 EQU P2.7 ;选屏幕CS2 EQU P3.0;12864存取命令的地址L_COM EQU 33H;YEQU 34H;存列地址X EQU 38H ;存页地址PG EQU 39H;存操作页数LINE EQU 40H ;存操作列数NUM EQU 41H ;循环次数SNUM EQU 42H;待显示的数字TEMP EQU 43H ;临时数据LJMPMAINORG 0003H ;外部中断0中断入口地址LJMP COUNT_SER ;外部中断中断服务程序ORG 0100HMAIN: ;数据初始化MOV SP,#60HCLR ACLR CCLR AN_COMMOV SEL,#00H;默认方波MOV RANGE,#7FH ;默认中间幅值MOV FREQ,#00;默认最大频率LCALL CLEANMOV P1,#00HMOV Y,#00HMOV INC_F1,#00HMOV INC_F2,#00HMOV RAN_SIN,#01H LCALL LCD_INITLCALL SHOW_MSGLCALL SHOW_VHLCALL SHOW_SQRMOV X,#0BAHMOV Y,#5FHMOV SNUM,#05HLCALL SHOW_NUM;外部中断0初始化SETB IT0SETB EX0 ;允许外部中断0SETB EA ;开总中断;停机等待中断,到后期可以改为一些一直执行的程序,如显示,输出等MAIN_L: MOV A,SELMOV DPTR,#WAVEJMP @A+DPTRSJMP MAIN_L;方波,不可调频SQUARE: MOV R5,SELCJNE R5,#00H,WAVE_BACK MOV P1,RANGE ;幅值LCALL DELAY_XusLCALL DELAY_100usMOV P1,#00HLCALL DELAY_XusLCALL DELAY_100usSJMP SQUARE;三角波,调幅,频率也会变,改默认最大幅值,最小频率R_SEL: MOV R5,SELCJNE R5,#01H,WAVE_BACKLCALL JINC_FRECT:DJNZ INC_F1,RECTINC P1MOV A,P1; LCALL DELAY_10usCJNE A,RANGE,RECTMOV INC_F1,INC_F2DOWN: DJNZ INC_F2,DOWNDEC P1MOV R0,P1CJNE R0,#00H,DOWNMOV INC_F2,INC_F1; LCALL DELAY_10usLJMP R_SELRET;判断三角波中是一个循环加多少JINC_F: MOV A,#0FFHMOV B,RANGEDIV ABMOV INC_F1,AMOV INC_F2,ARET ;正弦波,用查表法,不可调频,不可调幅SIN: MOV DPTR,#TABLE_SINS_SEL: MOV R5,SELCJNE R5,#02H,WAVE_BACKSL: CLR AMOVC A,@A+DPTRMOV B,RAN_SINDIV ABMOV P1,ALCALL DELAY_10usINC DPTRMOV A,#01HMOVC A,@A+DPTRCJNE A,#21H,S_SEL LJMP SIN;调用波形返回函数WAVE_BACK: RET;中断服务程序 ;外部中断0中断服务程序 ,判断是哪个按键被按下COUNT_SER: CPL P3.5JNB AN_FREQ,FREQ_FUNCJNB AN_RANGE,RANGE_FUNCJNB AN_SEL,SEL_FUNCJNB AN_RST,SEL_RSTRETI;调节频率按钮FREQ_FUNC: INC FREQRETI;调节幅值按钮RANGE_FUNC: INC RANGEINC RAN_SINMOV R6,RAN_SINCJNE R6,#00H,FUNC_RETMOV RAN_SIN,#01HRETI;选择波形标志位加一SEL_FUNC: INC SEL MOV R6,SELCJNE R6,#03H,FUNC_RETMOV SEL,#00HRETIFUNC_RET: RETI;复位部分SEL_RST:CLR ACLR CCLR AN_COMMOV SEL,#00H;默认方波MOV RANGE,#7FH ;默认中间幅值MOV FREQ,#00;默认最大频率MOV P1,#00HMOV Y,#00HMOV INC_F1,#00HMOV INC_F2,#00HMOV RAN_SIN,#01HRETI;LCD显示部分:;1、查看LCD是否处于空闲CHK_BUSY: MOV P0,#0FH ;必须让p0.7为低,不然一直卡在死循环CLR RSSETB RW SETB E JB P0.7,$ CLR E RET ;2、写命令;写左命令WR_L_COM: CLR CS1SETB CS2LCALL CHK_BUSY ;判断LCD是否处于空闲NOPCLR RSCLR RWNOPSETB EMOV P0,L_COMNOPCLR ENOPRET;写右命令WR_R_COM: SETB CS1CLR CS2LCALL CHK_BUSY ;判断LCD是否处于空闲NOPCLR RSCLR RWNOPSETB EMOV P0,L_COMNOPCLR ENOPRET;全屏写命令
.
链接:/s/1jUHhVUiVOdTTCy2MHmFcCg
提取码:1234
如果觉得《基于51单片机的波形发生器汇编语言proteus仿真》对你有帮助,请点赞、收藏,并留下你的观点哦!