当前位置:   article > 正文

0440基于51单片机的数控可调电源数码管显示proteus仿真原理图程序

0440基于51单片机的数控可调电源数码管显示proteus仿真原理图程序

功能:
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();
	} // 显示子程序
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153

仿真演示视频:
https://www.bilibili.com/video/BV1s3411f7Kq/

实物演示视频:
https://www.bilibili.com/video/BV1b24y117aJ/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/712269
推荐阅读
相关标签
  

闽ICP备14008679号