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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4331|回復: 1
收起左側

51單片機數控穩壓電源設計報告與仿真程序

[復制鏈接]
ID:189104 發表于 2017-7-22 15:07 | 顯示全部樓層 |閱讀模式
基于51的數控直流穩壓電源的設計資料全套 分享給大家
0.png

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

數控穩壓電源設計報告

班級:電信10-1班   學號:3100718116              姓名:羅遠鋒

此次數控穩壓電源設計我主要通過51單片機控制輸出來控制電源的電壓和顯示。主流程圖如下。
1.001.jpg
主要輸出部分
1.002.jpg
1.003.jpg
加減置數部分,通過對4X4矩陣鍵盤的設置,可任意置數,加減, 自動步進,輸出波形。
1.004.jpg
1.005.jpg
預置數部分 通過撥碼開關來預置。
1.006.jpg
顯示部分 通過單片機對兩位數碼管進行動態掃描
1.007.jpg
1.008.jpg
1.009.jpg
1.010.jpg
1.011.jpg
1.012.jpg



單片機源程序如下:
  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//定時器初值,設置time0 1/1000秒中斷一次
  11. const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管的顯示
  12. const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小數點的數碼管顯示
  13. uchar scan1;//用來分別顯示2個數碼管
  14. uchar scan2;
  15. uchar counter[2]={0xf1,0xf2};
  16. uchar vout=0; //j_片選,vout_電壓輸出

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

  30. void delay(uint t) //tms的延時
  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);//輸出的數字量
  41.         P1=vout;
  42.         for(nn=0;nn<250;nn++)
  43.                 ;
  44.                 nn=0;//輸出是存在D/A轉換時間差所以要延時

  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) //自動步進
  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)  //鍵盤掃描函數,使用行列反轉掃描法
  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;  //輸出當前列線值
  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數碼管的動態顯示
  153. {
  154.         
  155.          TR0=0;    //停止時鐘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為其他情況是跳出循環
  162.         }
  163.         j++;
  164.         if(j==2)
  165.         j=0;
  166.     TL0=(timer0_count & 0x00ff);
  167.         TH0=(timer0_count>>8);  //設置time0 初值
  168.         TR0=1;         //開時鐘                                         
  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();        //定時器初始化用于LED顯示
  181.     do
  182.    {     
  183.             key=keyscan();
  184.                 if(time1==1)
  185.                 switch( key)
  186.         {        
  187.                         
  188.                         case 0xee:aa=1;break;//1 按下相應的鍵顯示相對應的碼值
  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;//確認
  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:                //自動步進
  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 按下相應的鍵顯示相對應的碼值
  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:                //確認
  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:                //自動步進
  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 按下相應的鍵顯示相對應的碼值
  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:                //確認                 
  315.                         {   
  316.                                 time1=0;
  317.                             scan2=aa;
  318.                                   scan1=bb;
  319.                                   time1=0;
  320.                                 shuc();
  321.                         }break;
  322.                           case 0xb7://三角波
  323. ……………………

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

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



回復

使用道具 舉報

ID:299955 發表于 2018-4-3 15:39 來自手機 | 顯示全部樓層
值得學習謝謝
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av一区二区三区 | 国产精品18久久久久久久 | 黄视频国产 | 日韩精品在线播放 | 国产欧美在线观看 | 自拍偷拍3p | 久久不卡 | 国产高清一区二区三区 | 国产高清一区二区 | 在线看黄免费 | 99国产精品视频免费观看一公开 | 91在线一区二区三区 | 精品不卡 | 亚洲三区在线观看 | 在线亚洲欧美 | 欧美在线观看一区 | 亚洲小视频在线观看 | 亚洲精品在线免费 | 成人免费大片黄在线播放 | 超碰成人免费 | 人人鲁人人莫人人爱精品 | 精品日韩 | 久久久久久久久久久久久久av | 国产精品资源在线 | 欧美在线a | 综合网伊人 | 亚洲在线久久 | 亚洲第一在线 | 自拍视频网站 | 亚洲精品国产电影 | 国产亚洲精品久久久优势 | 欧美久 | 成人免费久久 | 二区在线观看 | 久久99精品国产麻豆婷婷 | 欧美视频在线一区 | 狠狠操av| 超碰成人免费 | 国产在线一区二 | 久久综合伊人 | 欧洲高清转码区一二区 |