51单片机能实现在LCD1602模块上显示AD模块采集的电压值的keil5代码
时间: 2023-06-26 19:04:31 浏览: 140
以下是基于51单片机和LCD1602模块显示AD模块采集电压值的Keil5代码:
```
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P2^2;
void delay(unsigned int i)
{
while(i--);
}
void LCD1602_Write_Cmd(unsigned char cmd)
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
delay(100);
LCD1602_E = 0;
}
void LCD1602_Write_Data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
delay(100);
LCD1602_E = 0;
}
void LCD1602_Init(void)
{
LCD1602_Write_Cmd(0x38);
LCD1602_Write_Cmd(0x0c);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01);
}
void LCD1602_Show_String(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char addr;
if(y == 0)
addr = 0x80 + x;
else
addr = 0xc0 + x;
LCD1602_Write_Cmd(addr);
while(*str)
LCD1602_Write_Data(*str++);
}
void ADC_Init(void)
{
P1ASF = 0x01; // P1.0作为ADC输入口
ADC_RES = 0; // 清零ADC转换结果寄存器
ADC_CONTR = 0xe0; // 使能ADC,设置ADC时钟为Fosc/32,选择ADC输入通道P1.0
}
unsigned int ADC_Read(unsigned char channel)
{
ADC_CONTR = 0xe0 | channel;
delay(100);
ADC_CONTR |= 0x08;
while((ADC_CONTR & 0x10) == 0);
return (ADC_RES * 256 + ADC_RESL);
}
int main()
{
unsigned int adc_value;
float voltage;
unsigned char str[16];
LCD1602_Init();
ADC_Init();
while(1)
{
adc_value = ADC_Read(0); // 读取ADC0通道的采样值
voltage = (float)adc_value * 5.0 / 1024.0; // 计算电压值
sprintf(str, "Voltage: %.2fV", voltage); // 将电压值转换为字符串
LCD1602_Show_String(0, 0, str); // 在LCD上显示电压值
delay(1000);
LCD1602_Write_Cmd(0x01); // 清屏
}
return 0;
}
```
注释已经说明了代码的主要逻辑,具体实现方法如下:
1. 定义LCD1602显示模块的引脚和函数,包括命令写入函数、数据写入函数、初始化函数和字符串显示函数。
2. 定义ADC模块的引脚和函数,包括初始化函数和读取通道采样值的函数。
3. 在主函数中初始化LCD1602和ADC模块,并进入循环,每次读取ADC0通道的采样值并计算电压值,将电压值转换成字符串并显示在LCD1602上,然后清屏,等待1秒后继续读取采样值。
需要注意的是,代码中使用了sprintf函数将电压值转换成字符串,需要在编译时加上-lscanf参数才能成功编译。
阅读全文