概述
上单片机课程的老师要求用汇编写程序,看到网上用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显示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复