8051单片机用四位动态数码管显示显示MCP3001A/D芯片的转换后的电压数值,跟随外部电压改变。保留小数点后两位,最后一位为大写字符“U”。程序代码。
时间: 2024-03-02 13:48:54 浏览: 66
通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中
5星 · 资源好评率100%
以下是8051单片机使用四位动态数码管显示MCP3001A/D芯片转换后的电压值的程序代码:
```
#include <reg52.h>
#define DS P0
#define SH_CP P1_0
#define ST_CP P1_1
sbit CS = P3_4; // MCP3001A/D芯片的CS引脚
sbit CLK = P3_5; // MCP3001A/D芯片的CLK引脚
sbit DOUT = P3_6; // MCP3001A/D芯片的DOUT引脚
unsigned int adc_value = 0; // 存储ADC转换后的数值
// 数码管的段码定义
unsigned char code digit_code[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
// 数码管的位码定义
unsigned char code digit_pos[] = {
0xfe, 0xfd, 0xfb, 0xf7
};
// 数码管动态显示函数
void dynamic_display(unsigned int value)
{
unsigned char i, j, k, digit;
unsigned int temp;
// 将ADC转换后的数值乘以5,再除以1024,得到电压值(单位:V)
temp = value * 5 / 1024;
// 将电压值分解成千位、百位、十位、个位
i = temp / 1000;
j = temp % 1000 / 100;
k = temp % 100 / 10;
digit = temp % 10;
// 数码管动态显示电压值
for (i = 0; i < 100; i++) {
// 显示千位
DS = digit_code[i % 10];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[i % 10];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[digit_pos[0]];
SH_CP = 0;
SH_CP = 1;
// 显示百位
DS = digit_code[j];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[digit_pos[1]];
SH_CP = 0;
SH_CP = 1;
// 显示十位
DS = digit_code[k];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[digit_pos[2]];
SH_CP = 0;
SH_CP = 1;
// 显示个位
DS = digit_code[digit];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[digit_pos[3]];
SH_CP = 0;
SH_CP = 1;
}
// 在最后一位上显示字符“U”
DS = digit_code[0x0f];
SH_CP = 0;
SH_CP = 1;
DS = digit_code[digit_pos[3]];
SH_CP = 0;
SH_CP = 1;
}
// MCP3001A/D芯片读取函数
unsigned int read_adc()
{
unsigned char i;
unsigned int adc_value = 0;
// 通过CS引脚将MCP3001A/D芯片选通
CS = 0;
// 发送启动转换命令
CLK = 0;
CLK = 1;
// 读取12位转换结果
for (i = 0; i < 12; i++) {
CLK = 0;
adc_value <<= 1;
if (DOUT) {
adc_value |= 0x01;
}
CLK = 1;
}
// 取消选通MCP3001A/D芯片
CS = 1;
return adc_value;
}
void main()
{
// 初始化数码管显示
DS = 0xff;
SH_CP = 0;
ST_CP = 0;
// 循环读取ADC转换结果并动态显示电压值
while (1) {
adc_value = read_adc();
dynamic_display(adc_value);
}
}
```
阅读全文