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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求幫忙看一下網上找的不能用,數字PID溫度控制系統(tǒng)單片機程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:454028 發(fā)表于 2019-4-12 15:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/***********************************************************
實驗名稱:數字PID溫度控制系統(tǒng)
***********************************************************/
#include<reg52.h>
#include"lcd_1602.h"        //液晶驅動
#include"pid.h"                        //PID驅動
#include"adc0809.h"                //
#define uchar unsigned char
#define uint unsigned int
sbit up  =P2^4;        //設定值加
sbit down=P2^5;        //設定值減
uchar set_temp=50,rel_temp;//設定值 和 測量值
/**********************************/
//按鍵檢測程序
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--;
                }
        }
}
/*************************************************/
//顯示設定值和測量值
void display()
{
         uchar buf1[4],buf2[3];                //暫設定值測量值百位,十位,個位
        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列開始顯示測量值
}
/*********以下主函數**************/
void main()
{        
        lcd_init();
        los_play(1,0,"SET temp:     'C");//第一行顯示
        los_play(2,0,"NOW temp:     'C");//第二行顯示
        while(1)
        {
                keyplay();//按鍵檢測
                rel_temp=adc0809();//讀取測量值
                PID(set_temp,rel_temp);        //PID控制
                display();//顯示設定值和測量值
        }
}
#define uint unsigned int
#define uchar unsigned char
/*定義端口*************************/
sbit LCD_RS =P2^0;
sbit LCD_EN =P2^2;
sbit LCD_RW =P2^1;
/*********以下是延時函數**************/
void Delay_ms(uchar n)
{
        uchar j;
        for(;n>0;n--)
        for(j=115;j>0;j--);
}
/*********以下是寫數據1,寫命令0函數**************/
void lcd_wdat(uchar dat,bit dr)
{        LCD_RW=0;
        LCD_RS=dr;
        P0=dat;
        LCD_EN=1;
        Delay_ms(5);
        LCD_EN=0;
}
/*********以下是顯示屏初始化函數**************/
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);  //設置顯示位置
        while(*adder1)
                lcd_wdat(*adder1++,1);
}
/**************************************************/
//顯示在某行某列的一個字符
/*************************************************/
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);  //設置顯示位置
        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;
//開始轉換函數
void adc_init()
{
        start=1;
        start=0;  //下降沿開始溫度轉換
        while(EOC==0); //轉換期間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--);//延時
        DA_wr1=1;
}

//PID控制
void PID(uchar set,uchar rel)
{
        uchar D_value=0;     //設定值與實際值的差值
        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();
}


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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-4-12 16:59 | 只看該作者
您這個問題給的信息不全,估計是沒人能回答得了的,先轉移到冷門區(qū)了,自行點擊編輯按鈕補充一下吧,審核員會幫你重新轉到熱門問答區(qū)的
回復

使用道具 舉報

板凳
ID:337808 發(fā)表于 2019-4-21 22:33 | 只看該作者
PID_control(set,rel);這個函數在哪里哪?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久蜜臀 | 一区二区三区国产好 | 懂色av一区二区三区在线播放 | 国产欧美日韩一区 | 亚洲视频免费在线观看 | 日韩一级二级片 | 尤物在线| 天天精品在线 | 天天草草草 | 国产成人免费视频 | 亚洲国产一区二区三区 | av午夜电影| 亚洲色欧美另类 | 精品无码久久久久久国产 | 日韩欧美国产精品一区 | 精品中文视频 | 亚洲一区综合 | 欧美精品乱码99久久影院 | 欧美精品在线视频 | 欧美精品久久 | 久久成人国产 | 亚洲成人一区二区 | 国产精品99久久久久久宅男 | 精品欧美乱码久久久久久 | 99re视频在线观看 | 欧美久久久久久 | 91精品国产91久久综合桃花 | 国产成人av一区二区三区 | 国产精品久久国产精品久久 | 亚洲精品无人区 | 欧美男人亚洲天堂 | 成人国产精品久久久 | 97人澡人人添人人爽欧美 | 亚洲一区二区三区免费视频 | 亚洲一区中文字幕 | av黄色免费 | 久久综合av | 午夜视频一区 | 99精品国产一区二区三区 | 激情国产 | 亚洲欧洲在线看 |