标题:
0-5V可调直流电源Proteus仿真
[打印本页]
作者:
heng88
时间:
2017-5-28 22:42
标题:
0-5V可调直流电源Proteus仿真
可调直流电源Proteus仿真欢迎大家参考
仿真图如下(proteus的仿真工程文件可到附件中下载):
0.png
(35.13 KB, 下载次数: 114)
下载附件
2017-5-29 02:16 上传
0.png
(68.59 KB, 下载次数: 140)
下载附件
2017-5-29 02:16 上传
单片机源程序如下:
#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
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
0·5V可调直流电源Proteus仿真.zip
(87.82 KB, 下载次数: 36)
2017-5-28 22:42 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
lv1532
时间:
2018-6-20 15:03
看看
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1