51单片机和温度模块测量电压和温度汇编程序lcd1602
时间: 2024-03-23 14:37:47 浏览: 56
以下是基于51单片机和温度模块测量电压和温度的汇编程序,同时配合LCD1602显示:
```assembly
;----------------------------------------------
;头文件
;----------------------------------------------
#include <reg51.h>
#include <intrins.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位寄存器
;----------------------------------------------
;函数声明
;----------------------------------------------
void delay_ms(unsigned int ms);
void lcd_write_cmd(unsigned char cmd);
void lcd_write_data(unsigned char dat);
void lcd_init();
unsigned int adc_get_result(unsigned char channel);
;----------------------------------------------
;主函数
;----------------------------------------------
void main()
{
unsigned int adc_result;
unsigned int temp;
unsigned int voltage;
unsigned char str[16];
lcd_init(); //LCD1602初始化
while(1)
{
adc_result = adc_get_result(0); //获取ADC结果
voltage = adc_result * 5 / 1024; //计算电压值
temp = (adc_result * 5 / 1024 - 0.5) * 100; //计算温度值
sprintf(str, "V:%d.%02dV T:%d.%02dC", voltage/100, voltage%100, temp/100, temp%100); //格式化字符串
lcd_write_cmd(0x80); //设置光标位置为第一行第一列
for(unsigned char i=0; i<16; i++)
{
lcd_write_data(str[i]); //写入LCD数据
}
delay_ms(500); //延时500ms
}
}
;----------------------------------------------
;函数定义
;----------------------------------------------
void delay_ms(unsigned int ms)
{
while(ms--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void lcd_write_cmd(unsigned char cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DB = cmd;
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
void lcd_write_data(unsigned char dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DB = dat;
LCD_EN = 1;
delay_ms(1);
LCD_EN = 0;
}
void lcd_init()
{
lcd_write_cmd(0x38); //设置LCD显示模式为2行,5*7点阵
lcd_write_cmd(0x0C); //设置LCD显示开启,光标关闭
lcd_write_cmd(0x06); //设置光标移动方式为右移,不移动屏幕
lcd_write_cmd(0x01); //清除LCD显示内容
}
unsigned int adc_get_result(unsigned char channel)
{
ADC_CONTR = 0x80 | (channel << 3); //设置ADC通道
delay_ms(10); //等待ADC转换完成
return (ADC_RESH << 2) | ADC_RESL; //返回ADC结果
}
```
该程序通过ADC模块测量电压值和温度值,并通过LCD1602显示。其中,adc_get_result函数用于获取ADC结果,lcd_init函数用于初始化LCD1602,lcd_write_cmd和lcd_write_data函数用于向LCD写入命令和数据,delay_ms函数用于延时。在主函数中,获取ADC结果后计算电压值和温度值,并将其格式化为字符串后写入LCD显示。
阅读全文