找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3240|回复: 1
打印 上一主题 下一主题
收起左侧

直流马达pid调速液晶显示单片机源程序

[复制链接]
跳转到指定楼层
楼主



全部资料下载地址:
直流马达pid调速液晶显示.zip (68.64 KB, 下载次数: 79)


单片机源程序:
  1. #include "12864Serial.h"
  2. #include "PWM.h"
  3. uint data h_count=0,freq10=0,Speed=0,Speed1=0;  //h_count高频脉冲个数        (高)
  4. uint data num1=0,num2=0,num3=0,num4=0;
  5. //float data p=4.0,i=0.9,d=1.0;
  6. float xdata p=3.0,i=20,d=3.0;        //P:3  I:20    D:3

  7. static data ErrorNum=0.0,en=0.0,en1=0.0,en2=0.0;
  8. static int data output=0;
  9. float data pwm;        
  10. uint temp40,temp50,temp60;

  11. bit Flag=0;
  12. uint data config=5,error=0,input=0,adjust=20;
  13. long int data duty=50;
  14. uint data TempConfig=0;                 //定义暂时的一个转速,P、I、D参数
  15. float xdata TempP=0,TempI=0,TempD=0; //在退出参数调整界面时将这些暂时的数据赋给真实的值
  16. uchar xdata ConfigTable[3]=0;        //设定参数数组
  17. uchar xdata ErrorTable[3]=0;        //误差参数数组
  18. uchar xdata SpeedTable[6]=0;        //速度参数数组
  19. uchar xdata InputTable[3]=0;    //输入参数数组
  20. uchar xdata DutyTable[4]=0;     //占空比参数数组
  21. uchar xdata AdjustTable[3]=0;        //调整参数数组
  22. uchar xdata PTable[3]=0;                //P参数数组
  23. uchar xdata ITable[3]=0;                //I参数数组
  24. uchar xdata DTable[3]=0;            //D参数数组

  25. uchar xdata PTable1[3]=0;
  26. uchar xdata ITable1[4]=0;
  27. uchar xdata DTable1[3]=0;



  28. //定义控制板的按键值

  29. sbit SW1= P3^1;
  30. sbit SW= P3^4;
  31. sbit K2= P3^5;
  32. sbit K3= P3^6;
  33. sbit K4= P3^7;



  34. sbit D0  = P1^0;
  35. sbit D1  = P1^1;
  36. sbit D2  = P1^2;
  37. sbit D3  = P1^3;
  38. sbit D4  = P1^4;
  39. sbit D5  = P1^5;
  40. sbit D6  = P1^6;
  41. sbit D7  = P1^7;





  42. unsigned char KeyScan(void);
  43. void delay(unsigned int ms)
  44. {
  45.           unsigned int De_Cnt;
  46.           while( (ms--) != 0)
  47.            {
  48.             for(De_Cnt = 0; De_Cnt < 950; De_Cnt++);
  49.            }            
  50. }

  51. //****************************************************
  52. //****************高频测量定时计数器初始化***********  高频的测量方法较准确
  53. void init_port()
  54. {        
  55.         TMOD=0x11;                //T1计时工作方式1
  56.         IT0=1;             //INT0下降沿触发

  57.         IT1=1;                     //INT1下降沿触发
  58.         EX1=1;                           //外部中断1打开

  59.         TH1=0xb1;
  60.         TL1=0xe0;                 //定时初值的计算:50ms*20=1s
  61.         EA=1;                       //全局中断允许
  62.         ET1=1;                       //T1中断允许
  63.     TH0=0;                           //清零
  64.     TL0=0;                           //清零
  65.          
  66.     ET0=1;                            //定时器0中断允许
  67.         TR0=0;                          //关T0中断
  68.         TR1=0;                          //关T1中断
  69. }  
  70. //******************高频率测量*****************
  71. void hight_frequency()
  72. {
  73.         h_count=0;              //脉冲计数初值为0,
  74.         EX0=1;                      //INT0中断允许,开始计数
  75.         TR1=1;                      //启动定时器1
  76.         while(EX0);              //等待INT0中断关闭
  77.         TR1=0;                      //关T1中断
  78.         h_count=(h_count-1)*50;   //得实际频率
  79.         Speed=h_count/334;   //此处采用200线编码器
  80.         if((Speed>300)||(Speed<0))
  81.                 Speed=0;
  82.         
  83.         SpeedTable[0]=0x30+(Speed/100);           //百位
  84.         SpeedTable[1]=0x30+(Speed%100/10);            //十位
  85.         SpeedTable[2]=0x30+(Speed%10);               //个位
  86.         SpeedTable[3]=0x20;         
  87.         
  88. }

  89. void display()
  90. {



  91.         //显示设定的速度值
  92.         ConfigTable[0]=(0x30+(config/100));
  93.         ConfigTable[1]=(0x30+(config%100/10));
  94.         ConfigTable[2]=(0x30+(config%10));


  95.         LCD_Write_String(0,0,"Set     Sp");
  96.         LCD_Write_Com(0x80+3);
  97.         LCD_Write_Data(':');
  98.         LCD_Write_Data(ConfigTable[0]);
  99.         LCD_Write_Data(ConfigTable[1]);
  100.         LCD_Write_Data(ConfigTable[2]);

  101.         //显示实际测得的速度
  102.         LCD_Write_Com(0x80+10);
  103.         LCD_Write_Data(':');
  104.         LCD_Write_Data(SpeedTable[0]);
  105.         LCD_Write_Data(SpeedTable[1]);
  106.         LCD_Write_Data(SpeedTable[2]);        
  107.                                                                           

  108.          LCD_Write_String(0,1,"Err      Da");
  109.                  //显示设定值与实测值的误差
  110.         if(config>Speed)
  111.         {
  112.                 error=config-Speed;
  113.                 ErrorTable[0]=(0x30+(error/100));
  114.                 ErrorTable[1]=(0x30+(error%100/10));
  115.                 ErrorTable[2]=(0x30+(error%10));

  116.                 LCD_Write_Com(0xC0+3);
  117.                 LCD_Write_Data(':');
  118.                 LCD_Write_Data('-');
  119.                 LCD_Write_Data(ErrorTable[0]);
  120.                 LCD_Write_Data(ErrorTable[1]);
  121.                 LCD_Write_Data(ErrorTable[2]);

  122.         }

  123.         else if((Speed>config)||(Speed==config))
  124.         {
  125.                 error=Speed-config;
  126.                 ErrorTable[0]=(0x30+(error/100));
  127.                 ErrorTable[1]=(0x30+(error%100/10));
  128.                 ErrorTable[2]=(0x30+(error%10));

  129.                 LCD_Write_Com(0xC0+3);
  130.                 LCD_Write_Data(':');
  131.                 LCD_Write_Data('+');
  132.                 LCD_Write_Data(ErrorTable[0]);
  133.                 LCD_Write_Data(ErrorTable[1]);
  134.                 LCD_Write_Data(ErrorTable[2]);

  135.         }


  136.                 //显示调整参数数据
  137.         if((Speed>Speed1)||(Speed==Speed1))
  138.         {
  139.                 adjust=Speed-Speed1;
  140.             AdjustTable[0]=(0x30+(adjust/100));
  141.                 AdjustTable[1]=(0x30+(adjust%100/10));
  142.                 AdjustTable[2]=(0x30+(adjust%10));

  143.                 LCD_Write_Com(0xC0+11);
  144.                 LCD_Write_Data(':');
  145.                 LCD_Write_Data('+');
  146.                 LCD_Write_Data(AdjustTable[0]);
  147.                 LCD_Write_Data(AdjustTable[1]);
  148.                 LCD_Write_Data(AdjustTable[2]);
  149.         }

  150.         else  if(Speed1>Speed)
  151.         {
  152.                 adjust=Speed1-Speed;
  153.             AdjustTable[0]=(0x30+(error/100));
  154.                 AdjustTable[1]=(0x30+(error%100/10));
  155.                 AdjustTable[2]=(0x30+(error%10));

  156.                 LCD_Write_Com(0xC0+11);
  157.                 LCD_Write_Data(':');
  158.                 LCD_Write_Data('-');
  159.                 LCD_Write_Data(AdjustTable[0]);
  160.                 LCD_Write_Data(AdjustTable[1]);
  161.                 LCD_Write_Data(AdjustTable[2]);

  162.         }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:300054 发表于 2019-6-25 20:50 | 只看该作者
有没有protues仿真图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表