赞
踩
功能:
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(); } // 显示子程序 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。