功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.5V按键可快捷输出5V
2.加/减键可调节输出电压,步进0.1V,范围0~10V(可联系客服定制更高电压或功率)
3.采用DC002作为电源接口可直接输入5V给整个系统供电
4.需要注意,该方案是类似于线性电源,因此效率并不高,电源芯片会发热很严重,使用的时候需要严格重视芯片的散热工作,否则芯片容易损坏!
原理图:
PCB :
主程序:
#include "reg52.h" //头文件
#define uchar unsigned char
#define uint unsigned int
uint voltage; // DA转换变量和显示变量
sbit S1 = P2^7; // 定义数码管位选
sbit S2 = P2^6; // 定义数码管位选
sbit S3 = P2^5; // 定义数码管位选
sbit S4 = P2^4; // 定义数码管位选
sbit DP = P0^7; // 定义数码管小数点
sbit KEY_5V = P3^4; // 按键5V
sbit KEY_ADD = P3^5; // 按键加
sbit KEY_SUB = P3^6; // 按键减
sbit TLC5615_CLK = P1^1; /*定义DAC控制端口*/
sbit TLC5615_CS = P1^0;
sbit TLC5615_DIN = P1^2;
uchar code SegCode[12] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff, 0xc1}; // 数码管段码
void DelayMs(uchar n) // 显示延迟
{
uchar j;
while (n--)
{
for (j = 0; j < 110; j++)
;
}
}
void Key_Scan() // 复位按键扫描
{
if (KEY_5V == 0) // 按键按下
{
DelayMs(10);
if (KEY_5V == 0) // 按键按下
voltage = 50; // DA变量赋值为0
}
while (KEY_5V == 0); // 退出
if (KEY_ADD == 0) // 按键按下
{
DelayMs(30);
if (KEY_ADD == 0) // 按键按下
{
if (voltage < 100) // DA变量加一,最大100
{
voltage = voltage + 1;
}
}
}
// while (KEY_ADD == 0); // 退出
if (KEY_SUB == 0) // 按键按下
{
DelayMs(30);
if (KEY_SUB == 0) // 按键按下
{
if (voltage > 0) // DA变量减一,最小0
{
voltage = voltage - 1;
}
}
}
// while (KEY_SUB == 0); // 退出
}
/*显示函数*/
void display(void)
{
S1 = 0; S2 = 0; S3 = 0; S4 = 0; // 位选关
if (voltage / 100 % 10 == 0) // 判断电压十位是不是等于0
P0 = SegCode[10]; // 是的话,不显示 ,发送段码
else
P0 = SegCode[voltage / 100 % 10]; // 不是的话,就显示,发送段码
S1 = 1; S2 = 0; S3 = 0; S4 = 0; // 位选开
DelayMs(3); // 显示延迟
S1 = 0; S2 = 0; S3 = 0; S4 = 0; // 位选关
P0 = SegCode[voltage / 10 % 10]; // 发送个位段码
DP = 0; // 点亮小数点
S1 = 0; S2 = 1; S3 = 0; S4 = 0; // 位选开
DelayMs(3); // 显示延迟
S1 = 0; S2 = 0; S3 = 0; S4 = 0; // 位选关
P0 = SegCode[voltage % 10]; // 发送小数位段码
S1 = 0; S2 = 0; S3 = 1; S4 = 0; // 位选开
DelayMs(3); // 显示延迟
S1 = 0; S2 = 0; S3 = 0; S4 = 0; // 位选关
P0 = SegCode[11]; // 发送V字段码
S1 = 0; S2 = 0; S3 = 0; S4 = 1; // 位选开
DelayMs(3); // 显示延迟
S1 = 0; S2 = 0; S3 = 0; S4 = 0; // 位选关
}
void DA_Conver(unsigned int DAValue) // 控制DA转换器输出模拟电压
{
unsigned char i;
DAValue <<= 6;
TLC5615_CS = 0;
TLC5615_CLK = 0;
for (i = 0; i < 12; i++)
{
TLC5615_DIN = (bit)(DAValue & 0x8000);
TLC5615_CLK = 0;
DAValue <<= 1;
TLC5615_CLK = 1;
}
TLC5615_CS = 1;
TLC5615_CLK = 1;
}
float zh(float k) // 转化
{
float DA;
DA = k * 1024 / 250; /*2.5v参考电压!*/
return DA;
}
void init_timer() // 中断初始化
{
TMOD = 0x01; // 定义中断工作模式
TH0 = (65536 - 3500) / 256; // 定时中断时间
TL0 = (65536 - 3500) % 256;
EA = 1; // 允许中断
ET0 = 1; // 中断开
TR0 = 1;
}
void main() // 主程序
{
long DAValue = 0; // 变量初始化
voltage = 0;
init_timer(); // 中断初始化
while (1)
{
DAValue = zh(voltage); // 把设置的电压变量转化成DA转化器输出的变量
DA_Conver(DAValue); // 控制DA转化器输出设置的电压
Key_Scan(); // 按键扫描
}
}
void time0() interrupt 1 // 定时器0中断
{
static char cnt = 0;
TH0 = (65536 - 3500) / 256; // 赋值中断时间
TL0 = (65536 - 3500) % 256;
cnt++; // 控制显示
if (cnt >= 2)
{
cnt = 0;
display();
} // 显示子程序
}