51单片机at89c51数字电压表代码
时间: 2023-12-08 15:04:16 浏览: 75
用89C51单片机实现数字电压表
以下是一个基于AT89C51单片机的简单数字电压表代码:
```c
#include <reg51.h>
#define LCD_DATA P0 // LCD 数据线连接到 P0 口
sbit RS = P2^0; // RS 控制线接到 P2.0 口
sbit EN = P2^1; // EN 控制线接到 P2.1 口
void delay(unsigned int ms) // 延时函数
{
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 110; j++);
}
void lcd_cmd(unsigned char cmd) // 发送指令到 LCD
{
RS = 0; // RS=0,发送命令
LCD_DATA = cmd;
EN = 1; // 使能
delay(1);
EN = 0; // 禁能
delay(1);
}
void lcd_data(unsigned char dat) // 发送数据到 LCD
{
RS = 1; // RS=1,发送数据
LCD_DATA = dat;
EN = 1; // 使能
delay(1);
EN = 0; // 禁能
delay(1);
}
void lcd_init() // LCD 初始化
{
lcd_cmd(0x38); // 设置显示模式 8 位数据、 2 行、 5x7 点阵字体
lcd_cmd(0x0C); // 打开显示,不显示光标
lcd_cmd(0x06); // 光标右移,字符不移动
lcd_cmd(0x01); // 清屏
}
void main()
{
unsigned int adc_value;
float voltage;
unsigned char a, b, c, d;
lcd_init(); // LCD 初始化
while (1)
{
ADC_CONTR = 0x81; // 使能 ADC,设置转换方式
delay(10); // 延时等待转换完成
adc_value = ADC_RES;
voltage = adc_value * 5.0 / 1024.0; // 计算电压值
a = (int)voltage / 10 + 0x30; // 分离出千位数
b = (int)voltage % 10 + 0x30; // 分离出百位数
c = (int)(voltage * 10) % 10 + 0x30; // 分离出十位数
d = (int)(voltage * 100) % 10 + 0x30; // 分离出个位数
lcd_cmd(0x80); // 光标移到第一行第一列
lcd_data(a); // 显示千位数
lcd_data(b); // 显示百位数
lcd_data('.'); // 显示小数点
lcd_data(c); // 显示十位数
lcd_data(d); // 显示个位数
lcd_data('V'); // 显示单位
delay(500); // 延时等待下一次转换
}
}
```
该代码使用了 AT89C51 单片机内部的 ADC 模块,将采集到的模拟电压转换为数字量,然后通过计算得到电压值,并显示在连接到 P0 口的 LCD 上。具体实现细节可参考代码注释。注意,该代码并未进行任何保护,如需实际应用,需添加适当的保护措施。
阅读全文