找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12C5A60S2单片机制作PID程序

  [复制链接]
跳转到指定楼层
楼主
制作出来的实物图如下:

单片机源程序如下:
  1. #define _MAIN_C_
  2. //============================
  3. #include "includeFile.h"
  4. //============================


  5. sbit output1=P4^0;
  6. sbit output=P2^4;
  7. //sbit ds=P3^2;

  8. //sbit ledred=P1^6;
  9. //sbit ledgreen=P1^7;
  10. sbit key0=P2^0;//按键引脚
  11. sbit key1=P2^1;
  12. u8 n,num;
  13. unsigned int TTemp = 95.33,HHumi = 99.99;        //温度和湿度unsigned int Temp = 99,Humi = 99;        
  14. unsigned int set_temper=30,temper,temp,ceshiwendu; //温度变量定义
  15. unsigned int s;
  16. float  f_temp;//转换后的温度
  17. u8 tvalue;
  18. unsigned int tvaluenum1;
  19. unsigned int tvaluenum2,tvaluenum3,tvaluenum4,tvaluenum5;        
  20. u8 tflag;//温度正负标志

  21. //void Dsplay_OLED(void);

  22. void delay11(i)//延时函数
  23. {
  24.         u16 j;
  25.         for(i;i>0;i--)
  26.         for(j=110;j>0;j--);
  27. }
  28. /*********************************
  29. OLED显示
  30. ****************************/
  31. void Dsplay_OLED(void)//显示
  32. {
  33.                 AHT10_Read_Data(&TTemp,&HHumi);
  34.                 Delay1ms(100);                //快速测量可能会引起传感器升温,此处降低测量速率
  35. //循环显示温湿度
  36. //                        OLED_ShowNum(0,0,Temp,5,16);//显示温度值
  37. //                        OLED_ShowNum(64,0,Humi,5,16);//显示湿度值
  38.                 OLED_ShowNum(0,4,set_temper,4,16);
  39.                 OLED_ShowNum(32,4,high_time,4,16);
  40.                 OLED_ShowNum(64,4,low_time,4,16);

  41. //                OLED_ShowString(16,4,temper);

  42.                 OLED_ShowNum(0,2,TTemp/100 ,2,16);
  43.                 OLED_ShowString(16,2,".");
  44.                 OLED_ShowNum(20,2,TTemp%100/10,1,8);
  45.                 OLED_ShowNum(28,2,TTemp%10,1,8);
  46.                 OLED_ShowCHinese(40,2,1);
  47. //                RegBuf_Input[0] = Temp;
  48.                 Delay1ms(200);        
  49.                 OLED_ShowNum(60,2,HHumi/1000,2,16);
  50.                 OLED_ShowString(76,2,".");
  51.                 OLED_ShowNum(80,2,HHumi%1000/100,1,8);
  52.                 OLED_ShowNum(88,2,HHumi%100/10,1,8);
  53. //                RegBuf_Input[1] = Humi;
  54. //                        OLED_ShowNum(36,4,Humi%10,1,8); //湿度小数点后第3位
  55.                 OLED_ShowString(96,2,"%");
  56. //                Delay1ms(100);        

  57.                 OLED_ShowNum(0,6,count,2,16);
  58.                 OLED_ShowNum(90,6,set_temper+1,2,16);
  59.                 OLED_ShowNum(32,6,tvaluenum2,4,16);



  60. }
  61. /****************************
  62. //获取温度
  63. ****************************/
  64. u16 get_temper()
  65. {  
  66.         tvalue=TTemp;//;ceshiwendu
  67.                  if(tvalue<0x0fff)
  68.                         tflag=0;
  69. //                        OLED_Clear();   //清屏
  70. //                        OLED_ShowString(40,0,"err");
  71.                  else {tvalue=~tvalue+1;tflag=1;}
  72.         tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数tvalue
  73.         temp=tvalue;
  74.         return temp;
  75. }
  76. /*******************
  77. void keyscan()//键盘扫描
  78. {  
  79.            if(key0==0)
  80.            {
  81.           delay11(1);
  82.           if(key0==0)
  83.           {
  84.            while(!key0);
  85.            delay11(1);
  86.            while(!key0);
  87.            set_temper++;
  88.           }
  89. //                OLED_ShowNum(0,4,set_temper,4,16);
  90.           delay11(1);
  91.         }
  92.         if(key1==0)
  93.            {
  94.           delay11(3);//延时去抖
  95.           if(key1==0)
  96.           {
  97.            while(!key1);
  98.            delay11(3);
  99.            while(!key1);
  100.            set_temper--;//温度减
  101.            if(set_temper==0)
  102.            {set_temper=0;}
  103.           }
  104. //                OLED_ShowNum(0,4,set_temper,2,16);
  105.         }
  106. }
  107. **********************/
  108. /***********************************************************
  109. 温度比较处理子程序
  110. ***********************************************************/
  111. void compare_temper(void)
  112. {
  113. unsigned char i;
  114. tvaluenum2 = TTemp/100;
  115. //        AHT10_Read_Data(&TTemp,&HHumi);
  116.         if(set_temper>tvaluenum2)  //设置温度大于当前温度   ceshiwendu
  117.                 {

  118. //                        ledred=0;
  119.                         output1=1;

  120. //                        ledgreen=1;
  121.                         if(set_temper-tvaluenum2>1)  //温度相差1度以上 ceshiwendu  TTemp
  122.                         {  

  123.                          high_time=100;
  124.                          low_time=0;

  125.                         }
  126.                         else  //设置温度与当前温度差距很小时开启PID调整
  127.                         {
  128.                          for(i=0;i<10;i++)
  129.                          {
  130.                                 get_temper();
  131.                                 rin = s; // Read Input
  132.                                 rout = PIDCalc ( &spid,rin ); // Perform PID Interation
  133.                          }
  134.                          if (high_time<=100)  high_time=(unsigned char)(rout/800);
  135.                          else high_time=100;
  136.                          low_time= (100-high_time);
  137.                                 output1=0;                                                                //增加PWM
  138.                         }

  139.                 }
  140. /*********************************************************

  141. ****************************************/
  142.                 else if(set_temper<=tvaluenum2)  //设置温度不大于当前温度
  143.                         {
  144.         //                        ledred=1;
  145.                                 output1=0;
  146.         //                        ledgreen=0;
  147.                                 if(tvaluenum2-set_temper>0) //温度相差0度以上
  148.                                         {
  149.                                          high_time=0;
  150.                                          low_time=100;
  151.                                         }
  152.                                 else
  153.                                 {
  154.                                  for(i=0;i<10;i++)
  155.                                          {
  156.                                                 get_temper();
  157.                                                 rin = s; // Read Input
  158.                                                 rout = PIDCalc ( &spid,rin ); // Perform PID Interation
  159.                                         }
  160.                                  if (high_time<100) high_time=(unsigned char)(rout/10000);
  161.                                  else  high_time=0;
  162.                                  low_time= (100-high_time);
  163.                                 }
  164.                         }

  165. }


  166. /*****************************************************
  167. T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期
  168. ******************************************************/
  169. void Timer0_Init(void)                //1毫秒@11.0592MHz
  170. {
  171.         AUXR |= 0x80;                        //定时器时钟1T模式
  172.         TMOD &= 0xF0;                        //设置定时器模式
  173.         TL0 = 0xCD;                                //设置定时初始值
  174.         TH0 = 0xD4;                                //设置定时初始值
  175.         EA=1;
  176.         ET0=1;
  177.         TR0=1;
  178. }

  179. void serve_T0() interrupt 1 using 1
  180. {
  181.         if(++count<=(high_time))
  182.         output=0;
  183.         else if(count<=100)
  184.                 {
  185.                   output=1;
  186.                 }
  187.         else count=0;
  188.         TL0 = 0xCD;                                //设置定时初始值
  189.         TH0 = 0xD4;                                //设置定时初始值
  190. }
  191. /********************
  192. 初始化参数void compare_temper(void)
  193. *******************/
  194. void AInit(void)
  195. {

  196. //        unsigned char i;
  197.         Timer0_Init();  //Timer0_Init(void)        
  198.         OLED_Init();                //LCD初始化
  199.         OLED_Clear();   //清屏
  200.         OLED_Display_On();//开显示
  201.         AHT10_Init();        //AHT10初始化
  202.         OLED_Clear();//OLED
  203.         OLED_ShowCHinese(0,0,0);//
  204.         OLED_ShowCHinese(18,0,1);//
  205.         OLED_ShowString(40,0,"Modbus");

  206.         output1=0;
  207.         output=0;

  208.         high_time=50;                        //高温变量
  209.         low_time=50;                        //低温变量
  210. //        ceshiwendu=30;                //测试用变量
  211.         PIDInit ( &spid ); // Initialize Structure
  212.         spid.Proportion= 10; // P值Set PID Coefficients
  213.         spid.Integral = 8;                // I值
  214.         spid.Derivative =6;                // D值
  215.         spid.SetPoint =100; // PID目标点Set PID Setpoint


  216. }

  217. /***********主函数**********/
  218. void main(void)
  219. {

  220.         AInit();

  221.         while(1)
  222.         {
  223. //                compare_temper();
  224.                 Dsplay_OLED();
  225.                 compare_temper();  //比较温度
  226. //                serve_stat();
  227. //                keyscan();  //按键扫描
  228. /******************************************************/
  229. //for(i=0;i<10;i++) //循环10次
  230. //                {
  231. //        OLED_ShowNum(32,6,set_temper,4,16); //显示温度值
  232. //                 if((key0==0)||(key1==0)) break; //如果有按键退出显示循环
  233. //                }
  234. //                if((key0!=0)&&(key1!=0))

  235.         }
  236. }
复制代码
PCB原理图开源:oshwhub.com/lbhsl/stc12c5a60s2-ce-shi-ban
视频:b23.tv/rOfdOIm

Keil代码下载: 程序.7z (231.91 KB, 下载次数: 82)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:89072 发表于 2023-4-21 22:48 | 只看该作者
继续更新:上位机昆仑通态触屏Modbus485通讯测试测试视频B站

51hei图片_20230421224817.jpg (196.34 KB, 下载次数: 80)

51hei图片_20230421224817.jpg
回复

使用道具 举报

板凳
ID:89072 发表于 2023-4-21 22:52 | 只看该作者
由于原理图串口2设置定时器2与Modbus有冲突,功能太多需要自行更改,先在使用串口1测试程序,原理图后期在更新。

51hei图片_20230421224817.jpg (196.34 KB, 下载次数: 75)

更新程序,PCB原理图调试过程中有问题,待更新

更新程序,PCB原理图调试过程中有问题,待更新

Modbus C51_V1510(上位机软件).rar

2.44 MB, 下载次数: 33, 下载积分: 黑币 -5

Modbus C51_V1510(更新Moudbus程序).rar

2.69 MB, 下载次数: 39, 下载积分: 黑币 -5

回复

使用道具 举报

地板
ID:1037819 发表于 2024-2-23 21:48 | 只看该作者
我在立创看到又转这里了,想学习moudbus谢谢你的资料
回复

使用道具 举报

5#
ID:1111542 发表于 2024-3-2 09:13 | 只看该作者
谢谢楼主的分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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