求代码:51单片机利用动态数码管显示外部电压的数值。外部电压的测量范围为0~2.5V。经过mcp3001串行A/D转换后显示出来。要求精确到小数点后2位。显示的例子为#“2.43U”。外部电压改变的时候,显示的电压数值也要随之改变。注意,最后一个字符为大写的字符“U”。
时间: 2024-03-02 14:50:05 浏览: 145
通过按键选择ADC0809的某一个通过进行模拟电压转换,电压值通过四位数码管进行显示。同时,将模拟电压转换数值存储在外部RAM中
5星 · 资源好评率100%
本问题需要涉及到51单片机、动态数码管、MCP3001串行A/D转换器,建议您可以先学习这些模块的基本知识,再进行编程实现。
以下是一个简单的参考代码:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^4; //定义MCP3001的CS引脚
sbit CLK = P1^5; //定义MCP3001的CLK引脚
sbit DOUT = P1^6; //定义MCP3001的DOUT引脚
sbit DIN = P1^7; //定义MCP3001的DIN引脚
uchar code table[] = { //0~9和小数点的动态数码管编码表
0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F,
0x80
};
void delay(uint n) { //延时函数
uint i, j;
for(i=0; i<n; i++) {
for(j=0; j<125; j++);
}
}
void write_ds(uchar dat, uchar num) { //写入动态数码管
uchar i, wei;
wei = 8 - num; //确定要写入的位数
for(i=0; i<wei; i++) {
P0 = 0; //清空P0口
P2 = 1 << i; //选择要写入的位
P0 = table[0]; //先清空该位
delay(1); //延时一段时间
}
for(i=0; i<num; i++) {
P0 = 0; //清空P0口
P2 = 1 << (wei+i); //选择要写入的位
P0 = table[dat%10]; //写入数字
delay(1); //延时一段时间
dat /= 10; //去掉个位数
}
P0 = 0; //清空P0口
P2 = 1 << (wei+num); //选择要写入的位
P0 = table[10]; //写入小数点
delay(1); //延时一段时间
}
uchar read_adc(uchar chn) { //读取ADC转换值
uchar i, dat;
DIN = 0; //使能
CS = 0; //片选
CLK = 0; //时钟
DIN = 1; //启动
CLK = 1;
CLK = 0;
DIN = chn | 0x18; //通道号
for(i=0; i<4; i++) { //读取12位数据
CLK = 1;
CLK = 0;
dat <<= 1;
dat |= DOUT;
}
CS = 1; //取消片选
return dat;
}
void main() {
uchar i, adc;
float v;
while(1) {
adc = read_adc(0); //读取ADC转换值
v = adc * 2.5 / 255; //转换为电压值
write_ds((uchar)(v*100), 2); //写入动态数码管
delay(100); //延时一段时间
}
}
```
上述代码实现了读取MCP3001的ADC转换值、转换为电压值并显示在动态数码管上的功能。其中,`read_adc()`函数用于读取ADC转换值,`write_ds()`函数用于写入动态数码管,`delay()`函数用于延时。在`main()`函数中,首先读取ADC转换值,然后将其转换为电压值,并调用`write_ds()`函数将其显示在动态数码管上。
阅读全文