用51单片机控制tm1638 显示实时电压
时间: 2023-10-05 21:05:27 浏览: 89
tm1812程序实例
好的,我会尽力回答您的问题。首先,您需要连接51单片机和TM1638模块。接下来,您需要编写程序来读取电压并将其显示在TM1638上。
以下是一个示例程序,用于读取电压并将其显示在TM1638上:
```c
#include <reg51.h>
#define CLK P3_6
#define DIO P3_5
#define STB P3_4
void delay(unsigned int i)
{
while(i--);
}
void TM1638_Write(unsigned char data)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
CLK = 0;
DIO = (data & 0x01);
data >>= 1;
CLK = 1;
}
}
void TM1638_Init(void)
{
STB = 0;
TM1638_Write(0x8f);
STB = 1;
}
void TM1638_Display(unsigned char *p)
{
unsigned char i;
STB = 0;
TM1638_Write(0x40);
for(i = 0; i < 8; i++)
{
TM1638_Write(p[i]);
}
STB = 1;
}
unsigned int Get_ADC_Result(void)
{
unsigned int val;
ADC_CONTR = 0x80; //启动ADC转换
while(!(ADC_CONTR & 0x20)); //等待转换完成
val = ADC_RES;
val = (val << 2) + ADC_RESL;
return val;
}
void main()
{
unsigned char i;
unsigned int voltage;
unsigned char display_buf[8];
TM1638_Init();
while(1)
{
voltage = Get_ADC_Result();
voltage = voltage * 5 / 1024; //换算成电压,单位为V
display_buf[0] = 0x3f;
display_buf[1] = 0x06;
display_buf[2] = 0x5b;
display_buf[3] = 0x4f;
display_buf[4] = 0x66;
display_buf[5] = 0x6d;
display_buf[6] = 0x7d;
display_buf[7] = 0x07;
for(i = 0; i < 8; i++)
{
if(i == 2)
{
display_buf[i] = 0x00; //清空小数点
}
else if(i == 4)
{
display_buf[i] = 0x00; //清空单位
}
else if(i == 6)
{
display_buf[i] = 0x00; //清空千位
}
else if(i == 7)
{
display_buf[i] = voltage % 10; //个位
}
else
{
display_buf[i] = voltage / 10; //十位、百位
voltage /= 10;
}
display_buf[i] = display_buf[i] | 0x80; //打开对应的LED
}
TM1638_Display(display_buf);
delay(10000);
}
}
```
在这个程序中,我们使用了51单片机的ADC模块来读取电压值,并使用TM1638模块来显示电压值。我们将电压值乘以5并除以1024,以将其转换为电压值。我们还使用了TM1638的LED来显示电压值的小数点和单位,并使用7个数码管来显示电压值的整数部分。我们每100ms更新一次显示值。
希望这个程序能对您有所帮助!
阅读全文