找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DAC0832数控电源的单片机程序与PCB及原理图

  [复制链接]
跳转到指定楼层
楼主
Altium Designer画的DAC0832数控电源原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned char uint8;
  3. typedef unsigned int  uint16;
  4. sbit V_ADD   = P3^4;           //电压加
  5. sbit V_MIN   = P3^5;           //电压减
  6. sbit V_SROTE = P3^6;           //读取上次存储的电压
  7. sbit V_TJ    = P3^7;           //电压调节开关
  8. /************EEPROM引脚*******************************/
  9. sbit SCL=P3^2;       //AT24C02的时钟线
  10. sbit SDA=P3^3;       //AT24C02的数据线
  11. /*********************************************************/
  12. void delay(uint16 time);   //延时函数
  13. void led(uint8 duan,uint8 wei, uint8 dian);        //数码管显示函数
  14. void iic_start();                                // IIC的开始信号产生函数
  15. void iic_stop();                                // IIC的结束信号产生函数
  16. void iic_ack(bit sda1);                        // IIC的应答信号产生函数
  17. void iic_write(uint8 date);                // IIC通信,写数据函数
  18. uint8 iic_read(uint8 sda2);                // 向EEPROM定入一个字节的数据
  19. void iic_store(uint8 date,uint8 adss);  //将date储存到EEPROM指定的一个单元中
  20. uint8 iic_got(uint8 adss,uint8 sck);     // 将1个数据从EEPROM指定的地址中读出
  21. void key();
  22. void display();
  23. /*********************************************************/
  24. uint8   led7[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  25.                   0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管编码

  26. uint8  dy_dx=0;      //电压数字量大小
  27. uint16 V = 0;                 //电压模拟量大小
  28. bit  v_tjv=0;                 //电压调节开关指示变量
  29. void main()
  30. {


  31.   while(1)
  32.         {
  33.                   
  34.                 key();
  35.                   display();
  36.         }

  37. }


  38. /**********************************************
  39. 函数名:delay
  40. 行参  :time 延时基数
  41. 功能  :用while延时(6us单位)
  42. ************************************************/
  43. // 延时函数(6us单位)
  44. void delay(uint16 time)
  45. {
  46.           while(time--);

  47. }


  48. /************************************************************
  49. 函数名:led
  50. 行参  :duan--段码 ,wei--位码, dian--是否显示点
  51. 功能  :数码管显示函数
  52. ***********************************************************/
  53. void led(uint8 duan,uint8 wei, uint8 dian)
  54. {
  55.   if(dian==1)
  56.     P1 = led7[duan]-0x80; //是否显示点
  57.   else
  58.     P1 = led7[duan];
  59.   P2=~(1<<(wei-1));
  60.   delay(100);
  61.   P2 = 0XFF;
  62. }



  63. /**********************************************
  64. 函数名:iic_start
  65. 功能  :IIC的开始信号产生函数  
  66. ************************************************/
  67. /******************************************/
  68. void iic_start()
  69. {
  70. SDA=1;                  //可根据资料的开始时延来写
  71. SCL=0;
  72. SCL=1;
  73. delay(1);
  74. SDA=0;
  75. delay(1);
  76. SCL=0;
  77. SDA=1;

  78. }

  79. /**********************************************
  80. 函数名:iic_stop
  81. 功能  :IIC的结束信号产生函数
  82. ************************************************/
  83. /****************************************/
  84. void iic_stop()
  85. {  
  86.   SDA=0;          //可根据资料的开始时延来写
  87.   SCL=0;
  88.   SCL=1;
  89.   delay(1);
  90.   SDA=1;
  91.   delay(1);
  92.   SCL=0;
  93.   SDA=1;
  94.   

  95. }
  96. /**********************************************
  97. 函数名:iic_ack
  98. 行参  :sda1 要定入的指令
  99. 功能  :IIC的应答信号产生函数
  100. ************************************************/
  101. // sda1=0发送应答,sda1=1发送非应答
  102. void iic_ack(bit sda1)
  103. {
  104.    SCL=0;
  105.    SDA=sda1;
  106.    SCL=1;
  107.    delay(1);
  108.    SCL=0;
  109. }
  110. /**********************************************
  111. 函数名:iic_write
  112. 行参  :date 要定入的指令或数据
  113. 功能  :向EEPROM定入一个字节的数据
  114. ************************************************/
  115. //IIC通信,写数据函数
  116. void iic_write(uint8 date)
  117. {
  118.    uint8 i;
  119.    SCL=0;            //接低时钟线
  120.    for(i=0;i<8;i++)           //循环8次将8位数据送入EEPROM
  121.                 {
  122.                     if(date&0x80)        //循环取出数据的每一位
  123.                             SDA=1;            //将数据赋给EEPROM的数据线
  124.                         else
  125.                             SDA=0;            
  126.                     SCL=1;                        //拉高时钟线
  127.                         date<<=1;                //左移一位
  128.                         SCL=0;                        //拉低时钟线
  129.                 }
  130.    SDA=1;                                        //接收应答
  131.    SCL=0;
  132.    SCL=1;
  133.    delay(20);
  134.    SCL=0;
  135.   }
  136.   
  137. /**********************************************
  138. 函数名:iic_read
  139. 行参  :sda2 发送应答或非应答的选择(0——非应答,1——应答)
  140. 功能  :向EEPROM定入一个字节的数据
  141. ************************************************/     
  142. //ATC2402读数据
  143. uint8 iic_read(uint8 sda2)
  144. {
  145.   uint8 i,date=0;  //数据返回
  146.   SCL=0;                   //接低时钟线
  147.   SDA=1;                   //拉高数据线
  148.   for(i=0;i<8;i++)
  149.                 {
  150.                    SCL=1;                //拉高时钟线
  151.                    date=date<<1;  //左移一位
  152.                    delay(1);
  153.                    if(SDA)
  154.                    date=date|0x01; //从数据线上读回数据赋给date
  155.                    SCL=0;                   //接低时钟线
  156.                  }                                  
  157.   iic_ack(sda2);                   //发送应答
  158.   return date;                           //返回数据
  159. }

  160. /**********************************************
  161. 函数名:iic_store
  162. 行参  :date——要储存的数据,adss——要存放的地址
  163. 功能  :将date储存到EEPROM指定的一个单元中
  164. ************************************************/  
  165. void iic_store(uint8 date,uint8 adss)
  166. {
  167.   iic_start();           //发送开始信号
  168.   iic_write(0xa0);  //器件地址
  169.   iic_write(adss);  //数据要存放的地址
  170.   iic_write(date);  //存入数据
  171.   iic_stop();       //一定要写这条停止指令。
  172.   
  173. }
  174. /**********************************************
  175. 函数名:iic_got
  176. 行参  :adss——要读取的数据的地址,sck——为1表示发送应答,为0表示发送非应答
  177. 功能  :将1个数据从EEPROM指定的地址中读出
  178. ************************************************/
  179. uint8 iic_got(uint8 adss,uint8 sck)
  180. {
  181.   uint8 date1;               //返回数据
  182.   iic_start();              //发送开始信号
  183.   iic_write(0xa0);    //器件地址
  184.   iic_write(adss);    //要读取的数据的地址
  185.   iic_start();              //发送开始信号
  186.   iic_write(0xa1);    //器件地址(选择读)
  187.   date1=iic_read(sck);//读取数据
  188.   if(!sck)
  189.      iic_stop();           //发送停止信号
  190.   return date1;                   //返回数据
  191. }

  192. void key()
  193. {
  194.   if(!V_TJ)
  195.           {
  196.                    while(!V_TJ)
  197.                           display();
  198.                  v_tjv=~v_tjv;
  199.           
  200.           }
  201.   if(!V_SROTE)
  202.       {
  203.                     while(!V_SROTE)
  204.                           display();
  205.                     dy_dx=iic_got(0x00,0);
  206.           }
  207.   if(v_tjv)
  208.       {
  209.                             if(!V_ADD&&dy_dx!=250)
  210.                                   {
  211.                                            dy_dx=dy_dx+2;
  212.                                          iic_store(dy_dx,0x00);
  213.                                          while(!V_ADD)
  214.                                                   display();
  215.                                          
  216.                                   
  217.                                   }
  218.                             else if(!V_MIN&&dy_dx!=0)
  219.                                     {
  220.                                            dy_dx=dy_dx-2;
  221.                                          iic_store(dy_dx,0x00);
  222.                                          while(!V_MIN)
  223.                                                   display();
  224.                                                                    
  225.                                   }
  226.           }
  227. }

  228. void display()
  229. {
  230.   P0=dy_dx;
  231.   V = dy_dx*4.8;
  232.   led(V/1000,1, 0);
  233.   led(V%1000/100,2, 1);
  234.   led(V%100/10,3, 0);
  235.   led(V%10,4, 0);

  236. }


复制代码

所有资料51hei提供下载:
0907917shukongdianyuan.rar (5.23 MB, 下载次数: 296)


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

使用道具 举报

沙发
ID:427869 发表于 2018-12-8 20:37 | 只看该作者
感谢楼主提供的资料,我下载下来学习参考下。
回复

使用道具 举报

板凳
ID:298582 发表于 2019-1-4 21:32 | 只看该作者
我怎么没找看到呢。。。感谢,学习一下
回复

使用道具 举报

地板
ID:298582 发表于 2019-1-4 21:33 | 只看该作者

我怎么没有找点看到,谢谢分享
回复

使用道具 举报

5#
ID:239055 发表于 2019-6-11 19:30 来自手机 | 只看该作者
谢谢了,我也想弄一个数控电源
回复

使用道具 举报

6#
ID:342010 发表于 2019-6-22 22:48 | 只看该作者
感谢楼主
回复

使用道具 举报

7#
ID:541246 发表于 2019-7-14 15:03 | 只看该作者
感恩。
回复

使用道具 举报

8#
ID:541246 发表于 2019-7-18 11:24 | 只看该作者
不错的资料,有学习价值!
回复

使用道具 举报

9#
ID:704663 发表于 2020-3-8 17:09 | 只看该作者
非常感谢楼主,很有意义的学习资料!
回复

使用道具 举报

10#
ID:303894 发表于 2020-3-11 11:38 | 只看该作者
这个真好谢谢楼主
回复

使用道具 举报

11#
ID:18797 发表于 2020-4-9 17:38 | 只看该作者
不可多得的学习资料,谢谢!!!
回复

使用道具 举报

12#
ID:18797 发表于 2020-4-9 17:38 | 只看该作者
不可多得的学习单片机资料,谢谢!!
回复

使用道具 举报

13#
ID:686387 发表于 2020-4-10 22:49 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

14#
ID:846847 发表于 2021-1-17 16:06 | 只看该作者
请问你这个有过流、短路保护吗?
回复

使用道具 举报

15#
ID:1062077 发表于 2023-3-15 20:52 | 只看该作者
感谢楼主的资料,很有帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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