找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8282|回复: 9
收起左侧

单片机数控稳压电源制作 带程序和原理图

  [复制链接]
ID:128771 发表于 2016-7-5 03:30 | 显示全部楼层 |阅读模式
量=6V÷0.06V=100,注意这里的100是十进制的,单片机不能识别十进制数据,所以要把十进制
转换成二进制或十六进制(转换时可用WINDOWS自带的科学计算器进行)。100转换成十六进制后为
64H。只要给DAC0808输入64H,它就能输出6V的电压(注意:理论值和实践值有所出入,具体运用时
要适当的调节数据输入量),该电压经运放TL082后再去推动LM317,由LM317输出我们需要的电压值,
实现了电压数控调节。

三、保护电路:
   保护电路由89C51的P2.4,R10和R11组成,R11的作用是预先给P2.4一个高电位。当某种原因
(如短路,过流)使得输出电压降低至一定值时,P2.4端电位也随之降低。程序立即检测到P2.4这
一变化,并立刻通过继电器关闭电源输出。直至原因排除才能再次开机;V3采用PNP型管是为了防止
在单片机复位前,LM317失控的电压输出到用电器上。

四、安装与调试:
  图中的正负15V、5V由黑白电视机的变压器经整流稳压后取得。运放TL082可以用NE5532、4558等
常见的型号代替。LM317发热量较大,散热片要尽可能的做大些。在确认接线无误后就可试机。若一
开机即自动关机,同时显示“OF”,这说说明P2.4电压太低。正常值应在1.5V以上。发现这种情况可
以适当的调节R11和R10的大小直至P2.4的电压正常。

  1. #include <reg52.h>                        //通用52单片机头文件
  2. #define uchar unsigned char                                  
  3. sbit RESET=P3^3;                   //DA转换数值复位端口位定义
  4. sbit keyup=P3^4;                   //步进加端口位定义
  5. sbit keydown=P3^5;                   //步进减端口位定义
  6. sbit LEDwei1=P2^7;                   //低位数码管位选
  7. sbit LEDwei2=P2^6;                   //高位数码管位选
  8. #define duan P0            //段选宏定义  
  9. void delay(int);                   //延时函数声明
  10. void display(uchar);           //显示函数声明
  11. uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
  12.                                       0x92,0x82,0xF8,0x80,0x90,0x8e};       //共阳数码管0-9和F(为段选所用)
  13. uchar code byte[]={ 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,        0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
  14.                                        
  15.                                         0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,        0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
  16.                                        
  17.                                         0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,        0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
  18.                                        
  19.                                         0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,        0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
  20.                                        
  21.                                         0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,        0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
  22.                                        
  23.                                         0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,        0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
  24.                                        
  25.                                         0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,        0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
  26.                                        
  27.                                         0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,        0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
  28.                                        
  29.                                         };//DA转换数据

  30. uchar code table[]={0x11,0x12,15,16,17,18,20,21,22,23, 24,25,27,28,29,30,31,32,34,35,
  31.                                         36,37,38,39,41,42,43,44,45,47, 48,49,50,51,52,53,55,56,57,58,
  32.                                         59,61,62,63,64,65,66,68,69,70, 71,72,73,75,76,77,78,79,80,82,
  33.                                         83,84,85,86,87,89,90,91,92,93, 94,96,97,98,99};        //用于显示电压值的数组

  34. void main()
  35. {
  36.         uchar num=0;         
  37.         while(1)
  38.         {
  39.                          if(keyup==0)                 //步进加端口为低电平,
  40.                         {       
  41.                                 delay(10);                  //稍作延时,消抖,
  42.                                 if(keyup==0)          //步进加端口依然为低电平,说明的确是被按下,
  43.                                 {       
  44.                                         if(num==128)  //执行电压DA转换数值步进增加一
  45.                                         num=0;
  46.                                         else
  47.                                         num++;
  48.                                 }
  49.                                 while(keyup==0);        //防止按死语句
  50.                          }
  51.                  if(keydown==0)                                 //步进减端口为低电平,
  52.                          {
  53.                                  delay(10);                         //稍作延时,消抖,
  54.                                 if(keydown==0)                 //步进减端口依然为低电平,说明的确是被按下,
  55.                                 {       
  56.                                         if(num==0)                  //执行电压DA转换数值步进减一
  57.                                         num=128;
  58.                                         else
  59.                                         num--;
  60.                                 }
  61.                                 while(keydown==0);          //防止按死语句
  62.                          }
  63.                  if(RESET==0)                                  // 复位端口为低电平
  64.                          {
  65.                                  delay(10);                          //稍作延时,消抖,
  66.                                 if(RESET==0)                  //复位端口依然为低电平,说明的确是被按下,
  67.                                 {       
  68.                                         num=0;                          //执行复位操作
  69.                                 }
  70.                                 while(RESET==0);           //防止按死语句
  71.                          }
  72.        
  73.                  P1=byte[num];           //给DA一个数值,转化成相应的电压值
  74.                  delay(10);
  75.                  display(num);           //调用显示函数显示电压值
  76.          }
  77. }

  78. void delay(int x)                   //12M晶振,约1ms延时函数
  79. {
  80.         int i;
  81.         for(;x>0;x--)
  82.         for(i=0;i<123;i++)
  83.                 ;
  84. }
  85. void display(uchar num)              //显示函数
  86. {        uchar temp;
  87.         temp=table[num];
  88.         if(num<75)                //电压值小于10V的可以直接在数码管上显示出来
  89.         {
  90.              duan=LEDcode[temp/10]&0x7f;        //显示个位,并加显小数点
  91.                  LEDwei1=1;
  92.                  delay(5);
  93.                  LEDwei1=0;
  94.                  duan=LEDcode[temp%10];;          //显示小数点后一位
  95.                  LEDwei2=1;
  96.                  delay(5);
  97.                  LEDwei2=0;
  98.         }
  99.         else               //电压值大于10V的在数码管上显示字母"FF"
  100.         {                                          
  101.                  duan=LEDcode[10];            //显示高位
  102.                  LEDwei1=1;
  103.                  delay(5);
  104.                  LEDwei1=0;
  105.                  duan=LEDcode[10];            //显示低位
  106.                  LEDwei2=1;
  107.                  delay(5);
  108.                  LEDwei2=0;
  109.         }
  110. }                                           
复制代码

0.png


0.png


所有资料下载:

单片机数控电源套件.rar

1.55 MB, 下载次数: 172, 下载积分: 黑币 -5

原理图等.rar

228.46 KB, 下载次数: 186, 下载积分: 黑币 -5

评分

参与人数 2黑币 +6 收起 理由
GUOXUAN + 5 绝世好帖!
cqhejian + 1 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:116826 发表于 2016-7-5 09:42 | 显示全部楼层
好帖,mark一下,感谢楼主费心分享!
回复

使用道具 举报

ID:96881 发表于 2017-2-28 19:50 | 显示全部楼层
这个资料真不错,谢谢您分享,下载学习一下
回复

使用道具 举报

ID:185482 发表于 2017-4-2 00:35 | 显示全部楼层
很好的资料
回复

使用道具 举报

ID:4150 发表于 2017-4-2 09:36 | 显示全部楼层
TL082是用为比较器吗
回复

使用道具 举报

ID:102702 发表于 2017-4-3 14:41 | 显示全部楼层
正需要这资料,收藏了,有时间仿制一个
回复

使用道具 举报

ID:99130 发表于 2017-5-10 16:08 | 显示全部楼层
范围小了点吧
回复

使用道具 举报

ID:76408 发表于 2017-8-19 14:16 | 显示全部楼层
谢谢楼主,正好我需要这个图纸。
回复

使用道具 举报

ID:249545 发表于 2017-12-9 11:02 | 显示全部楼层
看了楼主资料,好像只有2位数码管显示电压.要是做的话(自已私下认为)功能一点点鸡肋.
要是改下软件能兼容其它的+-0.1V电压连续可调的话,就可以DIY了.
回复

使用道具 举报

ID:427869 发表于 2018-12-8 20:39 | 显示全部楼层
感谢楼主提供的资料及样例。下载下来学习下。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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