久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 單片機(jī)+LM2596數(shù)控穩(wěn)壓電源源程序 [打印本頁]

作者: 51hei小林    時間: 2016-10-11 20:16
標(biāo)題: 單片機(jī)+LM2596數(shù)控穩(wěn)壓電源源程序
主要器件:

使用LCD1602顯示
電源可調(diào)模塊用到LM2596
模數(shù)轉(zhuǎn)換ADC0832

主要功能:
理論電壓范圍 1.25V~40V
電壓、電流顯示
短路保護(hù)電路

資料下載:
LM2596 數(shù)控電源.rar (2.1 KB, 下載次數(shù): 771)


源程序:
  1. #include"reg52.h"
  2. #include<stdio.h>
  3. #include <intrins.h>

  4. typedef  unsigned char uchar;
  5. typedef  unsigned int uint;


  6. #define LCD_Data P0
  7. #define Busy    0x80 //用于檢測LCD狀態(tài)字中的Busy標(biāo)識

  8. sbit ADC0832_CLK = P1^5;
  9. sbit ADC0832_DODI = P1^6;
  10. sbit ADC0832_CS = P1^7;

  11. sbit LCD_RS=P2^7;//定義引腳
  12. sbit LCD_RW=P2^6;
  13. sbit LCD_E=P2^5;

  14. float volts,amps;

  15. //5ms延時
  16. void Delay5Ms(void)
  17. {
  18.     unsigned int TempCyc = 5552;
  19.     while(TempCyc--);
  20. }

  21. //400ms延時
  22. void Delay400Ms(void)
  23. {
  24.     unsigned char TempCycA = 5;
  25.     unsigned int TempCycB;
  26.     while(TempCycA--)
  27.     {
  28.         TempCycB=7269;
  29.         while(TempCycB--);
  30.     };
  31. }

  32. //讀狀態(tài)
  33. unsigned char ReadStatusLCD(void)
  34. {
  35.     LCD_Data = 0xFF;
  36.     LCD_RS = 0;
  37.     LCD_RW = 1;
  38.     LCD_E = 0;
  39.     LCD_E = 0;
  40.     LCD_E = 1;
  41.     while (LCD_Data & Busy); //檢測忙信號
  42.     return(LCD_Data);
  43. }

  44. //寫數(shù)據(jù)
  45. void WriteDataLCD(unsigned char WDLCD)
  46. {
  47.     ReadStatusLCD(); //檢測忙
  48.     LCD_Data = WDLCD;
  49.     LCD_RS = 1;
  50.     LCD_RW = 0;
  51.     LCD_E = 0; //若晶振速度太高可以在這后加小的延時
  52.     LCD_E = 0; //延時
  53.     LCD_E = 1;
  54. }

  55. //寫指令
  56. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC為0時忽略忙檢測
  57. {
  58.     if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測忙
  59.     LCD_Data = WCLCD;
  60.     LCD_RS = 0;
  61.     LCD_RW = 0;
  62.     LCD_E = 0;
  63.     LCD_E = 0;
  64.     LCD_E = 1;
  65. }

  66. //讀數(shù)據(jù)
  67. unsigned char ReadDataLCD(void)
  68. {
  69.     LCD_RS = 1;
  70.     LCD_RW = 1;
  71.     LCD_E = 0;
  72.     LCD_E = 0;
  73.     LCD_E = 1;
  74.     return(LCD_Data);
  75. }

  76. void LCDInit(void) //LCM初始化
  77. {
  78.     LCD_Data = 0;
  79.     WriteCommandLCD(0x38,0); //三次顯示模式設(shè)置,不檢測忙信號
  80.     Delay5Ms();
  81.     WriteCommandLCD(0x38,0);
  82.     Delay5Ms();
  83.     WriteCommandLCD(0x38,0);
  84.     Delay5Ms();
  85.    
  86.     WriteCommandLCD(0x38,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
  87.     WriteCommandLCD(0x08,1); //關(guān)閉顯示
  88.     WriteCommandLCD(0x01,1); //顯示清屏
  89.     WriteCommandLCD(0x06,1); // 顯示光標(biāo)移動設(shè)置
  90.     WriteCommandLCD(0x0C,1); // 顯示開及光標(biāo)設(shè)置
  91. }

  92. //按指定位置顯示一個字符
  93. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  94. {
  95.     Y &= 0x1;
  96.     X &= 0xF; //限制X不能大于15,Y不能大于1
  97.     if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40;
  98.     X |= 0x80; // 算出指令碼
  99.     WriteCommandLCD(X, 0); //這里不檢測忙信號,發(fā)送地址碼
  100.     WriteDataLCD(DData);
  101. }

  102. //按指定位置顯示一串字符
  103. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  104. {
  105.     unsigned char ListLength;
  106.    
  107.     ListLength = 0;
  108.     Y &= 0x1;
  109.     X &= 0xF; //限制X不能大于15,Y不能大于1
  110.     while (DData[ListLength]>=0x20) //若到達(dá)字串尾則退出
  111.     {
  112.         if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF
  113.      {
  114.             DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  115.             ListLength++;
  116.          X++;
  117.      }
  118.     }
  119. }

  120. //讀取ADC0832轉(zhuǎn)換值函數(shù)
  121. //入口函數(shù):channel選擇通道
  122. uchar ADC0832_Read(uchar channel)
  123. {
  124.     uchar i = 0;   
  125.     uchar tmp = 0;  //高字節(jié)數(shù)據(jù)
  126.     uchar tmp1 = 0; //低字節(jié)數(shù)據(jù)

  127.    
  128.     //開始標(biāo)志位
  129.     ADC0832_DODI = 1;
  130.     _nop_();  _nop_();

  131.     ADC0832_CS = 0;     //片選信號  

  132.     ADC0832_CLK = 1;
  133.     _nop_();  _nop_();
  134.     ADC0832_CLK = 0;
  135.     _nop_();  _nop_();

  136.     //選擇通道
  137.     switch(channel)
  138.     {
  139.         case 0:     //通道0
  140.             ADC0832_DODI = 1;   //SGL = 1;
  141.             _nop_();  _nop_();
  142.             ADC0832_CLK = 1;
  143.             _nop_();  _nop_();
  144.             ADC0832_CLK = 0;
  145.             _nop_();  _nop_();

  146.             ADC0832_DODI = 0;   //ODD = 0;
  147.             _nop_();  _nop_();
  148.             ADC0832_CLK = 1;
  149.             _nop_();  _nop_();
  150.             ADC0832_CLK = 0;
  151.             _nop_();  _nop_();
  152.             break;

  153.         case 1:     //通道1
  154.             ADC0832_DODI = 1;   //SGL = 1;
  155.             _nop_();  _nop_();
  156.             ADC0832_CLK = 1;
  157.             _nop_();  _nop_();
  158.             ADC0832_CLK = 0;
  159.             _nop_();  _nop_();

  160.             ADC0832_DODI = 1;   //ODD = 1;
  161.             _nop_();  _nop_();
  162.             ADC0832_CLK = 1;
  163.             _nop_();  _nop_();
  164.             ADC0832_CLK = 0;
  165.             _nop_();  _nop_();
  166.             break;
  167.          
  168.         default:
  169.             break;   
  170.     }

  171.     ADC0832_DODI = 1;
  172.     _nop_();  _nop_();

  173.     //讀取8位轉(zhuǎn)換數(shù)值
  174.     for(i=0;i<8;i++)
  175.     {
  176.         ADC0832_CLK = 1;
  177.         _nop_();  _nop_();
  178.         ADC0832_CLK = 0;
  179.         _nop_();  _nop_();

  180.         if(ADC0832_DODI)
  181.         {
  182.             tmp |= 0x01;   
  183.         }
  184.         else
  185.         {
  186.             tmp &= 0xfe;
  187.         }
  188.         if(i<7)
  189.         {
  190.             tmp <<= 1;
  191.         }         
  192.     }

  193.     tmp1 =  tmp & 0x01;
  194.     tmp1 <<= 6;

  195.     for(i=0;i<7;i++)
  196.     {
  197.         ADC0832_CLK = 1;
  198.         _nop_();  _nop_();
  199.         ADC0832_CLK = 0;
  200.         _nop_();  _nop_();

  201.         if(ADC0832_DODI)
  202.         {
  203.             tmp1 |= 0x80;
  204.         }
  205.         else
  206.         {
  207.             tmp1 &= 0x7f;
  208.         }
  209.         if(i<6)
  210.         {
  211.             tmp1 >>= 1;
  212.         }   
  213.     }

  214.     ADC0832_CS = 1;

  215.     if(tmp == tmp1) //當(dāng)高字節(jié)與低字節(jié)相同時,該值有效
  216.     {
  217.         return tmp; //返回數(shù)值
  218.     }
  219. }

  220. void DisPlayValue(uint volts,uint amps)
  221. {
  222.     DisplayOneChar(0,0,'U');
  223.     DisplayOneChar(1,0,'=');
  224.     if(volts/10000 == 0)
  225.     {
  226.         DisplayOneChar(2,0,'0' + (volts/1000%10));
  227.         DisplayOneChar(3,0,'.');
  228.         DisplayOneChar(4,0,'0' + (volts/100%10));
  229.         DisplayOneChar(5,0,'0' + (volts/10%10));
  230.         DisplayOneChar(6,0,'0' + (volts%10));
  231.         DisplayOneChar(7,0,' ');
  232.         DisplayOneChar(8,0,'V');
  233.         DisplayOneChar(9,0,' ');
  234.     }
  235.     else
  236.     {
  237.         DisplayOneChar(2,0,'0' + (volts/10000));
  238.         DisplayOneChar(3,0,'0' + (volts/1000%10));
  239.         DisplayOneChar(4,0,'.');
  240.         DisplayOneChar(5,0,'0' + (volts/100%10));
  241.         DisplayOneChar(6,0,'0' + (volts/10%10));
  242.         DisplayOneChar(7,0,'0' + (volts%10));
  243.         DisplayOneChar(8,0,' ');
  244.         DisplayOneChar(9,0,'V');
  245.     }
  246.      
  247.     DisplayOneChar(0,1,'I');
  248.     DisplayOneChar(1,1,'=');
  249.     DisplayOneChar(2,1,'0' + (amps/1000));
  250.     DisplayOneChar(3,1,'.');
  251.     DisplayOneChar(4,1,'0' + (amps/100%10));
  252.     DisplayOneChar(5,1,'0' + (amps/10%10));
  253.     DisplayOneChar(6,1,'0' + (amps/1%10));
  254.     DisplayOneChar(7,1,' ');
  255.     DisplayOneChar(8,1,'A');         
  256. }

  257. void GetValue(void)
  258. {
  259.     uchar tmp,i;
  260.     uint ntmp;

  261.     for(i=0;i<10;i++)
  262.     {
  263.         tmp = ADC0832_Read(0);
  264.         ntmp += tmp;
  265.     }

  266.     volts = (ntmp/10)*0.1137*1000;
  267.     Delay5Ms();
  268.     ntmp = 0;

  269.     for(i=0;i<20;i++)
  270.     {
  271.         tmp = ADC0832_Read(1);
  272.         ntmp += tmp;
  273.     }

  274.     amps = (ntmp/20)*0.0196*1000;
  275.     Delay5Ms();

  276.     DisPlayValue(volts,amps);

  277. }

  278. void main(void)
  279. {
  280.     Delay400Ms(); //啟動等待,等LCD講入工作狀態(tài)
  281.     LCDInit(); //LCM初始化
  282.     Delay5Ms(); //延時片刻(可不要)

  283.     ReadDataLCD();//測試用句無意義

  284.     while(1)
  285.     {
  286.         GetValue();
  287.     }
  288. }
復(fù)制代碼



作者: bb24242424    時間: 2016-10-12 16:31
沒原理圖?
作者: 小白呂    時間: 2016-10-12 21:34
沒原理圖?

作者: shuijingyuice    時間: 2016-10-19 11:59
不錯 學(xué)習(xí)學(xué)習(xí)
作者: Jodelin    時間: 2016-11-3 18:48
為什么我的幣總是不夠的?
作者: 5swords    時間: 2016-12-20 13:33
原理圖在此http://www.zg4o1577.cn/bbs/dpj-56592-1.html
作者: 隨易而安    時間: 2016-12-20 16:17
51黑有你更精彩
作者: 山東臨沂    時間: 2016-12-21 16:04
正需要啊。學(xué)習(xí)中
作者: 說過的挺好    時間: 2016-12-21 22:26
挺好噠~~~
作者: xiaoer    時間: 2016-12-22 07:58
前一段時間購買了XL4016,做大功率數(shù)控電源,原理同上,
作者: 龍少11    時間: 2017-1-25 09:27
一直在尋找這個,終于找到了 ,下載學(xué)習(xí)中...........
作者: 13373092669    時間: 2017-4-5 22:04
怎么不能生成HEX
作者: Chandler1983    時間: 2017-4-6 13:22
沒原理圖,沒什么意思!!!
作者: Hitto    時間: 2017-5-10 20:55
理論電流輸出是多少?還有U2的那兩個集成運放是干什么的?
作者: xuanbaoren    時間: 2017-8-16 22:29
厲害,學(xué)習(xí)學(xué)習(xí)!
作者: ruanhua    時間: 2017-11-18 11:30
一直在尋找此類作品,正好學(xué)習(xí)一下知識
作者: aishininmen    時間: 2017-12-9 17:52
厲害,學(xué)習(xí)學(xué)習(xí)!
作者: 獨戰(zhàn)2011    時間: 2018-3-9 09:56
謝謝分享,急需
這樣的例程

作者: tthappy    時間: 2018-6-11 07:58
謝謝分享,收藏了
作者: MIkeS    時間: 2018-6-26 23:11
只有電壓采集 ,沒有調(diào)整輸出的功能啊
作者: ab560    時間: 2018-6-27 08:12
正需要,謝謝樓主分享
作者: bh2030693    時間: 2018-7-5 22:35
電壓顯示,沒有單片機(jī)調(diào)壓,想做一個調(diào)壓的
作者: bh2030693    時間: 2018-7-5 22:48
5swords 發(fā)表于 2016-12-20 13:33
原理圖在此http://www.zg4o1577.cn/bbs/dpj-56592-1.html

不配套,可互補(bǔ);
這個是顯示,那個是調(diào)壓。
作者: anyway132    時間: 2018-7-9 22:33
挺好的,學(xué)習(xí)下
作者: 2387806    時間: 2018-9-4 17:40
正需要,學(xué)習(xí)下
作者: 2387806    時間: 2018-9-4 17:42
正需要,謝謝樓主分享
作者: 色拉油    時間: 2018-10-8 14:11
參考一下,謝謝樓主
作者: 586486    時間: 2018-11-4 23:24
謝謝分享。
作者: ZUOJIANKUN    時間: 2018-11-21 18:16
感謝,非常感謝,號
作者: find_all    時間: 2019-3-8 17:31
學(xué)習(xí)一下。
作者: 真的見證1991    時間: 2019-6-3 16:05
學(xué)習(xí)了,謝謝樓主分享
作者: MIkeS    時間: 2019-6-12 02:30
恩,這個代碼,是純ADC采樣顯示,沒有數(shù)控的功能.
作者: 18239311863    時間: 2019-7-16 23:10
坑了唄,就一個點c文件
作者: yifeid    時間: 2019-11-18 22:25
坑了唄,就一個點c文件
作者: Hope2    時間: 2019-11-24 20:57
有圖嗎?
作者: wy_l    時間: 2019-11-24 22:41
受益匪淺
作者: wuxiandianzi    時間: 2019-12-11 21:24
非常感謝提供 這個!
作者: yhgwork    時間: 2021-5-1 09:25
不錯的數(shù)控電源
作者: Liangkan    時間: 2021-6-13 13:01
xiaoer 發(fā)表于 2016-12-22 07:58
前一段時間購買了XL4016,做大功率數(shù)控電源,原理同上,

可以分享一下嗎?謝謝你
作者: yyzf998    時間: 2023-3-26 16:10

樓主這里有個LM2596數(shù)控電源的程序希望能幫到你:http://www.zg4o1577.cn/bbs/dpj-56600-1.html




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久久久52avav | 一级毛片色一级 | 亚洲福利| 亚洲精品久久久一区二区三区 | 国产一二三区电影 | 精品国产乱码久久久久久88av | 九九精品在线 | 在线观看欧美一区 | 精品一级电影 | 久久久久国产一区二区三区 | 91视频一区二区 | 91精品久久久久久久久久入口 | 成人免费观看网站 | 亚洲国产精品久久 | 一区二区三区免费在线观看 | 欧美日韩精品在线一区 | 成人午夜黄色 | 国产精品网址 | 中文在线观看视频 | 91精品国产91久久综合桃花 | 精品亚洲一区二区 | 亚洲一区av在线 | 久久综合一区 | av在线二区 | 国产在线高清 | 99久久久久久 | 国产福利精品一区 | av在线一区二区三区 | 三级在线视频 | 成人午夜毛片 | 亚洲 精品 综合 精品 自拍 | 国产精品不卡视频 | 在线视频亚洲 | 色片在线观看 | 日本视频在线播放 | 国产精品久久久久久久久久久久冷 | 少妇久久久 | 精品久久久一区二区 | 99热热99 | 精品国产一区二区国模嫣然 | 久久精品视频9 |