找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1726|回复: 1
收起左侧

基于单片机的串联负反馈数控稳压电源Proteus仿真程序

[复制链接]
ID:241346 发表于 2020-5-24 09:30 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei图片20200524092841.png

单片机源程序如下:
  1. #include"reg52.h"
  2. #include"pcf8591.h"
  3. #include"keyscan.h"
  4. #include"lcd1602.h"
  5. #include"I2C.h"
  6. #include"delay.h"

  7. u8 key_num,key_flag,key_count;
  8. u8 flag,i,set_value;

  9. u8 str1[];
  10. u8 str2[];

  11. long bai,shi,ge,back_voltage1,back_current;
  12. float key_value,back_voltage2;

  13. void main()
  14. {
  15.      LCD_Init();//液晶初始化
  16.          IIC_Init();
  17.            while(1)
  18.      {
  19.               keyscan(); //键盘扫描
  20.                   if(key_flag==1)//有键按下
  21.                   {
  22.                            if(key_num<=9&&key_count<4) //只允许输入一个三位的数值
  23.                            {
  24.                           
  25.                                      key_flag=0;  //按下键标志位清零
  26.                                      if(key_count==1)//输入电压值第一位
  27.                                          {
  28.                                                    LCD_Manifest(1,5,keyscan());
  29.                                                    bai=keyscan();
  30.                                          }
  31.                                          if(key_count==2)//输入电压值第二位
  32.                                          {
  33.                                                    LCD_Manifest(1, 7,keyscan());
  34.                                                    shi=keyscan();
  35.                                          }
  36.                                          if(key_count==3)//输入电压值第三位
  37.                                          {
  38.                                                   LCD_Manifest(1,8,keyscan());
  39.                                                    ge=keyscan();
  40.                                          }
  41.                            }
  42.                            if(key_num==10&&key_count>=3)//确认键按下
  43.                                        flag=1;//确认键按下标志位         
  44.                            if(key_num==11)//清除键按下
  45.                            {
  46.                                       flag=0;//确认键按下标志位清零
  47.                                           key_count=0; //按下数字计数清零
  48.                                           LCD_Write_Cmd(0x80);
  49.                                           for(i=0;i<16;i++)//液晶显示初始化
  50.                                           {
  51.                                                     LCD_Write_Data(str1[i]);
  52.                                           }
  53.                                           LCD_Write_Cmd(0x80+0x40);
  54.                                           for(i=0;i<16;i++)
  55.                                           {
  56.                                                     LCD_Write_Data(str2[i]);
  57.                                           }          
  58.                            }
  59.                   }  
  60.                   if(flag==1) //按下确定键,将数值送给DA,开始工作
  61.               {
  62.                             key_value=bai*100+shi*10+ge;
  63.                           key_value=key_value/100/2/5*255;          
  64.                       set_value=(u8)key_value;//将按键输入值变成整形赋给变量
  65.                           
  66.                           DAC_Conversion(0x90,0x40,set_value) ; //DAC转换
  67.                       delay(100);   
  68.                           
  69.                           ADC_Send_Byte(0x90,0x41);//通道一ADC转换
  70.                           delay(100);
  71.                   back_voltage1=ADC_Receive_Byte(0x90);
  72.                                    
  73.                           ADC_Send_Byte(0x90,0x40);//通道二ADC转换
  74.                           delay(100);
  75.                   back_voltage2=ADC_Receive_Byte(0x90);//
  76.                                                  
  77.                           
  78.                           back_voltage1=back_voltage1*1000/255;//将输出反馈值扩大二倍,使小数点后保留二位有效数据
  79.                       LCD_Manifest(2,5,back_voltage1/100);//输出反馈值个位
  80.                       LCD_Manifest(2,7,back_voltage1%100/10);//输出反馈值小数点第一位
  81.                       LCD_Manifest(2,8,back_voltage1%10);//输出反馈值小数点第二位
  82.                                             
  83.                           back_current=back_voltage2/255*5/21/0.1*100;
  84.                           LCD_Manifest(2,12,back_current/100);//输出电流值个位
  85.                       LCD_Manifest(2,14,back_current%100/10);//输出电流值小数点第一位
  86.                       LCD_Manifest(2,15,back_current%10);//输出电流值小数点第二位
  87.        
  88.                   }                
  89.          }
  90. }                     
复制代码

所有资料51hei提供下载:
CtrlByDigital.rar (20.78 KB, 下载次数: 48)
回复

使用道具 举报

ID:449397 发表于 2020-10-27 13:37 | 显示全部楼层
楼主真英雄。有恒流模式吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表