完整版单片机温度控制器设计毕业设计Word下载.docx
《完整版单片机温度控制器设计毕业设计Word下载.docx》由会员分享,可在线阅读,更多相关《完整版单片机温度控制器设计毕业设计Word下载.docx(37页珍藏版)》请在冰豆网上搜索。
21个特殊功能寄存器。
32条I/O口线。
外部数据存储器寻址空间为64KB。
外部程序存储器寻址空间为64KB。
2个16位的可编程定时/计数器。
中断结构:
具有5个中断源,2个优先级。
一个全双工串行通信口。
有位寻址功能,适于布尔处理的位处理机制。
1.2.18051单片机引脚图
图1-1at89c51单片机
第2章相关编程与仿真软件的介绍
常用的单片机语言有很多,如:
汇编、C语言、BASIC、C++等,对51单片机而言,使用最为广泛的还是汇编语言和C语言。
有经验的程序员用汇编语言可以写出高效率的程序,但每种语言都有自己个子的特点。
2.1从标准C转向KeilC
C51是专门为51系列单片机设计的,根据51单片机自身的特点进行了若干扩展,与ANSIC在语法和库函数方面存在稍许差别,但绝大部分是兼容的。
但在学习中,使用最多的还是KeilC8.08uVision3。
2.2KeilC上机的基本方法
2.2.1uVision3中编程的基本步骤
在uVision3集成开发环境中创建一个新项目(Project),并为该项目选定合适的单片机型号。
利用uVision3的文件编译器编写C语言(或者汇编语言)源程序文件,并将文件添加到项目中去。
通过uVision3的各种选项,配置Cx51编译器、Ax51宏编译器、BL51/Lx51连接定位器以Debug调试器的功能。
利用uVision3的构造功能对项目中的源程序文件进行编译链接,生成绝对目标代码和可选的HEX格式的可执行文件,如果出现编译链接错误则返回上一步,修改源程序中的错误后重新构造整个项目。
将没有错误的绝对目标代码装入uVision3调试器进行仿真调试,调试成功后用编程器将可执行文件写入到单片机应用系统的程序存储器或者单片机内部的FlashROM中。
2.2.2uVision上机注意事项
C51源程序汗汉字注释内容时,删除、插入汉字会出现乱码。
解决方法为:
选择Edit|Configuration菜单项,弹出界面,将C源程序文本字体选择为DotumChe,此字体可避免出现汉字乱码现象。
原版的KeilC编译器会忽略编码为0xFD的字符,当编写中文显示程序时会出现问题,应安装针对这一问题的专用补丁,许多KeilC安装包都含有该补丁程序,安装时间可根据帮助文件安装该补丁。
2.3Proteus简介
Proteus是英国Labcenter公司开发的嵌入式系统仿真软件,组合了高级原理图设计工具ISIS、混合模式SPICE仿真、PCB设计以及自动布线而形成了一个完整的电子设计系统。
它运行于Windows操作系统上,可以仿真、分析各种模拟和数字电路,并且对PC机的硬件配置要求不高。
2.3.1Proteus 与KeilC的联合仿真
目前,单片机仿真软件很多,ProteusISIS与其他单片机仿真软件不同的是,它不仅能仿真单片机CPU的工作情况,也能够仿真单片机外围电路或没有单片机参与的其他电路的工作情况。
一次在仿真和程序调试时,关心的不再是某些语句执行时单片机寄存器和存储器内容的改变,而是从工程师的角度直接看程序运行和电路工作的过程和结果。
同事,当原理图调试成功后,利用ProteusARES软件,很容易获得PCB图,为今后的制造提供了方便。
Keil是美国KeilSoftware公司开发的,是目前世界上最好的51单片机的汇编和C语言的开发工具。
它支持汇编、C语言以及混合编程,同时具备功能强大的软件仿真,在软件模拟仿真方式下不需要任何单片机硬件即可完成用户程序仿真调试;
虽然Keil也提供了硬件仿真(用Monitor51协议,需要硬件支持)功能,但我们在利用它的硬件仿真功能的时候,它会受到一定的限制。
如果我们将ProteusISIS与Keil整合起来使用,充分利用各自的仿真功能,单片机软硬件的调试将变的十分有效。
打开LED.dsn,删除LED设计页中的ULA2003A驱动部分,在LED设计页新建一个子电路LED_DRIVER,为该子电路见撒谎那个输入/输出端子。
移动鼠标指针带子电路上。
按Ctrl+C计入子电路所在的设计页,原ULA2003驱动部分加上相应的端子。
由于LED的驱动部分有多中方案,将来采用别的方案时不需要做任何的修改。
用BUTTON元件绘出键盘的部分,并为行扫描线和列扫描线上的端子命名,此处不采用Proteus中现成的键盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘模块。
第3章基于单片机的PID温度控制系统
3.1PID温控器简介
图3-1PID温控器原理图
电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051读出电阻炉炉温,控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控制开关K的开与断,提供适当的加热功率,以使炉温尽快趋近目标温度。
本设计是接口技术、应用系统设计、Proteus仿真的结合,介绍存储系统、数据采集、串口通信等知识及其在PID温控器设计中的应用于仿真,从个子系统开始,设计并逐步完善,直至整个应用系统的实现。
3.28051存储系统扩展和PID温控器的存储系统设计
3.2.1PID温控器存储系统设计
PID温控器的存储系统设计中使用了一片3-8译码器74LS138来产生各芯片所需的片选信号。
要是为低电平选中6264,则C、B、A的输出应为011,由此可以计算出6264的二进制地址范围为0110000000000000~0111111111111111,写成十六进制为0x6000~0x7fff,2764的地址范围为0x0000~0x1fff。
图3-2温控系统扩展图
3.3人机接口和PID温控器的输入/输出设计及仿真
键盘和显示器是最常用的人机交互设备,在单片机系统中显示器常用笔段式LED或者多段式液晶LCD做显示设备,如微波炉、洗衣机、DVD等家用电器采用此类显示方式。
输出内容较复杂的系统也有才有字符型点阵式LED、字符型LCD等,这里只介绍八段LED显示器,可用于数字和部分字符显示。
3.3.1八段LED显示器
下图为笔段式八段LED数码管原理图。
LED显示器有共阴极和共阳极之分,其中的每段为一个发光二极管,常用的有红绿两种。
共阴极LED的com公共端应接低电平,割断引脚接高电平则该段点亮,接低电平则该段熄灭。
共阳极LED与其相反。
图3-3笔段式八段LED数码管原理图
不考虑com端,可知共阳极显示字符0时的各段二进制编码为11000000,写成十六进制为0xC0。
C语言形式给出的共阳极LED能显示的部分数字和字符编码,可直接用在C51程序中。
图3-4段位置及编号
图3-5共阳极LED
图3-6共阴极LED
3.3.2LED显示器的显示方式
实际使用LED时,一般将几个八段显示器排列成一组使用,其中的一个LED显示器被称为一位。
多位LED显示器的显示方式分为静态方式和动态扫描方式。
静态方式中各LED的段引脚和com端都独立接线,这种方式的好处是程序相对简单,显示无闪烁;
缺点是功耗大。
采用动态扫描时,各LED的段引脚链接在一起,而com段独立,程序是通过控制各LED的com端的电平来决定点亮某一位LED。
其优点是功耗小,缺点为编程相对复杂,当CPU负担较重时可能达不到理想的刷新速度,导致效果变差。
图3-7试验硬件图
图3-8LED静态显示仿真图
试验程序
#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);
}
图3-9试验仿真图
3.3.3PID温控器LED显示及仿真
图3-10LED程序流程图
下图为PID温控器LED显示部分的Proteus仿真原理图。
8255A是一个教复杂的并行接口芯片,在PID温控器主要用作I/O口扩展,用于LED的显示。
在编程时应注意,由于8255A的复位时间较长,字应用程序访问8255A之前,应有足够的延时保证8255A已正确复位。
图3-11PID温控器LED显示仿真原理图
图3-11中有6位动态扫描共阴极LED,它们的段引脚A~G、DP是并联在一起的;
引脚1~6位是各位LED的com端,相互独立。
8255A端口C经74LS244的相同输出S0~S7作为LED的段驱动信号,当某位LED各段全部点亮时,com端电流会达到120~150mA,所以,选用驱动能力较强的ULN2003A作为驱动器件。
8255A端口B的PB0~PB5经ULN2003A反相后的输出B0~B5,作为LED的位选信号,排阻R10~R15作为ULN2003A的下拉电阻。
实验程序
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[];
DISPLAY.C程序
#include"
#include"
reg51.h"
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;
MIAN.C程序
#include"
voidmain()
unsignedintm;
unsignedchari;
Init8255();
i=LEDS-1;
while
(1)
LedsOff();
for(m=50;
m!
=0;
m--);
turn_on(i,i,CC);
if(i==0)i=LEDS-1;
elsei--;
}
图3-12PID温控器LED动态显示运行效果图
3.3.4 键盘监测基本原理
键盘犹如一个开关,当键盘未闭合时,A点为高电平,当K闭合后,电路导通,A点电平拉低,如将A点以某种方式介入计算机系统,计算机就可以通过检测A点电平的高低来判别K键是否闭合。
在键的按下和松动过程中,电平都有一个抖动的过程,会引发键的误检测。
电平抖动过程一般持续5~10ms,对抖动过程的处理有硬件消抖和软件消抖,在键较少时可采用硬件方式。
但当按键较多时适合用软件消抖方式,如矩阵式键盘。
a.独立式键盘
下图是独立式键盘的接线示意图。
其优点是电路简单,检测方便;
缺点是与矩阵键盘相比,占用太多I/O口,浪费资源。
图3-13独立式键盘
b.矩阵式键盘
下图是矩阵式键盘原理图。
图中的键盘为4行4列共16个键,行扫描线为X0、X1、X2,X3,列扫描线为Y0、Y1、Y2、Y3。
矩阵键盘的识别有行扫描法和行反转法两种。
图3-14矩阵式键盘原理图
3.3.5PID温控器的键盘设计及其Proteus仿真
在6位LED上利用矩阵式键盘实现将按键的行、列显示在LED的第1、2位和5、6位上。
行扫描信号R0~R3来自于51单片机P1口的P1.0~P1.3,列扫描来自于51单片机的P1.4、P1.7。
本次用到的是行反转法识别按键,也就是说将行、列各接至一个端口,编程使CPU往行线说连端口全部输出低电平,然后从列线所连端口读入列线值。
如果有某一个键被按下,则必有一条列线位低电平,在进行反转,即将读入的列线值从列线所连的端口输出,在从行线所连端口读入行线的值,那么闭合键所对应的行线必位低电平。
在通过程序对所得列线值和行线值的处理,就可以识别出按键所对应的列号和行号。
图3-15键盘程序流程图如下:
图3-16PID温控器键盘原理图:
实验程序;
DISPLAY.H程序(如前)
DISPLAY.C程序(如前)
按键检测程序
Reg51.h"
voiddelay()
{chari;
for(i=1000;
i!
i--);
charkeyCheck(char*row,char*col)
unsignedchart1,t2,t3,i;
unsignedcharResult=0;
P1=0xf0;
t1=P1;
if(t1==0xf0)gotoexit;
for(i=11;
i--)
delay();
Result=1;
t2=0x80;
t1=~t1;
for(i=4;
{t3=t2&
t1;
if(t3!
=0){*col=i-1;
break;
elset2=t2>
>
1;
t1=t1|0x0f;
P1=t1;
t2=0x08;
for(i=4;
if(t3!
=0){*row=i-1;
elset2=t2>
1;
exit:
returnResult;
mian源程序
externcharkeyCheck(char*row,char*col);
voidmain()
{charrow,col,r;
unsignedchari,k;
while
(1)
r=keyCheck(&
row,&
col);
if(r==0)
{strIndexs[5]=20;
strIndexs[4]=20;
strIndexs[1]=20;
strIndexs[0]=20;
{strIndexs[5]=0;
strIndexs[1]=0;
strIndexs[4]=row;
strIndexs[0]=col;
for(k=6;
k!
k--)
{LedsOff();
for(i=250;
turn_on(k-1,strIndexs[k-1],CC);
for(i=250;
图3-17程序仿真图
第4章PID温控器的炉温采样接口及仿真
在计算机实时测量和智能化仪表等应用系统中,经常会遇到从时间到数值均连续变化的模拟量,如温度、压力、位移、速度等,与此相对应的电信号称为模拟信号。
因单片机只能处理数字量,因此这些模拟电信号必须转化为离散的数字信号,才能被送给单片机进行相应的处理。
将模拟信号转化为数字量的器件称为A/D转换器,简称A/D。
4.4.1A/D转化器的主要技术指标
a.分辨率
分辨率是指输出数字量变化的一个相邻数码所需要输入模拟电压的变化量。
习惯上用输出的二进制位数或BCD码位数表示。
例如,分辨率为12位的A/D转换器,表示该转化器的输出数据可以用2^12个二进制数进行量化。
分辨率用呗分数表示如下:
1/2^12*100%=1/4096*100%=0.0244%
故一个满刻度为10V的12位A/D转换器能够分辨输入电压变化的最小值为2.4V。
b.量化误差
量化误差是指由A/D转换器的优先分辨率多引起的误差。
若不考虑其他误差的影响,一个分辨率有限的A/D转换器的阶梯状转移特性曲线与具有无限分辨率的A/D转换器转移特性曲线(直线)之间的最大误差,称为误差量化。
提高分辨率能够减少量化误差。
c.转换精度
转换精度是指A/D转换器的时间量化值与理想A/D转换器的差值。
转换精度可以分为绝对精度和相对精度,是由非线性、零点刻度、满量程刻度以及温漂等因素所引起的误差。
d.转换速率
转换速率就是指能够重复进行数据转换的速度,即每秒转换的次数。
而完成一次的A/D转换所需要的时间,则是转换速率的倒数。
4.4.2PID温控器A/D转换编程方法
采用的是端口查询方式,先向51单片机P3.3写入1,然后读入P3口。
检查P3.3是为位0,不为0则重新读入P3在检测,直到P3.3为0,此时表示数据转换过程已结束,读片外地址0x2XXX,P1,/RD为低电平,经74LS02反向为高电平,向ADC0808的OE送读数据的信号,