51单片机测量电压和温度汇编程序lcd1602
时间: 2023-07-24 17:40:18 浏览: 115
下面是51单片机测量电压和温度的汇编程序,使用LCD1602显示:
```
; 51单片机测量电压和温度汇编程序,使用LCD1602显示
; 引脚定义:P0口连接ADC0804,P1口连接LCD1602
; 程序中使用了LCD1602的显示函数,请根据自己的需要修改
; 作者:xxx
; 定义常量和寄存器
LCD_DB equ P1 ; LCD数据口
LCD_RS equ P1.0 ; LCD寄存器选择
LCD_RW equ P1.1 ; LCD读写选择
LCD_E equ P1.2 ; LCD使能信号
ADC_CS equ P2.0 ; ADC0804片选
ADC_EOC equ P2.1 ; ADC0804转换结束信号
ADC_DATA equ P0 ; ADC0804数据口
TMP_DATA equ 30h ; 用于存储温度数据的变量
; 主程序
Main:
; 初始化LCD1602
CALL LCD_Init
; 无限循环
Loop:
; 测量电压
CALL ADC_Read
; 将电压值显示在LCD上
CALL LCD_Show_Voltage
; 延时一段时间
CALL Delay
; 测量温度
CALL TMP_Read
; 将温度值显示在LCD上
CALL LCD_Show_Temperature
; 延时一段时间
CALL Delay
; 无限循环
SJMP Loop
; LCD1602初始化函数
LCD_Init:
; 等待LCD上电稳定
CALL Delay_Long
; 设置LCD为8位数据接口,2行显示,5x7点阵字符
MOV LCD_DB, 38h
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
; 打开LCD显示,光标不闪烁,光标移动不影响字符
MOV LCD_DB, 0Ch
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
; 清屏
MOV LCD_DB, 01h
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
; 设置光标移动方向为右移,不自动滚屏
MOV LCD_DB, 06h
CLR LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
RET
; 读取ADC0804转换结果函数
ADC_Read:
; 选择ADC0804芯片
CLR ADC_CS
; 启动ADC0804转换
SETB ADC_DATA.7
CLR ADC_DATA.6
SETB ADC_DATA.5
CLR ADC_DATA.4
SETB ADC_DATA.3
CLR ADC_DATA.2
SETB ADC_DATA.1
CLR ADC_DATA.0
; 等待转换结束
WAIT_ADC:
MOV A, ADC_EOC
CJNE A, #1, WAIT_ADC
; 读取ADC0804转换结果
MOV A, ADC_DATA
; 取消ADC0804芯片选择
SETB ADC_CS
RET
; 读取温度函数
TMP_Read:
; 读取温度传感器的值
MOV A, TMP_DATA
; 转换成温度值
; 此处省略转换公式,需要根据具体温度传感器和电路进行修改
RET
; 显示电压值函数
LCD_Show_Voltage:
; 将电压值转换成ASCII码
MOV R5, A
MOV A, R5
MOV R1, #100
DIV AB, R1
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV R1, #100
DIV AB, R1
MOV R2, #10
DIV AB, R2
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV R1, #10
DIV AB, R1
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV A, #0
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
; 在LCD上显示单位
MOV A, #'V'
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
RET
; 显示温度值函数
LCD_Show_Temperature:
; 将温度值转换成ASCII码
MOV R5, A
MOV A, R5
MOV R1, #100
DIV AB, R1
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV R1, #100
DIV AB, R1
MOV R2, #10
DIV AB, R2
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV R1, #10
DIV AB, R1
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
MOV A, R5
MOV A, #0
ADD A, #30h
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
; 在LCD上显示单位
MOV A, #'C'
MOV LCD_DB, A
SETB LCD_RS
CLR LCD_RW
SETB LCD_E
CLR LCD_E
RET
; 延时函数
Delay:
; 此处省略延时函数,需要根据具体情况进行修改
RET
; 较长的延时函数
Delay_Long:
; 此处省略较长的延时函数,需要根据具体情况进行修改
RET
```
注意,上述程序中的ADC0804芯片是8位分辨率的模数转换器,可以将模拟电压转换成数字量,温度传感器的转换方法和公式需要根据具体传感器和电路进行修改。另外,上述程序中的LCD显示函数也需要根据具体LCD型号进行修改。
阅读全文