单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:6852|回复:9
打印上一主题下一主题

1602屏电烙铁控制的单片机源码 EC11旋转调温

 [复制链接]
跳转到指定楼层
楼主
ID:55815发表于 2018-6-6 15:06|只看该作者回帖奖励
EC11旋转调温电烙铁制作资料

单片机源程序如下:
  1. /******************************************************************
  2. 本程序只供学习使用,未经作者许可,不得用于其它任何用途
  3. 程序结构参考 安徽师范大学  Lyzhangxiang的EasyHW OS结构设计
  4. Main.C  file
  5. 作者:bg8wj
  6. 版本:V1.0
  7. Copyright(C) bg8wj
  8. /*******************************************************************/
  9. #include "ioconfig.h"
  10. #include "includes.h"
  11. #include "datacomm.h"

  12. /***********************按键定义*************************************************/
  13. sbit key0=P1^0;
  14. //sbit key2=P1^1;
  15. //sbit key3=P3^3;




  16. #define uint unsigned int
  17. #define uchar unsigned char
  18. unsigned char status=0;  //按键功能选择定义(bai0,shi1,ge0
  19. unsigned char ge,shi,bai=2;



  20. void Init_INT0()
  21. {
  22. IT0 = 1;                                  
  23. EX0 = 1;                              
  24. EA  = 1;      
  25.   
  26. }

  27. void ISR0()  interrupt 0  
  28. {  
  29.    if(!status==0){     //防止空转
  30.        if((P3&0x06) == 0x02)  
  31.    {  
  32.      DelayMs(1);  
  33.      if((P3&0x06) == 0x02)  
  34.      if(set_temper==500)  //最大值
  35.      {  
  36.        set_temper=500;  
  37.        }  
  38.        else  
  39.        {  
  40.          set_temper++;  
  41.        }  
  42.       
  43.    }                                                                
  44.    else  
  45.    {  
  46.      DelayMs(1);  
  47.      if((P3&0x06) == 0x00)  
  48.      if(set_temper==200)   // 最小值
  49.      {  
  50.          set_temper=200;  
  51.        }  
  52.        else  
  53.        {  
  54.          set_temper--;  
  55.        }  
  56.       
  57.    }  

  58. }
  59.   

  60. }    
  61.   
  62. /*****************************按键功能函数*************************************/
  63. void key_1()     //选择变量函数
  64. {
  65. key0=1;
  66. if(key0==0)
  67.   DelayMs(10);                                                                                                                                                      
  68. {
  69.   if(key0==0)
  70.   {
  71.    if(++status>1)status=0; //1bai,2shi,3ge
  72.   }    
  73.   while(key0==0);
  74. }
  75. }


  76. /************************************************
  77.            PID函数
  78. *************************************************/
  79. void PIDInit (struct PID *pp)
  80. {
  81.   memset ( pp,0,sizeof(struct PID));
  82. }
  83. /************************************************
  84.            增量控制PID函数体
  85. 51单片机最不擅长浮点数计算,转换成int型计算
  86. *************************************************/
  87. unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )
  88. {
  89.   unsigned int dError,Error,pError;
  90.   //增量法计算公式:
  91.   //Pdt=Kp*[E(t)-E(t-1)]+Ki*E(t)+Kd*[E(t)-2*E(t-1)+E(t-2)]
  92.   Error = set_temper - NextPoint;     // 偏差E(t)
  93.   pError=Error-pp->LastError;       //E(t)-E(t-1)
  94.   dError=Error-2*pp->LastError+pp->PrevError; //E(t)-2*E(t-1)+E(t-2)
  95.   pp->PrevError = pp->LastError;
  96.   pp->LastError = Error;
  97.   return (
  98.          pp->Proportion * pError       //比例
  99.          + pp->Integral *Error  //积分项
  100.          + pp->Derivative * dError       // 微分项
  101.                  );  
  102. }

  103. /************************************************
  104.                        PID函数初始化
  105. *************************************************/
  106. void PIDBEGIN()
  107. {
  108.   PIDInit(&spid); // Initialize Structure
  109.   spid.Proportion = 10; // Set PID Coefficients
  110.   spid.Integral = 5;
  111.   spid.Derivative =4;
  112. }
  113. /************************************************
  114.                  实时温度读取函数
  115. 从DS18b20中读取实时温度
  116. 返回值放大10倍便于PID计算
  117. *************************************************/
  118. int ReadTemperature(void)
  119. {
  120.        unsigned char TPL=0;
  121.        unsigned char TPH=0;
  122.        unsigned int temperture=0;

  123.        //EA = 0;            
  124.        Init_DS18B20();
  125.        WriteOneChar(0xCC); //跳过读序号列号的操作
  126.        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  127.        TPL=ReadOneChar();       //读温度低字节
  128.        TPH=ReadOneChar();       //读温度高字节

  129.        //启动下一次温度转换
  130.        Init_DS18B20();
  131.        WriteOneChar(0xCC); // 跳过读序号列号的操作
  132.        WriteOneChar(0x44); // 启动温度转换
  133.        //temperture=(TPH*256+TPL)*0.0625   //真实温度值 范围(+125,-55)
  134.        if(TPH&0xfc)
  135.        {
  136.          tp_flag=1;   //负温度标记
  137.          temperture=((TPH<<8)|TPL);
  138.          temperture=((~temperture)+1);
  139.          temperture*=0.625+0.5;
  140.        }
  141.        else
  142.        {
  143.          tp_flag=0;
  144.          //temperture=((TPH<<8)|TPL)*0.0625 //温度输出值范围(125.00,-55.00)
  145.          temperture=((TPH<<8)|TPL)*0.625+0.5;   //温度值放大10(+1250.00,-550.00)
  146.        }                                                 //       +0.5四舍五入 精度只到小数后一位
  147.        return(temperture);      
  148. }
  149. /************************************************
  150.                        lcd1602显示函数
  151. *************************************************/
  152. void xianshi(void)
  153. {
  154.    LCD_Write_String(0,0,"NOW TMP:");
  155.        LCD_Write_String(0,1,"SET TMP:");
  156. }
  157. /************************************************
  158.                  lcd1602显示实时温度
  159. *************************************************/
  160. void view(unsigned int tmp)
  161. {
  162.        LCD_Write_Char(15,0,'C');
  163.        LCD_Write_Char(14,0,0xdf);//摄氏温度符号
  164.        LCD_Write_Char(13,0,zhi[tmp%10]);//小数点后第1位
  165.        LCD_Write_Char(12,0,'.');            
  166.        LCD_Write_Char(11,0,zhi[tmp%100/10]);//       个位
  167.        LCD_Write_Char(10,0,zhi[tmp/100]);       //十位
  168.        if(0==tmp/1000)LCD_Write_Char(9,0,' ');//百位 如果为零显示空格
  169.        else
  170.        LCD_Write_Char(9,0,zhi[tmp/1000]);
  171.        if(1==tp_flag)LCD_Write_Char(8,0,'-');//正负温度符号显示 负温度显示- 0上显示空格
  172.        else
  173.        LCD_Write_Char(8,0,' ');
  174. }
  175. /***********************************************************
  176.          PID温度控制做动函数
  177. ***********************************************************/
  178. void compare_temper()             //PID温度控制输出函数
  179. {
  180.   unsigned char i;
  181.   
  182.   if(set_temper>temper)
  183.    {
  184.    if(set_temper-temper>50)//如果控制目标温度温与实时温度差大于5度,(放大10倍)是50
  185.      {
  186.     
  187.          PWM0_set(10); //PWM 输出高电平占空比最大。即全速加温
  188.          PWM1_set(10);
  189.      }
  190.        else
  191.    {
  192.      for(i=0;i<10;i++) //5度范围内PID增量控制,10次周期 即PID积分式中T=10
  193.      {
  194.      rin=ReadTemperature();//PID输入实时温度采样值
  195.      rout = PIDCalc (& spid,rin ); // PID增量输出
  196.      }//PID增量输出范围(0-255)配合pwm取值范围
  197.     
  198.        if(rout>=240)rout=240;       //保障PWM输入值10-240 防止pwm出现失调。stc单片机特性。
  199.        if(rout<=20)rout=20;
  200.       
  201.        PWM0_set(255-rout);
  202.        PWM1_set(255-rout);
  203.       
  204.    }
  205.    }
  206.   else if(set_temper<=temper) //目标温度小于实时温度pwm输出低电平最高占空比,关闭加热。
  207.    {
  208.      PWM0_set(250);
  209.        PWM1_set(250);
  210.    }
  211. }
  212. /************************************************
  213.                  系统初始化函数
  214. *************************************************/
  215. void Sys_Init()                                          
  216. {
  217. PWM_init();
  218. PIDBEGIN();
  219. LCD_Init();
  220. Init_DS18B20();
  221. LCD_Clear();
  222. //InitUart1();
  223. }
  224. /*************************************************
  225.              主函数
  226. **************************************************/
  227. void main(void)
  228. {      
  229. Init_INT0();
  230. Sys_Init();           //系统初始化
  231.        xianshi();                 //显示字符      
  232. PWM0_set(250);           //初始化PWM两路输出最高低电平占空比,不要加热 p1.3
  233. PWM1_set(250);   //p1.4
  234. delay500ms();           //延时稍等芯片初始化
  235. while(1)
  236.   {  
  237.            key_1();
  238.            {
  239.     
  240.            if(status==1){
  241.                        bai=(set_temper/100);
  242.                        shi=(set_temper%100/10);
  243.        ge=(set_temper%10);
  244.        }
  245.        }
  246. ……………………

  247. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
EC11-LCD1602显示.zip(118.65 KB, 下载次数: 220)


评分

黑币 +55
收起理由
+ 5
赞一个!如有PMW代码更棒
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:284488发表于 2018-6-7 08:43|只看该作者
好东西,感谢分享。有电路圗可一并分享吗?
板凳
ID:404223发表于 2018-9-29 22:34|只看该作者
如有PMW代码更棒
地板
ID:258210发表于 2018-10-23 09:59|只看该作者
楼主可以分享一下电路图吗?
5#
ID:281113发表于 2018-12-19 09:57|只看该作者
学习一下
6#
ID:547681发表于 2019-5-26 17:14|只看该作者
学习一下  如有PMW代码更棒
7#
ID:251347发表于 2019-9-23 13:56|只看该作者
有用   先看看
8#
ID:47634发表于 2020-6-30 10:27|只看该作者
这个很好,值得学习
9#
ID:766282发表于 2024-4-19 15:24来自手机|只看该作者
正在学习编码器,谢谢

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

Powered by 单片机教程网