欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
求幫忙看一下網(wǎng)上找的不能用,數(shù)字PID溫度控制系統(tǒng)單片機(jī)程序
[打印本頁(yè)]
作者:
lin08
時(shí)間:
2019-4-12 15:25
標(biāo)題:
求幫忙看一下網(wǎng)上找的不能用,數(shù)字PID溫度控制系統(tǒng)單片機(jī)程序
/***********************************************************
實(shí)驗(yàn)名稱:數(shù)字PID溫度控制系統(tǒng)
***********************************************************/
#include<reg52.h>
#include"lcd_1602.h" //液晶驅(qū)動(dòng)
#include"pid.h" //PID驅(qū)動(dòng)
#include"adc0809.h" //
#define uchar unsigned char
#define uint unsigned int
sbit up =P2^4; //設(shè)定值加
sbit down=P2^5; //設(shè)定值減
uchar set_temp=50,rel_temp;//設(shè)定值 和 測(cè)量值
/**********************************/
//按鍵檢測(cè)程序
void keyplay()
{
if(up==0)
{
Delay_ms(10);
if(up==0)
{
while(!up);
set_temp++;
}
}
if(down==0)
{
Delay_ms(10);
if(down==0)
{
while(!down);
set_temp--;
}
}
}
/*************************************************/
//顯示設(shè)定值和測(cè)量值
void display()
{
uchar buf1[4],buf2[3]; //暫設(shè)定值測(cè)量值百位,十位,個(gè)位
buf1[0]=set_temp/100+0x30;
buf1[1]=set_temp/10%10+0x30;
buf1[2]=set_temp%10+0x30;
los_dat(1,9,buf1[0]);//第一排第9列
los_dat(1,10,buf1[1]);//第一排第10列
los_dat(1,11,buf1[2]);//第一排第11列
buf2[0]=rel_temp/100+0x30;
buf2[1]=rel_temp/10%10+0x30;
buf2[2]=rel_temp%10+0x30;
los_play(2,9,buf2); //第2排第9列開始顯示測(cè)量值
}
/*********以下主函數(shù)**************/
void main()
{
lcd_init();
los_play(1,0,"SET temp: 'C");//第一行顯示
los_play(2,0,"NOW temp: 'C");//第二行顯示
while(1)
{
keyplay();//按鍵檢測(cè)
rel_temp=adc0809();//讀取測(cè)量值
PID(set_temp,rel_temp); //PID控制
display();//顯示設(shè)定值和測(cè)量值
}
}
#define uint unsigned int
#define uchar unsigned char
/*定義端口*************************/
sbit LCD_RS =P2^0;
sbit LCD_EN =P2^2;
sbit LCD_RW =P2^1;
/*********以下是延時(shí)函數(shù)**************/
void Delay_ms(uchar n)
{
uchar j;
for(;n>0;n--)
for(j=115;j>0;j--);
}
/*********以下是寫數(shù)據(jù)1,寫命令0函數(shù)**************/
void lcd_wdat(uchar dat,bit dr)
{ LCD_RW=0;
LCD_RS=dr;
P0=dat;
LCD_EN=1;
Delay_ms(5);
LCD_EN=0;
}
/*********以下是顯示屏初始化函數(shù)**************/
void lcd_init()
{
LCD_EN=0;
lcd_wdat(0x38,0);
lcd_wdat(0x0c,0);
lcd_wdat(0x06,0);
lcd_wdat(0x01,0);
}
/*****************顯示******************/
void los_play(uchar X,uchar Y,uchar *adder1)
{
switch(X)
{
case 1:X =0x80+Y;break;
case 2:X =0xc0+Y;break;
}
lcd_wdat(X,0); //設(shè)置顯示位置
while(*adder1)
lcd_wdat(*adder1++,1);
}
/**************************************************/
//顯示在某行某列的一個(gè)字符
/*************************************************/
void los_dat(uchar X,uchar Y,uchar dat)
{
switch(X)
{
case 1:X =0x80+Y;break;
case 2:X =0xc0+Y;break;
}
lcd_wdat(X,0); //設(shè)置顯示位置
lcd_wdat(dat,1);
}
#define uchar unsigned char
#define uint unsigned int
#define AD_data P1
sbit start=P2^7;
sbit EOC=P2^6;
uchar voltage;
//開始轉(zhuǎn)換函數(shù)
void adc_init()
{
start=1;
start=0; //下降沿開始溫度轉(zhuǎn)換
while(EOC==0); //轉(zhuǎn)換期間eoc為0
voltage=AD_data;
}
uchar adc0809()
{
uchar dat;
uchar table[3];
adc_init();
dat=voltage*300.0/255;
table[0]=dat/100;
table[1]=dat%100/10;
table[2]=dat%100%10;
dat=table[0]*100+table[1]*10+table[2];
return dat;
}
#define uchar unsigned char
#define uint unsigned int
#define DA_data P3
sbit DA_wr1=P2^3;
uchar uk;
void PID_control(uchar set,uchar rel)
{
uchar Kp=200,Ki=3,Kd=5;
char e2=0,e1=0,e0=0;
uint u0=0,u=0;
e2=set-rel;
u=Kp*(e2-e1)+Ki*e2+Kd*(e2-2e1+e0)+u0;
uk=u;
e0=e1;e1=e2;u0=u;
}
void DAC0832()
{
uchar i;
DA_wr1=1;
DA_data=uk;
DA_wr1=0;
for(i=7;i>0;i--);//延時(shí)
DA_wr1=1;
}
//PID控制
void PID(uchar set,uchar rel)
{
uchar D_value=0; //設(shè)定值與實(shí)際值的差值
if(set>rel)
{
D_value=set-rel;
if(D_value>20)
uk=255;
else
PID_control(set,rel);
}
else
{
D_value=rel-set;
if(D_value>10)
uk=10;
else
PID_control(set,rel);
}
DAC0832();
}
作者:
admin
時(shí)間:
2019-4-12 16:59
您這個(gè)問題給的信息不全,估計(jì)是沒人能回答得了的,先轉(zhuǎn)移到冷門區(qū)了,自行點(diǎn)擊編輯按鈕補(bǔ)充一下吧,審核員會(huì)幫你重新轉(zhuǎn)到熱門問答區(qū)的
作者:
zhangshanqiao
時(shí)間:
2019-4-21 22:33
PID_control(set,rel);這個(gè)函數(shù)在哪里哪?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1