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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2591|回復: 0
收起左側

單片機數顯穩壓電源設計分享 Proteus仿真代碼

[復制鏈接]
ID:184978 發表于 2021-5-13 12:41 | 顯示全部樓層 |閱讀模式
分享一款數顯穩壓電源設計資料
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png

單片機源程序如下:
  1. /*數字電壓表,能在0-5V,0-50V,0-250V之間自動切換量程*/
  2. #include<reg51.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #include <intrins.h>
  6. code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定義數碼管顯示數值
  7. uchar str_TME[4]={0,0,0,0,}; //定義數碼管顯示初始值
  8. unsigned char data1;     //data1用來存放轉換以后的數據
  9. sbit dang1=P2^7;
  10. sbit dang2=P2^6;
  11. sbit key1=P0^0;
  12. sbit led1=P1^7;//0-50V指示
  13. sbit led2=P1^6;//0-250V批示
  14. sbit led3=P1^5;//0-5V指示
  15. uchar flag;//用來作量程標志
  16. void delay(uchar ms) //定義ms延遲程序
  17. {
  18. uchar i;
  19. while(ms--)
  20. for(i=0;i<125;i++);
  21. }
  22. uchar tmel=0;
  23. bit sim=1;//轉換標志
  24. /***********************計數器中斷函數,用于控制電壓轉*********************
  25. *******************時間間隔,此程序設定間隔為1S電壓轉換一次***************/
  26. void  tme_tr0(void)  interrupt 1
  27. {
  28. TL0=0xb0;
  29. TH0=0x3c;
  30. if(++tmel==20)
  31.     {
  32.         tmel=0;
  33.         sim=1;//1S時間到,實現一次電壓轉換
  34.     }
  35. }
  36. /*****************定義數碼管顯示(共陽數碼管)***************************/
  37. sbit k1=P1^0;   //第一位
  38. sbit k2=P1^1;   //第二位
  39. sbit k3=P1^2;   //第三位
  40. sbit k4=P1^3;   //第四位
  41. void VAL_xs0()//0-250v顯示
  42. {
  43. k1=1; k2=1; k3=1; k4=1;
  44. P3=TAB[str_TME[0]];   
  45. k1=0;  //第一位顯示
  46. delay(5);
  47. k1=1;
  48. P3=TAB[str_TME[1]];
  49. k2=0; //第二位顯示
  50. delay(5);
  51. k2=1;
  52. P3=(TAB[str_TME[2]])&0x7f;//顯示小數點
  53. k3=0;  //第三位顯示
  54. delay(5);
  55. k3=1;
  56. P3=TAB[str_TME[3]];
  57. k4=0;  //第四位顯示
  58. delay(5);
  59. k4=1;
  60. }
  61. void VAL_xs1()//0-50v顯示
  62. {
  63. k1=1; k2=1; k3=1; k4=1;
  64. P3=TAB[str_TME[0]];   
  65. k1=0;  //第一位顯示
  66. delay(5);
  67. k1=1;
  68. P3=(TAB[str_TME[1]])&0x7f;//顯示小數點
  69. k2=0; //第二位顯示
  70. delay(5);
  71. k2=1;
  72. P3=TAB[str_TME[2]];
  73. k3=0;  //第三位顯示
  74. delay(5);
  75. k3=1;
  76. P3=TAB[str_TME[3]];
  77. k4=0;  //第四位顯示
  78. delay(5);
  79. k4=1;
  80. }
  81. void VAL_xs2()//0-5v顯示
  82. {
  83. k1=1; k2=1; k3=1; k4=1;
  84. P3=(TAB[str_TME[0]])&0x7f;   
  85. k1=0;  //第一位顯示
  86. delay(5);
  87. k1=1;
  88. P3=TAB[str_TME[1]];//顯示小數點
  89. k2=0; //第二位顯示
  90. delay(5);
  91. k2=1;
  92. P3=TAB[str_TME[2]];
  93. k3=0;  //第三位顯示
  94. delay(5);
  95. k3=1;
  96. P3=TAB[str_TME[3]];
  97. k4=0;  //第四位顯示
  98. delay(5);
  99. k4=1;
  100. }

  101. /******************************************************************************
  102.                             AD0832AD轉換子程序
  103. *******************************************************************************/
  104. sbit bADcs=P2^2;   //片選位
  105. sbit bADcl=P2^1;   //時鐘位
  106. sbit bADda=P2^0;   //數據位
  107. void ad(void)
  108. {           uchar i;
  109.      bADcs = 0;//當ADC0832未工作時其CS輸入端應為高電平,此時芯片禁用,開始工作CS為低電平
  110.          bADcl=0;  //第一個時鐘下降沿前da為1,第二個與第三時鐘下降沿前的數據為通道選擇
  111.          bADda=1;  //選置起始位
  112.          bADcl=1;
  113.          bADcl=0;   //   1down
  114.          bADda=1;   //通道選擇第1位
  115.          bADcl=1;
  116.          bADcl=0;        //   2 down
  117.          bADda=0;   //通道選擇第2位,通道選擇為1,0選通道0
  118.          bADcl=1;
  119.          bADcl=0;        //   3 down
  120.          bADda=1;
  121.          bADcl=1;
  122.          bADcl=0;        //   4 down
  123.          for(i=8;i>0;i--)
  124.                  {               
  125.                  data1<<=1;  //從第7位開始,要左移
  126.                  bADcl=0;
  127.                 bADcl=1;
  128.                 if(bADda==1) data1|=0x01;  //如果輸出1,data1最后一位補1
  129.                  }
  130.         bADcs=1;        //轉換完后CS置1
  131. }
  132. void changs()  //轉換程序
  133. {
  134.     double sum;         
  135.     uchar val_Integer;             //定義整數變量
  136.     unsigned int val_Decimal;      //定義小數變量
  137.    if((dang1==0)&&(dang2==1)) //檔位轉換(0-100V)
  138.     { flag=0;
  139.       sum=data1*0.0196078*20 ; //擴展50倍
  140.       led1=1;led2=0;led3=1;
  141.       val_Integer=(uchar)sum;
  142.       val_Decimal=(unsigned int)((sum-val_Integer)*10);
  143.       str_TME[3]=val_Decimal;
  144.       str_TME[2]=val_Integer%10;
  145.       str_TME[1]=val_Integer/10%10;
  146.       str_TME[0]=val_Integer/100;
  147.       if((sum<=25)&&(sum>=5))//如果在25V量程,則切換成25V量程
  148.         {
  149.          dang1=1; dang2=0;
  150.         }
  151.        if(sum<5)//小數字時切換成5V量程
  152.         { dang1=0;dang2=0;}   
  153.     }
  154.      else if((dang1==1)&(dang2==0))//檔位轉換(0-25V?
  155.         { flag=1;
  156.       sum=data1*0.0196078*5 ; //擴展5倍
  157.       led2=1;led1=0;led3=1;
  158.       val_Integer=(uchar)sum;
  159.       val_Decimal=(unsigned int)((sum-val_Integer)*100);
  160.       str_TME[3]=val_Decimal%10;
  161.       str_TME[2]=val_Decimal/10;
  162.       str_TME[1]=val_Integer%10;
  163.       str_TME[0]=val_Integer/10;
  164.       if(sum>24.9)//大于25V切換成大量程
  165.         {
  166.            dang1=0; dang2=1;
  167.         }
  168.        if(sum<5)//小于5V切換成5V量程
  169.         { dang1=0;dang2=0;}   
  170.     }
  171.      else if((dang1==0)&&(dang2==0))//檔位轉換(0-5V?
  172.           {  flag=2;
  173.         sum=data1*0.0196078 ;
  174.         led2=1;led1=1;  led3=0;
  175.         val_Integer=(uchar)sum;
  176.         val_Decimal=(unsigned int)((sum-val_Integer)*1000);
  177.         str_TME[3]=val_Decimal%10;
  178.         str_TME[2]=val_Decimal/10%10;
  179.         str_TME[1]=val_Decimal/100;
  180.         str_TME[0]=val_Integer;
  181.       
  182.         if(sum>4.9)//大于5V切換成25V量程
  183.           { dang1=1;dang2=0;
  184.               if(sum>25)//大于50V切換成250V量程
  185.               {
  186.                  dang1=0; dang2=1;
  187.               }
  188.           }
  189.       }
  190. }
  191. /*****************************************************
  192.                        主程序
  193. *******************************************************/
  194. main()
  195. {   
  196.     P1=0xc0;
  197.     IE=0x82;//開中斷
  198.     TMOD=0x01;//定時器設置
  199.     IP=0x01;
  200.     TL0=0xb0;//初值
  201.     TH0=0x3c;
  202.     TR0=1;//啟動
  203.    dang1=0;dang2=1;
  204. while(1)
  205.     {  
  206.        switch(flag)//用flag標志不同量程
  207.        {
  208.         case 0:
  209.         VAL_xs0();//250量程顯示
  210.         break;
  211.         case 1:
  212.         VAL_xs1();//50量程顯示
  213.         break;
  214.         case 2:
  215.         VAL_xs2();//5V量程顯示
  216.         break;
  217.         }            
  218.         if(sim==1)//1秒到后,實現一次電壓轉換
  219.             {         
  220.             ad();   //電壓轉換
  221.             changs();       //數據轉換
  222.             sim=0;
  223.             }        
  224.     }
  225. }
復制代碼

所有資料51hei提供下載,內含2個代碼與仿真,還有一個是電子秤 如有錯誤請多多指教:
1_數顯穩壓電源設計.zip (502.4 KB, 下載次數: 94)
51hei.png
51hei.png
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲大片在线观看 | 日韩av一区二区在线观看 | 亚洲精品免费在线观看 | 懂色中文一区二区在线播放 | 中文字幕精品一区 | 精品国产欧美一区二区三区成人 | 亚洲精品一区二区三区 | 国产成人精品一区二区在线 | 亚洲欧美在线一区 | 亚洲国产一区二区三区四区 | 99精品国产一区二区三区 | 四虎永久免费黄色影片 | 精品一区二区三区av | 亚洲性人人天天夜夜摸 | 久久久www成人免费无遮挡大片 | av看片网站| 日韩欧美一区二区三区 | 精品久久精品 | 91视频国产区 | 日韩一区三区 | 国产资源在线视频 | 久草在线| 久久97精品 | 老熟女毛片 | 激情欧美一区二区三区中文字幕 | 国产欧美视频一区 | 日韩成人免费视频 | 久久99精品久久久 | 在线一区二区国产 | 男人天堂av网站 | 婷婷在线视频 | 美女激情av | 在线观看成人免费视频 | 黄视频网址 | 午夜一区二区三区在线观看 | 欧美一区成人 | 亚洲成人免费电影 | 自拍偷拍av| 色www精品视频在线观看 | 综合中文字幕 | 亚洲免费在线观看视频 |