找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4983|回复: 0
收起左侧

初学51单片机制作的自动调压电路和源程序 附变压转换详表

[复制链接]
ID:451287 发表于 2018-12-21 10:12 | 显示全部楼层 |阅读模式
是本人初学51时制作的自动调压电路,设计上比较笨拙,仅供参考,参考莫笑!有单片机程序原理图!

制作出来的实物图如下:

实物图

实物图


电路原理图如下:
0.png

变压转换详表
220V变24V电压比:9.166
0.png
输入电压低于160VLED亮,控口P1.1
输入电压高于260VLED亮,无输出

单片机源程序如下:
  1. #include <stc12c2052ad.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define AD_SPEED   0x60 //0000,0000    1080个时钟周期转换一次,
  6. #define   nop     _nop_()


  7. //
  8. sbit v16=P1^1;
  9. sbit v17=P1^2 ;
  10. sbit v18=P1^3;
  11. sbit v19=P1^4  ;
  12. sbit v20=P1^5 ;
  13. sbit v21=P1^6  ;
  14. sbit v22=P1^7 ;
  15. sbit v23=P3^7 ;
  16. sbit v24=P3^5;
  17. sbit v25=P3^4;
  18. sbit led16=P3^3;
  19. sbit led25=P3^2;



  20. /****************************************************************/

  21. void delayms(uint);
  22. int  ADC();
  23. void InitADC();
  24. float voltage=0.0;
  25. uint  vac,V=0.0,V1=0.0,V2;
  26. float vdc=0.00 ;
  27. void kaig();
  28. /***8**************************************************************/
  29. void main()
  30. {  
  31.         InitADC();
  32.         delayms(1500);


  33. while (1)

  34.    {
  35.        WDT_CONTR=0x34;       
  36.       
  37.        delayms(100);
  38.        V2=ADC();
  39.        delayms(10);
  40.        vdc= V2/256.00*5.00 ;//单片机最高是5伏模拟电压

  41.       if ((vdc>3.78)||(vdc<1.85))        //acv=269.35   acv=131.8
  42.            {          
  43.               P1=0XFF;
  44.               P3=0XFF;
  45.               led25=0;
  46.               led16=0;
  47.                break;
  48.           }
  49.        else
  50.            {
  51.              if (V2<107)       //vdc=2.0865 acv=148.68
  52.                 led16=~led16;
  53.              if (V2>187)          //vdc=3.6465 acv=259.8
  54.                 led25=~led25;
  55.                     delayms(100);
  56.                 kaig();

  57.            }
  58.                  
  59.        

  60.     }


  61. }


  62. /////////////////////////////
  63. void kaig()
  64. {
  65.         if (vdc<=2.31)
  66.             
  67.                     {
  68.                           
  69.                           vac=16;
  70.                       led16=0;
  71.                     }
  72.                
  73.     if (2.31<vdc&&vdc<=2.45)
  74.   
  75.                    vac=17;
  76.                         
  77.         if  (2.45<vdc&&vdc<=2.59)
  78.              
  79.                    vac=18;

  80.         if  (2.59<vdc&&vdc<=2.73)
  81.                                  
  82.                    vac=19;
  83.        
  84.         if  (2.73<vdc&&vdc<=2.87)
  85.                
  86.                    vac=20;
  87.                         
  88.         if  (2.87<vdc&&vdc<=3.01)
  89.                          
  90.                    vac=21;
  91.        
  92.         if  (3.01<vdc&&vdc<=3.15)
  93.              
  94.                    vac=22;

  95.         if  (3.15<vdc&&vdc<=3.29)
  96.              
  97.                    vac=23;
  98.        
  99.         if  (3.29<vdc&&vdc<=3.43)
  100.                  
  101.                    vac=24;
  102.        
  103.         if  (3.43<vdc&&vdc<=3.57)
  104.                  vac=25;
  105.        
  106.         if  (vdc>3.57)
  107.               {
  108.                    vac=25;
  109.                    led25=0;       
  110.               }

  111.    switch(vac)
  112.    {
  113.           
  114.         case 16:
  115.               if (v16==0)
  116.                  break;
  117.                   else
  118.                   {
  119.                      
  120.                     P1=0XFF;
  121.                     P3=0XFF;
  122.                      v16=0;
  123.                   }
  124.                   break;
  125.         case 17:
  126.              if (v17==0)
  127.                    break;
  128.                  else
  129.                    {
  130.                           P1=0XFF;
  131.                     P3=0XFF;
  132.                     v17=0;
  133.                          }
  134.                         break;
  135.         case 18:
  136.                  if(v18==0)
  137.                             break;
  138.                      else
  139.                              {
  140.                                    P1=0XFF;
  141.                            P3=0XFF;
  142.                                    v18=0;
  143.                                   }
  144.                          break;
  145.         case 19:
  146.                  if(v19==0)
  147.                          break;
  148.                          else
  149.                              {
  150.                                   P1=0XFF;
  151.                           P3=0XFF;
  152.                                   v19=0;
  153.                                    }
  154.                                    break;
  155.         case 20:
  156.                  if(v20==0)
  157.                             break;
  158.                          else
  159.                            {
  160.                            P1=0XFF;
  161.                        P3=0XFF;
  162.                               v20=0;
  163.                                     }
  164.              break;
  165.         case 21:
  166.                   if(v21==0)
  167.                           break ;
  168.                           else
  169.                              {P1=0XFF;
  170.                         P3=0XFF;       
  171.                         v21=0;
  172.                           
  173.                           }   
  174.                    break;

  175.         case 22:
  176.                   if(v22==0)
  177.                             nop;
  178.                            else
  179.                            {
  180.                                    P1=0XFF;
  181.                          P3=0XFF;
  182.                            v22=0;
  183.                   }
  184.           break;
  185.         case 23:
  186.                    if(v23==0)
  187.                              break;
  188.                                 else
  189.                                 {
  190.                             P1=0XFF;
  191.                         P3=0XFF;
  192.                                 v23=0;
  193.                                 }

  194.             break;
  195.         case 24:
  196.                     if(v24==0)
  197.                                    break;
  198.                                 else
  199.                                 {
  200.                                   P1=0XFF;
  201.                          P3=0XFF;
  202.                                 v24=0;
  203.                                 }
  204.                 break;
  205.         case 25:
  206.                     if(v25==0)
  207.                                    break;
  208.                                 else
  209.                                 {
  210.                                  P1=0XFF;
  211.                          P3=0XFF;
  212.                                 v25=0;
  213.                                 }
  214.                 break;
  215.        


  216.    }
  217.    


  218. }
  219. /*void UartInit()                //9600bps@11.0592MHz
  220. {

  221.         PCON &= 0x7f;                //波特率不倍速
  222.         SCON = 0x50;                //8位数据,可变波特率
  223.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  224.         AUXR &= 0xfe;                //串口1选择定时器1为波特率发生器
  225.         TMOD &= 0x0f;                //清除定时器1模式位
  226.         TMOD |= 0x20;                //设定定时器1为8位自动重装方式
  227.         TL1 = 0xDC;                //设定定时初值
  228.         TH1 = 0xDC;                //设定定时器重装值
  229.         ET1 = 0;                //禁止定时器1中断
  230.         TR1 = 1;                //启动定时器1
  231. }

  232.   

  233.    

  234. //
  235. //
  236.   */
  237. //AD转换初始化 ----打开ADC电源
  238. void InitADC()
  239. {
  240. P1=0xff;
  241. ADC_CONTR|=0x80;
  242. delayms(80);
  243. //这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作
  244. /*****************
  245. P1M0 和P1M1 寄存器位  7      6     5    4     3      2     1     0
  246.                      P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0
  247. 同理P3M0  P3M0 也是。因为STC12C2052AD只有两个P口,所以只有这俩组  STC12C5410AD还多P2M0 P1M0 有三组   
  248.   P1M0   P1M1                 高
  249.     0   0     普通I0口 (准双向)        P1寄存器位  7      6     5    4     3      2     1     0
  250. 0      1     强推挽输出 (20MA电流 )尽量少用      P1.7  P1.6  P1.5  P1.4  P1.3  P1.2  P1.1  P1.0
  251. 1  0     仅做输入  A/D转换时可用此模式     
  252. 1      1    开漏 ,A/D转换时可用此模式
  253.   
  254.   例如:
  255.   要设置P1.1为 AD 输入口
  256.   则 P1M0=0X02 ;
  257.      P1M1=0X02;   开漏即可
  258.   当不用AD时,最好 关闭ADC电源 ,恢复为IO口状态
  259. ********************************/
  260. P1M0=0x01;//这两个寄存器用来设置 P1口四种状态,每一位对应一个P1引脚 ,按状态组合操作
  261. P1M1=0x01;//设置P1.0为开漏状态
  262. }

  263. // AD转换程序
  264. /******************************************************
  265. 注意:这个函数里注释的命令是通用命令,可以针对所有AD通道使用,我这就认准了P1.1一个通道,所以直接
  266. //赋值,省点"流量"!折磨我的问题就出在这个函数里的while等待语句
  267. while (1)                       //等待A/D转换结束
  268.     {
  269.         if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
  270.         { break; }
  271.     }
  272.   这是能用的,我原来写的是:
  273. while (ADC_CONTR & 0x10==0);
  274. 这样写不能用,再说一遍:这样就不能用了!!
  275. 至于为嘛,因为 优先级,“==”比&优先级高,
  276. 所以加个括号就可以了
  277. while (  (ADC_CONTR & 0x10)   == 0  );
  278. 不经常用C语言,就会记不住啦!!!
  279. 由此得到一个教训;小问题影响效率
  280. 经验:经常加一加括号会死啊,似乎也不耗“流量”吧!!
  281. *********************************************/
  282. int ADC()
  283. {
  284.     ADC_DATA   = 0; //清除结果
  285.     ADC_CONTR = 0x60;      //转换速度设置  0x60  最快速度
  286.     ADC_CONTR = 0xE0;               //1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位          开启AD电源保持速度设置
  287.   // ADC_CONTR =0xe1;                                   //        选择 A/D 当前通道   P1.1  保持上句设置
  288.   //  ADC_CONTR |= 0x01;           //选择 A/D 当前通道   P1.1
  289.     delayms(2);                       //使输入电压达到稳定
  290.    ADC_CONTR = 0xE8;                            //开启转换 1110  1001  保持上句设置
  291.    // ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,  
  292.      while (1)                       //等待A/D转换结束
  293.     {
  294.         if (ADC_CONTR & 0x10)       //0001,0000 测试A/D转换结束否
  295.         { break; }
  296.     }
  297.     ADC_CONTR =0xE0;
  298.     //ADC_CONTR &= 0xE7;            //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,  
  299.     return   ADC_DATA; //返回 A/D 10 位转换结果


  300. ……………………

  301. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
调压.rar (162.1 KB, 下载次数: 22)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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