找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6117|回复: 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, 下载次数: 184)


评分

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

查看全部评分

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

使用道具 举报

沙发
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 单片机教程网

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