標題: 單片機仿真編碼器電機測速程序 [打印本頁]

作者: 之一知足    時間: 2020-4-20 23:02
標題: 單片機仿真編碼器電機測速程序
利用Proteus8.6,元器件庫編碼器電機結合51單片機,進行速度測量由此可以延伸利用仿真實現(xiàn)PID電機轉速控制(請自行設計)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /***********頭文件聲明************/
  2. #include "reg52.h"//此文件中定義了單片機的一些特殊功能寄存器
  3. /***********數(shù)據(jù)類型聲明***********/
  4. typedef unsigned int u16;//對數(shù)據(jù)類型進行聲明定義
  5. typedef unsigned char u8;
  6. /***********IO口相關定義***********/
  7. sbit LSA=P2^0;
  8. sbit LSB=P2^1;
  9. sbit MOTOR=P2^2;
  10. /**********變量定義*************/
  11. u16 Pulse;
  12. u16 Speed;
  13. u16 pwm;
  14. /*******************************************************************************
  15. * 函 數(shù) 名         : delay
  16. * 函數(shù)功能                     : 延時函數(shù),i=1時,大約延時10us
  17. *******************************************************************************/
  18. void delay(u16 i)
  19. {
  20.         while(i--);        
  21. }
  22. /*******************************************************************************
  23. * 函數(shù)名       :DigDisplay()
  24. * 函數(shù)功能                 :數(shù)碼管顯示函數(shù)
  25. *******************************************************************************/
  26. void DigDisplay()
  27. {
  28.   u8 disp[2];
  29.   u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  30.         u8 i;
  31.         for(i=0;i<2;i++)
  32.         {
  33.                 switch(i)         //位選,選擇點亮的數(shù)碼管,
  34.                 {
  35.                         case(0):
  36.                                 LSA=0;LSB=1; break;//顯示第0位
  37.                         case(1):
  38.                                 LSA=1;LSB=0; break;//顯示第1位
  39.                 }
  40.                 P0=disp[i];//發(fā)送數(shù)據(jù)
  41.                 delay(10); //間隔一段時間掃描        
  42.                 P0=0x00;//消隱
  43.         }
  44.         disp[0]=smgduan[Speed/10];        
  45.         disp[1]=smgduan[Speed%10];        
  46. }
  47. /*******************************************************************************
  48. * 函 數(shù) 名         : Int0Init()
  49. * 函數(shù)功能                     : 設置外部中斷0
  50. *******************************************************************************/
  51. void Int0Init()
  52. {
  53.         //設置INT0
  54.         IT0=1;//跳變沿出發(fā)方式(下降沿)
  55.         EX0=1;//打開INT0的中斷允許。        
  56.         EA=1;//打開總中斷        
  57. }
  58. /*******************************************************************************
  59. * 函 數(shù) 名         : Timer0Init
  60. * 函數(shù)功能                     : 定時器0初始化
  61. *******************************************************************************/
  62. void Timer0Init()
  63. {
  64.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
  65.         TH0 = 0xFC;//給定時器賦初值,定時1ms  
  66.   TL0 = 0x18;
  67.         ET0=1;//打開定時器0中斷允許
  68.         EA=1;//打開總中斷
  69.         TR0=1;//打開定時器               
  70. }
  71. /*******************************************************************************
  72. * 函 數(shù) 名       : main
  73. * 函數(shù)功能                   : 主函數(shù)
  74. *******************************************************************************/
  75. void main()
  76. {        
  77.         Int0Init();
  78.         Timer0Init();
  79.         pwm=50;
  80.         while(1);
  81. }
  82. /*外部中斷0的中斷函數(shù)*/
  83. void Int0()        interrupt 0               
  84. {
  85.   Pulse++;//脈沖++
  86. }
  87. /*定時器0的中斷函數(shù)*/
  88. void Timer0() interrupt 1
  89. {
  90.         static u8 Period,dis,PWM_Period;
  91.         TH0 = 0xFC;//定時1ms  
  92.         TL0 = 0x18;
  93.         Period++;        
  94.         PWM_Period++;        
  95.         dis++;
  96.         /*******轉速計算********/
  97.         if(Period == 100)//1*100ms
  98.         {
  99.                 //計算速度S=(Pulse/360)*10*60 r/min
  100.                 Speed=(Pulse)*1.6;
  101.                 Pulse=0;
  102.                 Period=0;
  103.         }
  104.         /*******PWM 輸出********/
  105.         if(PWM_Period <  pwm) MOTOR=1;
  106.         if(PWM_Period >= pwm) MOTOR=0;
  107.         if(PWM_Period == 100)        PWM_Period=0;
  108.         /*******數(shù)碼管顯示********/
  109.         if(dis == 4)
  110.         {
  111.                 DigDisplay();//數(shù)碼管顯示函數(shù)        
  112.                 dis=0;               
  113.         }
  114. }
復制代碼

所有資料51hei提供下載:
基于51單片機的轉速測量.zip (139.97 KB, 下載次數(shù): 122)









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