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

📄 pcf8591-da-lcd1602-asm.asm

📁 89S52单片机做的A/D,D/A的实验的源程序PCF8591 D/A CONVERTER */ /* */ /* LCD1602显示 */ /* 参考电压接至5V电源 */ /* 最小输出电
💻 ASM
📖 第 1 页 / 共 2 页
字号:
DEL4:
         MOV  R6,#200
DEL5:
         MOV  R7,#250
         DJNZ  R7,$
         DJNZ  R6,DEL5
         RET
;==========================================================
;延时100MS                                                =
;==========================================================
DELAY:
          MOV  R6,#200
DEL6:
          MOV  R7,#250
          DJNZ  R7,$
          DJNZ  R6,DEL6
          RET

;==========================================================
;D/A 转换子程序

;R1 D/A转换数据指针,初值为DA_DATA。
;R2 存放D/A转换数据个数。
;==========================================================
PCF_DA:
           NOP
           LCALL  STR        ;启动I2C总线
           MOV  A,#90H       ;写PCF8591 A/D 寻址字
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_DA

           MOV  A,#DACOM     ;PCF8591 D/A的控制命令(40H)
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_DA
           RET
PCF_DA1:
           MOV  A,@R1
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_DA1
           ;LCALL  STOP
           RET

;=========================================================
;程序功能:正弦信号发生

;出口:从D/A通道输出正弦电压信号
;=========================================================
SINE:
         MOV  B,#00H
         ACALL  PCF_DA
SIN1:
         JNB  K4,SIN_END       ;退出
         MOV   A,B
         MOV   DPTR,#SIN_TAB
         MOVC  A,@A+DPTR
         MOV   @R1,A
         ACALL PCF_DA1         ;DA转换
         INC   B
         AJMP  SIN1
SIN_END:
         LCALL  STOP
         SETB  20H.1
         LCALL  BEEP_BL
         RET
;---------------------------------------------------------
SIN_TAB:
   DB  80H,83H,86H,89H,8DH,90H,93H,96H,99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
   DB  0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H,0C7H,0CAH,0CCH,0CFH,0D1H,0D4H,0D6H,0D8H
   DB  0DAH,0DDH,0DFH,0E1H,0E3H,0E5H,0E7H,0E9H,0EAH,0ECH,0EEH,0EFH,0F1H,0F2H,0F4H,0F5H
   DB  0F6H,0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FDH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
   DB  0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FEH,0FDH,0FDH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H,0F6H
   DB  0F5H,0F4H,0F2H,0F1H,0EFH,0EEH,0ECH,0EAH,0E9H,0E7H,0E5H,0E3H,0E1H,0DFH,0DDH,0DAH
   DB  0D8H,0D6H,0D4H,0D1H,0CFH,0CCH,0CAH,0C7H,0C5H,0C2H,0BFH,0BCH,0BAH,0B7H,0B4H,0B1H
   DB  0AEH,0ABH,0A8H,0A5H,0A2H,9FH,9CH,99H,96H,93H,90H,8DH,89H,86H,83H,80H
   DB  80H,7CH,79H,76H,72H,6FH,6CH,69H,66H,63H,60H,5DH,5AH,57H,55H,51H
   DB  4EH,4CH,48H,45H,43H,40H,3DH,3AH,38H,35H,33H,30H,2EH,2BH,29H,27H
   DB  25H,22H,20H,1EH,1CH,1AH,18H,16H,15H,13H,11H,10H,0EH,0DH,0BH,0AH
   DB  09H,08H,07H,06H,05H,04H,03H,02H,02H,01H,00H,00H,00H,00H,00H,00H
   DB  00H,00H,00H,00H,00H,00H,01H,02H,02H,03H,04H,05H,06H,07H,08H,09H
   DB  0AH,0BH,0DH,0EH,10H,11H,13H,15H,16H,18H,1AH,1CH,1EH,20H,22H,25H
   DB  27H,29H,2BH,2EH,30H,33H,35H,38H,3AH,3DH,40H,43H,45H,48H,4CH,4EH
   DB  51H,55H,57H,5AH,5DH,60H,63H,66H,69H,6CH,6FH,72H,76H,79H,7CH,7EH

;==========================================================

;DAC输出方波子程序:用示波器观察输出的信号。

;==========================================================
Square:
          MOV      A,#00H
          MOV      B,A
          LCALL  PCF_DA         ;启动DA转换
SQU1:
          JNB  K4,SQU2          ;退出
          MOV  @R1,A
          LCALL  PCF_DA1         ;DA转换
          LCALL    DELAY
          MOV      A,B
          CPL      A
          MOV      B,A
          AJMP     SQU1
SQU2:
          LCALL  STOP
          SETB  20H.1
          LCALL  BEEP_BL
          RET
;===================================================
;DAC输出三角波子程序
;单片机从数字量0开始,逐次加1直到255,然后从输出
;255逐次减1直至为0,即可输出连续三角波。
;===================================================
Triangle:
          MOV  A,#00H
          MOV  B,A
          LCALL  PCF_DA         ;启动DA转换

SJ_UP:
          MOV  @R1,A
          LCALL  PCF_DA1        ;启动DA转换
          JNB  K4,SJ_END
          INC  B                ;上升沿
          MOV  A,B
          CJNE  A,#0FFH,SJ_UP
SJ_DOWN:
          MOV  @R1,A
          LCALL  PCF_DA1        ;启动DA转换
          JNB  K4,SJ_END
          DEC  B                ;下降沿
          MOV  A,B
          CJNE  A,#00H,SJ_DOWN
          AJMP  SJ_UP           ;连续输出波型
SJ_END:
          LCALL  STOP
          SETB  20H.1
          LCALL  BEEP_BL
          RET

;=========================================================
;DAC输出梯形波
;单片机从数字量0开始,逐次加1直到255,保持255次,
;然后从输出255逐次减1直至为0,如此重复,即可输出连续梯形波。
;=========================================================
Echelon:
          MOV  A,#00H
          MOV  B,A
          LCALL  PCF_DA         ;启动DA转换
TX_UP:
          MOV  @R1,A
          LCALL  PCF_DA1        ;DA转换
          INC  B                 ;上升沿
          MOV  A,B
          CJNE  A,#0FFH,TX_UP
          MOV  R4,#0FFH
TX_BEEP:
          JNB  K4,TX_END
          MOV  A,B
          MOV  @R1,A            ;保持高电平
          LCALL  PCF_DA1        ;DA转换
          DJNZ  R4,TX_BEEP
          MOV  A,B
TX_DOWN:
          MOV  @R1,A
          LCALL  PCF_DA1        ;DA转换
          DEC  B                ;下降沿
          MOV  A,B
          CJNE  A,#00H,TX_DOWN
          AJMP  TX_UP
TX_END:
          LCALL  STOP
          SETB  20H.1
          LCALL  BEEP_BL
          RET
;====================================================
;DAC输出锯齿波子程序:用示波器观察输出的信号。
;====================================================
Sawtooth:
          MOV      A,#0
          MOV      B,A
          LCALL  PCF_DA         ;启动DA转换
JUCHI1:
          JNB  K4,JUCHI_END
          MOV  @R1,A
          LCALL  PCF_DA1        ;DA转换
          MOV      A,B
          INC      B
          AJMP     JUCHI1
JUCHI_END:
          LCALL  STOP
          SETB  20H.1
          LCALL  BEEP_BL
          RET
;**************************************************
;*             IIC 总线驱动程序                   *
;**************************************************

;==================================================
;总线启动子程序
;==================================================
STR:
           NOP
           SETB  SDA
           NOP
           SETB  SCL    ;起始条件建立时间大于4.7us
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR  SDA
           NOP          ;起始条件锁定时间大于4.7us
           NOP
           NOP
           NOP
           NOP
           CLR  SCL     ;钳住总线,准备发数据
           NOP
           RET
;==================================================
;发送一个字节子程序
;字节数据放入ACC
;==================================================
WR0:
           NOP
           MOV  R3,#08H
           CLR  SCL
           CLR  C
LL0:
           RLC  A
           JC  LL1
           LJMP  LL2
LL4:
           DJNZ  R3,LL0
           RET
LL1:
           NOP
           SETB  SDA
           NOP
           SETB  SCL
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR  SCL

           ;CLR  SDA
           LJMP  LL4
LL2:
           NOP
           CLR  SDA
           NOP
           NOP
           SETB  SCL
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR  SCL
           LJMP  LL4
;=======================================================
;发送应答信号子程序
;=======================================================
YIDA:
           CLR   SDA
           NOP
           NOP
           SETB  SCL
           NOP
           NOP
           NOP
           NOP
           NOP
           CLR   SCL
           NOP
           NOP
           RET
;======================================================
;发送非应答信号子程序
;======================================================
YIDAF:
           NOP
           SETB  SDA
           NOP
           NOP
           SETB  SCL
           NOP
           NOP
           NOP
           CLR  SDA
           NOP
           NOP
           NOP
           CLR  SCL
           NOP
           NOP
           RET
;======================================================
;接收一个字节子程序
;======================================================
RD0:
          MOV  R3,#08H
SS0:
          SETB  SDA        ;置P1.3为输入
          NOP
          NOP
          SETB  SCL        ;时钟线为高,接收数据位。
          NOP
          NOP
          ;MOV  A,P1        ;读取数据位
          ;JNB  ACC.3,SS1
          MOV  C,SDA
          JNC  SS1
          LJMP  SS2
SS3:
          DJNZ  R3,SS0
          CLR  SDA
          NOP
          NOP
          SETB  SCL
          RET
SS1:
          NOP
          CLR  C
          MOV  A,R4
          RLC  A
          MOV  R4,A
          CLR  SCL
          LJMP  SS3
SS2:
          SETB  C
          MOV  A,R4
          RLC  A
          MOV  R4,A
          CLR  SCL
          LJMP  SS3
;==================================================
;应答位查询子程序
;==================================================
CHEK:
          SETB  SDA          ;设P1.3为输入
          NOP
          NOP
          SETB  SCL
          CLR  F0
          NOP
          NOP
          MOV  C,SDA
          JNC  GEND
          ;MOV  A,P1
          ;JNB  ACC.3,GEND
          SETB  F0
GEND:
          NOP
          CLR  SCL
          NOP
          RET
;==================================================
;停止子程序
;==================================================
STOP:
          NOP
          CLR   SDA
          NOP
          SETB  SCL
          NOP
          NOP
          NOP
          NOP
          NOP
          SETB  SDA
          NOP
          NOP
          NOP
          NOP
          NOP
          CLR   SCL
          RET
;==================================================
          END             ;结束


⌨️ 快捷键说明

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