单片机/MCUwilliam hill官网
直播中

小小冰

12年用户 10经验值
私信 关注
[问答]

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

       小弟毕业设计是温度控制PID系统,以前从来都没有用过AD7705,
现在1602上显示的就是乱跳的温度啊,还有PID算法怎么编写,求指导,求帮助啊,
小弟跪谢大家啦
  • 威廉希尔官方网站
图如下,求帮忙啊

回帖(5)

小小冰

2013-3-14 09:09:15
威廉希尔官方网站 图如下,求个好心人帮忙啊
举报

小小冰

2013-3-14 09:23:12
#include
#include
#include
#include
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
//AD控制端口
***it AdDin  = P2^0;            /*AD7705数据输入脉冲*/
***it AdDout = P2^1;            /*AD7705数据输出的反相脉冲*/
***it AdClk  = P2^2;            /*AD7705时钟脉冲*/
***it AdDrdy = P3^2;
//1602控制端口
***it lcdrs=P1^0;  //液晶数据命令选择
***it lcdrw=P1^1;  
***it 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);
        }
}
举报

小小冰

2013-3-14 09:24:20
求指导啊,程序如上
举报

小小冰

2013-3-14 09:25:44
跪求大神指导
举报

小小冰

2013-3-15 08:22:54
跪求好心人帮忙看看
举报

更多回帖

发帖
×
20
完善资料,
赚取积分