
单片机实验报告
闪光对焊-S57
2023年2月18日发(作者:傲坦)51单片机课程设计实验报告
2
————————————————————————————————作者:
————————————————————————————————日期:
个人收集整理勿做商业用途
0
51单片机应用设计与仿真
—-———---———————基于KeilC与Proteus
院校成都理工大学工程技术学院
专业测控技术与仪器
学号2
姓名李刚
指导老师赵老师
成绩
个人收集整理勿做商业用途
1
目录
第一章51单片机结构和原理…………………………………2
1。151单片机的结构…………………………………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
个人收集整理勿做商业用途
2
第四章总结与展望……………………………………………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年代初是我国最流行的单片机之一.INT
EL公司后来将MCS-51的核心技术授权给了其他公司,现在生产8051内核单片机的公司,主要有ATMEL、
WINBOND、NXP、NCDRAGON等。
随着技术的发展,各种高性能的16位、32位MCU不断出现,但以8051、PIC、AV
G以及MC68HC等系列为典型代表的8位MCU,由于成本低、开发工具完善、易学易用等特点,
仍具有强大的生命力和极高的实使用价值。
1。151单片机的结构
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个优先级.
☆一个全双工串行通信口。
☆有位寻址功能,适于布尔处理的位处理机制。
个人收集整理勿做商业用途
3
1。2。18051单片机引脚图
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
图表错误!未定义书签。at89c51单片机
第二章相关编程与仿真软件的介绍
常用的单片机语言有很多,如:汇编、C语言、BASIC、C++等,对51单片机而言,使用最为广泛的
还是汇编语言和C语言。有经验的程序员用汇编语言可以写出高效率的程序,但每种语言都有自己个子
的特点.
2。1从标准C转向KeilC
C51是专门为51系列单片机设计的,根据51单片机自身的特点进行了若干扩展,与ANSIC在语
法和库函数方面存在稍许差别,但绝大部分是兼容的。但在学习中,使用最多的还是KeilC8。08u
Vision3.
2。2KeilC上机的基本方法
个人收集整理勿做商业用途
4
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计入子电路所在的设计页,原
个人收集整理勿做商业用途
5
ULA2003驱动部分加上相应的端子.由于LED的驱动部分有多中方案,将来采用别的方案时不需要做任何的修
改.用BUTTON元件绘出键盘的部分,并为行扫描线和列扫描线上的端子命名,此处不采用Proteus中现成的键
盘模型是为了是读者更透彻的理解键盘的设计和按键识别的原理,但在商业产品的开发中可购买现成的键盘
模块。
第三章基于单片机的PID温度控制系统
3.1PID温控器简介
PID温控器原理图
电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051读出电阻炉
炉温,控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控制开关K的开与断,提供适当
的加热功率,以使炉温尽快趋近目标温度。PID温控器还通过串口与PC通信,以实现远程监控。LED和
键盘用于人机接口,交流电过零检测部分可使8051只在正弦交流电零点附近控制开关K的通与断,以
避免对交流电斩波而造成干扰。
本设计是接口技术、应用系统设计、Proteus仿真的结合,介绍存储系统、人机接口、数据采集、
串口通信等知识及其在PID温控器设计中的应用于仿真,从个子系统开始,设计并逐步完善,直至整个
应用系统的实现.
3.28051存储系统扩展和PID温控器的存储系统设计
个人收集整理勿做商业用途
6
3。2.1PID温控器存储系统设计
PID温控器的存储系统设计中使用了一片3—8译码器74LS138来产生各芯片所需的片选信号.6264
信号来自于74LS138的输出。另外,要是为低电平选中6264,则C、B、A的输出
应为011,由此可以计算出6264的二进制地址范围为0000~1111,
写成十六进制为0x6000~0x7fff,2764的地址范围为0x0000~0x1fff。
下图为温控系统的仿真原理图
D[0..7]
A[0..7]
A7
A7
A7
A6
A5
A4
A3
A2
A1
A0
A6
A5
A4
A3
A2
A1
A0
D7
D6
D5
D4
D3
D2
D1
D0
A6
A5
A4
A3
A2
A1
A0
D7
D6
D5
D4
D3
D2
D1
D0
ALE
A8
A9
A10
A11
A12
A8
A9
A10
A11
A12
WR
RD
PSEN
ALE
PSEN
RD
WR
A8
A9
A10
A11
A12
D
0
D
1
D
2
D
3
D
4
D
5
D
6
D
7
P3
P2
P1
P0
T0
T1
T2
T3
F0
F1
F2
F3
EX1
START
A
1
B
2
C
3
E1
6
E2
4
E3
5
Y0
15
Y1
14
Y2
13
Y3
12
Y4
11
Y5
10
Y6
9
Y7
7
U1
74LS138
D0
3
Q0
2
D1
4
Q1
5
D2
7
Q2
6
D3
8
Q3
9
D4
13
Q4
12
D5
14
Q5
15
D6
17
Q6
16
D7
18
Q7
19
OE
1
LE
11
U2
74LS373
A0
10
A1
9
A2
8
A3
7
A4
6
A5
5
A6
4
A7
3
A8
25
A9
24
A10
21
A11
23
A12
2
CE
20
OE
22
PGM
27
VPP
1
D0
11
D1
12
D2
13
D3
15
D4
16
D5
17
D6
18
D7
19
U3
2764
A0
10
A1
9
A2
8
A3
7
A4
6
A5
5
A6
4
A7
3
A8
25
A9
24
A10
21
A11
23
A12
2
CE
20
CS
26
WE
27
OE
22
D0
11
D1
12
D2
13
D3
15
D4
16
D5
17
D6
18
D7
19
U4
6264
C1
22pF
12MHz
R1
200
C2
22pF
R2
1k
C3
2uF
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U5
AT89C51
温控系统扩展图
3.3人机接口和PID温控器的输入/输出设计及仿真
键盘和显示器是最常用的人机交互设备,在单片机系统中显示器常用笔段式LED或者多段式液晶
LCD做显示设备,如微波炉、洗衣机、DVD等家用电器采用此类显示方式。输出内容较复杂的系统也有
才有字符型点阵式LED、字符型LCD等,这里只介绍八段LED显示器,可用于数字和部分字符显示.
3。3.1八段LED显示器
下图为笔段式八段LED数码管原理图。LED显示器有共阴极和共阳极之分,其中的每段为一个发光
二极管,常用的有红绿两种。共阴极LED的com公共端应接低电平,割断引脚接高电平则该段点亮,接
低电平则该段熄灭。共阳极LED与其相反。
个人收集整理勿做商业用途
7
不考虑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};
段位置以编号
com
bacdefdp
共阳极LED
abcdefgdp
com
个人收集整理勿做商业用途
8
共阴极LED
3.3。2LED显示器的显示方式
实际使用LED时,一般将几个八段显示器排列成一组使用,其中的一个LED显示器被称为一位。
多位LED显示器的显示方式分为静态方式和动态扫描方式。静态方式中各LED的段引脚和com端都独立
接线,这种方式的好处是程序相对简单,显示无闪烁;缺点是功耗大.采用动态扫描时,各LED的段引
脚链接在一起,而com段独立,程序是通过控制各LED的com端的电平来决定点亮某一位LED。其优点
是功耗小,缺点为编程相对复杂,当CPU负担较重时可能达不到理想的刷新速度,导致效果变差.
D
7
D
0
D
1
D
2
D
3
D
4
D
5
D
6
D
7
D
0
D
1
D
2
D
3
D
4
D
5
D
6
D
7
D
0
D
1
D
2
D
3
D
4
D
5
D
6
A8
A9
A10
M0M1M2
M2
M1
M0
D
0
3
Q
0
2
D
1
4
Q
1
5
D
2
7
Q
2
6
D
3
8
Q
3
9
D
4
1
3
Q
4
1
2
D
5
1
4
Q
5
1
5
D
6
1
7
Q
6
1
6
D
7
1
8
Q
7
1
9
O
E
1
L
E
1
1
U10
74LS373
D
0
3
Q
0
2
D
1
4
Q
1
5
D
2
7
Q
2
6
D
3
8
Q
3
9
D
4
1
3
Q
4
1
2
D
5
1
4
Q
5
1
5
D
6
1
7
Q
6
1
6
D
7
1
8
Q
7
1
9
O
E
1
L
E
1
1
U11
74LS373
D
0
3
Q
0
2
D
1
4
Q
1
5
D
2
7
Q
2
6
D
3
8
Q
3
9
D
4
1
3
Q
4
1
2
D
5
1
4
Q
5
1
5
D
6
1
7
Q
6
1
6
D
7
1
8
Q
7
1
9
O
E
1
L
E
1
1
U12
74LS373
R3
50
R4
50
R5
50
2
3
1
U13:A
74LS02
5
6
4
U13:B
74LS02
8
9
10
U13:C
74LS02
WR
A
1
B
2
C
3
E1
6
E2
4
E3
5
Y0
15
Y1
14
Y2
13
Y3
12
Y4
11
Y5
10
Y6
9
Y7
7
U9
74LS138
LED静态显示仿真图
测试程序代码:
/*LED静态显示程序段*/
#include
#include〈reg51。h>
unsignedcharcodeLED_CODES[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e,0xff,0x0c,0x89,0x7f,0xbf};
个人收集整理勿做商业用途
9
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已正确复位。
D[0..7]
A[0..7]
D7
A1
A0
D6
D5
D4
D3
D2
D1
D0
RD
WR
S4
S5
S6
S7
S0
S1
S2
S3
B5
B4
B3
B2
B1
B0
P0
B
0
B
1
B
2
B
3
S
0
S
1
S
2
S
3
S
4
S
5
S
6
S
7
B
4
B
5
D0
34
D1
33
D2
32
D3
31
D4
30
D5
29
D6
28
D7
27
RD
5
WR
36
A0
9
A1
8
RESET
35
CS
6
PA0
4
PA1
3
PA2
2
PA3
1
PA4
40
PA5
39
PA6
38
PA7
37
PB0
18
PB1
19
PB2
20
PB3
21
PB4
22
PB5
23
PB6
24
PB7
25
PC0
14
PC1
15
PC2
16
PC3
17
PC4
13
PC5
12
PC6
11
PC7
10
U0
8255A
A0
2
A1
4
A2
6
A3
8
OE
1
Y0
18
Y1
16
Y2
14
Y3
12
U7:A
74LS244
A0
11
A1
13
A2
15
A3
17
OE
19
Y0
9
Y1
7
Y2
5
Y3
3
U8:B
74LS244
1
B
1
1
C
1
6
2
B
2
2
C
1
5
3
B
3
3
C
1
4
4
B
4
4
C
1
3
5
B
5
5
C
1
2
6
B
6
6
C
1
1
7
B
7
7
C
1
0
C
O
M
9
U6
ULN2003A
150k
150k
150k
150k
150k
150k
150k
150k
5k
5k
5k
5k
5k
5k
1k10uf
PID温控器LED显示仿真原理图
个人收集整理勿做商业用途
10
图中有6位动态扫描共阴极LED,它们的段引脚A~G、DP是并联在一起的;引脚1~6位是各位LED的com
端,相互独立。8255A端口C经74LS244的相同输出S0~S7作为LED的段驱动信号,当某位LED各段全部点亮
时,com端电流会达到120~150mA,所以,选用驱动能力较强的ULN2003A作为驱动器件。8255A端口B的PB
0~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;
个人收集整理勿做商业用途
11
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--;
}
}
仿真结果如下图:
个人收集整理勿做商业用途
12
PID温控器LED动态显示运行效果图
3。3。4键盘监测基本原理
键盘犹如一个开关,其原理图如下图。当键盘未闭合时,A点为高电平,当K闭合后,电路导通,A点电平
拉低,如将A点以某种方式介入计算机系统,计算机就可以通过检测A点电平的高低来判别K键是否闭合.
在键的按下和松动过程中,电平都有一个抖动的过程,会引发键的误检测.电平抖动过程一般持续5~10
ms,对抖动过程的处理有硬件消抖和软件消抖,在键较少时可采用硬件方式。但当按键较多时适合用软件
消抖方式,如矩阵式键盘。
1).独立式键盘
下图是独立式键盘的接线示意图。其优点是电路简单,检测方便;缺点是与矩阵键盘相比,占用太多I/O
口,浪费资源。
个人收集整理勿做商业用途
13
独立式键盘
2)矩阵式键盘
下图是矩阵式键盘原理图.图中的键盘为4行4列共16个键,行扫描线为X0、X1、X2,X3,列扫描线为Y0、
Y1、Y2、Y3。矩阵键盘的识别有行扫描法和行反转法两种。
3。3.5PID温控器的键盘设计及其Proteus仿真
个人收集整理勿做商业用途
14
D[0..7]
A[0..7]
D7
A1
A0
D6
D5
D4
D3
D2
D1
D0
RD
WR
S4
S5
S6
S7
S0
S1
S2
S3
B5
B4
B3
B2
B1
B0
P0
F
0
F
1
F
2
F
3
T0
T1
T2
T3
B
0
B
1
B
2
B
3
S
0
S
1
S
2
S
3
S
4
S
5
S
6
S
7
B
4
B
5
D0
34
D1
33
D2
32
D3
31
D4
30
D5
29
D6
28
D7
27
RD
5
WR
36
A0
9
A1
8
RESET
35
CS
6
PA0
4
PA1
3
PA2
2
PA3
1
PA4
40
PA5
39
PA6
38
PA7
37
PB0
18
PB1
19
PB2
20
PB3
21
PB4
22
PB5
23
PB6
24
PB7
25
PC0
14
PC1
15
PC2
16
PC3
17
PC4
13
PC5
12
PC6
11
PC7
10
U0
8255A
A0
2
A1
4
A2
6
A3
8
OE
1
Y0
18
Y1
16
Y2
14
Y3
12
U7:A
74LS244
A0
11
A1
13
A2
15
A3
17
OE
19
Y0
9
Y1
7
Y2
5
Y3
3
U8:B
74LS244
1
B
1
1
C
1
6
2
B
2
2
C
1
5
3
B
3
3
C
1
4
4
B
4
4
C
1
3
5
B
5
5
C
1
2
6
B
6
6
C
1
1
7
B
7
7
C
1
0
C
O
M
9
U6
ULN2003A
150k
150k
150k
150k
150k
150k
150k
150k
5k
5k
5k
5k
5k
5k
1k10uf
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)
个人收集整理勿做商业用途
15
{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;}
实验仿真结果:
个人收集整理勿做商业用途
16
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兼容;
个人收集整理勿做商业用途
17
功耗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〈ADC0808。c〉
#include〈display.h〉
#include〈absacc。h>
#include unsignedchargetData2 (unsignedcharADC_Chip,unsignedcharchannel) {unsignedcharflag=0; 个人收集整理勿做商业用途 18 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;}} 主程序 ……………………………………………………………………… #include〈ADC0808。C〉 #include〈display.h> #include #include〈absacc.h> voidmain() { unsignedcharvalue; unsignedintk; charstrIndexs[6]={20,20,20,20,1,12}; Init8255(); while(1) { value=getData1(ADC_0808,1); for(k=100;k!=0;k——) dispStr(strIndexs,value,1); LedsOff(); } } 仿真结果: 个人收集整理勿做商业用途 19 3。3。7测温放大电路与ADC0808的接口及仿真 在前面已经完成了测温放大电路的分析和设计,现在考虑将其整合到前面的PID温控器的仿真设计中, 最终的仿真原理图如下: T1 T 2 Ut 0 R18 1k R19 10k R20 2k R22 2k R23 10k R24 10k R25 1k R26 5k R28 5k R29 100 3 2 6 7 48 1 U14 OP07 3 2 6 7 415 U15 UA741 +15V -15V +15V -15V RV1 200 RV3 4k R18(1) RV1(2) U14(OP) Ut0 整体原理图: 个人收集整理勿做商业用途 20 测温仿真效果图 测试程序: 测温放大程序 ……………………………………………………………………… #include #include〈absacc.h〉 #include #defineADC_08081 #defineADC0808_DATA_PORT0x2000 #defineADC0808_QUERY_PORT0x4000 #defineADC0808_START_PORT0x2000 voidturn_on_withdot(charled,charchnumber,charmode); 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; 个人收集整理勿做商业用途 21 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;} } voidmain() { unsignedcharvalue; unsignedlongt; unsignedchari,m,n; Init8255(); while(1) { value=getdata2(ADC_0808,0); t=((200*(unsignedlong)value*100)/255+5)/10; LedsOff(); for(i=200;i!=0;i-—) for(m=100;m!=0;m—-); for(i=0;;i++) { m=t%10; if(i==1) {LedsOff(); for(n=5000;n!=0;n-—); turn_on_withdot(i,m,CC); for(n=500;n!=0;n—-);} else {LedsOff(); for(n=5000;n!=0;n——); turn_on(i,m,CC); for(n=500;n!=0;n-—); } t=t/10; if(t==0) 个人收集整理勿做商业用途 22 break; }}} voidturn_on_witndot(charled,charchnumber,charmode) {if(mode==CA) XBYTE[PORT_C]=LED_CODES[chnumber]|0x7f; else XBYTE[PORT_C]=~LED_CODES[chnumber]|~0x7f; XBYTE[PORT_B]=select[led]; } 仿真效果图: 第四章总结与展望 个人收集整理勿做商业用途 23 本次51单片机的课程设计离单片机课程结束已有两年多了,可以说基本上都忘记了。因此,这次课 程设计对我们即将找工作的毕业生来说,是非常有意义的。在这个过程中,我们重新学习并深化了对单 片机技术的理解,更加熟练地掌握了各种仿真软件.比如说:KeilC51、Proteus等等。学会了怎样去 仿真和调试,懂得了发现错误后怎么去解决。 另外,单片机技术在现实生活中应用的越来越多,几乎所有的电子产品都必不可少。如:智能洗衣机、 电冰箱、各种类型的传感器以及控制系统等。因此,学好这门课对我们来说是十分有用的。然而,由于 本人的水平有限,并未完全掌握,在今后的学习过程中仍然需要花费大量的时间去深化。特别是,在实 际使用时更重要的才是硬件连接,需要自己动手制作各种电路板,开发各种不同的系统。所以,今后的 时间里将会更多的注重这一方面。 参考文献 【1】李朝青.单片机原理及接口技术.北京:北京航空航天大学出版社 【2】胡汉才.单片机原理及其接口技术.北京:清华大学出版社 【3】丁明亮、唐前辉.51单片机应用设计与仿真北京:北京航空航天大学出版 社 【4】王燕.单片机原理与应用北京:北京航空航天大学出版社 【5】张靖武.单片机系统的Proteus设计与仿真北京:电子工业大学出版社 【6】夏路易.电路原理图与电路板设计教程北京:北京希望电子出版社 【7】Atmel公司.Atmel8051MicrosoftrollerHardwareManul.2005 【8】周立功.增强型80C51单片机速成与实践.北京:北京航空航天大学出版社