久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4482|回復: 9
打印 上一主題 下一主題
收起左側

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, 下載次數: 112)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏16 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89072 發表于 2023-4-21 22:48 | 只看該作者
繼續更新:上位機昆侖通態觸屏Modbus485通訊測試測試視頻B站

51hei圖片_20230421224817.jpg (196.34 KB, 下載次數: 133)

51hei圖片_20230421224817.jpg
回復

使用道具 舉報

板凳
ID:89072 發表于 2023-4-21 22:52 | 只看該作者
由于原理圖串口2設置定時器2與Modbus有沖突,功能太多需要自行更改,先在使用串口1測試程序,原理圖后期在更新。

51hei圖片_20230421224817.jpg (196.34 KB, 下載次數: 141)

更新程序,PCB原理圖調試過程中有問題,待更新

更新程序,PCB原理圖調試過程中有問題,待更新

Modbus C51_V1510(上位機軟件).rar

2.44 MB, 下載次數: 54, 下載積分: 黑幣 -5

Modbus C51_V1510(更新Moudbus程序).rar

2.69 MB, 下載次數: 70, 下載積分: 黑幣 -5

回復

使用道具 舉報

地板
ID:1037819 發表于 2024-2-23 21:48 | 只看該作者
我在立創看到又轉這里了,想學習moudbus謝謝你的資料
回復

使用道具 舉報

5#
ID:1111542 發表于 2024-3-2 09:13 | 只看該作者
謝謝樓主的分享!
回復

使用道具 舉報

6#
ID:23844 發表于 2024-7-1 07:28 | 只看該作者
謝謝樓主的分享!下載仿制學習一下
回復

使用道具 舉報

7#
ID:46004 發表于 2024-10-18 18:16 | 只看該作者
謝謝樓主的分享!下載仿制學習一下
回復

使用道具 舉報

8#
ID:97678 發表于 2024-10-25 20:59 | 只看該作者
我想請教一下,這個程序可以做 加熱和制冷嗎?
PID 有正作用,和 負作用 嗎?
回復

使用道具 舉報

9#
ID:478112 發表于 2024-10-31 09:33 | 只看該作者
感覺這程序pid沒起作用,rin = s;  rout = PIDCalc ( &spid,rin );  s沒有任何賦值,沒法對比
回復

使用道具 舉報

10#
ID:478112 發表于 2024-10-31 10:11 | 只看該作者
pid部分純屬生搬硬套,毫無作用。實時溫度根本沒傳給pid,能控溫全靠else if(set_temper<=tvaluenum2)這句
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 狠狠操在线 | 精品久久中文字幕 | 性做久久久久久免费观看欧美 | 欧美日韩在线观看视频 | 欧美精品久久久久久久久老牛影院 | 亚洲福利av | 免费在线观看一区二区 | 国产精品欧美一区二区三区 | 麻豆精品一区二区三区在线观看 | 国产精品一区久久久 | 97精品久久 | 免费精品久久久久久中文字幕 | www视频在线观看 | 91在线一区| 久久三级影院 | 韩日中文字幕 | 精品欧美乱码久久久久久 | 成人在线亚洲 | 亚州精品天堂中文字幕 | 黄视频国产 | 国产一区二区不卡 | 国产一区二区久久 | 成人欧美一区二区三区视频xxx | 99精品视频免费观看 | 国产精品久久久久aaaa樱花 | 国产线视频精品免费观看视频 | 久久综合婷婷 | 欧美中文字幕一区二区 | 国产精品久久久久久久久久免费 | 久久久亚洲综合 | 成人免费区一区二区三区 | 久草视频在线看 | 国产精品伦理一区二区三区 | 老司机午夜性大片 | 久久久久久久一区二区三区 | 国产成人综合一区二区三区 | 久国久产久精永久网页 | 国产精品视频一二三区 | 欧美国产亚洲一区二区 | 久久久久久久91 | 亚洲国产精品一区二区久久 |