我是靠谱客的博主 激动书包,最近开发中收集的这篇文章主要介绍汇编51单片机、ADC0832测电阻、LCD1602显示,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上单片机课程的老师要求用汇编写程序,看到网上用C的比较多,希望对想用汇编做东西的人有些帮助。

先了解汇编程序、51单片机、ADC0832接收数据时序、LCD1602显示原理再理解程序比较好。这些模块的资料CSDN上已经有很多人发过了。想要理解的百度一下或者在本站搜索就可以。

仿真图:

 

程序:

   AD_CLK EQU P2.2
   AD_DAT EQU P2.4
   AD_CS  EQU P2.3

   AD_TEMP   EQU   2FH    ;AD采样值存放单元

   RS BIT P2.7
   RW BIT P2.6
   EN BIT P2.5

ORG 0300H
AJMP MAIN

MAIN: mov a,#00h
      mov b,#00h

AD_CONV:
            SETB AD_CS          ;一个转换周期开始
            CLR  AD_CLK
            CLR  AD_CS          ;CS置0,片选有效
            SETB AD_DAT         ;DI置1,起始位
            SETB AD_CLK         ;第一个脉冲
            CLR  AD_DAT         ;在负跳变之前加一个DI反转操作
            CLR  AD_CLK
            SETB AD_DAT         ;DI置1,设为单通道
            SETB AD_CLK         ;第二个脉冲
            CLR  AD_DAT
            CLR  AD_CLK
            CLR  AD_DAT         ;DI置0,选择通道0
            SETB AD_CLK         ;第三个脉冲
            SETB AD_DAT
            CLR  AD_CLK
            NOP
            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
            MOV AD_TEMP,A       ;转换结果存入AD_TEMP


MOV B,#51     ;B=51,A=254 本来#33h     255/5	   255/10
DIV AB
ADD A,#'0'
MOV R5,A
;-------------------------------
     MOV A,B         ;A= B=50
	 MOV B,#0AH      ;A=50,B= 10
	 MUL AB          ;A=244,B=1=256(因为计算后B保存高位,111110100=100000000+11110100=256+244)
	 ADD A,B         ;A=245,加B是因为b的值除以51后余数为1,要加入低位中进行计算,否则会漏掉一些数
	 MOV R0,A        ;保存低位的值,因为后面要用A
	 MOV A,#05H      ;A=5,B=1将A赋值为5,是因为B是高位,B=1实际是B=100000000=256除以51后为五
	 MUL AB          ;A=5,B=0
	 MOV R1,A        ;这个5的值是小数点后的一部分,还可能因为最开始A输入的值的不同而等于零,A的实际的数字是以A=0xFE计算所得
	 MOV A,R0        ;A=245,B=0;
	 MOV B,#33H      ;A=245,B=51
	 DIV AB          ;A=4,B=41
	 ADD A,R1

ADD A,#'0'
MOV R4,A
;-------------------------------

     MOV A,#0AH      ;A=10,B=41
	 MUL  AB         ;A=9A=154,B=1=256
	 ADD A,B         ;A=9B=155,B=1=256
	 MOV R0,A        ;A=155,R0=155
	 MOV A,#05H      ;A=5,B=1
	 MUL AB          ;A=5,B=0
	 MOV R1,A        ;R1=A=5,B=0
	 MOV A,R0        ;A=155,B=0
	 MOV B,#33H	     ;A=155,B=51=0X33
	 DIV  AB         ;A=3,B=2
	 ADD A,R1       ;R1=8

ADD A,#'0'
MOV R3,A
;----------------------------------

LCD1602:
        CALL INIT	
     	MOV A ,#40H                   
		CALL XML	
		CALL WRITE_ZFC		
		MOV A ,#80H			
		CALL XML

	    MOV A,#'R'
		CALL XSJ

		mov a,#':'
		call xsj
							
		MOV A ,R5         
		CALL XSJ

		MOV A,R4
		CALL XSJ

		MOV A,R3
		CALL XSJ

		CALL DELAY1
		CALL DELAY1
		CALL DELAY1
		CALL DELAY1

		JMP $
		
						                   								
XML: 	    CLR RS			           
			CLR RW                 
			CLR EN
			MOV P0 ,A
			CALL DELAY 
			SETB EN
			CALL DELAY 
			CLR EN 
			RET
					  
XSJ:	    SETB RS			  
			CLR RW
			CLR EN
			MOV P0 ,A
			CALL DELAY 
			SETB EN
			CALL DELAY 
			CLR EN 
			RET			
INIT:	    		                       
            CALL DELAY
			MOV A,#38H	  
			CALL XML
			MOV A,#0CH       
			CALL XML
			MOV A,#06H	 
			CALL XML
			MOV A,#01H	 
			CALL XML
			RET

WRITE_ZFC:	MOV R0 ,#48	              

DELAY:  MOV R6 ,#25                                         
D2: 	MOV R7,#18
		DJNZ R7 ,$							  
		DJNZ R6 ,D2
		RET

DELAY1: MOV R6 ,#200	     ;按键延时
D3: 	MOV R7,#200
		DJNZ R7 ,$
		DJNZ R6 ,D3
		RET
END

说明:理解ADC0832,注重接收数据时序问题,其实ADC0832接收的是电压模拟量,然后转化为数字量并将数据发送给MCU。对于8位二进制数据而言对应最大的十进制数位255,假设提供的滑动变阻器最大阻值为500,那么接收到的数据(假设为255)除以51可以得到百位(得到5),同理其他最大阻值不同的滑动变阻器,修改相应的除数。其原理就是将电压映射到电阻的函数关系。分别用不同的寄存器或地址存储百位、十位、个位,然后将数据给LCD1602显示。

最后

以上就是激动书包为你收集整理的汇编51单片机、ADC0832测电阻、LCD1602显示的全部内容,希望文章能够帮你解决汇编51单片机、ADC0832测电阻、LCD1602显示所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部