51单片机和温度模块测量电压和温度用lcd1602显示的汇编语言程序
时间: 2023-09-01 14:11:11 浏览: 101
以下是基于51单片机和温度模块测量电压和温度的汇编语言程序,同时配合LCD1602显示:
```assembly
;----------------------------------------------
;头文件
;----------------------------------------------
#include <reg51.h>
;----------------------------------------------
;宏定义
;----------------------------------------------
#define LCD_DB P0
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
;----------------------------------------------
;全局变量定义
;----------------------------------------------
sfr ADC_CONTR = 0xBC; //ADC控制寄存器
sfr ADC_RES = 0xBD; //ADC结果寄存器
sfr ADC_RESH = 0xBE; //ADC结果高8位寄存器
sfr ADC_RESL = 0xBF; //ADC结果低2位寄存器
;----------------------------------------------
;函数声明
;----------------------------------------------
delay_ms: ;延时函数
mov R7, #10
Delay1:
mov R6, #100
Delay2:
djnz R6, Delay2
djnz R7, Delay1
ret
lcd_write_cmd: ;写入LCD命令函数
clr LCD_RS
clr LCD_RW
mov A, @R1
mov LCD_DB, A
setb LCD_EN
call delay_ms
clr LCD_EN
ret
lcd_write_data: ;写入LCD数据函数
setb LCD_RS
clr LCD_RW
mov A, @R1
mov LCD_DB, A
setb LCD_EN
call delay_ms
clr LCD_EN
ret
lcd_init: ;LCD初始化函数
mov R1, #LCD_Init_Table_End-LCD_Init_Table
mov DPTR, #LCD_Init_Table
LCD_Init_Loop:
movx A, @DPTR
inc DPTR
jz LCD_Init_End
call lcd_write_cmd
sjmp LCD_Init_Loop
LCD_Init_End:
ret
adc_get_result: ;获取ADC结果函数
mov ADC_CONTR, #0x80 | (R7 << 3)
call delay_ms
mov A, ADC_RESH
mov R6, A
mov A, ADC_RESL
anl A, #0x03
orl A, R6
ret
;----------------------------------------------
;常量定义
;----------------------------------------------
LCD_Init_Table:
db 0x38 ;设置LCD显示模式为2行,5*7点阵
db 0x0C ;设置LCD显示开启,光标关闭
db 0x06 ;设置光标移动方式为右移,不移动屏幕
db 0x01 ;清除LCD显示内容
LCD_Init_Table_End:
;----------------------------------------------
;主函数
;----------------------------------------------
Main:
mov SP, #0x7F ;设置栈指针
call lcd_init ;LCD初始化
Loop:
mov R7, #0 ;设置ADC通道0
call adc_get_result ;获取ADC结果
mov R6, A ;保存ADC结果
mov A, R6 ;计算电压值
mov B, #5
mul AB
mov R7, #1024
div AB
mov R0, A ;保存电压值的整数部分
mov A, B ;保存电压值的小数部分
mul AB
mov B, #100
div AB
mov R1, A ;保存电压值的小数部分
mov A, R6 ;计算温度值
mov B, #5
mul AB
mov R7, #1024
div AB
mov A, R0 ;计算温度值的整数部分
sub A, #50
mov R0, A ;保存温度值的整数部分
mov A, R1 ;计算温度值的小数部分
mov B, #2
mul AB
mov A, R7
div AB
mov R1, A ;保存温度值的小数部分
mov A, R0 ;写入LCD显示
add A, #'0'
mov @R4, A
inc R4
mov A, #'.'
mov @R4, A
inc R4
mov A, R1
add A, #'0'
mov @R4, A
inc R4
mov A, 'V'
mov @R4, A
inc R4
mov A, ':'
mov @R4, A
inc R4
mov A, R0
add A, #'0'
mov @R4, A
inc R4
mov A, #'.'
mov @R4, A
inc R4
mov A, R2
add A, #'0'
mov @R4, A
inc R4
mov A, 'T'
mov @R4, A
inc R4
mov A, ':'
mov @R4, A
inc R4
mov A, R0
add A, #50
add A, #'0'
mov @R4, A
inc R4
mov A, #'.'
mov @R4, A
inc R4
mov A, R1
add A, #'0'
mov @R4, A
inc R4
mov A, 'C'
mov @R4, A
mov R5, #16
mov R4, #0x80
Write_Loop:
mov A, @R3
call lcd_write_data
inc R3
djnz R5, Write_Loop
sjmp Loop
END
```
该程序通过ADC模块测量电压值和温度值,并通过LCD1602显示。其中,delay_ms函数用于延时,lcd_write_cmd和lcd_write_data函数用于向LCD写入命令和数据,lcd_init函数用于初始化LCD1602,adc_get_result函数用于获取ADC结果。在主函数中,获取ADC结果后计算电压值和温度值,并将其格式化为字符串后写入LCD显示。
阅读全文