⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wave_generater.asm

📁 本程序是利用C8051F330单片机的10位DAC做的一个SIN信号发生器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
$include (c8051f330.inc)                  ; Include register definition file.;-----------------------------------------------------------------------------; EQUATES;-----------------------------------------------------------------------------
						GREEN_LED   equ   P1.3                    ; Green LED: '1' is ON
						PB0 BIT P0.7
						FLAG0_180 BIT 00H							TEMP EQU 50H
						INDEX EQU 51H
						T_BUF EQU 60H
						MTD   EQU   30H
						MRD   EQU   40H
						DISP_BUF EQU   56H
						SDA BIT P1.4
						SCL BIT P1.5
						ACK1 BIT 20H
						SLA EQU  1AH 
						SUBA EQU  1BH
						NUMBYTE EQU  1CH
						BLINK   EQU  1DH
						NUM     EQU  1EH
						MTD1    EQU   0E0H
						ZLG7290 EQU   70H;-----------------------------------------------------------------------------; RESET and INTERRUPT VECTORS;-----------------------------------------------------------------------------            ; Reset Vector            ;cseg AT 0            ;ljmp Main                     ; Locate a jump to the start of
            ORG 0000H
						LJMP MAIN                              ; code at the reset vector.						ORG 000BH
						LJMP TIMER0
						ORG 0023H
            LJMP SVC_SCI					;转串行口中断服务程序;-----------------------------------------------------------------------------; CODE SEGMENT;-----------------------------------------------------------------------------;Blink       segment  CODE

            ;rseg     Blink                ; Switch to this code segment.
            ;using    0                    ; Specify register bank for the
             ORG 0100H                             ; following program code.Main:				MOV OSCICN,#0B0H							;内部振荡器使能,系统时钟8分频(24.5MHz)
						MOV A,OSCICL
						ADD A,#2DH
						MOV OSCICL,A									;内部振荡器调整为20MHz,时钟周期0.4us
            ; Disable the WDT.
            ANL   PCA0MD, #NOT(040h)      ; clear Watchdog Enable bit            ; Enable the Port I/O Crossbar            ORL   P0SKIP, #06h            ; skip LED pin in crossbar
                                          ; assignments
						MOV XBR0,#0x01;#01H								;UART0使能
            MOV XBR1,#0x40;#40H           ; enable Crossbar
            ORL P1MDOUT, #0x38;#08h       ; make LED pin output push-pull
            ORL P1MDIN, #0x38;#08h        ; make LED pin input mode digital						;ANL P1MDOUT,#0FH							;P0.4、P0.5为开漏输出            ; Initialize LED to OFF            CLR   GREEN_LED
						MOV TEMP,#00H
						MOV IDA0CN,#0xf2							;DAC输出2mA电流#0F2H
						MOV IDA0L,#00H						MOV IDA0H,#00H
						MOV TMOD,#22H;               	;TMOD: Timer 0, mode 2, 8-bit reload        */
						MOV TCON,#10H;               	;TCON:                                      */
						MOV TH0,#6;                		;TH0:  Reload value                         */
						MOV TL0,#6;                		;TL0:  Reload value
						SETB ET0;                  /* ET0:  Enable timer 0                       */
						SETB TR0;                  /* TR0:  Timer 0 run
						SETB EA;            ;开放总中断      /* EA:   Enable interrupts
						CLR FLAG0_180
						MOV INDEX,#00H
						NOP
						NOP
						NOP
						NOP
						NOP
						NOP
						NOP
						SJMP LOOP

TIMER0:			CLR TR0
						MOV A,INDEX
						JNB P0.4,TIM90
						JNB P0.0,TIM180
TIM90:			MOV DPTR,#SINTBL90
						SJMP TIM0
TIM180:			MOV DPTR,#SINTBL180
TIM0:				MOVC A,@A+DPTR
						MOV IDA0H,A
						INC INDEX
						MOV R2,INDEX
						CJNE R2,#0C7H,TORETI
						MOV INDEX,#00H
TORETI:			SETB TR0
						RETI

D20MS:			MOV R6,#14H
D201:				ACALL D1MS
						DJNZ R6,D201
						RET
D1MS:				MOV R7,#0C7H			;1T
DD1:				NOP								;1T
						NOP								;1T
						NOP								;1T
						DJNZ R7,DD1				;2T
						RET
															;2T
D250MS:			MOV R5,#0CH
DD2:				ACALL D20MS
						DJNZ R5,DD2
						RET

D500MS:			MOV R5,#19H
DD3:				ACALL D20MS
						DJNZ R5,DD3
						RET

D1S:				MOV R5,#32H
DD4:				ACALL D20MS
						DJNZ R5,DD4
						RET

DELAY:      PUSH    PSW
            PUSH    ACC
            MOV     PSW,#10H
            MOV     R6,#250
DE1:        NOP
            NOP
            DJNZ    R6,DE1
            POP     ACC
            POP     PSW
            RET

SVC_SCI:		PUSH ACC		;接收中断服务程序
						PUSH PSW
	 					JBC RI0,SVC_SCI_RI
						SJMP SVC_SCI_Z
SVC_SCI_RI:	MOV A,SBUF0
						MOV 70H,A
SVC_SCI_Z:	POP PSW
						POP ACC
						RETI
TRANS:			MOV R7,#08H				;将60H单元开始的连续10个字节通过串口发给PC机						
						MOV R0,#60H
TRANSA:			MOV A,@R0
						MOV SBUF0,A
WAITA:			JNB TI0,WAITA
						CLR TI0
						INC R0
						DJNZ R7,TRANSA
						RET
SINTBL90:		DB 0,8,16,24,32,40,47,55,63,71
						DB 79,86,94,101,108,116,123,130,137,143
						DB 150,156,163,169,175,181,186,192,197,202
						DB 207,211,216,220,224,228,231,234,238,240
						DB 243,245,247,249,251,252,253,254,255,255
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  
SINTBL180:	DB 0, 8, 16, 24, 32, 40, 47, 55, 63, 71
						DB 79, 86, 94, 101, 108, 116, 123, 130, 137, 143
						DB 150, 156, 163, 169, 175, 181, 186, 192, 197, 202
						DB 207, 211, 216, 220, 224, 228, 231, 234, 238, 240
						DB 243, 245, 247, 249, 251, 252, 253, 254, 255, 255
						DB 255, 255, 255, 254, 253, 252, 251, 249, 247, 245
						DB 243, 240, 238, 234, 231, 228, 224, 220, 216, 211
						DB 207, 202, 197, 192, 186, 181, 175, 169, 163, 156
						DB 150, 143, 137, 130, 123, 116, 108, 101, 94, 86
						DB 79, 71, 63, 55, 47, 40, 32, 24, 16, 8
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
						DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

	
;在LED上显示数字0~8
;入口参数:R6:复合命令的第一个字节,R7:复合命令的第二个字节。R2:要显示的LED数

DISPLAY:
					MOV	R6,#60H			;复合命令第一个字节的初值,是按位下载数据并译码的指令代码
					MOV	R0,#56H			;复合命令的第二个字节,是要显示的数值,这里是0
					MOV	R2,#06H			;循环6次,即显示6位
LOOP1:		MOV	MTD,R6			;将复合命令的第一个字节送发送数据缓冲区
					MOV A,@R0
					MOV	MTD+1,A			;将复合命令的第二个字节送发送数据缓冲区
					MOV 5CH,R0
					LCALL SENDCMD		;调用发送命令函数
					INC R6					;指向下一个数码管
					MOV R0,5CH
					INC	R0					;数值加1
					LCALL DELAY			;延迟
					DJNZ R2,LOOP1		;循环8次了吗?
					RET

SENDCMD:  MOV	SLA,#ZLG7290			;指定器件地址
          MOV	SUBA,#07H					;指定子地址
	       	MOV	NUMBYTE,#02H			;发送2个字节的命令字节数据
	       	LCALL    IWRNBYTE			;调用写n字节数据程序
          NOP
          NOP
          NOP
          NOP
  	      RET
;--------------------------------------------------------------------------------------------------------
;		  MCS-51单片机模拟I2C软件包(V1.1)
;    文件名:VI2C_ASM.INC
;    功能说明:本模拟I2C软件包包含了I2C操作的底层子程序,使用前要定义
;好SCL和SDA。在标准8051模式(12 Clock)下,对主频要求是不高于12MHz(即1个
;机器周期1us);若Fosc>12MHz则要增加相应的NOP指令数。(总线时序符合I2C标
;准模式,100Kbit/S)
;    版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT两个子程序,
;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便.
;					  更新时间:2002.06.04
;--------------------------------------------------------------------------------------------------------

;启动I2C总线子程序      
START:    SETB  SDA
          NOP
          SETB  SCL     			;起始条件建立时间大于4.7us
          NOP
          NOP
          NOP
          NOP
          NOP
					NOP
          NOP
          NOP
          NOP
          NOP
					NOP
          NOP
          NOP
          NOP
          NOP
					NOP
          NOP
          NOP
          NOP
          NOP
          CLR   SDA      
          NOP           		 	;起始条件锁定时大于4us
          NOP
          NOP
          NOP
          NOP
					NOP           		 	;起始条件锁定时大于4us
          NOP
          NOP
          NOP
          NOP
					NOP           		 	;起始条件锁定时大于4us
          NOP
          NOP
          NOP
          NOP
					NOP           		 	;起始条件锁定时大于4us
          NOP
          NOP
          NOP
          NOP
          CLR   SCL     		 	;钳住总线,准备发数据
          NOP
					NOP
					NOP
					NOP
					NOP
					NOP
          RET

;结束总线子程序
STOP:     CLR    SDA
          NOP
					NOP
					NOP
					NOP
          SETB   SCL    			;发送结束条件的时钟信号
          NOP           			;结束总线时间大于4us
          NOP            
          NOP
          NOP
          NOP
					NOP           			;结束总线时间大于4us
          NOP            
          NOP
          NOP
          NOP
					NOP           			;结束总线时间大于4us
          NOP            
          NOP
          NOP
          NOP
					NOP           			;结束总线时间大于4us
          NOP            
          NOP
          NOP
          NOP
          SETB  SDA    			        ;结束总线
          NOP          			      	;保证一个终止信号和起始信号的空闲时间大于4.7us
          NOP
          NOP
          NOP
					NOP          			      	;保证一个终止信号和起始信号的空闲时间大于4.7us
          NOP
          NOP
          NOP
					NOP          			      	;保证一个终止信号和起始信号的空闲时间大于4.7us
          NOP
          NOP
          NOP
					NOP          			      	;保证一个终止信号和起始信号的空闲时间大于4.7us
          NOP
          NOP
          NOP
          RET

;发送应答信号子程序

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -