欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于溫控浴缸單片機程序調試
[打印本頁]
作者:
812839019
時間:
2021-4-24 12:05
標題:
關于溫控浴缸單片機程序調試
我想讓檢測的溫度n和設定的溫度m相等時舵機轉動停止該如何去做(只貼了舵機程序和主程序,顯示程序和檢測程序沒貼應該不影響)
我試了
if(m=n)
{
Servo0PwmDuty0=Servo0PwmDuty0;Servo0PwmDuty1=Servo0PwmDuty1;
DelayMs(1000);
}
但是效果不太理想,還是仿真有問題希望幫忙解答
單片機程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit SERVO0=P3^6; //控制舵機的PWM輸出口
sbit SERVO1=P3^5;
sbit kaishi=P1^1;
sbit jieshu=P1^2;
sbit jiare=P3^3;
sbit jianre=P3^4;
uint Servo0PwmDuty0=1500; //PWM脈沖寬度 1.5ms脈沖寬度
uint Servo0PwmDuty1=1500;
void DelayMs(uint ms)
{
uint i,j;
for(i=0;i<85;i++) //89單片機用85,12系列單片機用800
for(j=0;j<ms;j++);
}
//時鐘初始化
void InitTimer0(void)
{
TMOD = 0x11; //設置定時器模式
TL0 = 0x00; //設置定時初值
TH0 = 0x00; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1;
TL1 = 0x00; //設置定時初值
TH1 = 0x00; //設置定時初值
TF1 = 0; //清除TF0標志
TR1 = 1; //定時器0開始計時
ET1 = 1; //開定時器0中斷
}
//給定時器0計數(shù)器賦值產生定時中斷秒的中斷
//因為定時器是TH0,TL0都要全部計數(shù)到0xFF后在計1個數(shù)就會產生中斷,所以要想產生pwm毫秒的中斷,那么TH0,TL0就應該賦值(0xFFFF-pwm) 從這個值開始計數(shù)產生定時中斷
void Timer0Value(uint pwm)
{
uint value;
value=0xffff-pwm;
TR0 = 0;
TL0=value; //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認將16位數(shù)據(jù)的低八位直接賦給八位數(shù)據(jù)
TH0=value>>8; //將16位數(shù)據(jù)右移8位,也就是將高8位移到低八位,再賦值給8位數(shù)據(jù)
TR0 = 1;
}
void Timer1Value(uint pwm)
{
uint value;
value=0xffff-pwm;
TR1 = 0;
TL1=value; //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認將16位數(shù)據(jù)的低八位直接賦給八位數(shù)據(jù)
TH1=value>>8; //將16位數(shù)據(jù)右移8位,也就是將高8位移到低八位,再賦值給8位數(shù)據(jù)
TR1 = 1;
}
void main(void)
{
float m=0,n;
InitTimer0(); //定時器0初始化
EA = 1;
LCD_init();//lcd初始化
while(1)
{
n=ds18b20readwendu();//檢測到的溫度
LCD_Putstring(1,1, "當前溫度");//顯示
lcd_putint(1,5, n);//顯示
LCD_Putstring(2,1, "預設溫度");
lcd_putint(2,5, m);
if(kaishi==0)
{
Servo0PwmDuty0 = 1500;Servo0PwmDuty1 = 1500;
DelayMs(1000);
}
if(jieshu==0)
{
Servo0PwmDuty0 = 500;Servo0PwmDuty1 = 500;
DelayMs(1000);
}
if(jiare==0)
{
m=m+1;
}
if(jianre==0)
{
m=m-1;
}
if(m>n)
{
Servo0PwmDuty0=Servo0PwmDuty0+50;Servo0PwmDuty1=Servo0PwmDuty1-50;
DelayMs(1000);
if(Servo0PwmDuty0>=2500){Servo0PwmDuty0=2500;Servo0PwmDuty1=500;}
}
if(m<n)
{
Servo0PwmDuty0=Servo0PwmDuty0-50;Servo0PwmDuty1=Servo0PwmDuty1+50;
DelayMs(1000);
if(Servo0PwmDuty1>=2500){Servo0PwmDuty1=2500;Servo0PwmDuty0=500;}
}
}
}
void Timer_0(void) interrupt 1 using 1
{
static uint i = 1; //靜態(tài)變量:每次調用函數(shù)時保持上一次所賦的值,
//跟全局變量類似,不同是它只能用于此函數(shù)內部
switch(i)
{
case 1:
SERVO0 = 1; //PWM控制腳高電平
//給定時器0賦值,計數(shù)Pwm0Duty個脈沖后產生中斷,下次中斷會進入下一個case語句
Timer0Value(Servo0PwmDuty0);
break;
case 2:
SERVO0 = 0; //PWM控制腳低電平
//高脈沖結束后剩下的時間(20000-Pwm0Duty)全是低電平了,Pwm0Duty + (20000-Pwm0Duty) = 20000個脈沖正好為一個周期20毫秒
Timer0Value(20000-Servo0PwmDuty0);
i = 0;
break;
}
i++;
}
void Timer_1(void) interrupt 3 using 1
{
static uint j = 1; //靜態(tài)變量:每次調用函數(shù)時保持上一次所賦的值,
//跟全局變量類似,不同是它只能用于此函數(shù)內部
switch(j)
{
case 1:
SERVO1 = 1; //PWM控制腳高電平
Timer1Value(Servo0PwmDuty1);
break;
case 2:
SERVO1 = 0; //PWM控制腳低電平
Timer1Value(20000-Servo0PwmDuty1);
j = 0;
break;
}
j++;
}
復制代碼
作者:
MJMHZH
時間:
2021-4-25 09:20
如果是兩者相等才能動作,這樣的寫法肯定不行,需要PID算法。如果你讓比較是一個區(qū)間,那么就簡單很多。
作者:
gd2051
時間:
2021-4-25 16:47
if(m=n) 應該是這個吧 if(m==n)
作者:
812839019
時間:
2021-4-25 17:14
gd2051 發(fā)表于 2021-4-25 16:47
if(m=n) 應該是這個吧 if(m==n)
我的手誤,我試驗的時候是==
作者:
shy609100727
時間:
2021-4-26 13:27
舵機是吧?那你的思路有問題。我的思路是這樣:變量A=溫度1-溫度2>>>變量A轉為適當?shù)腜WM>>>PWM轉為舵機角度控制。這樣你就可以無塞運行控制函數(shù)了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1