📄 wave_generater.asm
字号:
$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 + -