標(biāo)題: 單片機(jī)直流電機(jī)控制電路原理圖與源程序 [打印本頁(yè)]

作者: liuquan    時(shí)間: 2018-11-3 00:33
標(biāo)題: 單片機(jī)直流電機(jī)控制電路原理圖與源程序
直流電機(jī)控制電路仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. ///*************************************************************************************************************
  2. ///直流電機(jī)的pwm控制程序
  3. ///功能:直流電機(jī)的速度控制,速度測(cè)試,速度顯示。
  4. ///作者:廖維斌,郭留濤
  5. ///*************************************************************************************************************


  6. #include<reg51.h>                                ///包含頭文件
  7. #include<absacc.h>
  8. #define gew DBYTE[0X40]                        ///定義顯示緩沖區(qū) 個(gè)位
  9. #define shiw DBYTE[0X41]                        //////////////////十位
  10. #define baiw DBYTE[0X42]                        //////////////////百位
  11. #define qianw DBYTE[0X43]                        //////////////////千位
  12. #define unint unsigned int                ///自定義變量
  13. #define uchar unsigned char
  14. sbit in1=P3^0;                                        ///控制位定義
  15. sbit in2=P3^1;
  16. sbit ena=P3^7;
  17. uchar code zm[12]={0Xc0,0Xf9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x73,0x71};///在程序存儲(chǔ)區(qū)定義字型碼表
  18. uchar code wm[4]={0xfe,0xfd,0xfb,0xf7};///在程序存儲(chǔ)區(qū)定義字位控制碼表***選位
  19. uchar a=8;                                                ///占空比控制字
  20. uchar n=1;                                                ///速度增減量一
  21. uchar m=2;                                                ///速度增減量二
  22. unint speedbuf=0;                                ///速度值
  23. uchar zc=0;
  24. unint ys=0;
  25. key();                                                        ///子函數(shù)聲明
  26. display();
  27. control();
  28. delays();
  29. speedcan();
  30. ///*************************************************************************************************************
  31. ///主函數(shù)
  32. ///*************************************************************************************************************
  33. main()       
  34. {
  35.         gew=shiw=baiw=qianw=0;                                ///顯示初始化
  36.         P0=0xc0;                                       
  37.         P2=0;
  38.         in1=0;                                                ///電機(jī)控制的初始化
  39.         in2=0;
  40.         ena=1;
  41.         TMOD=0X15;                                        ///定時(shí)器1為定時(shí)模式,使用方式2;定時(shí)器0為計(jì)數(shù)模式,使用方式2
  42.         TH1=0Xfa;                                        ///裝定時(shí)器初值
  43.         TL1=0X24;
  44.         TH0=0;                                                ///裝計(jì)數(shù)器初值
  45.         TL0=0;
  46.         EA=1;                                                ///開(kāi)總中斷
  47.         ET0=1;                                                ///允許定時(shí)器0中斷
  48.         ET1=1;                                                ///允許定時(shí)器1中斷
  49.         TR0=1;                                                ///開(kāi)計(jì)數(shù)器
  50.         TR1=1;                                                ///開(kāi)定時(shí)器
  51.         while(1)                                        ///無(wú)限循環(huán)
  52.         {
  53.                 key();                                        ///調(diào)用按鍵掃描程序
  54.                 control();                                ///調(diào)用電機(jī)控制程序
  55.                 display();                                ///調(diào)用顯示程序
  56.                 speedcan();                                ///調(diào)用速度處理程序
  57.         }
  58. }
  59. ///*************************************************************************************************************
  60. ///中斷處理程序,實(shí)現(xiàn)輸出方波占空比控制
  61. ///*************************************************************************************************************
  62. timer_1() interrupt 3 using 1        ///定時(shí)器1中斷,使用寄存器組1
  63. {
  64.         TR1=0;                                                ///停止定時(shí)
  65.         zc++;                                                ///中斷次數(shù)加1
  66.         ys++;
  67.         control();                                       
  68.         speedcan();
  69.         TH1=0Xfa;                                        ///重裝定時(shí)初值
  70.         TL1=0X24;
  71.         TR1=1;
  72. }
  73. ///************************************************************************************************************
  74. ///脈寬控制程序,實(shí)現(xiàn)PWM的輸出
  75. ///***********************************************************************************************************
  76. control()
  77. {
  78.         if(zc==a)
  79.         {
  80.                 ena=0;
  81.         }
  82.         if(zc==15)
  83.         {
  84.                 zc=0;
  85.                 ena=1;
  86.         }
  87. }
  88. ///*****************************************************************************************************************
  89. ///顯示子函數(shù),顯示當(dāng)前電機(jī)的速度
  90. ///****************************************************************************************************************
  91. display()
  92. {
  93.         uchar i;
  94.         gew=speedbuf%10;                                        ///求速度個(gè)位值送各位顯示緩沖
  95.         shiw=(speedbuf/10)%10;                                        ///求速度十位值送十位顯示緩沖
  96.         baiw=(speedbuf/100)%10;                                ///求速度百位值送百位顯示緩沖
  97.         qianw=speedbuf/1000;                                ///求速度千位值送千位顯示緩沖
  98.         for(i=0;i<4;)                                        ///循環(huán)選中數(shù)碼管的每一位
  99.         {
  100.                 P2=wm[i];
  101.                 if(i==0)                                        ///顯示個(gè)位
  102.                 {
  103.                         P0=zm[gew];
  104.                         delays();
  105.                 }
  106.                         else if(i==1)                        ///顯示十位
  107.                         {
  108.                                 P0=zm[shiw];
  109.                                 delays();
  110.                         }
  111.                                 else if(i==2)                ///顯示百位
  112.                                 {
  113.                                         P0=zm[baiw];
  114.                                         delays();
  115.                                 }
  116.                                         else if(i==3)        ///顯示千位
  117.                                         {
  118.                                                 P0=zm[qianw];
  119.                                                 delays();
  120.                                         }               
  121.                 i++;
  122.         }

  123. }
  124. ///**********************************************************************************************************
  125. ///讀速度值子函數(shù),從計(jì)數(shù)器0中讀計(jì)數(shù)值,經(jīng)過(guò)計(jì)算,求出當(dāng)前速度值
  126. ///*************************************************************************************************************
  127. speedcan()
  128. {
  129.         if(ys==500)
  130.         {
  131.                 TR0=0;                                                ///停止計(jì)數(shù)
  132.                 speedbuf=((TH0*256+TL0)*8)/3;///讀計(jì)數(shù)器
  133.                 ys=0;
  134.                 TH0=0;                                                ///重裝計(jì)數(shù)初值
  135.                 TL0=0;
  136.                 TR0=1;                                                ///開(kāi)計(jì)數(shù)器
  137.         }
  138. }
  139. ///*********************************************************************************************************
  140. ///延時(shí)子函數(shù)
  141. ///***********************************************************************************************************
  142. delays()
  143. {
  144.         uchar i;
  145.         for(i=80;i>0;i--);
  146. }
  147. ///************************************************************************************************************
  148. ///鍵盤掃描子函數(shù),實(shí)現(xiàn)電機(jī)的方向 速度的控制
  149. ///*********************************************************************************************************
  150. key()
  151. {
  152.         uchar i;
  153.         P1=0xff;                                                ///拉高P1口的電平
  154.         i=P1;                                                        ///讀P1口
  155.         if(i==0xfe)                                                ///第一個(gè)鍵按下
  156.         {        delays();                                        ///延時(shí)去抖動(dòng)
  157.                 if(i==0xfe)                                        ///再判斷按鍵是否按下
  158.                 {
  159.                         in1=0;                                        ///電機(jī)順時(shí)針轉(zhuǎn)動(dòng)
  160.                         in2=1;       
  161.                 }
  162.         }
  163.         if(i==0xfd)                                                ///第二個(gè)鍵是否按下
  164.         {
  165.                 delays();                                        ///延時(shí)去抖動(dòng)
  166.                 if(i==0xfd)                                        ///再判斷按鍵是否按下       
  167.                 {
  168.                         in1=1;                                         ///電機(jī)逆時(shí)針轉(zhuǎn)動(dòng)
  169.                         in2=0;
  170.                 }
  171.         }
  172.         if(i==0xfb)                                                ///第三個(gè)鍵是否按下
  173.         {
  174.                 delays();
  175.                 if(i==0xfb)
  176.                 {
  177.                         a=a+n;                                        ///速度加((慢速)
  178.                         if(a>=15)                                
  179.                                 a=15;
  180.                 }
  181.         }
  182.         if(i==0xf7)                                               
  183.         {
  184.                 delays();
  185.                 if(i==0xf7)
  186.                 {
  187.                         if(a>3)                                        ///速度減(慢速)
  188.                                 a=a-n;
  189.                         else
  190.                                 a=3;
  191.                 }
  192.         }
  193.         if(i==0xef)
  194.         {
  195.                 delays();
  196.                 if(i==0xef)
  197.                 {
  198.                         a=a+m;                                        ///速度加,(快速)
  199.                         if(a>=15)
  200.                                 a=15;
  201.                 }
  202.         }
  203.         if(i==0xdf)
  204.         {
  205.                 delays();
  206.                 if(i==0xdf)
  207.                         if(a>3)                                        ///速度減,(快速)
  208.                                 a=a-m;
  209.                         else
  210.                                 a=3;
  211.         }
  212.         if(i==0xbf)
  213.         {
  214.                 delays();
  215.                 if(i==0xbf)
  216.                 {
  217.                         in1=0;                                        ///停止轉(zhuǎn)動(dòng)
  218.                         in2=0;
  219.                 }
  220.         }
  221.         if(i==0x7f)
  222.         {
  223.                 delays();
  224.                 if(i==0x7f)
  225.                         a=5;                                        ///回到中間速度
  226.         }
  227.         while(P1!=0xff);                                ///等待按鍵放下
  228. }
復(fù)制代碼

所有資料51hei提供下載:
直流電機(jī)的pwm控制.rar (162.44 KB, 下載次數(shù): 158)



作者: 宰實(shí)娃    時(shí)間: 2018-11-19 21:10
這個(gè)里面沒(méi)有Proteus仿真,騙人的
希望大家慎重,那個(gè)ddb文件也沒(méi)有密碼

作者: 944417428    時(shí)間: 2018-12-6 21:27
非常感謝,哈哈哈哈哈哈
作者: zm598633    時(shí)間: 2019-11-24 13:28
寫的很詳細(xì)但是,不知道為什么幾個(gè)按鈕控制的不算是太好,還點(diǎn)看看
作者: lindeijun1    時(shí)間: 2019-12-13 19:51
謝謝樓主分享。
作者: szzxl10    時(shí)間: 2019-12-14 09:22
謝謝樓主分享。
作者: 分離角色    時(shí)間: 2021-6-4 18:04
左上角的示波器是如何調(diào)出來(lái)的

作者: 分離角色    時(shí)間: 2021-6-4 18:07
仿真圖里的按鍵不能控制轉(zhuǎn)速和正反轉(zhuǎn)

作者: 紅雷    時(shí)間: 2021-9-24 08:09
如何修改能做到按鈕控制速度?





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1