51单片机课程设计实验报告.docx
《51单片机课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《51单片机课程设计实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
51单片机课程设计实验报告
51单片机应用设计与仿真
---------------基于KeilC与Proteus
院校
成都理工大学工程技术学院
专业
测控技术与仪器
学号
5
姓名
李刚
指导老师
赵老师
成绩
目录
第一章51单片机结构和原理 …………………………………2
1.1 51单片机的结构 …………………………………2
第二章相关编程软件与仿真软件的介绍………………………3
2.1从标准C转向KeilC …………………………………3
2.2KeilC上机的基本方法…………………………………3
2.3Proteus简介 ……………………………………………4
第三章基于单片机的PID温度控制系统………………………5
3.1PID温控器简介……………………………………………5
3.28051存储系统扩展和PID温控器的存储系统设计………………5
3.2.1PID温控器存储系统设计…………………………………5
3.3人机接口和PID温控器的输入/输出设计及仿真…………………6
3.3.1八段LED显示器……………………………………………6
3.3.2LED显示器的显示方式………………………………………8
3.3.3PID温控器LED显示及仿真…………………………………9
3.3.4 键盘监测基本原理………………………………………12
3.3.5PID温控器的键盘设计及其Proteus仿真…………………13
3.3.6PID温控器的炉温采样接口及仿真………………………16
第四章总结与展望 ……………………………………………22
参考文献………………………………………………………………22
第一章51单片机结构和原理
单片微型计算机简称单片机,也称为微控制器(MicroControllerUnit),英文缩写为MCU.单片机的结构及功能均是按照工业控制要求而设计的,它把微型计算机的宫格功能部件(中央处理器CPU、随机存取存储器RAM、只读存储器ROM、输入输出I/O接口、定时器/计数器以及串行通信接口等)集成在一块芯片上,构成一个完整的微型计算机,故又称为单片微型计算机。
除工业领域外,单片机还广泛应用于各种民用电子、电器之中。
MCS-51是由美国INTEL公司20世纪80年代生产的一系列8位单片机的总称,此系列单片机包括很多型号,如:
8031、8051、8751、8032、8052等,其中8051是最早最典型的产品。
该系列其他单片机都是在8051的基础上进行功能的增、减改变而来的,所以人们习惯用8051来称呼MCS-8051系列单片机,而其中的8031在20世纪80年代末90年代初是我国最流行的单片机之一。
INTEL公司后来将MCS-51的核心技术授权给了其他公司,现在生产8051内核单片机的公司,主要有ATMEL、WINBOND、NXP、NC DRAGON等。
随着技术的发展,各种高性能的16位、32位MCU不断出现,但以8051、PIC、AVG以及MC68HC等系列为典型代表的8位MCU,由于成本低、开发工具完善、易学易用等特点,仍具有强大的生命力和极高的实使用价值。
1.1 51单片机的结构
1.1.11基本结构
8051单片机的基本结构为:
☆8位CPU,片内振荡器。
☆4KB程序存储器ROM(4096个8位淹没ROM)。
☆128字节的数据存储器RAM(128个8位淹没RAM)。
☆21个特殊功能寄存器。
☆32条I/O口线。
☆外部数据存储器寻址空间为64KB。
外部程序存储器寻址空间为64KB。
☆2个16位的可编程定时/计数器。
☆中断结构:
具有5个中断源,2个优先级。
☆一个全双工串行通信口。
☆有位寻址功能,适于布尔处理的位处理机制。
1.2.18051单片机引脚图
图表1at89c51单片机
第二章相关编程与仿真软件的介绍
常用的单片机语言有很多,如:
汇编、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中现成的键盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘模块。
第三章基于单片机的PID温度控制系统
3.1PID温控器简介
PID温控器原理图
电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051读出电阻炉炉温,控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控制开关K的开与断,提供适当的加热功率,以使炉温尽快趋近目标温度。
PID温控器还通过串口与PC通信,以实现远程监控。
LED和键盘用于人机接口,交流电过零检测部分可使8051只在正弦交流电零点附近控制开关K的通与断,以避免对交流电斩波而造成干扰。
本设计是接口技术、应用系统设计、Proteus仿真的结合,介绍存储系统、人机接口、数据采集、串口通信等知识及其在PID温控器设计中的应用于仿真,从个子系统开始,设计并逐步完善,直至整个应用系统的实现。
3.28051存储系统扩展和PID温控器的存储系统设计
3.2.1PID温控器存储系统设计
PID温控器的存储系统设计中使用了一片3-8译码器74LS138来产生各芯片所需的片选信号。
6264
信号来自于74LS138的输出。
另外,要是为低电平选中6264,则C、B、A的输出应为011,由此可以计算出6264的二进制地址范围为0110000000000000~0111111111111111,写成十六进制为0x6000~0x7fff,2764的地址范围为0x0000~0x1fff。
下图为温控系统的仿真原理图
温控系统扩展图
3.3人机接口和PID温控器的输入/输出设计及仿真
键盘和显示器是最常用的人机交互设备,在单片机系统中显示器常用笔段式LED或者多段式液晶LCD做显示设备,如微波炉、洗衣机、DVD等家用电器采用此类显示方式。
输出内容较复杂的系统也有才有字符型点阵式LED、字符型LCD等,这里只介绍八段LED显示器,可用于数字和部分字符显示。
3.3.1八段LED显示器
下图为笔段式八段LED数码管原理图。
LED显示器有共阴极和共阳极之分,其中的每段为一个发光二极管,常用的有红绿两种。
共阴极LED的com公共端应接低电平,割断引脚接高电平则该段点亮,接低电平则该段熄灭。
共阳极LED与其相反。
不考虑com端,可知共阳极显示字符0时的各段二进制编码为11000000,写成十六进制为0xC0。
以下是以C语言形式给出的共阳极LED能显示的部分数字和字符编码,课直接用在C51程序中。
unsignedcharcodeLED_CODES[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0x0c,0x89,0x7f,0xbf};
段位置以编号
共阳极LED
共阴极LED
3.3.2LED显示器的显示方式
实际使用LED时,一般将几个八段显示器排列成一组使用,其中的一个LED显示器被称为一位。
多位LED显示器的显示方式分为静态方式和动态扫描方式。
静态方式中各LED的段引脚和com端都独立接线,这种方式的好处是程序相对简单,显示无闪烁;缺点是功耗大。
采用动态扫描时,各LED的段引
脚链接在一起,而com段独立,程序是通过控制各LED的com端的电平来决定点亮某一位LED。
其优点是功耗小,缺点为编程相对复杂,当CPU负担较重时可能达不到理想的刷新速度,导致效果变差。
LED静态显示仿真图
测试程序代码:
/*LED静态显示程序段*/
#include
#include
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[0X0100]=LED_CODES[9];
XBYTE[0X0200]=LED_CODES[6];
XBYTE[0X0300]=LED_CODES[3];
while
(1);
}
仿真结果如下图:
3.3.3PID温控器LED显示及仿真
下图为PID温控器LED显示部分的Proteus仿真原理图。
8255A是一个教复杂的并行接口芯片,在PID温控器主要用作I/O口扩展,用于LED的显示。
在编程时应注意,由于8255A的复位时间较长,字应用程序访问8255A之前,应有足够的延时保证8255A已正确复位。
PID温控器LED显示仿真原理图
图中有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~R1
5作为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();
unsignedcharcodeselect[];
unsignedcharcodeled_codes[];
/*显示C程序*/
………………………………………………………………………
/*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;}
/*PID温控器LED动态显示*/
………………………………………………………………………
/*main.c*/
#include"reg51.h"
#include"display.h"
voidmain()
{unsignedintm;
unsignedchari;
init8255();
i=leds-1;
while
(1)
{
ledsoff();
for(m=1000;m!
=0;m--);
turn_on(i,i,cc);
for(m=1000;m!
=0;m--);
if(i==0)i=leds-1;
elsei--;
}
}
仿真结果如下图:
PID温控器LED动态显示运行效果图
3.3.4 键盘监测基本原理
键盘犹如一个开关,其原理图如下图。
当键盘未闭合时,A点为高电平,当K闭合后,电路导通,A点电平
拉低,如将A点以某种方式介入计算机系统,计算机就可以通过检测A点电平的高低来判别K键是否闭合。
在键的按下和松动过程中,电平都有一个抖动的过程,会引发键的误检测。
电平抖动过程一般持续5~10
ms,对抖动过程的处理有硬件消抖和软件消抖,在键较少时可采用硬件方式。
但当按键较多时适合用软件消抖方式,如矩阵式键盘。
1). 独立式键盘
下图是独立式键盘的接线示意图。
其优点是电路简单,检测方便;缺点是与矩阵键盘相比,占用太多I/O口,浪费资源。
独立式键盘
2)矩阵式键盘
下图是矩阵式键盘原理图。
图中的键盘为4行4列共16个键,行扫描线为X0、X1、X2,X3,列扫描线为Y0、Y1、Y2、Y3。
矩阵键盘的识别有行扫描法和行反转法两种。
3.3.5PID温控器的键盘设计及其Proteus仿真
PID温控器键盘原理图:
打开LED.dsn,删除LED设计页中的ULA2003A驱动部分,在LED设计页新建一个子电路LED_DRIVER,为该子电路见撒谎那个输入/输出端子。
移动鼠标指针带子电路上。
按Ctrl+C计入子电路所在的设计页,原ULA2003驱动部分加上相应的端子。
由于LED的驱动部分有多中方案,将来采用别的方案时不需要做任何的修改。
用BUTTON元件绘出键盘的部分,并为行扫描线和列扫描线上的端子命名,此处不采用Proteus中现成的键盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘模块。
测试程序:
/*按键按下识别子程序:
keycheck*/
………………………………………………………………………
#include"absacc.h"
#include"display.h"
#include"reg51.h"
voiddelay();
chari;
for(i=255;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;}
实验仿真结果:
3.3.6A/D、D/A转换以及PID温控器的温度采集子系统
在计算机实时测量和智能化仪表等应用系统中,经常会遇到从时间到数值均连续变化的模拟量,如温度、压力、位移、速度等,与此相对应的电信号称为模拟信号。
因单片机只能处理数字量,因此这些模拟电信号必须转化为离散的数字信号,才能被送给单片机进行相应的处理。
将模拟信号转化为数字量的器件称为A/D转换器,简称A/D。
A/D转化器的主要技术指标
1、分辨率
分辨路是指输出数字量变化的一个相邻数码所需要输入模拟电压的变化量。
习惯上用输出的二进制位数或BCD码位数表示。
例如,分辨率为12位的A/D转换器,表示该转化器的输出数据可以用2^12个二进制数进行量化。
分辨率用呗分数表示如下:
1/2^12*100%=1/4096*100%=0.0244%
故一个满刻度为10V的12位A/D转换器能够分辨输入电压变化的最小值为2.4V。
2、量化误差
量化误差是指由A/D转换器的优先分辨率多引起的误差。
若不考虑其他误差的影响,一个分辨率有限的A/D转换器的阶梯状转移特性曲线与具有无限分辨率的A/D转换器转移特性曲线(直线)之间的最大误差,称为误差量化。
提高分辨率能够减少量化误差。
3、转换精度
转换精度是指A/D转换器的时间量化值与理想A/D转换器的差值。
转换精度可以分为绝对精度和相对精度,是由非线性、零点刻度、满量程刻度以及温漂等因素所引起的误差。
4、转换速率
转换速率就是指能够重复进行数据转换的速度,即每秒转换的次数。
而完成一次的A/D转换所需要的时间,则是转换速率的倒数。
A/DC0809芯片介绍
ADC0809为8位逐次逼近式A/D转换器,CMOS工艺。
ADC0809的综合功能如下:
分辨率为8位;
最大不可调误差为±1LSB;
单一的+5V供电,模拟输入范围为0-5V;
具有锁存控制的8路模拟开关;
可锁存三态输出,输出与TTL兼容;
功耗15mW;
不必进行零点和精度调整;
转换速率取决于芯片的时钟频率。
时钟频率范围:
10-1280kHz,当时钟为500kHz时,转换速率为128us。
3.3.6PID温控器的炉温采样接口及仿真
PID温控器A/D转换原理
下图是PID温控器的仿真原理图;
PID温控器仿真A/D转换仿真局部图
图中的P1为CPU访问外数据存储器空间地址0x2xxx时74LS138的译码输出,当CPU写0x2xxx时,可使ADC0808锁存数据总线上D0、D1、D2的输入通道号,CPU读0x2xxx时,可使A/D转换结果读到CPU中。
测试程序:
/*ADC0808的程序段*/
………………………………………………………………………
#include
#include
#include
#include
unsignedchargetData2
(unsignedcharADC_Chip,unsignedcharchannel)
{unsignedcha