求程序代码:51单片机8位动态数码管数字电压显示,经过mcp3001串行A/D转换后,利用8位动态数码管显示外部电压的数值。要求精确到小数点后2位。外部电压改变的时候,显示的电压数值也要随之改变,注意,最后一个字符为大写的字符“U”
时间: 2024-03-02 22:52:05 浏览: 65
以下是基于51单片机和MCP3001 A/D转换芯片的代码,可以实现8位动态数码管数字电压显示:
```c
#include<reg51.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define Uchar unsigned char
#define Uint unsigned int
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DOUT=P1^2;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管显示0~9
uint result;
void delay(uint i)
{
while(i--);
}
void write_com(uchar com)
{
uchar i;
CS=0;
CLK=0;
for(i=0;i<8;i++)
{
if(com&0x80) DOUT=1;
else DOUT=0;
CLK=1;
CLK=0;
com<<=1;
}
}
void write_date(uchar date)
{
uchar i;
CS=1;
CLK=0;
for(i=0;i<8;i++)
{
if(date&0x80) DOUT=1;
else DOUT=0;
CLK=1;
CLK=0;
date<<=1;
}
}
void init()
{
write_com(0x9f); // 打开数码管
write_com(0x40); // 显示位置为首位
write_com(0x06); // 显示模式为增量显示,不移位
write_com(0x01); // 显示清零
}
void main()
{
uchar i,j;
float voltage;
init();
while(1)
{
CS=1;
CLK=0;
DOUT=1;
CLK=1;
CLK=0;
CLK=1;
CLK=0;
CLK=1;
CLK=0;
CLK=1;
CLK=0;
CLK=1;
CLK=0;
result=0;
for(i=0;i<10;i++)
{
CLK=1;
result<<=1;
CLK=0;
if(DOUT) result++;
}
voltage=result*5.0/1024; // 外部电压转化为电压值
j=(uchar)(voltage*10)%10; // 取小数点后一位
write_date(table[(uchar)(voltage)]); // 显示整数部分
write_com(0x40+1); // 显示小数点
write_date(table[j]); // 显示小数部分
write_date(0x75); // 显示大写字母U
}
}
```
需要说明的是,该代码只是提供思路和参考,具体实现需要根据硬件电路和外设接口进行调整。
阅读全文