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

📄 02_adc0832.asm

📁 adc0832模数转换_51单片机汇编和C程序
💻 ASM
字号:
;********************************************Copyright (c)***********************************
;**                               ----------------------------------			    *
;**                              |              芯控电子            |			    *
;**                              |                                  |		   	    *
;**                              |  http://shop33761453.taobao.com  |			    *
;**                              ----------------------------------                         *
;**-----------------------------------------文件信息----------------------------------------*
;**标        题: 芯控电子zb-51(v2.0)单片机开发系统演示程序 - 数字电压表_LCD1602显示         *
;**文   件   名: 02_ADC0832.asm                                                             *
;**创   建   人: 周波                                                                       *
;**最后修改日期: 2006年10月18日                                                             *
;**版        本: v1.0									    *
;**邮        箱: z_wkyx_b@tom.com 							    *
;**网        站: http://shop33761453.taobao.com                                		    *
;**-----------------------------------------功能描述----------------------------------------*
;*          ADC0832数字电压表1602LCD显示                                                    *
;*                                                                                          *
;*          调节ADC0832旁边的电位器,在LCD1602 显示 ADC0832 转换值的大小                    *
;**-----------------------------------------实验说明----------------------------------------*
;** 在进行本实验之前必须把实验板上的JUMP5跳线器短接上排                  		    *
;**										            *
;**-----------------------------------------版权声明----------------------------------------*
;** 【版权】 Copyright(C)芯控电子   All Rights Reserved            		            *
;**-----------------------------------------------------------------------------------------*
          AD_CLK  EQU  P1.6      ;ADC0832 时钟端
          AD_CS   EQU  P1.5      ;ADC0832 片选信号
          AD_DAT  EQU  P1.7      ;ADC0832 数据端
          LCD_RS  EQU  P2.5      ;LCD 数据/命令选择端
          LCD_RW  EQU  P2.6      ;LCD 读/写选择端
          LCD_EN  EQU  P2.7      ;LCD 使能信号
          LCD_X   EQU  20H       ;LCD 地址变量

            ORG  0000H
            JMP  START
;===================================================
START:      MOV  SP,#60H
            MOV  P0,#0FFH
            MOV  P2,#0FFH
            CALL  SET_LCD

START1:     CALL  AD_CONV        ;AD转换
            CALL  AD_CHULI       ;数据处理
            CALL  LCD_CONV       ;数据显示
            JMP   START1
;====================================================
;  LCD 初始化设置
;====================================================
SET_LCD:
          CLR  LCD_EN
          CALL  INIT_LCD     ;初始化 LCD
          CALL  DELAY1
          MOV  DPTR,#INFO1   ;指针指到显示信息1
          MOV  A,#1          ;显示在第一行
          CALL  LCD_SHOW
          MOV  DPTR,#INFO2   ;指针指到显示信息2
          MOV  A,#2          ;显示在第二行
          CALL  LCD_SHOW
          RET
;-----------------------------------------------------
INFO1:  DB  "DIGITALVOLTMETER",0  ;LCD 第一行显示信息
INFO2:  DB  " VOLTAGE:     V ",0  ;LCD 第二行显示信息
;-----------------------------------------------------
;-----------------------------------------------------
; LCD 接口初始化
;-----------------------------------------------------
INIT_LCD:
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#38H     ;双列显示,字形5*7点阵
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#0CH     ;开显示,关光标,
          CALL  WCOM
          CALL  DELAY1
          MOV  A,#01H     ;清除 LCD 显示屏
          CALL  WCOM
          CALL  DELAY1
          RET
;-------------------------------------------------
DELAY1:                    ;延时5MS
          MOV  R6,#25
  DEL1:   MOV  R7,#100
          DJNZ  R7,$
          DJNZ  R6,DEL1
          RET
;==================================================
;在LCD的第一行或第二行显示信息字符
;==================================================
LCD_SHOW:

          CJNE  A,#1,LINE2  ;判断是否为第一行
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        ;写入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM        ;写入命令
          CALL  CLR_LINE    ;清除该行字符数据
          MOV  A,#0C0H      ;设置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            ;填入字符
          MOVC  A,@A+DPTR   ;由消息区取出字符
          CJNE  A,#0,LC1    ;判断是否为结束码
          RET
  LC1:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET
;---------------------------------------------------
CLR_LINE:                  ;清除该行 LCD 的字符
          MOV  R0,#24
   CL1:   MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;======================================================
; 写指令使能子程序
;RS=L,RW=L,D0-D7=指令码,E=高脉冲
;=====================================================
WCOM:
          MOV  P0,A
          CLR  LCD_RS
          CLR  LCD_RW
          SETB LCD_EN
          CALL  DELAY0
          CLR  LCD_EN
          RET
;=====================================================
;写数据使能子程序
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;=====================================================
WDATA:
          MOV  P0,A
          SETB  LCD_RS
          CLR   LCD_RW
          SETB  LCD_EN
          CALL  DELAY0
          CLR   LCD_EN
          RET

DELAY0:   MOV  R7,#250     ;延时500微秒
          DJNZ  R7,$
          RET
;---------------------------------------------------
;在 LCD 第二行指定位置显示字符
;(A)=ASCII 数据, (B)=位置变量
;---------------------------------------------------
LCDP2:                    
          PUSH  ACC        ;入栈保护A
          MOV  A,B         ;设置显示地址
          ADD  A,#0C0H     ;设置LCD的第二行地址
          CALL  WCOM       ;写入命令
          POP  ACC         ;由堆栈取出A
          CALL  WDATA      ;写入数据
          RET
;=================================================
;ASCII 转换并在第二行显示数字子程序
;=================================================
LCD_CONV:
          MOV  A,R4          ;加载数据
          MOV  LCD_X,#10     ;设置位置
          CALL  SHOW_DIG2A   ;显示数据
          INC  LCD_X         ;设置位置
          MOV  A,#'.'        
          MOV  B,LCD_X           
          CALL  LCDP2        ;显示小数点
          MOV  A,R5          ;加载数据
          INC  LCD_X         ;设置位置
          CALL  SHOW_DIG2B   ;显示数据
          RET
;---------------------------------------
;整数部分转换为ASCII码,送显示
;只显示一位数
;---------------------------------------
SHOW_DIG2A:
          MOV  B,#16
          DIV  AB
          MOV  A,B        ;只取整数部分的个位
          ADD  A,#30H     ;转换为ASCII码
          MOV  B,LCD_X    ;地址变量送B
          CALL  LCDP2     ;送显示
          RET
;---------------------------------------
;小数部分转换为ASCII码,送显示
;显示两位数
;---------------------------------------
SHOW_DIG2B:
          MOV  B,#16
          DIV  AB
          ADD  A,#30H     ;转换为ASCII码
          PUSH  B
          MOV  B,LCD_X    ;地址变量送B
          CALL  LCDP2     ;送显示
          POP  B
          MOV  A,B
          ADD  A,#30H     ;转换为ASCII码
          INC  LCD_X
          MOV  B,LCD_X    ;地址变量送B
          CALL  LCDP2     ;送显示
          RET
;=========================================================
;AD0832 初始化与AD转换子程序
;(A)=AD转换值
;=========================================================
AD_CONV:                       
            SETB AD_CS          ;一个转换周期开始
            CLR  AD_CLK
            CLR  AD_CS          ;CS置0,片选有效
            SETB AD_DAT         ;DI置1,起始位
            NOP
            SETB AD_CLK         ;第一个脉冲
            CLR  AD_DAT         ;在负跳变之前加一个DI反转操作
            CLR  AD_CLK
            SETB AD_DAT         ;DI置1,设为单通道
            NOP
            SETB AD_CLK         ;第二个脉冲
            CLR  AD_DAT
            CLR  AD_CLK
            CLR  AD_DAT         ;DI置0,选择通道0
            NOP
            SETB AD_CLK         ;第三个脉冲
            SETB AD_DAT
            CLR  AD_CLK
            NOP
            SETB AD_CLK         ; 第四个脉冲
            MOV  R1,#08H        ;计数器初值,读取8位数据,
AD_READ:    CLR  AD_CLK         ;下降沿
            MOV  C,AD_DAT       ;读取DO端数据
            RLC A               ;C移入A,高位在前
            SETB AD_CLK         ;下一个脉冲
            DJNZ R1,AD_READ     ;没读完继续
            SETB  AD_CS
            RET
;====================================================
;AD转换值处理子程序
;入口:(A) =AD转换值
;出口:处理后的数据 (R4)=高位,(R5)=低位
;====================================================
AD_CHULI:
            CLR  C
            MOV  R5,#00H    ;十进制转换的低位寄存器
            MOV  R4,#00H    ;十进制转换的高位寄存器
            MOV  R3,#08H    ;十进制调整的次数
AD_CHULI1:
            RLC  A
            MOV  R2,A           ;送 R2 保存
            MOV  A,R5           ;(R5)乘2加C
            ADDC  A,R5
            DA  A               ;做十进制调整
            MOV  R5,A           ;结果存回R5
            MOV  A,R4           ;(R4)乘2加C
            ADDC  A,R4
            MOV  R4,A           ;结果存回R4
            MOV  A,R2
            DJNZ  R3,AD_CHULI1  ;是否转换完?
            MOV  A,R5           ;(R5)乘2
            ADD  A,R5
            DA  A
            MOV  R5,A           ;结果存回R5
            MOV  A,R4
            ADDC  A,R4          ;(R4)乘2加C
            DA   A
            MOV  R4,A           ;结果存回R4
            RET
;---------------------------------------------------
            END             ;结束

⌨️ 快捷键说明

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