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

📄 pcf8591-lcd1602-4ch-xianshi.asm

📁 89S52单片机做的A/D,D/A的实验的源程序PCF8591 D/A CONVERTER */ /* */ /* LCD1602显示 */ /* 参考电压接至5V电源 */ /* 最小输出电
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;显示数据初址在AD_TEMP中
;255/51=5.00V 运算
;====================================================================
TUNBCD:
             MOV  A,AD_TEMP
             MOV  B,#51
             DIV  AB
             MOV DISSTART+2,A   ;整数个位数放入DISSTART+2
             MOV  A,B           ;余数大于1AH,F0为0,乘法溢出,结果加5
             CLR  F0
             SUBB  A,#1AH       ;相减不够,C=1 表示余数小于1AH(26)
             MOV  F0,C
             MOV  A,#10
             MUL  AB            ;余数乘以10,相当于补0,继续除。
             MOV  B,#51
             DIV  AB            ;再除以51
             JB  F0,T_BCD1
             ADD  A,#5
T_BCD1:
             MOV  DISSTART+1,A  ;小数后第一位放入DISSTART+1
             MOV  A,B
             CLR  F0
             SUBB  A,#1AH
             MOV  F0,C
             MOV  A,#10
             MUL  AB
             MOV  B,#51
             DIV  AB
             JB  F0,T_BCD2
             ADD  A,#5
T_BCD2:
             MOV  DISSTART,A    ;小数后第二位放入DISSTART
             RET
;====================================================================
;蜂鸣器响一声子程序
;====================================================================
BEEP_BL:
         MOV  R6,#100
DEL1:
         CALL  DEL2
         CPL  BEEP
         DJNZ  R6,DEL1
         RET
DEL2:
         MOV  R7,#180
DEL3:
         NOP
         DJNZ  R7,DEL3
         RET
;====================================================================
DELAY:                    ;延时100MS
          MOV  R6,#200
DEL4:
          MOV  R7,#250
          DJNZ  R7,$
          DJNZ  R6,DEL4
          RET

;=====================================================
;PCF8591演示程序
;=====================================================

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

;R1 D/A转换数据指针,初值为50H。
;R2 存放D/A转换数据个数。
;========================================================
PCF_DA:
           NOP
           LCALL  STR
           MOV  A,#90H      ;写PCF8591 A/D 寻址字
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_DA
WRD1:
           MOV  A,#40H
           MOV  R1,#50H
WRD2:
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_DA
           MOV  A,@R1
           INC  R1
           DJNZ  R2,WRD2
           LCALL  STOP
           RET
;=======================================================
;A/D 转换子程序

;R1 A/D转换数据指针,初值为60H。
;60H-63H 存放4路A/D转换值
;R2 存放A/D转换数据个数。
;=======================================================
PCF_AD:
           NOP
           LCALL  STR
           MOV  A,#90H       ;写PCF8591 A/D 寻址字
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_AD     ;错误,重发。
           MOV  A,#04H       ;A/D控制字
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_AD     ;错误,重发。
PCF_AD1:
           LCALL  STR
           MOV  A,#91H       ;读PCF8591 A/D 寻址字
           LCALL  WR0
           LCALL  CHEK
           JB  F0,PCF_AD1

           MOV  R1,#AD_DATA  ;数据存储区首地址
          ; lcall  rd0        ;空读一次,调整读顺序
           ;lcall  yida
WRD3:
           LCALL  RD0
           MOV  @R1,A
           DJNZ  R2,WRD4
           LCALL  YIDAF
           LCALL  STOP
           RET
WRD4:
           LCALL  YIDA
           INC  R1
           LJMP  WRD3

;**************************************************
;*             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
           NOP
           NOP
           NOP
           CLR  SCL
           NOP
           NOP
           RET
;======================================================
;接收一个字节子程序
;======================================================
RD0:
          MOV  R3,#08H
SS0:
          SETB  SDA        ;置P1.1为输入
          NOP
          NOP
          SETB  SCL        ;时钟线为高,接收数据位。
          NOP
          NOP
          MOV  A,P1        ;读取数据位
          JNB  ACC.3,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.1为输入
          NOP
          NOP
          SETB  SCL
          CLR  F0
          NOP
          NOP
          ;MOV  C,SDA
          ;JC  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 + -