找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4336|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)數(shù)控穩(wěn)壓電源設(shè)計(jì)報(bào)告與仿真程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于51的數(shù)控直流穩(wěn)壓電源的設(shè)計(jì)資料全套 分享給大家


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


數(shù)控穩(wěn)壓電源設(shè)計(jì)報(bào)告

班級:電信10-1班   學(xué)號:3100718116              姓名:羅遠(yuǎn)鋒

此次數(shù)控穩(wěn)壓電源設(shè)計(jì)我主要通過51單片機(jī)控制輸出來控制電源的電壓和顯示。主流程圖如下。
主要輸出部分
加減置數(shù)部分,通過對4X4矩陣鍵盤的設(shè)置,可任意置數(shù),加減, 自動步進(jìn),輸出波形。
預(yù)置數(shù)部分 通過撥碼開關(guān)來預(yù)置。
顯示部分 通過單片機(jī)對兩位數(shù)碼管進(jìn)行動態(tài)掃描




單片機(jī)源程序如下:
  1. #include<regx51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
  6. uchar time1=0;
  7. sbit led1=P2^0;
  8. sbit led2=P2^1;
  9. sbit ce=P2^4;
  10. #define timer0_count 0xfc18//定時(shí)器初值,設(shè)置time0 1/1000秒中斷一次
  11. const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管的顯示
  12. const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小數(shù)點(diǎn)的數(shù)碼管顯示
  13. uchar scan1;//用來分別顯示2個數(shù)碼管
  14. uchar scan2;
  15. uchar counter[2]={0xf1,0xf2};
  16. uchar vout=0; //j_片選,vout_電壓輸出

  17. static void timer0_initialize(void)//timer0的初始化
  18. //定時(shí)器的初始化程序
  19. {
  20.         EA=0;        //中斷控制器IE--停止接受中斷  
  21.                 TR0=0;        //停止計(jì)時(shí)
  22.                 TMOD=0x01;     //設(shè)置工作方式為1
  23.                 TL0=(timer0_count & 0x00ff);
  24.             TH0=(timer0_count>>8);  //設(shè)置time0 初值        
  25.                 PT0=1;    //設(shè)置timer0高優(yōu)先級
  26.                 ET0=1;          //允許timer0中斷
  27.                 TR0=1;           //開始計(jì)時(shí)
  28.                 EA=1;           //開所有中斷
  29. }

  30. void delay(uint t) //tms的延時(shí)
  31. {   
  32.         uchar i;
  33.         uint j;
  34.     for(j=0;j<t;j++)
  35.                 for(i=0;i<40;i++);
  36. }
  37. void shuc(void)
  38. {         
  39.          uchar nn;
  40.          vout=2*(scan2*10+scan1);//輸出的數(shù)字量
  41.         P1=vout;
  42.         for(nn=0;nn<250;nn++)
  43.                 ;
  44.                 nn=0;//輸出是存在D/A轉(zhuǎn)換時(shí)間差所以要延時(shí)

  45. }  
  46. void shaom(void)
  47. {
  48.          P3=0x0f;//掃描是否有按鍵按下
  49.      if((P3&0x0f)!=0x0f)
  50.      dd=0;
  51.          else
  52.          dd=1;
  53. }
  54. void zdbj(void) //自動步進(jìn)
  55. {
  56.         uchar rr;
  57.         jj=scan2;
  58.         ii=scan1;
  59.         shaom();
  60.         for(;jj<10;jj++)
  61.     {
  62.             for(;ii<10;ii++)
  63.                 {
  64.                          if(dd)
  65.                                  {
  66.                                          scan1=ii;
  67.                                          scan2=jj;
  68.                                         shuc();
  69.                                          for(rr=0;rr<250;rr++)
  70.                                         {
  71.                                                 shaom();
  72.                                                 if(dd)        
  73.                                                  delay(70);
  74.                                                 else
  75.                                                 break;
  76.                                         }
  77.                                          if(jj==9&&ii==9)
  78.                                          {
  79.                                                  ii=0;
  80.                                                  jj=0;
  81.                                          }
  82.         
  83.                                  }
  84.                         else
  85.                          {
  86.                                  jj=10;
  87.                                  ii=10;
  88.                          }
  89.                 }
  90.                 ii=0;
  91.     }
  92.         jj=0;
  93.         shaom();
  94.         for(;dd==0;)
  95.         shaom();

  96. }

  97. void sjb(void)        //三角波
  98. {
  99.         uchar max;
  100.         max=vout;
  101.         shaom();
  102.         for(;dd;)
  103.          {
  104.                    for(iii=0;iii<=max;iii=iii+2)
  105.                    {
  106.                           P1=iii;
  107.                         shaom();
  108.                          delay(10);
  109.                            if(dd==0)
  110.                  break;
  111.                 }
  112.                 if(dd==0)
  113.             break;
  114.                 for(;iii>0;iii=iii-2)
  115.                 {
  116.                         P1=iii;
  117.                         shaom();
  118.                         delay(5);
  119.                         if(dd==0)
  120.                         break;
  121.                 }
  122.                 if(dd==0)
  123.             break;
  124.           }
  125.            P1=max;
  126.          shaom();
  127.          for(;dd==0;)
  128.         shaom();
  129. }
  130. unsigned char keyscan(void)  //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
  131. {
  132.          unsigned char cord_h,cord_l;//行列值中間變量
  133.         P3=0x0f;          //行線輸出全為0
  134.          cord_h=P3&0x0f;     //讀入列線值
  135.          if(cord_h!=0x0f)    //先檢測有無按鍵按下
  136.          {
  137.                   delay(70);        //去抖
  138.                   if((P3&0x0f)!=0x0f)
  139.                   {
  140.                     cord_h=P3&0x0f;  //讀入列線值
  141.                     P3=cord_h|0xf0;  //輸出當(dāng)前列線值
  142.                     cord_l=P3&0xf0;  //讀入行線值                                                                                                   ;;
  143.                         while((P3&0xf0)!=0xf0);//等待松開并輸出
  144.                          {
  145.                                  time1=time1+1;
  146.                             return(cord_h+cord_l);//鍵盤最后組合碼值
  147.                          }
  148.                   }
  149.          }return(0);     //返回該值
  150. }
  151. void timer0_isr(void) interrupt 1   //timer0中斷
  152. //用于LED數(shù)碼管的動態(tài)顯示
  153. {
  154.         
  155.          TR0=0;    //停止時(shí)鐘0
  156.         P2=counter[j];
  157.         switch(j)
  158.         {
  159.                  case 0:P0=seg[scan1];break;                                                                                 
  160.                  case 1:P0=seg_point[scan2];break;
  161.                          default:break;        //j為其他情況是跳出循環(huán)
  162.         }
  163.         j++;
  164.         if(j==2)
  165.         j=0;
  166.     TL0=(timer0_count & 0x00ff);
  167.         TH0=(timer0_count>>8);  //設(shè)置time0 初值
  168.         TR0=1;         //開時(shí)鐘                                         
  169. }
  170.                                              
  171. void main(void)
  172. {                 
  173.         ce=0;
  174.         delay(5);   
  175.         scan1=(P3/2)%10;
  176.         scan2=P3/20;
  177.         ce=1;
  178.         delay(5);
  179.         shuc();

  180.         timer0_initialize();        //定時(shí)器初始化用于LED顯示
  181.     do
  182.    {     
  183.             key=keyscan();
  184.                 if(time1==1)
  185.                 switch( key)
  186.         {        
  187.                         
  188.                         case 0xee:aa=1;break;//1 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
  189.                  case 0xed:aa=2;break;
  190.                  case 0xeb:aa=3;break;
  191.                  case 0xe7:aa=4;break;//4
  192.                  case 0xde:aa=5;break;//5
  193.                        case 0xdd:aa=6;break;//5
  194.                           case 0xdb:aa=7;break;//6
  195.                             case 0xd7:aa=8;break;//7
  196.                           case 0xbe:aa=9;break;//8
  197.                           case 0xbd:aa=0;break;//9
  198.                      case 0xbb:time1--;break;//確認(rèn)
  199.                            case 0xb7: //三角波
  200.                         {
  201.                         time1=0;
  202.                         sjb();
  203.                         }
  204.                         break;
  205.                            case 0x7e:                //加
  206.                     {
  207.                                 time1=0;
  208.                              scan1++;
  209.                         if(scan1==10)
  210.                                 {
  211.                                         scan1=0;
  212.                                     scan2++;
  213.                                         if(scan2==10)
  214.                                         scan2=0;
  215.                                 }
  216.                                 shuc();
  217.                         }break;//c
  218.                           case 0x7d:                //減
  219.                     {
  220.                                 time1=0;
  221.                         scan1--;                                    
  222.                                 if(scan1==-1)
  223.                                 {         
  224.                                         scan1=9;
  225.                                         scan2--;
  226.                                         if(scan2==-1)
  227.                                         scan2=9;
  228.                                 }
  229.                                 shuc();
  230.                         }break;
  231.                               case 0x7b:                //自動步進(jìn)
  232.                         {
  233.                                 time1=0;
  234.                     zdbj();
  235.                         }break;//e
  236.                           case 0x77: time1--;break;        
  237.                   }
  238.                                                            
  239.                 if(time1==2)
  240.                 switch( key)
  241.                  {        
  242.                
  243.                         case 0xee:bb=1;break;//0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
  244.                          case 0xed:bb=2;break;//1
  245.                           case 0xeb:bb=3;break;//2
  246.                      case 0xe7:bb=4;break;//3
  247.                      case 0xde:bb=5;break;//4
  248.                      case 0xdd:bb=6;break;//5
  249.                      case 0xdb:bb=7;break;//6
  250.                           case 0xd7:bb=8;break;//7
  251.                           case 0xbe:bb=9;break;//8
  252.                           case 0xbd:bb=0;break;//9
  253.                           case 0xbb:                //確認(rèn)
  254.                         {
  255.                              scan2=0;
  256.                              scan1=aa;
  257.                                    time1=0;
  258.                                  shuc();
  259.                         }break;
  260.                           case 0xb7://三角波
  261.                         {
  262.                         time1=0;
  263.                         sjb();
  264.                         }
  265.                         break;
  266.                           case 0x7e:                //加
  267.                         {
  268.                                 time1=0;
  269.                         scan1++;
  270.                         if(scan1==10)
  271.                                 {
  272.                                         scan1=0;
  273.                                     scan2++;
  274.                                         if(scan2==10)
  275.                                         scan2=0;
  276.                                 }
  277.                                 shuc();
  278.                         }break;//c
  279.                      case 0x7d:                //減   
  280.                         {
  281.                                 time1=0;
  282.                               scan1--;                                    
  283.                                 if(scan1==-1)
  284.                                 {                  
  285.                                         scan1=9;
  286.                                         scan2--;
  287.                                         if(scan2==-1)
  288.                                          scan2=9;
  289.                                 }
  290.                                 shuc();
  291.                         }break;
  292.                           case 0x7b:                //自動步進(jìn)
  293.                     {
  294.                                 time1=0;
  295.             zdbj();
  296.                         }break;//e
  297.                           case 0x77: time1--;break;
  298.                  }
  299.                 ;
  300.                 if(time1>2)
  301.                  switch( key)
  302.                  {        
  303.                
  304.                           case 0xee:time1--;break;//0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
  305.                           case 0xed:time1--;break;//1
  306.                           case 0xeb:time1--;break;//2
  307.                           case 0xe7:time1--;break;//3
  308.                           case 0xde:time1--;break;//4
  309.                           case 0xdd:time1--;break;//5
  310.                           case 0xdb:time1--;break;//6
  311.                           case 0xd7:time1--;break;//7
  312.                           case 0xbe:time1--;break;//8
  313.                           case 0xbd:time1--;break;//9
  314.                           case 0xbb:                //確認(rèn)                 
  315.                         {   
  316.                                 time1=0;
  317.                             scan2=aa;
  318.                                   scan1=bb;
  319.                                   time1=0;
  320.                                 shuc();
  321.                         }break;
  322.                           case 0xb7://三角波
  323. ……………………

  324. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
proteus數(shù)控穩(wěn)壓電源.zip (489.83 KB, 下載次數(shù): 106)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:299955 發(fā)表于 2018-4-3 15:39 來自手機(jī) | 只看該作者
值得學(xué)習(xí)謝謝
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表