找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3506|回复: 0
打印 上一主题 下一主题
收起左侧

单片机可控电源Proteus仿真程序 电路涉及到A/D、D/A转换

[复制链接]
跳转到指定楼层
楼主
可控电源,电压可在1.25伏到9伏之间设定,电路涉及到A/D、D/A转换、矩阵键盘和LED显示。PROTEUS仿真图和代码见附件。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. //#include<DAC0832.c>
  3. //#include<ADC0832.c>
  4. //#include <absacc.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. //#define DAC0832 XBYTE[0xfffe]          
  8. /************I/O口定义*********/
  9. sbit CS=P2^3;         //ADC0832的片选端
  10. sbit CLK=P2^2;         //时钟端
  11. sbit DIO=P2^1;         //数据输入输出端
  12. sbit  up=P2^7;
  13. sbit down=P3^0;
  14. sbit L1=P2^4;
  15. sbit L2=P2^5;
  16. sbit L3=P2^6;
  17. sbit WR2=P2^0;
  18. sbit LED1=P2^7;
  19. sbit LED2=P3^7;
  20. uint cdi=0,dy=0;
  21. uchar key=12,flag=0,h=0,m=0,l=0;
  22. uint ge,dian,xiao1,xiao2;
  23. uchar code table[]={        //共阳数码管显示定义
  24. 0x03,0x9f,0x25,0x0d,
  25. 0x99,0x49,0x41,0x1f,
  26. 0x01,0x09};
  27. void delay();
  28. uint A_D();
  29. void display();
  30. void DAC();
  31. void key_test();

  32. void delay(uchar i)   //i=1延迟1ms
  33. {
  34.     uchar a,b,c;
  35.     for(c=i;c>0;c--)
  36.         for(b=142;b>0;b--)
  37.             for(a=2;a>0;a--);
  38. }

  39. void vol_up()
  40. {
  41.          cdi+=1;
  42.          DAC();
  43.             delay(1);
  44.          dy=A_D()*9/5;
  45.          ge=dy/51;                // 计算整数部分
  46.          dian=(dy%51)*100/51;        //计算小数部分
  47.          xiao1=dian/10;          //取小数点后第一位
  48.          xiao2=dian%10;           //去小数点后第二位
  49. }

  50. void vol_down()
  51. {
  52.          cdi-=1;
  53.          DAC();
  54.             delay(1);
  55.          dy=A_D()*9/5;
  56.          ge=dy/51;                // 计算整数部分
  57.          dian=(dy%51)*100/51;        //计算小数部分
  58.          xiao1=dian/10;          //取小数点后第一位
  59.          xiao2=dian%10;           //去小数点后第二位
  60. }
  61. /*****  
  62. *函数名称:   void dispaly1()                     
  63. *输入参数:  共0个参数;  
  64. *输出参数:  共0个参数;  
  65. *返回值:    无;  
  66. *需储存的参数: 共0个参数;      
  67. *功能介绍:         显示电压值                     
  68. *****/
  69. void display()
  70. {   
  71.         if(flag==0)
  72.         {
  73.         P1=table[ge]&0xfe;         
  74.         P1=table[ge]&0xfe;                  //显示整数位,与0x01是为了显示小数点       
  75.         L1=1;                
  76.         delay(1);
  77.         L1=0;
  78.         P1=table[xiao1];                 //显示小数点后第一位
  79.         L2=1;
  80.         delay(1);
  81.         L2=0;
  82.         P1=table[xiao2];          //显示小数点后第二位,
  83.         L3=1;
  84.         delay(1);
  85.         L3=0;
  86.         }
  87.         else
  88.         {
  89.         P1=table[h]&0xfe;         
  90.         P1=table[h]&0xfe;                  //显示整数位,与0x01是为了显示小数点       
  91.         L1=1;                
  92.         delay(1);
  93.         L1=0;
  94.         P1=table[m];                 //显示小数点后第一位
  95.         L2=1;
  96.         delay(1);
  97.         L2=0;
  98.         P1=table[l];          //显示小数点后第二位,
  99.         L3=1;
  100.         delay(1);
  101.         L3=0;
  102.         }
  103. }


  104. /*****  
  105. *函数名称:   uchar A_D()                     
  106. *输入参数:  共0个参数;  
  107. *输出参数:  共0个参数;  
  108. *返回值:    有;  
  109. *需储存的参数: 共0个参数;      
  110. *功能介绍:         采集电压                    
  111. *****/
  112. uint A_D()
  113. {
  114.         uint dat;
  115.         uchar i;
  116.         CS=1;        //一个转换周期开始
  117.         CLK=0;        //为第一个脉冲准备
  118.         CS=0;        //CS置0,片选有效
  119.         DIO=1;        //DIO置1,规定起始信号
  120.         CLK=1;        //第一个脉冲
  121.         CLK=0;        //第一个脉冲的下降沿,此前DIO必须是高电平
  122.         DIO=1;        //DIO置1,通道选择信号
  123.         CLK=1;        //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入
  124.                         //两位数据用于选择通道,这里选通道CH1
  125.         CLK=0;        //第二个脉冲下降沿
  126.         DIO=1;//DI置1,选择通道1
  127.         CLK=1;//第三个脉冲
  128.         CLK=0;//第三个脉冲下降沿
  129.         DIO=1;//第三个脉冲下沉沿之后,输入端DIO失去作用,应置1
  130.         CLK=1;//第四个脉冲
  131.         for(i=0;i<8;i++)          //高位在前,循环8次读出8位数据
  132.         {
  133.                 CLK=1;                   //第四个脉冲
  134.                 CLK=0;
  135.                 dat<<=1;                  //将下面存储的低位数据右移
  136.                 dat|=(uchar)DIO; //将输出数据DIO通过或运算存储在dat最低位
  137.         }
  138.         CS=1;//片选无效
  139.         return dat;
  140. }

  141. void DAC()
  142. {       
  143.         P0 = cdi;
  144.         WR2=0;
  145.         WR2=1;
  146. }

  147. /*****  
  148. *函数名称:   void key_test()                     
  149. *输入参数:  共0个参数;  
  150. *输出参数:  共0个参数;  
  151. *返回值:    无;  
  152. *需储存的参数: 共0个参数;      
  153. *功能介绍:         键盘扫描程序,采用行反转法对键盘进行扫描,确定键值                        
  154. *****/
  155. void key_test()
  156. {         
  157.         uchar temp=0;       
  158.                 delay(10);        //去抖
  159.                 if((P3&0x0f)!=0x0f)
  160.                 {
  161.                         temp=P3;
  162.                         P3=0x70;
  163.                         temp=temp|P3; //将行列值或即可得到每个键的编码
  164.                         switch(temp)
  165.                         {
  166.                         case 0x3e:key=1;break; //1
  167.                         case 0x5e:key=2;break; //2
  168.                         case 0x6e:key=3;break; //3
  169.                         case 0x3d:key=4;break; //4
  170.                         case 0x5d:key=5;break; //5
  171.                         case 0x6d:key=6;break; //6
  172.                         case 0x3b:key=7;break; //7
  173.                         case 0x5b:key=8;break; //8
  174.                         case 0x6b:key=9;break; //9
  175.                         case 0x37:key=10;break;        //*
  176.                         case 0x57:key=0;break;        //0
  177.                         case 0x67:key=11;break;        //#
  178.                         default:key=12;
  179.                         }
  180.                         while((P3&0x70)!=0x70);        //判断松手检测
  181.                 }
  182. }
  183. void main()
  184. {
  185.         uint i=0;
  186.         uchar set_ok=0;
  187.         LED1=0;
  188.         DAC();
  189.         delay(1);
  190.         dy=A_D()*9/5;
  191.         ge=dy/51;                // 计算整数部分
  192.         dian=(dy%51)*100/51;        //计算小数部分
  193.         xiao1=dian/10;          //取小数点后第一位
  194.         xiao2=dian%10;           //去小数点后第二位
  195.         display();
  196.         while(1)
  197.         {               
  198.                          P3=0x0f;
  199.                  if((P3&0x0f)!=0x0f)
  200.                           { key_test();
  201.                                 if(key==10)                                   //设置键
  202.                                     {        LED1=1;
  203.                                             flag=1;
  204.                                             key=12;
  205.                                      }
  206.                                 else if(key==11)                   //确定键
  207.                                     {
  208.                                             flag=0;
  209.                                             LED1=0;
  210.                                             key=12;
  211.                                                   set_ok=1;
  212.                                      }
  213.                                                                                          
  214.                                 else if(key!=12)                         //其他数字键
  215.                                         {       
  216.                                            if(flag==1)
  217.                                            {
  218.                                               h=m;
  219.                                                   m=l;
  220.                                                   l=key;
  221.                                                   key=12;
  222.                                                 }
  223.                                          }                                               
  224.                             }

  225.                         if(set_ok==1)
  226.                         {
  227.                            set_ok=0;
  228.                            if(h>ge)
  229.                            {
  230.                               do
  231.                                   {vol_up();}
  232.                                   while(h>ge);
  233.                                 }
  234.                                 else if(h<ge)
  235.                                 {
  236.                                   do
  237.                                   {vol_down();}
  238.                                   while(h<ge);
  239.                                 }

  240.                                 if(m>xiao1)
  241.                            {
  242.                               do
  243.                                   {vol_up();}
  244.                                   while(m>xiao1);
  245.                                 }
  246.                                 else if(m<xiao1)
  247.                                 {
  248.                                   do
  249.                                   {vol_down();}
  250.                                   while(m<xiao1);
  251.                                 }
  252.                         }       
  253.                                                                
  254.                         display();
  255.                 }
  256. }
复制代码

所有资料51hei提供下载:
可控电源.zip (62.27 KB, 下载次数: 59)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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