PID温控器设计.docx
- 文档编号:7678083
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:34
- 大小:1.08MB
PID温控器设计.docx
《PID温控器设计.docx》由会员分享,可在线阅读,更多相关《PID温控器设计.docx(34页珍藏版)》请在冰豆网上搜索。
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日星期日测温放大电路
-、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PID 温控 设计