微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大神们,有没有人做过温度控制PID系统的,小弟跪求帮忙啊

大神们,有没有人做过温度控制PID系统的,小弟跪求帮忙啊

时间:10-02 整理:3721RD 点击:
       小弟毕业设计是温度控制PID系统,以前从来都没有用过AD7705,
现在1602上显示的就是乱跳的温度啊,还有PID算法怎么编写,求指导,求帮助啊,
小弟跪谢大家啦

电路图如下,求个好心人帮忙啊

电路图如下,求帮忙啊


#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
//AD控制端口
sbit AdDin  = P2^0;            /*AD7705数据输入脉冲*/
sbit AdDout = P2^1;            /*AD7705数据输出的反相脉冲*/
sbit AdClk  = P2^2;            /*AD7705时钟脉冲*/
sbit AdDrdy = P3^2;
//1602控制端口
sbit lcdrs=P1^0;  //液晶数据命令选择
sbit lcdrw=P1^1;  
sbit lcden=P1^2;  //液晶使能
#define lcd_data    P0
uchar code table0[]="WENDU        ";
uchar code table2[]="         C";
uint ADC=0;
/*******************************************************************/
/*                                                                 */
/*  延时函数                                                       */
/*                                                                 */
/*******************************************************************/
void delay(int ms)
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<250;i++)  
           {
            _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}
//LCD1602
void write_state(uchar com)
{
  lcdrs=0;    //低电平读状态
  lcdrw=0;
  lcd_data=com;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
}
  void write_date(uchar date)
  {
  lcdrs=1;    //高电平读状态
  lcdrw=0;
  lcd_data=date;
  delay(5);
  lcden=1;
  delay(5);
  lcden=0;
  }
  
  void lcdinit()
{
  uchar num;
  lcden=0;
   write_state(0x38);   // 设置16*12显示,5*7点阵, 8位数据口
   write_state(0x0c);   //  设置开显示,不显示光标
   write_state(0x06);   //  写一个字符后地址指针加1
   write_state(0x01);   //  显示清零,数据指针清零
   write_state(0x80);
      for(num=0;num<13;num++)
    {
          write_date(table0[num]);
          delay(5);
         }
}
//ADC程序               
/* 向AD7705写入一个字节 */
void WriteByte7705(unsigned char x)
{
        unsigned char a;
        AdClk = 1;
        _nop_();
        for (a=0; a<8; a++)
        {
                AdClk=0;
                _nop_();
                AdDin = (bit) (x & 0x80);
                x<<=1;
                AdClk=1;                        
                _nop_();
        }
        //AdClk=1; //后添加
        //AdDin=1;   //后添加
}
/* 从AD7705读一个字 */
unsigned int ReadWord7705(void)
{
        unsigned char b;
        unsigned long y=0;
        AdClk = 1 ;
       
        for(b=0;b<16;b++)
        {
                AdClk=0;
                _nop_();
                //y<<=1;
                if(AdDout == 1)
                {
                        y = y | 0x01;
                }
                y<<=1;
                AdClk=1;
                _nop_();
        }
        //AdClk=1; //后添加
        //AdDin=1;   //后添加
        return y;
}
/* AD7705通信端口复位 */
void Reset7705(void)
{
        unsigned char c;
        for(c=0;c<35;c++)
        { /* 多于连续32个 DIN=1 使串口复位 */
                AdClk = 0;       
                _nop_();
                AdDin = 1;       
                _nop_();
                AdClk = 1;                       
                _nop_();
        }
}

void Init7705(void)
{
        Reset7705();
        WriteByte7705(0x20);//0010 0000选中时钟寄存器 写 通道1寄存器0
        WriteByte7705(0x05);//对时钟寄存器 时钟分频禁止 时钟位0 50Hz刷新
        WriteByte7705(0x10);//0001 0000选中设置寄存器 写 通道1寄存器0
        WriteByte7705(0x78);//设置寄存器自校准 增益128 双极性工作  
        delay(30);
}
void int0 (void) interrupt 0                                    //AD7705中断0读取AD
{
        WriteByte7705(0x38);//选中数据寄存器 读操作        
        ADC = ReadWord7705();
        Reset7705();
        WriteByte7705(0x10);//设置寄存器 写 通道1
        WriteByte7705(0x78);//设置寄存器自校准 增益128 双极性工作                 
        AdDrdy = 1;
}
//显示ADC
void display(uint ad_date)
{
write_state(0x80+0x40);
write_date(0x30+ad_date/10000);
write_date(0x30+ad_date%10000/1000);
write_date(0x30+ad_date%1000/100);
write_date(0x30+ad_date%100/10);
write_date(0x30+ad_date%10);
}
/*****************************************************************/
void main(void)
{
    IT0  = 1;                 //外部中断触发方式为下降沿触发
        EX0  = 1;                 //外部中断允许
        EA   = 1;                 //开中断
    Init7705();
        lcdinit();
        while(1)
        {
         display(ADC);
        }
}

求指导啊,程序如上

跪求大神指导

跪求好心人帮忙看看

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top