PID温控器设计.docx

上传人:b****5 文档编号:7678083 上传时间:2023-01-25 格式:DOCX 页数:34 大小:1.08MB
下载 相关 举报
PID温控器设计.docx_第1页
第1页 / 共34页
PID温控器设计.docx_第2页
第2页 / 共34页
PID温控器设计.docx_第3页
第3页 / 共34页
PID温控器设计.docx_第4页
第4页 / 共34页
PID温控器设计.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

PID温控器设计.docx

《PID温控器设计.docx》由会员分享,可在线阅读,更多相关《PID温控器设计.docx(34页珍藏版)》请在冰豆网上搜索。

PID温控器设计.docx

PID温控器设计

题目:

PID温控器

 

专业(班级):

学号:

姓名:

小组人员:

2010年10月20日星期三静态显示

一、实验思路

要想实现本实验的目的,就要用到相关的器件,器件清单如后面所述。

首先连接硬件图。

单片机控制7段数码管显示数据,就要用到单片机和7段数码管,为了使软件设计简单,再用到74LS373编码器,将二进制数据编码成能让7段数码管显示数据的编码。

然后用到一个74LS138的3/8译码器来充当编码器的选通信号输入源。

单片机周边电路的设计可以参照最小系统设计。

之后就是软件的设计。

本实验说要达到的效果是让7段数码管显示128这3个数据。

软件编程的框图如下:

二、实验步骤

1、打开电脑,打开KEIL和proteus软件,

2、在proteus软件中,新建一个文件,保存在C:

/目录下。

3、选择器件,将所用到的器件都选择上。

4、对照课本P137,将实验电路图连接好。

5、在KEIL软件中新建一个工程文件,命名为LED.UV2。

6、新建一个文件,命名为led.c。

7、在这一个文件中写入对应的程序,并保存。

8、将这三个文件添加到建立的LED.UV2工程中。

9、点击FLASH-CONIGUREFLASHTOOLS,在弹出的对话框中,修改晶振频率12MHZ以及勾选输出建立.HEX文件。

10、编译工程文件,有错,则更改错误的地方,直至无误。

11、将生成的LED.HEX文件添加到刚刚建立的实验电路图中的单片机中。

12、仿真运行实验电路,观察LED显示情况,和所预期的情况想比较,不一样,则更改程序或硬件电路。

知道结果和预期一样

三、试验硬件图

四、试验程序

#include"absacc.h"

unsignedcharcodeLED_CODES[]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,

0x88,0x83,0xc6,0xa1,0x86,

0x8e,0xff,0x0c,0x89,0x7f,0xbf

};

voidmain()

{

XBYTE[0x0000]=LED_CODES[1];

XBYTE[0x0200]=LED_CODES[2];

XBYTE[0x0400]=LED_CODES[8];

while

(1);

}

五、试验仿真图

2010年10月21日星期四动态显示

一、实验思路

首先连接硬件图。

单片机控制7段数码管显示数据,就要用到单片机和7段数码管,为了使软件设计简单,再用到74LS373编码器,将二进制数据编码成能让7段数码管显示数据的7段编码。

然后用到一个74LS138的3/8译码器来充当编码器的选通信号输入源。

单片机周边电路的设计可以参照最小系统设计。

之后就是软件的设计。

本实验说要达到的效果是让6位LED上循环显示数字0~5。

程序流程图如下:

二、实验步骤

1、打开电脑,打开KEIL和proteus软件,

2、在proteus软件中,新建一个文件,保存在C:

/目录下。

3、选择器件,将所用到的器件都选择上。

4、对照课本P138和P132,将实验电路图连接好。

5、在KEIL软件中新建一个工程文件,命名为DLED.UV2。

6、新建三个文件,分别命名为DISPLAY.H,DISPLAY.C,MIAN.C。

7、在这三个文件中写入对应的程序,并保存。

8、将这三个文件添加到建立的DLED.UV2工程中。

9、点击FLASH-CONIGUREFLASHTOOLS,在弹出的对话框中,修改晶振频率12MHZ以及勾选输出建立.HEX文件。

10、编译工程文件,有错,则更改错误的地方,直至无误。

11、将生成的DLED.HEX文件添加到刚刚建立的实验电路图中的单片机中。

12、仿真运行实验电路,观察LED显示情况,和所预期的情况想比较,不一样,则更改程序或硬件电路。

知道结果和预期一样。

三、实验硬件图

四、实验程序

1、DISPLAY.H程序

#defineBASE0x0000

#definePORT_A(BASE)

#definePORT_B(BASE+1)

#definePORT_C(BASE+2)

#definePORT_CONTROL(BASE+3)

#defineLEDS6

#defineCA0

#defineCC1

voidturn_on(charled,charChNumber,charmode);

voidLedsOff();

voidoneByone(chardatas[]);

externvoidInit8255();

unsignedcharcodeSetect[];

unsignedcharcodeLED_CODES[];

2、DISPLAY.C程序

#include"absacc.h"

#include"reg51.h"

#include"display.h"

unsignedcharcodeSelect[]={0x01,0x02,0x04,0x08,0x10,0x20};

unsignedcharcodeLED_CODES[]={0xc0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90,

0x88,0x83,0xC6,0xA1,0x86,

0x8E,0xFF,0x0C,0x89,0x7F,0xBF

};

voidInit8255()

{unsignedchari,j;

for(j=0;j<10;j++)

for(i=0;i<255;i++);

XBYTE[PORT_CONTROL]=0x90;

LedsOff();

}

voidturn_on(charled,charChNumber,charmode)

{

if(mode==CA)

XBYTE[PORT_C]=LED_CODES[ChNumber];

else

XBYTE[PORT_C]=~LED_CODES[ChNumber];

XBYTE[PORT_B]=Select[led];

}

voidLedsOff()

{

XBYTE[PORT_B]=0x00;

}

3、MIAN.C程序

#include"reg51.h"

#include"display.h"

voidmain()

{

unsignedintm;

unsignedchari;

Init8255();

i=LEDS-1;

while

(1)

{

LedsOff();

for(m=50;m!

=0;m--);

turn_on(i,i,CC);

for(m=50;m!

=0;m--);

if(i==0)i=LEDS-1;

elsei--;

}

}

五、实验仿真结果

2010年10月22日星期五键盘设计

一、试验思路

首先连接硬件图,本次实验要求在6位LED上利用矩阵式键盘实现将按键的行、列显示在LED的第1、2位和5、6位上。

本次要求的键盘矩阵,行扫描信号R0~R3来自于51单片机P1口的P1.0~P1.3,列扫描来自于51单片机的P1.4、P1.7。

我们这次实验用到的是行反转法识别按键,也就是说将行、列各接至一个端口,编程使CPU往行线说连端口全部输出低电平,然后从列线所连端口读入列线值。

如果有某一个键被按下,则必有一条列线位低电平,在进行反转,即将读入的列线值从列线所连的端口输出,在从行线所连端口读入行线的值,那么闭合键所对应的行线必位低电平。

在通过程序对所得列线值和行线值的处理,就可以识别出按键所对应的列号和行号。

程序流程图如下:

二、实验步骤

1、打开电脑,打开KEIL和proteus软件,

2、在proteus软件中,新建一个文件,保存在C:

/目录下。

3、打开电脑,打开KEIL和proteus软件,

4、在proteus软件中,新建一个文件,保存在C:

/目录下。

5、选择器件,将所用到的器件都选择上。

6、对照课本P132和P144,将实验电路图连接好。

7、在KEIL软件中新建一个工程文件,命名为BUTTON.UV2。

8、新建四个文件,分别命名为DISPLAY.H,DISPLAY.C,KeyCheck.C,mian.C

9、在这四个文件中写入对应的程序,并保存。

10、将这四个文件添加到建立的BUTTON.UV2工程中。

11、点击FLASH-CONIGUREFLASHTOOLS,在弹出的对话框中,修改晶振频率12MHZ以及勾选输出建立.HEX文件。

12、编译工程文件,有错,则更改错误的地方,直至无误。

13、将生成的button.HEX文件添加到刚刚建立的实验电路图中的单片机中。

14、仿真运行实验电路,观察LED显示情况,和所预期的情况想比较,不一样,则更改程序或硬件电路。

知道结果和预期一样。

三、实验硬件图

四、试验程序

1、DISPLAY.H程序(如前)

2、DISPLAY.C程序(如前)

3、按键检测程序

#include"absacc.h"

#include"display.h"

#include"Reg51.h"

voiddelay()

{chari;

for(i=1000;i!

=0;i--);

}

charkeyCheck(char*row,char*col)

{

unsignedchart1,t2,t3,i;

unsignedcharResult=0;

P1=0xf0;t1=P1;

if(t1==0xf0)gotoexit;

for(i=11;i!

=0;i--)

delay();

t1=P1;

if(t1==0xf0)gotoexit;

Result=1;

t2=0x80;t1=~t1;

for(i=4;i!

=0;i--)

{t3=t2&t1;

if(t3!

=0){*col=i-1;break;}

elset2=t2>>1;

}

t1=~t1;

t1=t1|0x0f;

P1=t1;

t1=P1;

t2=0x08;t1=~t1;

for(i=4;i!

=0;i--)

{t3=t2&t1;

if(t3!

=0){*row=i-1;break;}

elset2=t2>>1;

}

exit:

returnResult;

}

4、mian源程序

#include"display.h"

#include"absacc.h"

#include"Reg51.h"

externcharkeyCheck(char*row,char*col);

voidmain()

{charrow,col,r;

charstrIndexs[6]={20,20,20,20,20,20};

unsignedchari,k;

Init8255();

while

(1)

{

r=keyCheck(&row,&col);

if(r==0)

{strIndexs[5]=20;strIndexs[4]=20;

strIndexs[1]=20;strIndexs[0]=20;

}

else

{strIndexs[5]=0;strIndexs[1]=0;

strIndexs[4]=row;strIndexs[0]=col;

}

for(k=6;k!

=0;k--)

{LedsOff();

for(i=250;i!

=0;i--);

turn_on(k-1,strIndexs[k-1],CC);

for(i=250;i!

=0;i--);

}

}

}

五、程序仿真图

2010-10-25星期一AD转换(端口查询方式)

一、实验思路

本次实验采用的是端口查询方式,先向51单片机P3.3写入1,然后读入P3口。

检查P3.3是为位0,不为0则重新读入P3在检测,直到P3.3为0,此时表示数据转换过程已结束,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7~Out0送到数据总线并读入CPU。

实现在LED上显示读取的A/D转换值。

程序流程图如下:

二、实验步骤

1、打开电脑,打开KEIL和proteus软件,

2、在proteus软件中,新建一个文件,保存在C:

/目录下。

3、选择器件,将所用到的器件都选择上。

4、对照课本P189,将实验电路图连接好。

5、在KEIL软件中新建一个工程文件,命名为ADC0808.UV2。

6、新建一个文件,命名为MAIN.c。

7、在这一个文件中写入对应的程序,并保存。

8、将这三个文件添加到建立的ADC0808.UV2工程中。

9、点击FLASH-CONIGUREFLASHTOOLS,在弹出的对话框中,修改晶振频率12MHZ以及勾选输出建立.HEX文件。

10、编译工程文件,有错,则更改错误的地方,直至无误。

11、将生成的ADC0808.HEX文件添加到刚刚建立的实验电路图中的单片机中。

12、仿真运行实验电路,观察LED显示情况,和所预期的情况想比较,不一样,则更改程序或硬件电路。

知道结果和预期一样.

三、实验硬件图

四、实验程序

1、DISPLAY.H程序和DISPLAY.C程序(如前)

2、主程序ADC0808.c

#include

#include

#include

#defineADC_08081

#defineADC0808_DATA_PORT0x2000

#defineADC0808_QUERY_PORT0x4000

#defineADC0808_START_PORT0x2000

unsignedchargetData2(unsignedcharADC_Chip,unsignedcharchannel)

{

unsignedcharflag=0;

unsignedcharvalue=-1;

unsignedxdataale;

switch(ADC_Chip)

{

caseADC_0808:

P3=P3|0x08;

XBYTE[ADC0808_START_PORT]=channel;

P3=P3&0xdf;

P3=P3|0x20;

P3=P3&0xdf;

flag=P3;

while

(1)

{

ale=1;

flag=flag&0x08;

if(flag==0)break;

flag=P3;

}

value=XBYTE[ADC0808_DATA_PORT];

returnvalue;

break;

}

}

voiddispStr(charstrIndexs[],unsignedcharvalue,charchannel)

{

chari,k;

for(i=0;i<3;i++)

{

strIndexs[i]=value%10;

value=value/10;

}

strIndexs[4]=channel;

LedsOff();

for(i=250;i!

=0;i--);

for(k=6;k!

=0;k--)

{

LedsOff();

for(i=250;i!

=0;i--);

turn_On(k-1,strIndexs[k-1],CC);

for(i=250;i!

=0;i--);

}

}

voidmain()

{

unsignedcharvalue;

unsignedintk;

charstrIndexs[6]={20,20,20,20,1,12};

Init8255();

while

(1)

{

value=getData2(ADC_0808,1);

for(k=100;k!

=0;k--)

dispStr(strIndexs,value,1);

LedsOff();

}

}

五、实验仿真图

2010-10-26星期二AD转换(总线查询方式和中断方式)

一、实验思路

本次实验采用的总线查询方式和中断方式。

读片外地址0x4XXX,P2和/RD位低电平,经74LS02反相后打开三态门74LS125,将转换是否完成的标志EOC通过数据总线D7读入CPU,检查D7是否为1,若不为1,则重新读端口0x4XXX在检测,直到D7为1为止,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,ADC0808将转换结果从Out7~Out0送到数据总线并读入CPU。

二、实验步骤

1、打开电脑,打开KEIL和proteus软件,

2、在proteus软件中,新建一个文件,保存在C:

/目录下。

3、选择器件,将所用到的器件都选择上。

4、对照课本P189,将实验电路图连接好。

5、在KEIL软件中新建一个工程文件,命名为ADZX.UV2。

6、新建一个文件,命名为MAIN.c。

7、在这一个文件中写入对应的程序,并保存。

8、将这三个文件添加到建立的ADZX.UV2工程中。

9、点击FLASH-CONIGUREFLASHTOOLS,在弹出的对话框中,修改晶振频率12MHZ以及勾选输出建立.HEX文件。

10、编译工程文件,有错,则更改错误的地方,直至无误。

11、将生成的ADZX.HEX文件添加到刚刚建立的实验电路图中的单片机中。

12、仿真运行实验电路,观察LED显示情况,和所预期的情况想比较,不一样,则更改程序或硬件电路。

知道结果和预期一样

三、实验硬件图

1、总线查询方式硬件图

2、中断方式硬件图

四、实验程序

1、总线查询方式程序

A、DISPLAY.H和DISPLAY.C程序同上次实验

B、主程序ADZX.C

#include

#include

#include

#defineADC_08081

#defineADC0808_DATA_PORT0X2000

#defineADC0808_QUERY_PORT0x4000

#defineADC0808_START_PORT0x2000

unsignedchargetData1(unsignedcharADC_Chip,unsignedcharchannel)

{unsignedcharflag=0;

unsignedcharvalue=-1;

unsignedxdataale;

switch(ADC_Chip)

{caseADC_0808:

XBYTE[ADC0808_START_PORT]=channel;

P3=P3|0x08;

P3=P3&0xdf;

P3=P3|0x20;

P3=P3&0xdf;

flag=P3;

while

(1)

{ale=1;

flag=flag&0x08;

if(flag==0)break;

flag=P3;

}

value=XBYTE[ADC0808_DATA_PORT];

returnvalue;

break;

}

}

voiddispStr(charstrIndexs[],unsignedcharvalue,charchannel)

{chari,k;

for(i=0;i<3;i++)

{strIndexs[i]=value%10;

value=value/10;

}

strIndexs[4]=channel;

LedsOff();

for(i=250;i!

=0;i--);

for(k=6;k!

=0;k--)

{LedsOff();

for(i=250;i!

=0;i--);

turn_On(k-1,strIndexs[k-1],CC);

for(i=250;i!

=0;i--);

}

}

voidmain()

{unsignedcharvalue;

unsignedintk;

charstrIndexs[6]={20,20,20,20,1,12};

Init8255();

while

(1)

{

value=getData1(ADC_0808,0);

for(k=100;k!

=0;k--)

dispStr(strIndexs,value,0);

LedsOff();

}

}

2、中断方式程序

A、DISPLAY.H和DISPLAY.C程序同上次实验

B、主程序ADC0808ZD.C

#include

#include

#include

#defineADC_08081

#defineADC0808_DATA_PORT0X2000

#defineADC0808_QUERY_PORT0x4000

#defineADC0808_START_PORT0x2000

unsignedcharvalue;

voiddispStr(charstrIndexs[],unsignedcharvalue,charchannel)

{chari,k;

for(i=0;i<3;i++)

{strIndexs[i]=value%10;

value=value/10;

}

strIndexs[4]=channel;

LedsOff();

for(i=250;i!

=0;i--);

for(k=6;k!

=0;k--)

{LedsOff();

for(i=250;i!

=0;i--);

turn_On(k-1,strIndexs[k-1],CC);

for(i=250;i!

=0;i--);

}

}

voidmain()

{

unsignedxdataale;

Init8255();

EX1=1;IT1=1;

EA=1;

XBYTE[ADC0808_START_PORT]=5;

P3=P3&0xdf;

P3=P3|0x20;

P3=P3&0xdf;

while

(1)

{ale=1;

}

}

voidEX1_Int()interrupt2

{unsignedcharvalue;

charstrIndexs[6]={20,20,20,20,1,12};

EX1=0;

value=XBYTE[ADC0808_START_PORT];

dispStr(strIndexs,value,5);

LedsOff();

EX1=1;

P3=P3&0xdf;

P3=P3|0x20;

P3=P3&0xdf;

}

五、实验仿真图

1、总线查询方式仿真图

2、中断方式仿真图

2010年10月31日星期日测温放大电路

-、

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1