typora-root-url: ./
【毕业设计】18-基于单片机的数字直流电源设计(源代码工程+仿真工程+答辩论文+答辩PPT)
文章目录
任务书
一、主要研究内容:
设计一种满足小型电子设备供电需要的开关稳压电源。电源设计的主要指标是:输入电压为AC220V,输入频率为50HZ,输入电压范围为AC165V~265V,输出电压为直流0~10V可调,输出最大电流为150mA,输出最大功率为2.25W。
二、方法和要求:
1、阅读大量稳压直流电源系统的相关文献资料,掌握其技术的原理和电路的结构,理解程序实现的核心思想;
2、积累相关资料确定论文的主体内容,重点进行研究;
3、每一周进行一次论文进度的汇报,指导老师解答遇到的问题;
把握好论文的进度,按照学校的要求完成各个阶段目标。
资料链接
仿真模型工程文件
仿真截图
答辩论文低重复率文档
英文文献及翻译
答辩PPT
设计说明书
摘要
本次系统在设计上首先对系统进行研究了解直流电源当前输出精度不够高,这个问题来设计数字直流电源,通过分析本次系统所需要实现的功能确定系统设计方案。然后对系统的硬件、软件设计,最后通过仿真软件来来测试整个系统的功能是否满足设计要求,本次设计系统考虑到多方面的原因,包括抗干扰能力,输出精度以及输出范围等因素,并且考虑到了整个系统的制作成本,保证系统性价比高,稳定性强。
设计框架架构
设计说明书及设计文件
源码展示
#include <reg52.h>
#include <intrins.h>
#include "timer.h"
#include "global.h"
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
#define vout 1
#define vset 0
#define vmode
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit DACSCLK = P2^3;
sbit DACCS = P2^4;
sbit DACDIN = P2^5;
sbit CS = P1^0;
sbit CLK = P1^1;
sbit DIO = P1^2;
sbit KEY1 = P3^6;
sbit KEY2 = P3^7;
#ifdef vmode
uchar Display_Buffer[] = "00.00V ";
uchar code Line1[] = "Current Voltage:";
#else
uchar Display_Buffer[] = " ";
uchar code Line1[] = "Current Speed: ";
#endif
extern uint speed;
void Delayms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
uchar Busy_Check()
{
uchar LCD_Status;
RS = 0;
RW = 1;
EN = 1;
Delayms(1);
LCD_Status = P0;
EN = 0;
return LCD_Status;
}
void Write_LCD_Command(uchar cmd)
{
while((Busy_Check()&0x80)==0x80);
RS = 0;
RW = 0;
EN = 0;
P0 = cmd;
EN = 1;
Delayms(1);
EN = 0;
}
void Write_LCD_Data(uchar dat)
{
while((Busy_Check()&0x80)==0x80);
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
EN = 1;
Delayms(1);
EN = 0;
}
void Initialize_LCD()
{
Write_LCD_Command(0x38);
Delayms(1);
Write_LCD_Command(0x01);
Delayms(1);
Write_LCD_Command(0x06);
Delayms(1);
Write_LCD_Command(0x0c);
Delayms(1);
}
void ShowString(uchar x,uchar y,uchar *str)
{
uchar i = 0;
if(y == 0)
Write_LCD_Command(0x80 | x);
if(y == 1)
Write_LCD_Command(0xc0 | x);
for(i=0;i<16;i++)
{
Write_LCD_Data(str[i]);
}
}
uchar Get_AD_Result(uchar ch)
{
uchar i,dat1=0,dat2=0;
CS = 0;
CLK = 0;
DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;
DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;
if(ch)
DIO = 1;
else
DIO = 0;
_nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;
DIO = 1; _nop_(); _nop_();
for(i=0;i<8;i++)
{
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
if(DIO) dat1 |=0x80>>i;
}
for(i=0;i<8;i++)
{
if(DIO) dat2 |=0x01<<i;
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
}
CS = 1;
if (dat1 == dat2)
return dat1;
else
return 0x00;
}
void Set_DAC(uint dacvalue)
{
uchar i;
uint dat;
dat = dacvalue;
dat &= 0x03ff;
DACCS = 0;
DACSCLK = 0;
for(i=0;i<12;i++)
{
if(dat & 0x0200)
DACDIN = 1;
else
DACDIN = 0;
DACSCLK = 1;
dat <<= 1;
DACSCLK = 0;
}
DACCS = 1;
}
void main()
{
uchar B;
uint d,v;
Initialize_LCD();
InitTimer();
Delayms(10);
v = 0x0100;
StartTimer(0);
B = 0;
while(1)
{
d = Get_AD_Result(vset);
d &=0x00FF;
Set_DAC(d*4);
d = Get_AD_Result(vout);
d &=0x00FF;
d = d*1000.0/255;
#ifdef vmode
if(d/1000)
Display_Buffer[0]=d/1000+'0';
else
Display_Buffer[0]=' ';
Display_Buffer[1]=d/100%10+'0';
Display_Buffer[3]=d/10%10+'0';
Display_Buffer[4]=d%10+'0';
#else
if(speed/1000)
Display_Buffer[0]=speed/1000+'0';
else
Display_Buffer[0]=' ';
Display_Buffer[1]=speed/100%10+'0';
Display_Buffer[2]=speed/10%10+'0';
Display_Buffer[3]=speed%10+'0';
#endif
ShowString(0,0,Line1);
ShowString(0,1,Display_Buffer);
}
}