写一段基于AT89c51的数字电压表的代码
时间: 2023-12-06 11:44:15 浏览: 26
以下是一个基于 AT89c51 的数字电压表的简单代码:
```
#include <reg52.h>
#define LCD P2 // 定义 LCD 数据总线接口
void delay(unsigned int t); // 延时函数
void lcd_init(); // LCD 初始化函数
void lcd_cmd(unsigned char c); // LCD 命令函数
void lcd_data(unsigned char d); // LCD 数据函数
void show_voltage(unsigned int voltage); // 显示电压函数
void main()
{
unsigned int voltage;
ADCON0 = 0x81; // 设置 ADC 控制寄存器,选择通道 0 和 ADC 开启
ADCON1 = 0x80; // 设置 ADC 控制寄存器,选择右对齐输出
while(1)
{
ADCON0 |= 0x04; // 启动 ADC 转换
while(ADCON0 & 0x04); // 等待转换完成
voltage = ADRESH; // 获取高 8 位电压值
voltage = voltage << 8; // 将高 8 位电压值左移 8 位
voltage |= ADRESL; // 获取低 8 位电压值
show_voltage(voltage); // 显示电压值
}
}
void delay(unsigned int t)
{
while(t--);
}
void lcd_init()
{
lcd_cmd(0x38); // 初始化 LCD,设置 8 位数据总线、2 行显示、5x7 点阵
lcd_cmd(0x0c); // 设置 LCD,显示开、光标关、闪烁关
lcd_cmd(0x06); // 设置 LCD,字符输出后地址自动加 1
lcd_cmd(0x01); // 清屏
delay(5000); // 延时等待 LCD 清屏完成
}
void lcd_cmd(unsigned char c)
{
LCD = c; // 传输命令到 LCD 数据总线
LCD &= ~0x80; // 设置 LCD_RS 为 0,选择命令模式
LCD |= 0x40; // 设置 LCD_E 为 1,开始传输命令
delay(1000); // 延时等待 LCD 处理命令
LCD &= ~0x40; // 设置 LCD_E 为 0,结束传输命令
}
void lcd_data(unsigned char d)
{
LCD = d; // 传输数据到 LCD 数据总线
LCD |= 0x80; // 设置 LCD_RS 为 1,选择数据模式
LCD |= 0x40; // 设置 LCD_E 为 1,开始传输数据
delay(1000); // 延时等待 LCD 处理数据
LCD &= ~0x40; // 设置 LCD_E 为 0,结束传输数据
}
void show_voltage(unsigned int voltage)
{
unsigned char str[4]; // 定义字符数组,用于存储电压值的每一位数字
unsigned char i;
voltage = voltage * 5 / 1024; // 将电压值转换为实际电压值
str[0] = voltage / 100 + '0'; // 获取百位数字
str[1] = voltage / 10 % 10 + '0'; // 获取十位数字
str[2] = voltage % 10 + '0'; // 获取个位数字
str[3] = 'V'; // 添加单位字符
lcd_init(); // 初始化 LCD
for(i = 0; i < 4; i++)
{
lcd_data(str[i]); // 依次显示每一位数字和单位字符
}
}
```
该程序通过 AT89c51 的 ADC 功能,获取外部电压值,并通过 LCD 显示器显示电压值。程序中的 `delay()` 函数用于延时等待 LCD 处理命令或数据。LCD 初始化函数 `lcd_init()` 用于初始化 LCD,并清屏。LCD 命令函数 `lcd_cmd()` 用于传输 LCD 命令,LCD 数据函数 `lcd_data()` 用于传输 LCD 数据。显示电压函数 `show_voltage()` 将获取到的电压值转换为实际电压值,并将每一位数字和单位字符显示在 LCD 上。