用51单片机控制tm1638 前四个数码管显示电压 后面四个数码管显示电流 一共8个数码管
时间: 2024-03-06 14:47:57 浏览: 66
51单片机使用8个数码管,在8个数码管上分别显示“12345678”这八个数字。
5星 · 资源好评率100%
好的,你需要使用51单片机和TM1638模块来控制8个数码管的显示,前四个数码管显示电压,后四个数码管显示电流。首先,你需要将51单片机和TM1638模块连接起来,然后通过编写程序来控制数码管的显示。
以下是参考代码:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P3^6; //CLK引脚
sbit DIO=P3^5; //DIO引脚
sbit CS=P3^4; //CS引脚
uchar code TubeTab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管0~9及H~L的显示码
void delay(uint t) //延时函数
{
uint i;
while(t--)
{
for(i=0;i<125;i++);
}
}
void Write_Byte(uchar dat) //向TM1638写入一个字节的数据
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DIO=dat&0x01;
dat>>=1;
CLK=1;
}
}
void Write_Command(uchar cmd) //向TM1638写入命令
{
CS=0;
delay(1);
Write_Byte(cmd);
CS=1;
delay(1);
}
void Init_TM1638() //初始化TM1638
{
Write_Command(0x8a); //设置亮度
Write_Command(0x0c); //开启显示,不显示地址
}
void Display(uchar *p) //显示函数
{
uchar i;
Write_Command(0x40); //设置自动地址递增模式
CS=0;
delay(1);
Write_Byte(0xc0); //设置起始地址为0xc0
for(i=0;i<8;i++)
{
Write_Byte(*(p+i)); //写入数据
}
CS=1;
delay(1);
}
void main()
{
uchar i;
uchar Voltage[4]={1,2,3,4}; //电压数据(示例)
uchar Current[4]={5,6,7,8}; //电流数据(示例)
Init_TM1638(); //初始化TM1638
while(1)
{
for(i=0;i<4;i++) //显示电压
{
Voltage[i]=i;
Display(&Voltage[0]); //显示电压数据
delay(500); //延时0.5秒
}
for(i=0;i<4;i++) //显示电流
{
Current[i]=i+5;
Display(&Current[0]); //显示电流数据
delay(500); //延时0.5秒
}
}
}
```
在这个程序中,我们定义了一些常量和变量,用于控制TM1638模块的工作。在`Init_TM1638()`函数中,我们设置了亮度和显示模式。在`Display()`函数中,我们设置了TM1638的自动地址递增模式,并向TM1638写入数据。
在`main()`函数中,我们定义了电压和电流的数据,并循环显示这些数据。你可以根据实际情况修改这些数据。
最后,你需要将编写好的程序下载到51单片机中,然后将TM1638模块连接到单片机上即可。
阅读全文