📄 main.a51
字号:
;*************************************************************************
; main.A51
; TLC5620串行DAC例程:产生正弦波
;*************************************************************************
;*************************************************************************
;定义I/O端口
;*************************************************************************
DAT BIT P1.4 ;串行数据
CLK BIT P1.5 ;串行时钟,下降沿有效
LDAC BIT P1.6 ;DAC更新锁存控制,下降沿有效
LOAD BIT P1.7 ;串行数据装载,下降沿有效
;*************************************************************************
;复位和中断向量入口
;*************************************************************************
;复位入口
ORG 0x0000
LJMP PreMain
;*************************************************************************
;程序段:PreMain
;功能:进入主程序之前的初始化操作
;*************************************************************************
PreMain:
MOV SP, #0x2F
LJMP main
;*************************************************************************
;函数:Dac()
;功能:发送数据至TLC5620串行DAC
;参数:
; addr:DAC通道地址,取值0~3,对应通道A~D
; rng:附加的范围位,rng=0时,Vo不会超过Vref,rng=1时,Vo变为2倍
; dat:8位DAC数据
;公式:
; rng=0时,Vo=Vref*(dat/256)
; rng=1时,Vo=Vref*(dat/256)*2
;*************************************************************************
;void Dac(unsigned char addr, bit rng, unsigned char dat)
;addr = R7
;rng = 0x20.0
;dat = R6
Dac:
;{
; unsigned char n;
;//发送通道地址
; n = 2;
MOV R1, #2
; do
MOV A, R7
Dac_do1:
; {
; DAT = (bit)(addr & 0x02);
; addr <<= 1;
MOV C, ACC.1
MOV DAT, C
ADD A, ACC
; CLK = 0;
; CLK = 1;
CLR CLK
SETB CLK
; } while ( --n != 0 );
DJNZ R1, Dac_do1
;//发送RNG位
; DAT = rng;
; CLK = 0;
; CLK = 1;
MOV C, 0x20.0
MOV DAT, C
CLR CLK
SETB CLK
;//发送8位DAC数据
; n = 8;
MOV R1, #8
MOV A, R6
; do
Dac_do2:
; {
; DAT = (bit)(dat & 0x80);
; dat <<= 1;
MOV C, ACC.7
MOV DAT, C
ADD A, ACC
; CLK = 0;
; CLK = 1;
CLR CLK
SETB CLK
; } while ( --n != 0 );
DJNZ R1, Dac_do2
;//装载数据
; LOAD = 0;
; LOAD = 1;
CLR LOAD
SETB LOAD
;//数据锁存到DAC转换器
; LDAC = 0;
; LDAC = 1;
CLR LDAC
SETB LDAC
;}
RET
;*************************************************************************
;函数:Delay()
;功能:延时1ms~256ms
;参数:
; t>0时,延时(t)ms
; t=0时,延时256ms
;*************************************************************************
;void Delay(unsigned char t)
;t = R7
Delay:
;{
; do
Delay_do:
; {
; TH0 = 0xFC;
; TL0 = 0x66;
; TR0 = 1;
; while ( !TF0 );
; TR0 = 0;
; TF0 = 0;
MOV TH0, #0xFC
MOV TL0, #0x66
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
; } while ( --t != 0 );
DJNZ R7, Delay_do
;}
RET
;*************************************************************************
;函数:SinWave()
;功能:利用TLC5620串行DAC在通道B产生正弦波
;说明:请用示波器观察SmartSOPC实验箱D5区的DACB通道
;*************************************************************************
;void SinWave()
SinWave:
;{
; code unsigned char SinTab[] =
; {
; 128,147,167,185,202,218,231,241,249,253,
; 255,253,249,241,231,218,202,185,167,147,
; 127,108,88,70,53,37,24,14,6,2,
; 0,2,6,14,24,37,53,70,88,108
; };
; unsigned char n;
; 分配:n = R2
; for (;;)
SinWave_for1:
; {
; for ( n=0; n<40; n++ )
MOV R2, #0
SinWave_for2:
; {
; Dac(1,0,SinTab[n]);
MOV A, R2
MOV DPTR, #SinTab
MOVC A, @A+DPTR
MOV R6, A
CLR 0x20.0
MOV R7, #1
LCALL Dac
; Delay(5);
MOV R7, #5
LCALL Delay
; }
INC R2
CJNE R2, #40, SinWave_for2
; }
SJMP SinWave_for1
;}
RET
SinTab:
DB 128,147,167,185,202,218,231,241,249,253
DB 255,253,249,241,231,218,202,185,167,147
DB 127,108,88,70,53,37,24,14,6,2
DB 0,2,6,14,24,37,53,70,88,108
;*************************************************************************
;函数:void main()
;功能:主函数
;*************************************************************************
;void main()
main:
;{
; TMOD &= 0xF0;
; TMOD |= 0x01;
ANL TMOD, #0xF0
ORL TMOD, #0x01
; DAT = 1;
; CLK = 1;
; LDAC = 1;
; LOAD = 1;
SETB DAT
SETB CLK
SETB LDAC
SETB LOAD
; SinWave();
LCALL SinWave
; for (;;);
SJMP $
;}
;*************************************************************************
;程序结束
;*************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -