欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

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

關(guān)于溫控浴缸單片機(jī)程序調(diào)試

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:900557 發(fā)表于 2021-4-24 12:05 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我想讓檢測(cè)的溫度n和設(shè)定的溫度m相等時(shí)舵機(jī)轉(zhuǎn)動(dòng)停止該如何去做(只貼了舵機(jī)程序和主程序,顯示程序和檢測(cè)程序沒(méi)貼應(yīng)該不影響)

我試了
if(m=n)
{
     Servo0PwmDuty0=Servo0PwmDuty0;Servo0PwmDuty1=Servo0PwmDuty1;
     DelayMs(1000);
}
但是效果不太理想,還是仿真有問(wèn)題希望幫忙解答

單片機(jī)程序:
  1. #include<reg52.h>

  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit SERVO0=P3^6;                        //控制舵機(jī)的PWM輸出口
  5. sbit SERVO1=P3^5;
  6. sbit kaishi=P1^1;
  7. sbit jieshu=P1^2;
  8. sbit jiare=P3^3;
  9. sbit jianre=P3^4;

  10. uint Servo0PwmDuty0=1500;        //PWM脈沖寬度   1.5ms脈沖寬度
  11. uint Servo0PwmDuty1=1500;



  12. void DelayMs(uint ms)
  13. {
  14.         uint i,j;
  15.         for(i=0;i<85;i++)                //89單片機(jī)用85,12系列單片機(jī)用800
  16.                 for(j=0;j<ms;j++);
  17. }
  18. //時(shí)鐘初始化
  19. void InitTimer0(void)
  20. {

  21.         TMOD = 0x11;                //設(shè)置定時(shí)器模式
  22.         TL0 = 0x00;                        //設(shè)置定時(shí)初值
  23.         TH0 = 0x00;                        //設(shè)置定時(shí)初值
  24.         TF0 = 0;                        //清除TF0標(biāo)志
  25.         TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  26.         ET0 = 1;
  27.         TL1 = 0x00;                        //設(shè)置定時(shí)初值
  28.         TH1 = 0x00;                        //設(shè)置定時(shí)初值
  29.         TF1 = 0;                        //清除TF0標(biāo)志
  30.         TR1 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  31.         ET1 = 1;                        //開定時(shí)器0中斷
  32. }

  33. //給定時(shí)器0計(jì)數(shù)器賦值產(chǎn)生定時(shí)中斷秒的中斷
  34. //因?yàn)槎〞r(shí)器是TH0,TL0都要全部計(jì)數(shù)到0xFF后在計(jì)1個(gè)數(shù)就會(huì)產(chǎn)生中斷,所以要想產(chǎn)生pwm毫秒的中斷,那么TH0,TL0就應(yīng)該賦值(0xFFFF-pwm)        從這個(gè)值開始計(jì)數(shù)產(chǎn)生定時(shí)中斷
  35. void Timer0Value(uint pwm)
  36. {
  37.         uint value;
  38.         value=0xffff-pwm;        
  39.         TR0 = 0;
  40.         TL0=value;                        //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認(rèn)將16位數(shù)據(jù)的低八位直接賦給八位數(shù)據(jù)
  41.     TH0=value>>8;                //將16位數(shù)據(jù)右移8位,也就是將高8位移到低八位,再賦值給8位數(shù)據(jù)        
  42.         TR0 = 1;
  43. }

  44. void Timer1Value(uint pwm)
  45. {
  46.         uint value;
  47.         value=0xffff-pwm;        
  48.         TR1 = 0;
  49.         TL1=value;                        //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認(rèn)將16位數(shù)據(jù)的低八位直接賦給八位數(shù)據(jù)
  50.     TH1=value>>8;                //將16位數(shù)據(jù)右移8位,也就是將高8位移到低八位,再賦值給8位數(shù)據(jù)        
  51.         TR1 = 1;
  52. }

  53. void main(void)
  54. {

  55.         float m=0,n;
  56.         InitTimer0();        //定時(shí)器0初始化
  57.         EA = 1;        
  58.         LCD_init();//lcd初始化
  59.         while(1)
  60.         {
  61.                 n=ds18b20readwendu();//檢測(cè)到的溫度
  62.                 LCD_Putstring(1,1, "當(dāng)前溫度");//顯示
  63.                 lcd_putint(1,5, n);//顯示
  64.                 LCD_Putstring(2,1, "預(yù)設(shè)溫度");
  65.                 lcd_putint(2,5, m);
  66.                 if(kaishi==0)
  67.                 {
  68.                   Servo0PwmDuty0 = 1500;Servo0PwmDuty1 = 1500;
  69.                   DelayMs(1000);
  70.                
  71.                 }
  72.                 if(jieshu==0)
  73.                 {
  74.                   Servo0PwmDuty0 = 500;Servo0PwmDuty1 = 500;
  75.                   DelayMs(1000);
  76.                
  77.                 }
  78.                 if(jiare==0)
  79.                 {
  80.                          m=m+1;
  81.                 }
  82.                 if(jianre==0)
  83.                 {
  84.                          m=m-1;
  85.                 }
  86.                 if(m>n)
  87.                 {
  88.                   Servo0PwmDuty0=Servo0PwmDuty0+50;Servo0PwmDuty1=Servo0PwmDuty1-50;
  89.                   DelayMs(1000);
  90.                   if(Servo0PwmDuty0>=2500){Servo0PwmDuty0=2500;Servo0PwmDuty1=500;}
  91.                 }

  92.                 if(m<n)
  93.                 {
  94.                   Servo0PwmDuty0=Servo0PwmDuty0-50;Servo0PwmDuty1=Servo0PwmDuty1+50;
  95.                   DelayMs(1000);
  96.                   if(Servo0PwmDuty1>=2500){Servo0PwmDuty1=2500;Servo0PwmDuty0=500;}
  97.                 }


  98.         }
  99. }

  100. void Timer_0(void) interrupt 1 using 1
  101. {
  102.         static uint i = 1;        //靜態(tài)變量:每次調(diào)用函數(shù)時(shí)保持上一次所賦的值,
  103.                                                         //跟全局變量類似,不同是它只能用于此函數(shù)內(nèi)部
  104.         switch(i)
  105.         {
  106.                 case 1:
  107.                         SERVO0 = 1;        //PWM控制腳高電平
  108.                         //給定時(shí)器0賦值,計(jì)數(shù)Pwm0Duty個(gè)脈沖后產(chǎn)生中斷,下次中斷會(huì)進(jìn)入下一個(gè)case語(yǔ)句
  109.                         Timer0Value(Servo0PwmDuty0);        
  110.                         break;
  111.                 case 2:
  112.                         SERVO0 = 0;        //PWM控制腳低電平
  113.                         //高脈沖結(jié)束后剩下的時(shí)間(20000-Pwm0Duty)全是低電平了,Pwm0Duty + (20000-Pwm0Duty) = 20000個(gè)脈沖正好為一個(gè)周期20毫秒
  114.                         Timer0Value(20000-Servo0PwmDuty0);
  115.                         i = 0;        
  116.                         break;         
  117.         }
  118.         i++;
  119. }

  120. void Timer_1(void) interrupt 3 using 1
  121. {
  122.         static uint j = 1;        //靜態(tài)變量:每次調(diào)用函數(shù)時(shí)保持上一次所賦的值,
  123.                                                         //跟全局變量類似,不同是它只能用于此函數(shù)內(nèi)部
  124.         switch(j)
  125.         {
  126.                 case 1:
  127.                         SERVO1 = 1;        //PWM控制腳高電平
  128.                         Timer1Value(Servo0PwmDuty1);        
  129.                         break;
  130.                 case 2:
  131.                         SERVO1 = 0;        //PWM控制腳低電平
  132.                         Timer1Value(20000-Servo0PwmDuty1);
  133.                         j = 0;        
  134.                         break;         
  135.         }
  136.         j++;
  137. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:303742 發(fā)表于 2021-4-25 09:20 | 只看該作者
如果是兩者相等才能動(dòng)作,這樣的寫法肯定不行,需要PID算法。如果你讓比較是一個(gè)區(qū)間,那么就簡(jiǎn)單很多。
回復(fù)

使用道具 舉報(bào)

板凳
ID:77479 發(fā)表于 2021-4-25 16:47 | 只看該作者
if(m=n) 應(yīng)該是這個(gè)吧 if(m==n)
回復(fù)

使用道具 舉報(bào)

地板
ID:900557 發(fā)表于 2021-4-25 17:14 | 只看該作者
gd2051 發(fā)表于 2021-4-25 16:47
if(m=n) 應(yīng)該是這個(gè)吧 if(m==n)

我的手誤,我試驗(yàn)的時(shí)候是==
回復(fù)

使用道具 舉報(bào)

5#
ID:118954 發(fā)表于 2021-4-26 13:27 | 只看該作者
舵機(jī)是吧?那你的思路有問(wèn)題。我的思路是這樣:變量A=溫度1-溫度2>>>變量A轉(zhuǎn)為適當(dāng)?shù)腜WM>>>PWM轉(zhuǎn)為舵機(jī)角度控制。這樣你就可以無(wú)塞運(yùn)行控制函數(shù)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表