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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8788|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+NTC3435熱敏電阻的水溫自動(dòng)加熱系統(tǒng)設(shè)計(jì)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
【功能設(shè)計(jì)】
使用IAP15W4K58S4單片機(jī)、數(shù)碼管和NTC3435熱敏電阻、DC12V直流加熱棒(帶驅(qū)動(dòng)板)組成一個(gè)自動(dòng)加熱系統(tǒng)。可以手動(dòng)設(shè)定目標(biāo)溫度(30℃~90℃),設(shè)置步進(jìn)1攝氏度。
請(qǐng)使用者僅用于參考學(xué)習(xí),不要用于商業(yè)。
【使用流程描述】
1.上電程序會(huì)輪流顯示設(shè)定溫度和實(shí)際溫度。配有指示燈表示當(dāng)前所顯示的是哪一個(gè)。
2.任意時(shí)刻按下增加或減少按鍵,程序進(jìn)入設(shè)置模式,顯示設(shè)定值并保持。后臺(tái)加熱仍然以原設(shè)置值為準(zhǔn)。
3.當(dāng)按下確定鍵且設(shè)定溫度在有效范圍內(nèi)時(shí),程序裝載新設(shè)置值并進(jìn)行自動(dòng)調(diào)整,否則恢復(fù)原值。按下取消鍵也恢復(fù)原值。
4.降溫操作通過(guò)被動(dòng)散熱進(jìn)行,所以會(huì)比較慢。
5.后續(xù)需求有所變化,增加一個(gè)串口輸出,傳遞設(shè)置值和實(shí)際值給遠(yuǎn)端單片機(jī)顯示。
【主機(jī)參數(shù)設(shè)置】
0.MCU型號(hào)IAP15W4K58S4,頻率11.0592MHz,下載程序時(shí)注意勾選“在程序區(qū)的結(jié)束處添加重要測(cè)試參數(shù)”。
1.ADC使用片內(nèi)ADC,10位精度,使用內(nèi)部基準(zhǔn)源校正采集值。
2.PID部分借用他人程序,針對(duì)此設(shè)計(jì)做了調(diào)整
。參考程序來(lái)源已不可考,故不貼出。
3.NTC電阻采用B值3435防水型號(hào),其查表程序?yàn)楸救怂鶎懀斍檎?qǐng)查閱對(duì)應(yīng)C文件(移植很方便)。
4.串口設(shè)置9600 8N1。
【從機(jī)參數(shù)設(shè)置】
1.型號(hào)STC15W408AS,頻率11.0592MHz。
2.從機(jī)使用IIC轉(zhuǎn)并口的轉(zhuǎn)接板連接LCD1602,極大地節(jié)約了IO口的使用。


這個(gè)小板原本為在Arduino上使用而設(shè)計(jì)的,但是既然遵守IIC協(xié)議,并且只是PCF8574芯片通信,那么51也可以才對(duì)。經(jīng)過(guò)查找,在百度貼吧上找到了使用其驅(qū)動(dòng)LCD1602的程序,并且重新排版編寫使之清晰明了,工程中的LCD1602_IIC.c即為此轉(zhuǎn)接板的驅(qū)動(dòng)程序。

【實(shí)物快照】


顯示部分會(huì)隨著主機(jī)的顯示進(jìn)行更新

白天照的不清晰,數(shù)碼管由于直連IO推挽方式驅(qū)動(dòng)所以有些段選有殘影。單片機(jī)PWM和加熱部分之間使用MOS管驅(qū)動(dòng),供電12V。

【主機(jī)主程序】

  1. #include"STC15.H"        //單片機(jī)寄存器定義
  2. #include"Binary.H"        //提供二進(jìn)制輸入
  3. #include<intrins.h>        //提供_nop_函數(shù)
  4. #include"NTC3435.c"        //提供NTC查詢表

  5. sbit Key_Add=P1^5;//設(shè)定值+
  6. sbit Key_Subtract=P1^6;//設(shè)定值-
  7. sbit Key_Submit=P1^7;//確定修改
  8. sbit Key_Cancel=P5^5;//取消修改

  9. sbit LED_Red=P3^6;//用于指示當(dāng)前顯示的溫度為設(shè)定值
  10. sbit LED_Green=P3^7;//用于指示當(dāng)前顯示的溫度為測(cè)得值

  11. sbit S1=P4^5;
  12. sbit S2=P4^2;
  13. sbit S3=P4^4;//數(shù)碼管位選

  14. sbit PWM_FC=P1^0;//PWM輸出引腳

  15. //初始化變量
  16. unsigned int code Voltage_BandGap_ROM _at_ 0xe7f7;//58K程序空間的MCU
  17. //全局變量表
  18. unsigned char smgduan[18]={0xfa,0x22,0xb9,0xab,0x63,0xcb,0xdb,0xa2,0xfb,0xeb,0xf3,0x5b,0x19,0x3b,0xd9,0xd1,0x01};
  19. unsigned char Display_Temperature_Act[3]={0,0,0};//溫度測(cè)得值顯示數(shù)組
  20. unsigned char Display_Temperature_Set[3]={0,0,0};//溫度設(shè)定值顯示數(shù)組
  21. int Temperature_Act=32;                        //溫度測(cè)得值
  22. int Temperature_Set=40;                        //溫度設(shè)定值
  23. int Shadow_Temperature_Set=40;        //溫度設(shè)定值影子值
  24. unsigned int T0_Cnt_1=0;                //定時(shí)器0周期計(jì)數(shù)1:顯示輪詢
  25. unsigned int T0_Cnt_2=0;                //定時(shí)器0周期計(jì)數(shù)2:PID控制
  26. unsigned char T0_Cnt_3=0;                //定時(shí)器0周期計(jì)數(shù)3:串口發(fā)送
  27. bit En_Display_Standby=1;                //顯示輪詢有效標(biāo)志位
  28. bit Do_T0_3=0;                                        //串口發(fā)送標(biāo)志
  29. bit flag_display_mode=0;                //顯示標(biāo)志位
  30. bit Temperature_Set_Choose=0;//溫度設(shè)置值數(shù)據(jù)來(lái)源選擇,用于PID設(shè)置,該值為0時(shí)數(shù)據(jù)參考來(lái)自設(shè)置變量,該值為1時(shí)數(shù)據(jù)參考來(lái)源來(lái)自影子變量
  31. bit flag_Key_Add=0;                                //按鍵動(dòng)作執(zhí)行標(biāo)志位
  32. bit flag_Key_Subtract=0;                //按鍵動(dòng)作執(zhí)行標(biāo)志位
  33. bit flag_Key_Submit=0;                        //按鍵動(dòng)作執(zhí)行標(biāo)志位
  34. bit flag_Key_Cancel=0;                        //按鍵動(dòng)作執(zhí)行標(biāo)志位
  35. bit busy=0;//串口1發(fā)送狀態(tài)
  36. //ADC測(cè)溫相關(guān)變量
  37. unsigned int ADC_DATA;                        //讀取到的ADC轉(zhuǎn)換值
  38. unsigned int ADC_BandGap;                //讀取的BandGap轉(zhuǎn)換值
  39. float VCC_Voltage;                                //計(jì)算得到的VCC電壓值,單位mV
  40. float NTC_Voltage;                                //計(jì)算得到的NTC分壓電壓值,單位mV
  41. float NTC_Temperature;                        //查表計(jì)算得到的NTC對(duì)應(yīng)溫度值,單位℃
  42. unsigned long NTC_R_Comp=0;                //待對(duì)比的電阻值,單位十倍歐姆
  43. bit flag_value_update=0;                //測(cè)得值更新標(biāo)志位
  44. bit En_ADC_Value=0;                                //ADC轉(zhuǎn)換值標(biāo)志 0:無(wú)效 1:有效

  45. //移植PID部分時(shí)的全局變量
  46. int e ,e1 ,e2 ;//pid
  47. float uk ,uk1 ,duk ;//pid
  48. float Kp=10,Ki=12,Kd=1.5;//pid        10,12,1.5
  49. int out=0;
  50. unsigned int PWMTime=0;
  51. unsigned int cnt=0;
  52. /************************************************************
  53. 名稱:基于NTC3435的水溫自動(dòng)加熱系統(tǒng)設(shè)計(jì)
  54. 平臺(tái):IAP15W4K58S4 11.0592MHz 9600 8N1

  55. 編寫注意:數(shù)碼管連接在P2口,單片機(jī)推挽輸出方式直驅(qū)

  56. 程序編寫:凌凈清河
  57. 硬件制作:凌凈欣羽
  58. 文稿排版:凌凈欣羽

  59. 發(fā)布日期:2019年8月7日(星期三)
  60. 聲明:如您直接使用本例程或進(jìn)行較大程度的借鑒,請(qǐng)注明程序出處,謝謝!
  61. 所屬:新礦城學(xué)習(xí)基地#2019
  62. ************************************************************/
  63. void PWMOUT()                  
  64. {
  65.         if(cnt<PWMTime)         
  66.         {
  67.                 PWM_FC=1;
  68.         }
  69.         else
  70.         {
  71.                 PWM_FC=0;
  72.         }
  73.         if(cnt>1000)cnt=0;         
  74. }

  75. void PIDControl(void)
  76. {
  77.         if(Temperature_Set_Choose)
  78.         {
  79.                 e=Shadow_Temperature_Set-NTC_Temperature;
  80.         }
  81.         else
  82.         {
  83.                 e=Temperature_Set-NTC_Temperature;
  84.         }
  85.         duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));
  86.         uk=uk1+duk;
  87.         if(uk>1200)
  88.         {
  89.                 uk=1000;
  90.         }
  91.         else if(uk<-1200)
  92.         {
  93.                 uk=0;
  94.         }
  95.         
  96.         out=(int)uk;
  97.         if(out>1000)
  98.         {
  99.                 out=1000;
  100.         }
  101.         else if(out<0)
  102.         {
  103.                 out=0;
  104.         }
  105.         PWMTime=out;
  106.         uk1=uk;
  107.         e2=e1;
  108.         e1=e;
  109. }

  110. void delay(unsigned int i)
  111. {
  112.         while(i--);
  113. }

  114. void SendData(unsigned char dat)//串口1發(fā)送一個(gè)字節(jié)數(shù)據(jù)
  115. {
  116.         while(busy);
  117.         busy=1;
  118.         SBUF=dat;
  119. }

  120. void Value_Send()//串口將數(shù)據(jù)發(fā)送出去,僅發(fā)送顯示的部分
  121. {
  122.         SendData(0xC7);
  123.         delay(100);
  124.         SendData(Display_Temperature_Act[0]);
  125.         delay(100);
  126.         SendData(Display_Temperature_Act[1]);
  127.         delay(100);
  128.         SendData(Display_Temperature_Act[2]);
  129.         delay(100);
  130.         SendData(Display_Temperature_Set[0]);
  131.         delay(100);
  132.         SendData(Display_Temperature_Set[1]);
  133.         delay(100);
  134.         SendData(Display_Temperature_Set[2]);
  135.         delay(100);
  136.         SendData(0x7C);
  137. }

  138. void VCC_Voltage_Read()                                                //調(diào)用此函數(shù)更新電源電壓值,存儲(chǔ)在VCC_Voltage變量中,該函數(shù)改變ADC的設(shè)置
  139. {
  140.         P1ASF=B00000000;                                                //不設(shè)置P1ASF,以便上電讀取BandGap電壓的ADC轉(zhuǎn)換值
  141.         ADC_CONTR=B10000000;                                        //開(kāi)啟ADC電源,設(shè)置轉(zhuǎn)換速度540時(shí)鐘周期,清空轉(zhuǎn)換標(biāo)志位,停止轉(zhuǎn)換,模擬通道選擇P1^0
  142.         ADC_RES=0;                                                                //清除結(jié)果寄存器
  143.         ADC_RESL=0;                                                                //清除結(jié)果寄存器
  144.         CLK_DIV&=B11011111;                                                //ADC_RES[7:0]存放高8位ADC結(jié)果,ADC_RES[1:0]存放低2位ADC結(jié)果
  145.         //PADC=1;                                                                //設(shè)置A/D轉(zhuǎn)換中斷優(yōu)先級(jí)為最高
  146.         
  147.         ADC_CONTR|=0x08;                                                //開(kāi)始轉(zhuǎn)換
  148.         _nop_();
  149.         _nop_();
  150.         _nop_();
  151.         _nop_();                                                                //按照例程延時(shí)4個(gè)周期
  152.         while(!En_ADC_Value);                                        //等待轉(zhuǎn)換結(jié)束
  153.         En_ADC_Value=0;                                                        //清除標(biāo)志位
  154.         ADC_BandGap=ADC_DATA;                                        //保存BandGap的ADC轉(zhuǎn)換值
  155.         VCC_Voltage=Voltage_BandGap_ROM*1023.0/(float)ADC_BandGap;//電源電壓值計(jì)算
  156. }

  157. void NTC_Voltage_Read()                                                //調(diào)用此函數(shù)更新NTC電壓值,存儲(chǔ)在NTC_Voltage變量中,該函數(shù)改變ADC的設(shè)置
  158. {
  159.         P1ASF=B00001000;                                                //NTC接在P13
  160.         ADC_CONTR=B11100011;                                        //開(kāi)啟ADC電源,設(shè)置轉(zhuǎn)換速度90時(shí)鐘周期,清空轉(zhuǎn)換標(biāo)志位,停止轉(zhuǎn)換,模擬通道選擇P1^3
  161.         ADC_RES=0;                                                                //清除結(jié)果寄存器
  162.         ADC_RESL=0;                                                                //清除結(jié)果寄存器
  163.         CLK_DIV&=B11011111;                                                //ADC_RES[7:0]存放高8位ADC結(jié)果,ADC_RES[1:0]存放低2位ADC結(jié)果
  164.         //PADC=1;                                                                //設(shè)置A/D轉(zhuǎn)換中斷優(yōu)先級(jí)為最高
  165.         
  166.         ADC_CONTR|=0x08;                                                //開(kāi)始轉(zhuǎn)換
  167.         _nop_();
  168.         _nop_();
  169.         _nop_();
  170.         _nop_();                                                                //按照例程延時(shí)4個(gè)周期
  171.         while(!En_ADC_Value);                                        //等待轉(zhuǎn)換結(jié)束
  172.         En_ADC_Value=0;                                                        //清除標(biāo)志位
  173.         NTC_Voltage=Voltage_BandGap_ROM*(float)ADC_DATA/(float)ADC_BandGap;//NTC分壓電壓計(jì)算
  174. }

  175. /*
  176. 數(shù)值顯示處理函數(shù),將溫度變量的值判斷合法范圍并按位取出送給顯示數(shù)組
  177. 溫度變量值的合理更新由其更新函數(shù)負(fù)責(zé)
  178. 為提高效率,該函數(shù)只在變量更新時(shí)執(zhí)行一次,不隨數(shù)碼管顯示函數(shù)輪詢刷新
  179. */
  180. void Data_Process()
  181. {
  182.         if(Temperature_Act>0&&Temperature_Act<100)
  183.         {
  184.                 Display_Temperature_Act[0]=Temperature_Act/10;
  185.                 Display_Temperature_Act[1]=Temperature_Act%10;
  186.                 Display_Temperature_Act[2]=12;
  187.         }
  188.         else
  189.         {
  190.                 if(Temperature_Act<0)
  191.                 {
  192.                         Temperature_Act*=(-1);//將值變?yōu)檎龜?shù)
  193.                         Display_Temperature_Act[0]=17;//顯示負(fù)號(hào)
  194.                         Display_Temperature_Act[1]=Temperature_Act/10;
  195.                         Display_Temperature_Act[2]=Temperature_Act%10;
  196.                 }
  197.                 else//數(shù)值大于100℃
  198.                 {
  199.                         Display_Temperature_Act[0]=Temperature_Act/100;
  200.                         Display_Temperature_Act[1]=(Temperature_Act%100)/10;
  201.                         Display_Temperature_Act[2]=Temperature_Act%10;
  202.                 }
  203.         }
  204.         //由于設(shè)置值由設(shè)置函數(shù)保證合法性,此處不用判斷,直接按位取出即可
  205.         Display_Temperature_Set[0]=Temperature_Set/10;
  206.         Display_Temperature_Set[1]=Temperature_Set%10;//溫度設(shè)定值在30~90之間
  207.         Display_Temperature_Set[2]=12;
  208.         
  209. //                        Display_Temperature_Set[0]=PWMTime/100;
  210. //                        Display_Temperature_Set[1]=(PWMTime%100)/10;
  211. //                        Display_Temperature_Set[2]=PWMTime%10;
  212. //        if(PWMTime==0)Display_Temperature_Set[2]=15;
  213. }

  214. /*
  215. 數(shù)碼管顯示函數(shù),用于刷新顯示設(shè)定的和實(shí)際的溫度值
  216. 同時(shí)刷新LED的指示顯示
  217. 參數(shù)為布爾量,0:顯示設(shè)定值 1:顯示測(cè)得值
  218. */
  219. void smg_display(bit choose)
  220. {
  221.         unsigned char i;
  222.         for(i=0;i<3;i++)
  223.         {
  224.                 switch(i)
  225.                 {
  226.                         case 0:S1=0;S2=1;S3=1;break;
  227.                         case 1:S1=1;S2=0;S3=1;break;
  228.                         case 2:S1=1;S2=1;S3=0;break;
  229.                 }
  230.                 if(choose)
  231.                 {//測(cè)得值
  232.                         P2=smgduan[Display_Temperature_Act[i]];
  233.                 }
  234.                 else
  235.                 {//設(shè)定值
  236.                         P2=smgduan[Display_Temperature_Set[i]];
  237.                 }
  238.                 delay(100);
  239.                 P2=0x00;
  240.         }
  241.         
  242.         if(choose)//在不同模式下點(diǎn)亮相應(yīng)的指示燈
  243.         {
  244.                 LED_Red=1;LED_Green=0;
  245.         }
  246.         else
  247.         {
  248.                 LED_Red=0;LED_Green=1;
  249.         }
  250. }

  251. void Timer0Init(void)                //5毫秒@11.0592MHz
  252. {
  253.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  254.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  255.         TL0 = 0x00;                //設(shè)置定時(shí)初值
  256.         TH0 = 0x28;                //設(shè)置定時(shí)初值
  257.         TF0 = 0;                //清除TF0標(biāo)志
  258.         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  259. }

  260. void Timer1Init(void)                //10微秒@11.0592MHz
  261. {
  262.         AUXR |= 0x40;                //定時(shí)器時(shí)鐘1T模式
  263.         TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
  264.         TL1 = 0x91;                //設(shè)置定時(shí)初值
  265.         TH1 = 0xFF;                //設(shè)置定時(shí)初值
  266.         TF1 = 0;                //清除TF1標(biāo)志
  267.         TR1 = 1;                //定時(shí)器1開(kāi)始計(jì)時(shí)
  268. }

  269. void UartInit(void)                //9600bps@11.0592MHz
  270. {
  271.         SCON = 0x50;                //8???,?????
  272.         AUXR |= 0x01;                //??1?????2???????
  273.         AUXR |= 0x04;                //???2???Fosc,?1T
  274.         T2L = 0xE0;                //??????
  275.         T2H = 0xFE;                //??????
  276.         AUXR |= 0x10;                //?????2
  277. }

  278. void sys_init()
  279. {
  280.         P0M1=0x00;
  281.         P0M0=0x00;
  282.         P1M1=0x00;
  283.         P1M0=0x00;
  284.         P2M1=0x00;
  285.         P2M0=0xFF;//P2口推挽輸出
  286.         P3M1=0x00;
  287.         P3M0=0x00;
  288.         P4M1=0x00;
  289.         P4M0=0x00;
  290.         P5M0=0x00;
  291.         P5M1=0x00;
  292.         P2=0x00;
  293.         LED_Red=0;
  294.         LED_Green=0;
  295.         Timer0Init();
  296.         Timer1Init();
  297.         UartInit();
  298.         EA=1;
  299.         ET0=1;
  300.         ET1=1;
  301.         ES=1;//開(kāi)串口中斷使能
  302.         EADC=1;//開(kāi)ADC轉(zhuǎn)換中斷
  303.         VCC_Voltage_Read();//讀取電源電壓
  304.         Data_Process();
  305.         LED_Red=1;
  306.         LED_Green=1;
  307. }

  308. void main()
  309. {
  310.         sys_init();
  311.         while(1)
  312.         {
  313.                 smg_display(flag_display_mode);
  314.                 if(flag_value_update)
  315.                 {
  316.                         flag_value_update=0;
  317.                         NTC_Voltage_Read();//讀取NTC的分壓值(P13上的模擬電壓)
  318.                         NTC_R_Comp=100000*NTC_Voltage/(VCC_Voltage-NTC_Voltage);//計(jì)算待對(duì)比的NTC阻值,單位十倍歐姆
  319.                         NTC_Temperature=NTC_103_3435_Compare(NTC_R_Comp);//查表計(jì)算NTC對(duì)應(yīng)的溫度值
  320.                         Temperature_Act=(char)NTC_Temperature;//取整
  321.                         Data_Process();
  322.                 }
  323.                 //***************************************************************************
  324.                 //此處添加PID調(diào)溫的函數(shù)               
  325.                 //Temperature_Set_Choose為溫度設(shè)置值數(shù)據(jù)來(lái)源選擇標(biāo)志位,用于PID設(shè)置。
  326.                 //該值為0時(shí)溫度設(shè)置值來(lái)自變量Temperature_Set,該值為1時(shí)設(shè)置值來(lái)自影子變量Shadow_Temperature_Set
  327.                 //溫度的設(shè)置值為int型數(shù)據(jù),范圍為30-90
  328.                 //實(shí)時(shí)溫度可以來(lái)自以下兩個(gè)變量:
  329.                 //Temperature_Act為int型變量,存儲(chǔ)顯示的測(cè)得值
  330.                 //NTC_Temperature為float型變量,存儲(chǔ)每次轉(zhuǎn)換完成后的查表得到的溫度值
  331.                 PWMOUT();
  332.                 //***************************************************************************
  333.                 if(Do_T0_3)
  334.                 {
  335.                         Do_T0_3=0;
  336.                         Value_Send();//串口發(fā)送顯示的值給另一個(gè)單片機(jī)(設(shè)計(jì)要求?
  337.                         
  338.                 }

  339.                 if((Key_Add==0&&(!flag_Key_Add)))
  340.                 {
  341.                         delay(3000);
  342.                         if(Key_Add==0)
  343.                         {
  344.                                 flag_Key_Add=1;
  345.                                 //按鍵執(zhí)行內(nèi)容
  346.                                 if(Temperature_Set_Choose==0)//當(dāng)首次進(jìn)入設(shè)置模式時(shí)
  347.                                 {
  348.                                         En_Display_Standby=0;//關(guān)閉中斷中的顯示輪詢
  349.                                         Shadow_Temperature_Set=Temperature_Set;//備份之前的設(shè)置值
  350.                                         Temperature_Set_Choose=1;//切換PID數(shù)據(jù)來(lái)源
  351.                                         flag_display_mode=0;//切換到設(shè)定值顯示
  352.                                 }
  353.                                 Temperature_Set++;//增加設(shè)置值
  354.                                 if(Temperature_Set>90)Temperature_Set=90;//設(shè)置上限
  355.                                 Data_Process();//更新顯示
  356.                         }
  357.                 }
  358.                 if((Key_Subtract==0&&(!flag_Key_Subtract)))
  359.                 {
  360.                         delay(3000);
  361.                         if(Key_Subtract==0)
  362.                         {
  363.                                 flag_Key_Subtract=1;
  364.                                 //按鍵執(zhí)行內(nèi)容
  365.                                 if(Temperature_Set_Choose==0)//當(dāng)首次進(jìn)入設(shè)置模式時(shí)
  366.                                 {
  367.                                         En_Display_Standby=0;//關(guān)閉中斷中的顯示輪詢
  368.                                         Shadow_Temperature_Set=Temperature_Set;//備份之前的設(shè)置值
  369.                                         Temperature_Set_Choose=1;//切換PID數(shù)據(jù)來(lái)源
  370.                                         flag_display_mode=0;//切換到設(shè)定值顯示
  371.                                 }
  372.                                 Temperature_Set--;//減少設(shè)置值
  373.                                 if(Temperature_Set<30)Temperature_Set=30;//設(shè)置下限
  374.                                 Data_Process();//更新顯示
  375.                         }
  376.                 }
  377.                 if((Key_Submit==0&&(!flag_Key_Submit)))
  378.                 {
  379.                         delay(3000);
  380.                         if(Key_Submit==0)
  381.                         {
  382.                                 flag_Key_Submit=1;
  383.                                 //按鍵執(zhí)行內(nèi)容
  384.                                 if(Temperature_Set_Choose)//確定鍵在設(shè)置模式時(shí)有效
  385.                                 {
  386.                                         En_Display_Standby=1;//開(kāi)啟中斷中的顯示輪詢
  387.                                         Temperature_Set_Choose=0;//切換PID數(shù)據(jù)來(lái)源
  388.                                 }
  389.                         }
  390.                 }
  391.                 if((Key_Cancel==0&&(!flag_Key_Cancel)))
  392.                 {
  393.                         delay(3000);
  394.                         if(Key_Cancel==0)
  395.                         {
  396.                                 flag_Key_Cancel=1;
  397.                                 //按鍵執(zhí)行內(nèi)容
  398.                                 if(Temperature_Set_Choose)//取消鍵在設(shè)置模式時(shí)有效
  399.                                 {
  400.                                         Temperature_Set=Shadow_Temperature_Set;//還原之前的設(shè)置值
  401.                                         En_Display_Standby=1;//開(kāi)啟中斷中的顯示輪詢
  402.                                         Temperature_Set_Choose=0;//切換PID數(shù)據(jù)來(lái)源
  403.                                 }
  404.                         }
  405.                 }
  406.                
  407.                 if(Key_Add)flag_Key_Add=0;
  408.                 if(Key_Subtract)flag_Key_Subtract=0;
  409.                 if(Key_Submit)flag_Key_Submit=0;
  410.                 if(Key_Cancel)flag_Key_Cancel=0;
  411.         }
  412. }

  413. void T0() interrupt 1
  414. {
  415.         if(T0_Cnt_1==400)
  416.         {
  417.                 T0_Cnt_1=0;
  418.                 if(En_Display_Standby)
  419.                 {
  420.                         flag_display_mode=!flag_display_mode;
  421.                 }
  422.                 flag_value_update=1;
  423.         }
  424.         else
  425.         {
  426.                 T0_Cnt_1++;
  427.         }
  428.         
  429.         if(T0_Cnt_2==10)
  430.         {
  431.                 T0_Cnt_2=0;
  432.                 PIDControl();
  433. //                PWMTime=PWMTime+100;
  434. //                if(PWMTime>1000)
  435. //                {
  436. //                        PWMTime=0;
  437. //                }
  438.         }
  439.         else
  440.         {
  441.                 T0_Cnt_2++;
  442.         }
  443.         
  444.         if(T0_Cnt_3==100)
  445.         {
  446.                 T0_Cnt_3=0;
  447.                 Do_T0_3=1;
  448.         }
  449.         else
  450.         {
  451.                 T0_Cnt_3++;
  452.         }
  453. }

  454. void T1() interrupt 3
  455. {
  456.         cnt++;
  457. }

  458. void UART() interrupt 4
  459. {
  460.         if(RI)
  461.         {
  462.                 RI=0;
  463.         }
  464.         if(TI)
  465.         {
  466.                 TI=0;//清除標(biāo)志位
  467.                 busy=0;//上一數(shù)據(jù)發(fā)送完成
  468.         }
  469. }

  470. void ADC() interrupt 5                                                //AD中斷服務(wù)函數(shù)
  471. {
  472.         ADC_CONTR&=!0x10;                                                //清除ADC中斷標(biāo)志,例程
  473.         ADC_DATA=(ADC_RES<<2)|ADC_RESL;                        //10位ADC結(jié)果拼接
  474.         En_ADC_Value=1;                                                        //ADC轉(zhuǎn)換值有效標(biāo)志
  475. }
  476.   
復(fù)制代碼

【程序下載】
基于NTC3435的水溫自動(dòng)加熱系統(tǒng)設(shè)計(jì) 凌凈清河.zip (103.38 KB, 下載次數(shù): 222)


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

使用道具 舉報(bào)

沙發(fā)
ID:328014 發(fā)表于 2019-8-8 02:23 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:386381 發(fā)表于 2019-8-8 13:49 來(lái)自手機(jī) | 只看該作者
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

地板
ID:484435 發(fā)表于 2019-8-8 19:15 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:97678 發(fā)表于 2019-12-2 17:45 | 只看該作者
能不能把完整的資料發(fā)給我?尤其是PID程序。可以把溫度范圍放大到0~30度
回復(fù)

使用道具 舉報(bào)

6#
ID:231727 發(fā)表于 2019-12-17 17:28 | 只看該作者
PID控制的部分還么有完成嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:362076 發(fā)表于 2019-12-18 10:15 | 只看該作者
yuri_su 發(fā)表于 2019-12-17 17:28
PID控制的部分還么有完成嗎?

程序是可用的,由于是師兄的畢設(shè),所以PID部分只對(duì)照示波器測(cè)試了具體表現(xiàn)可以達(dá)到比較好的預(yù)期,理論層面上沒(méi)有做精確分析和計(jì)算
回復(fù)

使用道具 舉報(bào)

8#
ID:36172 發(fā)表于 2020-2-16 10:49 | 只看該作者
想問(wèn)你一個(gè)問(wèn)題,關(guān)于熱敏電阻的溫度與阻值之間的關(guān)系,好像你的不對(duì)呀,有點(diǎn)差距,還有就是你的NTC接電源還是接地(是采用上拉電阻還是下拉電阻)
回復(fù)

使用道具 舉報(bào)

9#
ID:362076 發(fā)表于 2020-2-17 09:08 | 只看該作者
weq12345 發(fā)表于 2020-2-16 10:49
想問(wèn)你一個(gè)問(wèn)題,關(guān)于熱敏電阻的溫度與阻值之間的關(guān)系,好像你的不對(duì)呀,有點(diǎn)差距,還有就是你的NTC接電源 ...

呃,太久了不記得當(dāng)初怎么連的了,應(yīng)該是VCC-10K-NTC-GND吧..
回復(fù)

使用道具 舉報(bào)

10#
ID:502881 發(fā)表于 2020-3-25 13:53 | 只看該作者
想問(wèn)你一個(gè)問(wèn)題,關(guān)于熱敏電阻的溫度與阻值之間的關(guān)系,好像你的不對(duì)呀,有點(diǎn)差距,還有就是你的NTC接電源還是接地(是采用上拉電阻還是下拉電阻)
回復(fù)

使用道具 舉報(bào)

11#
ID:362076 發(fā)表于 2020-3-26 09:37 | 只看該作者
山外青衫 發(fā)表于 2020-3-25 13:53
想問(wèn)你一個(gè)問(wèn)題,關(guān)于熱敏電阻的溫度與阻值之間的關(guān)系,好像你的不對(duì)呀,有點(diǎn)差距,還有就是你的NTC接電源 ...

NTC是接地的,VCC-10K-NTC-GND。
有不對(duì)的地方請(qǐng)見(jiàn)諒哈,我承認(rèn)自己學(xué)藝不精~
回復(fù)

使用道具 舉報(bào)

12#
ID:1023572 發(fā)表于 2023-8-15 09:02 | 只看該作者
牛X,向樓主看齊
回復(fù)

使用道具 舉報(bào)

13#
ID:1023572 發(fā)表于 2023-8-15 09:09 | 只看該作者
凌凈清河 發(fā)表于 2020-3-26 09:37
NTC是接地的,VCC-10K-NTC-GND。
有不對(duì)的地方請(qǐng)見(jiàn)諒哈,我承認(rèn)自己學(xué)藝不精~

有沒(méi)串一個(gè)電阻到ADC呢?
回復(fù)

使用道具 舉報(bào)

14#
ID:1052053 發(fā)表于 2023-10-11 09:45 | 只看該作者
AndyYeung 發(fā)表于 2023-8-15 09:09
有沒(méi)串一個(gè)電阻到ADC呢?

一般是不用串的吧,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 超黄视频网站 | 国产高清免费 | 亚洲成人精品一区 | 日韩欧美三区 | 国产在线视频一区 | 亚洲三区视频 | 小川阿佐美pgd-606在线 | 福利视频一区 | 中文字幕高清一区 | 久久综合狠狠综合久久综合88 | 亚洲性人人天天夜夜摸 | 久久午夜视频 | 欧美精品一区二区蜜桃 | 亚洲一区二区三区久久久 | 日韩精品无码一区二区三区 | 91精品国产综合久久婷婷香蕉 | 亚洲综合大片69999 | 91嫩草精品 | 日韩网站免费观看 | 日韩在线精品强乱中文字幕 | 欧美 日韩 综合 | 亚洲精品乱码久久久久久按摩观 | 国产精品福利视频 | 久久久精品一区二区三区 | 91精品在线看| 国产露脸对白88av | 欧美国产亚洲一区二区 | 国产99免费 | 久草成人网 | 欧美一区二 | 91在线视频免费观看 | 中文字幕亚洲精品在线观看 | 91在线免费视频 | 色综合视频 | 日韩av中文 | 精品区| 午夜影晥 | 亚洲激情网站 | 一级毛片色一级 | 成人免费视频网站在线观看 | 免费中文字幕 |