• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

菜鸟也来做数控电源

刚开始学习51单片机,有点像别人都开着飞机,而我还在学习骑自行车,呵呵;不过也没办法啊,

使用的是51单片机和0832的DAC两个,一个控制输出电压,一个控制输出电流,来实现横流恒压;

当然是开环控制,精度不是很高,没办法啊,小白就这个水平;

上图,这也是我调试了2天的结果啊

 

无标题

无标题1

 

 

1602的显示程序,也是写的我要死要活的,

采用了五个按键,

一个功能选择(电流电压设定切换)

一个调零

一个最大

一个加

一个减

后面四个按键是公用的,刚好把51单片机端口用完,还想加两个ADC采样修正输出电压和电流,没端口了;

 

全部回复(12)
正序查看
倒序查看
2015-05-06 09:21
把学习和调试的过程发上来,加油~
0
回复
2015-05-06 09:32
已经被添加到社区经典图库喽
http://www.dianyuan.com/bbs/classic/
0
回复
2015-05-06 11:29
@电源网-fqd
已经被添加到社区经典图库喽http://www.dianyuan.com/bbs/classic/

#include

#include

#include

#define uint unsigned int  //预定义一下

#define uchar unsigned char sbit rs=P2^3;    //1602的数据/指令选择控制线

sbit wr=P2^4;  

sbit en=P2^5;

sbit dacv=P2^6;

sbit key1 = P2^0;

sbit key2= P2^1;

sbit key3 = P2^2;

sbit key4 = P2^7;      

sbit cs1 = P3^2;

sbit wr1 = P3^3;

sbit daci=P3^0;

sbit cs2=P3^4;

sbit wr2=P3^5;

sbit xuan=P3^1;

uchar code table[]="V and I Value";

float val,val1;                   

tablel  void delay(uint n)       //延时函数                       

{     uint x,y;       for(x=n;x>0;x--)          for(y=110;y>0;y--);} 

void lcd_wcom(uchar com)  //1602写命令函数                 

{     rs=0;            //选择指令寄存器        

P1=com;            //把命令字送入P2    

delay(5);            //延时一小会儿,让1602准备接收数据     

en=1;  delay(5);           //使能线电平变化,命令送入1602的8位数据口      

 en=0; } 

void lcd_wdat(uchar dat)        //1602写数据函数      

 {     rs=1;        //选择数据寄存器        

 P1=dat;        //把要显示的数据送入P2    

delay(5);        //延时一小会儿,让1602准备接收数据     

 en=1;

 delay(5);       //使能线电平变化,数据送入1602的8位数据口   

  en=0;} 

void lcd_init()              //1602初始化函数       

{     wr=0;    en=0;    lcd_wcom(0x38);       //8位数据,双列,5*7字形           

 lcd_wcom(0x0f);      //开启显示屏,关光标,光标不闪烁    

 lcd_wcom(0x0c);    //显示地址递增,即写一个数据后,显示位置右移一位     

 lcd_wcom(0x01);    //清屏 

 

void displayv(uchar k1,k2,k3,k4)   //显示子函数

{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('V');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+k1);lcd_wcom(0x80+0x48);lcd_wdat(0x30+k2);lcd_wcom(0x80+0x49);lcd_wdat('.');lcd_wcom(0x80+0x4A);lcd_wdat(0x30+k3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+k4);lcd_wcom(0x80+0x4C);lcd_wdat('V');}

 

void displayi(uchar f1,f2,f3,f4)   //显示子函数

{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('I');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+f1);lcd_wcom(0x80+0x48);lcd_wdat('.');lcd_wcom(0x80+0x49);lcd_wdat(0x30+f2);lcd_wcom(0x80+0x4A);lcd_wdat(0x30+f3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+f4);lcd_wcom(0x80+0x4C);lcd_wdat('A');}

void dianya()

{uint k1,k2,k3,k4,a; cs1=0; wr1=0; { dacv=1; P0=val;  if(key1== 0)   {val=0; P0 = val;delay(20);} if(key2 == 0) {  val++;  delay(50);   if(val==255)  val=0;  P0 = val;delay(20);  } if(key3 == 0)   {   val--;   delay(50); if(val==0)   val=255;P0=val;delay(20);} if(key4 == 0) {val = 255;P0=val;delay(20);}         dacv=0;  a=((float)val*30.0/255.0)*100.0;  k1=(int)a/1000;   k2=(int)a%1000/100;  k3=(int)a%100/10;  k4=(int)a%10;    displayv( k1,k2,k3,k4);    cs2=1;wr2=1;    }    }

void dianliu()

{uint f1,f2,f3,f4,f; cs2=0; wr2=0; {  daci=1;    P0=val1;  if(key1== 0)   {val1=0; P0 = val1;delay(20);} if(key2 == 0) {  val1++;  delay(50);   if(val1==255)  val1=0;  P0 = val1;delay(20);  } if(key3 == 0)   {   val1--;   delay(20); if(val1==0)   val1=255;P0=val1;delay(20);} if(key4 == 0) {val1 = 255;P0=val1;delay(30);}        

 daci=0;

  f=((float)val1*30.0/255.0)*100.0; 

 f1=(int)f/1000;  

 f2=(int)f%1000/100; 

 f3=(int)f%100/10;  

f4=(int)f%10;   

displayi( f1,f2,f3,f4);   

 cs1=1;wr1=1;  

  } 

   }

 

void main()            //主函数

 {        uchar m=0; bit flag; 

P0=0x00; dacv=0; daci=0;  flag=1;   

 lcd_init(); lcd_wcom(0x80);        //显示地址设为80H(即00H,)上排第一位            

for(m=0;m<14;m++)     //将table[]中的数据依次写入1602显示     

 {            

lcd_wdat(table[m]);                         

 delay(5);      }                        

 while(1) 

{

 if(xuan==0) 

{

 while(!xuan); flag=~flag; }

  if(flag==1) {dianya();}

 if(flag==0) {dianliu();} 

}  }

0
回复
2015-05-07 21:01
@wangbo0227
#include#include#include#defineuintunsignedint //预定义一下#defineucharunsignedchar sbitrs=P2^3;   //1602的数据/指令选择控制线sbitwr=P2^4;  sbiten=P2^5;sbitdacv=P2^6;sbitkey1=P2^0;sbitkey2=P2^1;sbitkey3=P2^2;sbitkey4=P2^7;      sbitcs1=P3^2;sbitwr1=P3^3;sbitdaci=P3^0;sbitcs2=P3^4;sbitwr2=P3^5;sbitxuan=P3^1;ucharcodetable[]="VandIValue";floatval,val1;                   tablel  voiddelay(uintn)      //延时函数                       {    uintx,y;       for(x=n;x>0;x--)         for(y=110;y>0;y--);} voidlcd_wcom(ucharcom) //1602写命令函数                 {    rs=0;           //选择指令寄存器        P1=com;           //把命令字送入P2    delay(5);           //延时一小会儿,让1602准备接收数据     en=1; delay(5);          //使能线电平变化,命令送入1602的8位数据口       en=0; } voidlcd_wdat(uchardat)       //1602写数据函数       {    rs=1;       //选择数据寄存器         P1=dat;       //把要显示的数据送入P2    delay(5);       //延时一小会儿,让1602准备接收数据      en=1; delay(5);      //使能线电平变化,数据送入1602的8位数据口    en=0;} voidlcd_init()             //1602初始化函数       {    wr=0;   en=0;   lcd_wcom(0x38);      //8位数据,双列,5*7字形            lcd_wcom(0x0f);     //开启显示屏,关光标,光标不闪烁     lcd_wcom(0x0c);   //显示地址递增,即写一个数据后,显示位置右移一位      lcd_wcom(0x01);   //清屏 }  voiddisplayv(uchark1,k2,k3,k4)  //显示子函数{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('V');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+k1);lcd_wcom(0x80+0x48);lcd_wdat(0x30+k2);lcd_wcom(0x80+0x49);lcd_wdat('.');lcd_wcom(0x80+0x4A);lcd_wdat(0x30+k3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+k4);lcd_wcom(0x80+0x4C);lcd_wdat('V');} voiddisplayi(ucharf1,f2,f3,f4)  //显示子函数{lcd_wcom(0x80+0x40);lcd_wdat('T');lcd_wcom(0x80+0x41);lcd_wdat('h');lcd_wcom(0x80+0x42);lcd_wdat('e');lcd_wcom(0x80+0x43);lcd_wdat('I');lcd_wcom(0x80+0x44);lcd_wdat('i');lcd_wcom(0x80+0x45);lcd_wdat('s');lcd_wcom(0x80+0x46);lcd_wdat(':');lcd_wcom(0x80+0x47);lcd_wdat(0x30+f1);lcd_wcom(0x80+0x48);lcd_wdat('.');lcd_wcom(0x80+0x49);lcd_wdat(0x30+f2);lcd_wcom(0x80+0x4A);lcd_wdat(0x30+f3);lcd_wcom(0x80+0x4B);lcd_wdat(0x30+f4);lcd_wcom(0x80+0x4C);lcd_wdat('A');}voiddianya(){uintk1,k2,k3,k4,a; cs1=0; wr1=0; { dacv=1; P0=val;  if(key1==0)  {val=0;P0=val;delay(20);} if(key2==0) {  val++;  delay(50);   if(val==255)  val=0;  P0=val;delay(20);  } if(key3==0)  {  val--;  delay(50); if(val==0)  val=255;P0=val;delay(20);} if(key4==0) {val=255;P0=val;delay(20);}       dacv=0;  a=((float)val*30.0/255.0)*100.0;  k1=(int)a/1000;   k2=(int)a%1000/100;  k3=(int)a%100/10;  k4=(int)a%10;   displayv(k1,k2,k3,k4);   cs2=1;wr2=1;    }    }voiddianliu(){uintf1,f2,f3,f4,f; cs2=0; wr2=0; { daci=1;   P0=val1;  if(key1==0)  {val1=0;P0=val1;delay(20);} if(key2==0) {  val1++;  delay(50);   if(val1==255)  val1=0;  P0=val1;delay(20);  } if(key3==0)  {  val1--;  delay(20); if(val1==0)  val1=255;P0=val1;delay(20);} if(key4==0) {val1=255;P0=val1;delay(30);}        daci=0;  f=((float)val1*30.0/255.0)*100.0;  f1=(int)f/1000;   f2=(int)f%1000/100;  f3=(int)f%100/10;  f4=(int)f%10;   displayi(f1,f2,f3,f4);    cs1=1;wr1=1;    }    } voidmain()           //主函数 {       ucharm=0; bitflag; P0=0x00; dacv=0; daci=0;  flag=1;    lcd_init(); lcd_wcom(0x80);       //显示地址设为80H(即00H,)上排第一位            for(m=0;m
经过改进已经使用了16位DAC来转换电压,使用了SPI通讯节省了IO口,现在很想比数字键盘加进去,这样子这个电源就趋势与完美了,可是苦于不会写键盘程序,
0
回复
2015-05-08 15:32
@wangbo0227
经过改进已经使用了16位DAC来转换电压,使用了SPI通讯节省了IO口,现在很想比数字键盘加进去,这样子这个电源就趋势与完美了,可是苦于不会写键盘程序,

 

键盘做出来了,可是程序怎么都写不好,哪位大神帮忙写一个啊 ;;

0
回复
2015-05-11 09:16
@wangbo0227
[图片] 键盘做出来了,可是程序怎么都写不好,哪位大神帮忙写一个啊;;

键盘和显示程序都可以正常运行了,使用了16位的ADC和DAC,程序写了500多行,现在觉得写程序的人太不容易了;

0
回复
2015-05-30 14:58
@wangbo0227
[图片]键盘和显示程序都可以正常运行了,使用了16位的ADC和DAC,程序写了500多行,现在觉得写程序的人太不容易了;

能不能把电路图和图贴出来看一下。。。。

0
回复
2015-06-01 08:36
@yangkuan6621
能不能把电路图和图贴出来看一下。。。。

52-4.pdf

上传的附件是电路图,里面的ADC是公用的,两个DAC电路属于开环电路;

0
回复
178064035
LV.4
10
2015-06-18 08:00
@wangbo0227
52-4.pdf上传的附件是电路图,里面的ADC是公用的,两个DAC电路属于开环电路;

显示子函数如指针方便点。

void lcd1602_write_char_string(uchar y,uchar *s)

{   

    uchar i = 0; 

   while(*s)   

{      

LCD_disp_char(i,y,*s);

s++; //地址加1    i++;   

}

 

lcd1602_write_char_string(显示在哪一行,"要显示的字符串");

 

0
回复
wangbo0227
LV.8
11
2015-06-18 21:52
@178064035
显示子函数如指针方便点。voidlcd1602_write_char_string(uchary,uchar*s){       uchari=0;   while(*s)   {     LCD_disp_char(i,y,*s);s++; //地址加1   i++;   }}  lcd1602_write_char_string(显示在哪一行,"要显示的字符串"); 

谢谢指点,明天更新程序试一下。,终于有人看了。。。

*s是什么意思啊

0
回复
2015-06-24 14:47
@wangbo0227
谢谢指点,明天更新程序试一下。,终于有人看了。。。*s是什么意思啊

 指针定义

0
回复
Rachelmi
LV.9
13
2015-08-11 17:28
@影动随意
 指针定义
搜嘎~
0
回复