汇编51单片机、ADC0832测电阻、LCD1602显示
时间:2023-01-24 22:00:00
上单片机课程的老师要求用汇编程序,看到网上有很多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(11101000=1000000+11111000=256+244) ADD A,B ;A=245、加B是因为B值除以51后余数为1,要加低位计算,否则会漏掉一些数字 MOV R0,A ;保存低值,因为以后要用A MOV A,#05H ;A=5,B=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可获得100位(5)。同样,其他最大电阻不同的滑动变阻器也可以修改相应的除数。其原理是将电压映射到电阻的函数关系。将百位、十位、个位存储在不同的寄存器或地址中,然后将数据给出LCD1602显示。