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

📄 job2.asm

📁 单片机数码管显示 数据采集 模拟数字转换
💻 ASM
字号:
;接口与数据定义
DATA_IN	     EQU     28H
DATA_OUT     EQU     29H
 
CHR          EQU     2CH	;频道号

BIT_COUNT    EQU     40H
TIMER        EQU     41H
TIMER1       EQU     42H
GEW          EQU     43H
TENTH        EQU     44H
HUNDREDTH    EQU     45H
SUMH         EQU     4AH
SUML         EQU     4BH

GRD	     EQU     66H


SCL          BIT     P0.0	; UV1316
SDA          BIT     P0.1



ZENGB        BIT     P0.5

CLK  	     BIT     P1.4      	; 2543
DIN          BIT     P1.5
DOUT         BIT     P1.6
CS           BIT     P1.7          

CS1          BIT     P2.0    	; 7279
CLK12        BIT     P2.1
DAT          BIT     P2.2 
KEY          BIT     P2.3	        
CS2          BIT     P2.4

;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          ORG   0030H
	  AJMP	START
START:    ; ----------------------------------------------
                ;---------------------------------
          CALL DELAY_25MS
          MOV  DATA_OUT,#10100100B ;发复位指令
          CALL SEND

          MOV  DATA_OUT,#10111111B ;发送闪烁指令
          CALL SEND
          SETB CS1                 ;恢复cs为高电平

          MOV  R3,#00H
MAIN:     JB   KEY,MAIN             ;检测是否有键按下
          CJNE R3,#00H,ONEADD
          MOV  DATA_OUT,#10100100B  ;发复位指令
          CALL SEND

          MOV  DATA_OUT,#81H        ;方式0译码  数码管第2位显示0   
          CALL SEND
          MOV  DATA_OUT,#00H
          CALL SEND

ONEADD:   MOV  DATA_OUT,#80H        ;方式0译码  数码管第1位显示N  
          CALL SEND
          MOV  DATA_OUT,R3
          CALL SEND
          SETB CS1  

HH1:         CJNE R3,#01H,HH2
             AJMP GAP1
HH2:         CJNE R3,#02H,HH3
	     AJMP GAP2
HH3:         CJNE R3,#03H,HH4
             AJMP GAP3
HH4:         CJNE R3,#04H,HH5
             AJMP GAP4
HH5:         CJNE R3,#05H,HH6
             AJMP GAP5
HH6:         CJNE R3,#06H,HH7
             AJMP GAP6
HH7:         CJNE R3,#07H,HH8
             AJMP GAP7
HH8:         CJNE R3,#08H,HH0
             AJMP GAP8                          
HH0:         MOV R3,#00H  
        
WAIT:     JNB  KEY,WAIT             ;等待按踺放开
          INC  R3
          JMP  MAIN
                ;--------------------------------
          ;----------------------------------------------



GAP1:     MOV   DATA_OUT,#00H    ;采集第一个通道
     	  CALL  TLC2543
          CALL  ZHUAN
          MOV  DATA_OUT,#87H     ;方式0译码  数码管高位第8显示
          CALL HD7279
          SETB CS1
	  CALL DL500
          JB   KEY,GAP1 
          AJMP WAIT


GAP2:	  MOV   DATA_OUT,#10H	 ;采集第二个通道
	  CALL  TLC2543
	  CALL  ZHUAN
	  MOV  DATA_OUT,#87H     ;方式0译玛  数码管位第5位显示
	  CALL HD7279
	  SETB CS1
	  CALL DL500
          JB   KEY,GAP2
          AJMP WAIT

GAP3:    CALL GET_TEMPER

          CALL ZHUAN
          MOV  DATA_OUT,#87H 
	  CALL HD7279
          SETB CS1	
          AJMP WAIT

GAP4:     AJMP WAIT
GAP5:     AJMP WAIT
GAP6:     AJMP WAIT
GAP7:     AJMP WAIT
GAP8:     MOV R3,#00H
          AJMP WAIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;采集子程序:TLC2543;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;入口:DATA_OUT:采集口,串行方式
;;;;;;;;;;;;;;;出口:SUMH、SUML:采集结果
TLC2543:  SETB	CS  			;TLC2543的初始化 MOV P1,#11101111            
       	  CLR   CLK
          MOV   R5,#5        		;对同一个通道采集5次,第一次为无效字节             
          MOV   R1, #GRD        	;R1保存寄存器首地址 
            
KC:       CLR   CS             		;下降沿到开始采集
          MOV   R0, #0CH        	;传送12BIT计数
          MOV   A, DATA_OUT     	;取采集口                     
GATHER:   CLR   C
          MOV   C, DOUT         	;读入转换数据到C
          RLC   A               	;进位C(1位转换数据)左移入A,将1位控制位移入C
          MOV   DIN,C           	;送出串行输出控制位  
          SETB  CLK            		
          NOP
	  NOP
          CLR   CLK            
          CJNE  R0, #5, D4  
          MOV   @R1, A          	;保留高八位转换结果,在@GRD中              
          INC   R1                            
          CLR   A                             
D4:       DJNZ  R0, GATHER                    
          SETB  CS              	;接收完转换数据                          
          ANL   A, #0FH          	;保留低四位  
          MOV   @R1, A           	;存入单元    
          DEC   R1

          MOV   A,@R1			;存放格式规范化                         
          INC   R1                           
          SWAP  A                             
          XCHD  A,@R1                         
          DEC   R1                            
          MOV   @R1,A      	             
                                             
          CJNE  R5, #5, ADD5                    
          MOV   SUMH, #00H       	;第一个转换结果无效               
          MOV   SUML, #00H                    
          JMP   AVERAGE                            
ADD5:     MOV   A, SUML          	;对同一个口采四次,四次结果相加
          ADD   A, @R1
          MOV   SUML, A
          INC   R1      
          MOV   A, SUMH 
          ADDC  A, @R1  
          MOV   SUMH, A
          DEC   R1 
AVERAGE:  DJNZ  R5, KC          	;五个没采完,继续      
  
          CLR   C     			;求均值:总和除4,即右移2次         
          MOV   A, SUMH         	
          RRC   A             
          MOV   SUMH, A       
          MOV   A, SUML       
          RRC   A             
          MOV   SUML, A 
      
          CLR   C
          MOV   A, SUMH
          RRC   A
          MOV   SUMH, A 
          MOV   A, SUML 
          RRC   A       
          MOV   SUML, A
	  RET
;;;;;;;;;;;;;;;采集子程序:TLC2543;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;12位二进制数转换成三位BCD码;;;;;;;;;;
;;;;;;;;;;;;;;;入口:SUMH,SUML;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;出口:GEW,TENTH,HUNDREDTH;;;;;;;;;;;;
ZHUAN: 	  MOV	R1, #GRD        	;R1保存寄存器首地址
          MOV 	@R1,SUML
	  INC  	R1
	  MOV  	@R1,SUMH
	  DEC  	R1    
     
	  ACALL MUL5     		;X5
	  ANL 	A,#0F0H    		;保存BCD码
	  SWAP 	A
	  MOV 	GEW,A      		;保存整数部分

	  ACALL MUL5     		;X10
	  ACALL MUL2
	  ANL 	A,#0F0H    		;保存BCD码
	  SWAP 	A
	  MOV 	TENTH,A 		;保存十分位
   
	  ACALL MUL5     		;X10
	  ACALL MUL2
	  ANL 	A,#0F0H  
	  SWAP 	A
	  MOV 	HUNDREDTH,A		;保存百分位

	  ACALL MUL5                    ;X10
	  ACALL MUL2
	  ANL 	A,#0F0H     		;取BCD码的值进行四舍五入
	  CLR 	C
	  SUBB 	A,#50H                  ;??????????????????????????????????????
	  CPL 	C  
          CLR   PSW.6           ;;;;;;;;;;;;;;;;;;;个人认为应该在这个地方加 clr psw.6
	  MOV 	A,HUNDREDTH             
	  ADDC 	A,#0
	  DA 	A  
	  MOV 	HUNDREDTH,A 
          CLR   c                ;;;;;;;;;;;;;;;
          MOV   c,PSW.6          ;;;;;;;;;;;;;;;
	  MOV 	A,TENTH                  ;这个地方应该判断PSW.6位的数据   
	  ADDC  A,#0                      
	  DA A
	  MOV TENTH,A
	  MOV  C,PSW.6           ;;;;;;;;;;;;;;;;;
	  MOV  A,GEW             ;;;;;;;;;;;;;;;;;
          ADDC A,#0              ;;;;;;;;;;;;;;;;;
	  MOV  GEW,A             ;;;;;;;;;;;;;;;;;
	  RET                

MUL5:     MOV 	A,@R1			;目标数(两字节)乘五,得数覆盖该目标数
	  MOV 	B,#05H
	  MUL 	AB
	  MOV 	@R1,A
	  MOV 	R2,B
	  INC 	R1
	  MOV 	A,@R1
	  ANL 	A,#0FH
	  MOV 	B,#05H
	  MUL 	AB
	  ADD 	A,R2                    ;A中保存着乘以5后的高字节
	  MOV 	@R1,A
	  DEC 	R1       
	  RET

MUL2:     CLR 	C     			;目标乘数二,相当于左移一次
	  MOV	A,@R1
	  RLC 	A
	  MOV 	@R1,A
	  INC 	R1
	  MOV 	A,@R1
	  RLC	A
	  MOV 	@R1,A
	  DEC 	R1
	  RET
;;;;;;;;;;;;;;;12位二进制数转换成三位BCD码;;;;;;;;;

;;;;;;;;;;;;;;显示子程序:HD7279;;;;;;;;;;;;;;;;;;;;
 
HD7279:	  MOV 	A,#00H
          ORL 	GEW,A                ; 逻辑或指令
               
          MOV 	R0,DATA_OUT      
          CALL 	SEND
          MOV 	DATA_OUT,GEW         ;发送个位数据到HD7279A
          CALL 	SEND

          
          MOV 	A,#0F0H
          ORL 	TENTH,A 

          DEC 	R0
          MOV 	DATA_OUT,R0
          CALL 	SEND
          MOV 	DATA_OUT,TENTH       ;发送十分位数据到HD7279A
          CALL 	SEND
                
          DEC 	R0
          MOV 	DATA_OUT,R0
          CALL 	SEND
          MOV 	DATA_OUT,HUNDREDTH   ;发送百分位数据到HD7279A
          CALL 	SEND    
          RET 

;;;;;;;;;;;;;发送1个字节到HD7279,高位在前;;;;;;;;;;;;;;;;
SEND:     MOV   BIT_COUNT, #8 
          CLR   CS1  
          CALL  LONG_DELAY
SEND_LP:  MOV   C,DATA_OUT.7
          MOV   DAT, C
          SETB  CLK12                     
          MOV   A, DATA_OUT              
          RL    A                        
          MOV   DATA_OUT, A              
          CALL  SHORT_DELAY              
          CLR   CLK12                    
          CALL  SHORT_DELAY              
          DJNZ  BIT_COUNT, SEND_LP    
          CLR   DAT        		;重设DAT口为低电平(输出状态)              
          RET
 
;;;;;;;;;从HD7279接收一个字节,高位在前;;;;;;;;;;;;;;;;;;;;;
RECEIVE:  MOV  	BIT_COUNT, #8
          SETB  DAT
   	  CALL  LONG_DELAY
RECEIVE_LP:SETB CLK12
          CALL  SHORT_DELAY
	  MOV   A, DATA_IN
	  RL    A
	  MOV   DATA_IN, A
	  MOV   C, DAT
	  MOV   DATA_IN.0,C
	  CLR   CLK12
	  CALL  SHORT_DELAY
	  DJNZ  BIT_COUNT, RECEIVE_LP
	  CLR   DAT
	  RET
;;;;;;;;;;;;;;;;;延时子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LONG_DELAY:  MOV   TIMER, #25        	;50uS
DELAY_LOOP:  DJNZ  TIMER, DELAY_LOOP
             RET

SHORT_DELAY: MOV   TIMER, #4         	;8uS 
SHORT_LOOP:  DJNZ  TIMER, SHORT_LOOP
             RET 

DL50: 	  MOV    TIMER, #0C8H           ;100ms
DL501:    MOV    TIMER1,#0FAH
DL502:    DJNZ   TIMER1,DL502
          DJNZ   TIMER, DL501
          RET

DL5:      MOV    TIMER,#20              ;10ms
DL51:     MOV    TIMER1,#0E6H
DL52:     DJNZ   TIMER1,DL52
          DJNZ   TIMER,DL51
	  RET

DL500: 	  MOV	R7,#5			;500ms
DL5001:	  CALL	DL50
	  DJNZ	R7,DL5001
	  RET

DELAY_25MS:   MOV  TIMER,#50            ;延迟约25MS
START_DELAY:   MOV  TIMER1, #255
START_DELAY1: DJNZ TIMER1,START_DELAY1
              DJNZ TIMER,START_DELAY
              RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;温度采集子程序;温度采集子程序;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;读出转换后的温度值;;;;;;;;;;;;;;;;;;;;;;

GET_TEMPER: SETB P0.2
            LCALL INIT_1820	;先复位DS18B20
            RET 		; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:  	
            MOV A,#0CCH 	; 跳过ROM匹配
            LCALL WRITE_1820
            MOV A,#44H 		; 发出温度转换命令
            LCALL WRITE_1820

            			;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
            LCALL DL500
	    LCALL DL50
	    LCALL DL50

            LCALL INIT_1820	;准备读温度前先复位

            MOV A,#0CCH		 ; 跳过ROM匹配
            LCALL WRITE_1820

            MOV A,#0BEH 	; 发出读温度命令
            LCALL WRITE_1820

            LCALL READ_18200	; 将读出的温度数据保存到SUML/SUMH 
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          ; 这是DS18B20复位初始化子程序
INIT_1820:
            SETB P0.2
            NOP
            CLR P0.2
            				;主机发出延时537微秒的复位低脉冲
            MOV R1,#3
TSR1:       MOV R0,#107
            DJNZ R0,$
            DJNZ R1,TSR1
            SETB P0.2		;然后拉高数据线
            NOP
            NOP
            NOP
            MOV R0,#25H
TSR2:       JNB P0.2,TSR3	;等待DS18B20回应
            DJNZ R0,TSR2
            LJMP TSR4 		; 延时
TSR3:
            LJMP TSR5
TSR4:
            LJMP TSR7
TSR5:
            MOV R0,#117
TSR6:
            DJNZ R0,TSR6	 ; 时序要求延时一段时间
TSR7:
            SETB P0.2
            RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            			;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
            MOV R2,#8		;一共8位数据
            CLR C
WR1:
            CLR P0.2
            MOV R3,#6
            DJNZ R3,$
            RRC A
            MOV P0.2,C
            MOV R3,#23
            DJNZ R3,$
            SETB P0.2
            NOP
            DJNZ R2,WR1
            SETB P0.2
            RET
	
            			; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 
READ_18200:	
            MOV R4,#2 		; 将温度高位和低位从DS18B20中读出
            MOV R1,SUML 	; 低位存入SUML(TEMPER_L),高位存入SUMH(TEMPER_H)
RE00:
            MOV R2,#8		;数据一共有8位
RE01:
            CLR C
            SETB P0.2
            NOP
            NOP
            CLR P0.2
            NOP
            NOP
            NOP
            SETB P0.2

            MOV R3,#9
RE10:       DJNZ R3,RE10
            MOV C,P0.2

            MOV R3,#23
RE20:       DJNZ R3,RE20
            RRC A
            DJNZ R2,RE01
            MOV @R1,A
            INC R1
            DJNZ R4,RE00
            RET

	    END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
























⌨️ 快捷键说明

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