51单片机共阴8位数码管显示函数
时间: 2023-11-11 07:22:17 浏览: 77
以下是一个51单片机共阴8位数码管显示的函数示例:
```
void display(unsigned char num[])
{
unsigned char i;
unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管编码表,0~9十个数字
for (i = 0; i < 8; i++) // 8位数码管循环显示
{
P0 = 0xff; // 所有数码管关闭
P2 = ~(1 << i); // 打开指定位数码管
P0 = table[num[i]]; // 在指定位数码管上显示对应数字
delay(1); // 延时一定时间,使数码管能够显示数字
}
}
```
在这个函数中,传入的参数`num[]`是一个长度为8的数组,其中每个元素都是需要在对应数码管上显示的数字。在函数中,先定义了一个数码管编码表`table[]`,用于将数字转化为对应的编码。然后使用`for`循环依次打开每个数码管,并在其中显示对应的数字。最后使用`delay()`函数延时一定时间,使数码管能够显示数字。
相关问题
51单片机8位数码管显示时间
好的,下面是51单片机通过8位数码管显示时间的代码:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code Display[] = { // 数码管显示0-F的值
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
uchar hour = 10, minute = 30, second = 0; // 初始化时间为10:30:00
void DisplayTime() {
uchar hour1, hour2, minute1, minute2, second1, second2;
hour1 = hour / 10; // 小时的十位数
hour2 = hour % 10; // 小时的个位数
minute1 = minute / 10; // 分钟的十位数
minute2 = minute % 10; // 分钟的个位数
second1 = second / 10; // 秒钟的十位数
second2 = second % 10; // 秒钟的个位数
// 显示时间,共阴数码管,将位选信号取反
P0 = Display[hour1]; // 显示小时的十位数
P2 = 0xfe; // 第一位数码管
delay(5);
P0 = Display[hour2]; // 显示小时的个位数
P2 = 0xfd; // 第二位数码管
delay(5);
P0 = Display[minute1]; // 显示分钟的十位数
P2 = 0xfb; // 第三位数码管
delay(5);
P0 = Display[minute2]; // 显示分钟的个位数
P2 = 0xf7; // 第四位数码管
delay(5);
P0 = Display[second1]; // 显示秒钟的十位数
P2 = 0xef; // 第五位数码管
delay(5);
P0 = Display[second2]; // 显示秒钟的个位数
P2 = 0xdf; // 第六位数码管
delay(5);
}
void main() {
while (1) {
DisplayTime(); // 显示时间
second++; // 秒钟加1
if (second == 60) { // 如果秒钟到达60
second = 0;
minute++; // 分钟加1
if (minute == 60) { // 如果分钟到达60
minute = 0;
hour++; // 小时加1
if (hour == 24) // 如果小时到达24
hour = 0; // 重置为0
}
}
}
}
// 延时函数,具体时间根据实际情况调整
void delay(uint i) {
uint j, k;
for (j = i; j > 0; j--)
for (k = 110; k > 0; k--);
}
```
这段代码可以通过P0口控制8位数码管的显示,其中P2口用来控制数码管的位选信号。程序中通过循环实现了时间的自动更新,每隔一秒钟更新一次数码管的显示。可以根据实际情况进行修改。
求代码:基于51单片机共阴的8位数码管显示经mcp3001ad转换的外部电压
以下是基于51单片机共阴的8位数码管显示经MCP3001AD转换的外部电压的示例代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^5;
sbit CLK = P1^6;
sbit DOUT = P1^7;
uchar code numCode[] = { // 数码管显示0~9的编码表
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
void DelayMs(uint ms) { // 延时函数
uint i, j;
for (i = ms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void SendByte(uchar dat) { // 发送一个字节的数据到MCP3001AD
uchar i;
for (i = 0; i < 8; i++) {
CLK = 0;
DOUT = dat & 0x80;
dat <<= 1;
CLK = 1;
}
}
uint ReadADC() { // 读取MCP3001AD的转换值
uchar i;
uint value = 0;
CS = 0;
SendByte(0x80);
for (i = 0; i < 12; i++) {
CLK = 0;
CLK = 1;
value <<= 1;
value |= DOUT;
}
CS = 1;
return value;
}
void DisplayVoltage(uint voltage) { // 在数码管上显示电压值
uint integerPart, decimalPart;
uchar i, digit;
integerPart = voltage / 100; // 取整数部分
decimalPart = voltage % 100; // 取小数部分
for (i = 0; i < 8; i++) { // 循环显示8位数码管
digit = 0;
if (i == 2) { // 小数点位置
digit = 0x80;
} else if (i == 7) { // 最后一位显示字符U
digit = numCode[0];
} else { // 显示数字
switch (i) {
case 0: digit = numCode[integerPart / 10]; break;
case 1: digit = numCode[integerPart % 10]; break;
case 3: digit = numCode[decimalPart / 10]; break;
case 4: digit = numCode[decimalPart % 10]; break;
case 5: digit = numCode[0]; break;
case 6: digit = numCode[0]; break;
}
}
P0 = digit; // 发送数据到数码管
P2 = 1 << i; // 选择数码管
DelayMs(5); // 延时一段时间,使数码管显示稳定
P2 = 0; // 关闭数码管
}
}
void main() {
uint voltage;
while (1) {
voltage = ReadADC() * 25 / 4095; // 读取电压值并转换为0~250
DisplayVoltage(voltage); // 在数码管上显示电压值
}
}
```
这个示例代码使用了硬件SPI接口与MCP3001AD进行通信,并使用共阴的8位数码管显示电压值。您需要根据您的硬件连接和需要进行适当的修改。