数码管由2N5401驱动。
5.键盘电路设计。
6个按键,P2.2-P2.7接6个按键,P3.4接公共端,采用动态扫描方式检测键盘。
6.系统软件设计。
系统初始化模块,键盘扫描模块,数据采集模块,标度变换模块、显示模块等。
三.设计报告要求
设计报告应按以下格式书写:
<1)封面;
<2)设计任务书;
<3)目录;
<4)正文;
<5)参考文献。
其中正文应包含以下内容:
<1)系统总体功能及技术指标描述;
<2)各模块电路原理描述;
<3)系统各部分电路图及总体电路图<用PROTEL绘制);
<4)软件流程图及软件清单;
<5)设计总结及体会。
四、参考资料
1、李全利,单片机原理及接口技术,高等教育出版社,2004
2、于永,51单片机常用模块与综合系统设计实例精讲,电子工业出版社,2007
1.?
?
?
?
?
?
2.?
?
?
?
?
?
1.单片机及电源模块设计
2.存储器设计
3.A/D转换器设计
4.显示器设计
5.键盘电路设计
6.系统软件设计
三.项目心得
4.参考文献
1.项目的研究意义
21世纪的今天,科学技术的发展日新月异,科学技术的进步同时也带动了测量技术的发展,现代控制设备不同于以前,它们在性能和结构发生了翻天覆地的变化。
我们已经进入了高速发展的信息时代,测量技术是当今社会的主流,广泛地深入到应用项目的各个领域。
温度是工业、农业生产中常见的和最基本的参数之一,在生产过程中常需对温度进行检测和监控,采用微型机进行温度检测、数字显示、信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用。
伴随工业科技、农业科技的发展,温度测量需求越来越多,也越来越重要。
但是在一些特定环境温度监测环境范围大,测点距离远,布线很不方便。
这时就要采用无线方式对温度数据进行采集。
本设计是以Atmel公司的AT89C52单片机作为控制核心,通过ADC0832模数转换对所测的温度进行数字量变化,且通过数码管进行相应的温度显示。
因为采用微型机进行温度检测、数字显示、信息存储及实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用,并且温度参数对工业生产的重要性,所以温度测量系统的精确度和智能化一直受到企业的重视。
所以学习并研究温度测量及相关知识可做为一个较为实用的课题的方向,能获得较实用的知识和方法。
因此温度测控技术是一个很实用、也很重要的技术,值得去研究掌握。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
…?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
2.研究内容
1.单片机及电源模块设计
单片机:
AT89C52简介
如图5.1-1所示为AT89C52芯片的引脚图。
兼容标准MCS-51指令系统的AT89S52单片机是一个低功耗、高性能CHMOS的单片机,片内含4KB在线可编程Flash存储器的单片机。
它与通用80C51系列单片机的指令系统和引脚兼容。
AT89C52单片机片内的Flash可允许在线重新编程,也可用通用非易失性存储编程器编程;片内数据存储器内含128字节的RAM;有40个引脚,32个外部双向输入/输出
具有两个16位可编程定时器;中断系统是具有6个中断源、5个中断矢量、2级中断优先级的中断结构;震荡器频率0到33MHZ,因此我们在此选用12MHZ的晶振是比较合理的;具有片内看门狗定时器;具有断电标志POF等等。
AT89S51具有PDIP、TQFP和PLCC三种封装形式[8]。
图5.1-1AT89S52引脚图
上图就是PDIP封装的引脚排列,下面介绍各引脚的功能。
5.2AT89C52引脚说明
P0口:
8位、开漏级、双向I/O口。
P0口可作为通用I/O口,但须外接上拉电阻;作为输出口,每各引脚可吸收8各TTL的灌电流。
作为输入时,首先应将引脚置1。
P0也可用做访问外部程序存储器和数据存储器时的低8位地址/数据总线的复用线。
在该模式下,P0口含有内部上拉电阻。
在FLASH编程时,P0口接收代码字节数据;在编程效验时,P0口输出代码字节数据(需要外接上拉电阻>。
P1口:
8位、双向I/0口,内部含有上拉电阻。
P1口可作普通I/O口。
输出缓冲器可驱动四个TTL负载;用作输入时,先将引脚置1,由片内上拉电阻将其抬到高电平。
P1口的引脚可由外部负载拉到低电平,通过上拉电阻提供电流。
在FLASH并行编程和校验时,P1口可输入低字节地址。
在串行编程和效验时,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分别是串行数据输入、输出和移位脉冲引脚。
P2口:
具有内部上拉电阻的8位双向I/O口。
P2口用做输出口时,可驱动4各TTL负载;用做输入口时,先将引脚置1,由内部上拉电阻将其提高到高电平。
若负载为低电平,则通过内部上拉电阻向外部输出电流。
CPU访问外部16位地址的存储器时,P2口提供高8位地址。
当CPU用8位地址寻址外部存储时,P2口为P2特殊功能寄存器的内容。
在FLASH并行编程和校验时,P2口可输入高字节地址和某些控制信号。
P3口:
具有内部上拉电阻的8位双向口。
P3口用做输出口时,输出缓冲器可吸收4各TTL的灌电流;用做输入口时,首先将引脚置1,由内部上拉电阻抬位高电平。
若外部的负载是低电平,则通过内部上拉电阻向输出电流。
在与FLASH并行编程和校验时,P3口可输入某些控制信号。
P3口除了通用I/O口功能外,还有替代功能,如表5.3-1所示。
表5.3-1P3口的替代功能
引脚
符号
说明
P3.0
RXD
串行口输入
P3.1
TXD
串行口输出
P3.2
/INT0
外部中断0
P3.3
/INT1
外部中断1
P3.4
T0
T0定时器的外部的计数输入
P3.5
T1
T1定时器的外部的计数输入
P3.6
/WR
外部数据存储器的写选通
P3.7
/RD
外部数据存储器的读选通
RST:
复位端。
当振荡器工作时,此引脚上出现两个机器周期的高电平将系统复位。
ALE/
:
当访问外部存储器时,ALE<允许地址锁存)是一个用于锁存地址的低8位字节的书粗脉冲。
在Flash编程期间,此引脚也可用于输入编程脉冲<
)。
在正常操作情况下,ALE以振荡器频率的1/6的固定速率发出脉冲,它是用作对外输出的时钟,需要注意的是,每当访问外部数据存储器时,将跳过一个ALE脉冲。
如果希望禁止ALE操作,可通过将特殊功能寄存器中位地址为8EH那位置的“0”来实现。
该位置的“1”后。
ALE仅在MOVE或MOVC指令期间激活,否则ALE引脚将被略微拉高。
若微控制器在外部执行方式,ALE禁止位无效。
:
外部程序存储器读选取通信号。
当AT89S51在读取外部程序时,每个机器周期将PSEN激活两次。
在此期间内,每当访问外部数据存储器时,将跳过两个
信号。
/Vpp:
访问外部程序存储器允许端。
为了能够从外部程序存储器的0000H至FFFFH单元中取指令,
必须接地,然而要注意的是,若对加密位1进行编程,则在复位时,
的状态在内部被锁存。
执行内部程序
应接VCC。
不当选择12V编程电源时,在Flash编程期间,这个引脚可接12V编程电压。
XTAL1:
振荡器反向放大器输入端和内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器输出端[9]。
电源模块:
电源电路
电源变压器是将交流电网220V的电压变为所需要的电压值。
交流电经过二极管整流之后,方向单一了,但是电流强度大小还是处在不断地变化之中。
这种脉动直流一般是不能直接用来给集成电路供电的,而要通过整流电路将交流电变成脉动的直流电压。
因为此脉动的直流电压还含有较大的纹波,必须通过滤波电路加以滤除,从而得到平滑?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
±10%?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
220V?
?
?
?
?
9V?
?
?
?
?
9V?
?
?
?
9V?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
9V?
?
?
?
?
?
?
?
?
?
?
<470μF)?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
9V?
?
?
?
?
?
?
?
?
?
?
?
?
?
LM7805?
?
?
?
?
?
?
5V?
?
?
?
7805?
Vin?
?
?
?
?
?
9V?
?
?
?
?
?
GND?
?
?
?
?
9V?
?
?
?
?
?
Vout?
?
?
?
?
?
?
?
?
?
?
?
?
?
+5V?
?
5V?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
5V?
?
?
?
?
?
?
?
?
?
?
?
5V?
?
?
?
?
?
?
?
10K?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
5V?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
[2]?
?
?
?
?
图如图所示。
2.存储器设计
本设计采用的是AT24C02外扩存储器
?
?
?
?
?
?
:
1.8V~5.5V
?
?
?
?
/?
?
?
?
?
?
5V
?
?
?
?
?
?
?
?
?
:
128x8(1K>,256x8(2K>,512x8(4K>,1024x8(8K>,2048x8(16K>
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
400KHz<1.8V,2.5V,2.7V,3.6V)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
:
1,000,000?
–?
?
?
?
:
100?
?
?
?
?
?
?
?
?
?
?
?
?
(SCL>:
?
SCL?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
EEPROM?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
/?
?
?
?
(SDA>:
SDA?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
24C04?
?
?
A2?
A1?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
4K?
?
?
A0?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
SDA?
?
?
?
?
?
?
?
?
?
?
?
SDA?
?
?
?
?
?
?
SCL?
?
?
?
?
;?
?
?
?
SCL?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
SCL?
?
SDA?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
/?
?
?
?
?
?
?
?
(?
?
?
5>?
?
?
?
?
:
?
SCL?
?
SDA?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
EEPROM?
?
?
?
?
?
?
?
?
?
(?
?
?
5>?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
8?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
8?
?
?
?
?
EEPROM?
?
?
?
9?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
8?
?
?
?
?
?
?
?
?
9?
?
?
?
?
?
EEPROM?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
EEPROM?
?
?
?
?
?
?
?
8?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
EEPROM?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
24C01/02/04/08/16?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
(a>?
?
(>?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
<1)?
?
?
?
9?
?
?
;<2)?
?
?
?
?
?
?
?
?
?
?
SCL?
?
?
SDA?
?
?
;<3)?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
:
voidstart(>//?
?
?
?
{
sda=1?
delay(>?
sck=1?
delay(>?
sda=0?
delay(>?
}
voidstop(>//?
?
?
?
{
sda=0?
delay(>?
sck=1?
delay(>?
sda=1?
delay(>?
}
voidrespons(>//?
?
{
uchari?
sck=1?
delay(>?
while((sda==1>&&i<250>
i++?
sck=0?
delay(>?
}
voidinit(>//?
?
?
{sda=1?
delay(>?
sck=1?
delay(>?
}
voidwrite_byte(uchardate>//?
?
?
{
uchari,temp?
temp=date?
for(i=0?
i<8?
i++>
{temp=temp<<1?
sck=0?
delay(>?
sda=CY?
delay(>?
sck=1?
delay(>?
}
sck=0?
delay(>?
sda=1?
delay(>?
}
ucharread_byte(>//?
?
?
{
uchari,k?
sck=0?
delay(>?
sda=1?
delay(>?
for(i=0?
i<8?
i++>
{sck=1?
delay(>?
k=(k<<1>|sda?
sck=0?
delay(>?
}
returnk?
}
voidwrite_add(ucharaddress,uchardate>//?
?
?
?
?
?
?
{
start(>?
write_byte(0xa0>?
respons(>?
write_byte(address>?
respons(>?
write_byte(date>?
respons(>?
stop(>?
}
ucharread_add(ucharaddress>//?
?
?
?
?
?
?
?
?
?
{
uchardate?
start(>?
write_byte(0xa0>?
respons(>?
write_byte(address>?
respons(>?
start(>?
write_byte(0xa1>?
respons(>?
date=read_byte(>?
stop(>?
returndate?
}
3.A/D转换器设计
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
因为它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
ADC0832具有以下特点:
?
8位分辨率;
?
双通道A/D转换;
?
输入输出电平与TTL/CMOS相兼容;
?
5V电源供电时输入电压在0~5V之间;
?
工作频率为250KHZ,转换时间为32μS;
?
一般功耗仅为15mW;
?
8P、14P—DIP<双列直插)、PICC多种封装;
?
商用级芯片温宽为0°Cto+70°C,工业级芯片温宽为40℃to+85℃。
?
?
?
?
?
?
?
?
?
:
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
功能时序图
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。
在完成输入启动位、通道选择之后,就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。
在程序读取二个数据后,我们可以加上检验来看看数据是否被正确读取。
下面
程序如下:
unsignedcharGetValue0832(bitChannel>//AD?
?
?
?
?
?
{
unsignedchari,data1=0,data2=0?
clk=0?
d0=1?
di=1?
cs=0?
//cs=0?
ADC0832?
?
clk=1?
//delay(>?
clk=0?
//?
?
?
?
?
?
?
?
d0=1?
di=1?
clk=1?
//delay(>?
clk=0?
//?
?
?
?
?
?
?
?
?
di=Channel?
d0=channel?
//?
?
?
?
clk=1?
//delay(>?
clk=0?
//?
?
?
?
?
?
?
?
?
d0=1?
di=1?
for(i=0?
i<8?
i++>//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
{
clk=1?
clk=0?
if(d0==1&&di==1>
data1|=0x80>>i?
}
for(i=0?
i<8?
i++>//?
?
?
?
?
?
?
?
?
?
?
?
?
?
{
if(d0==1&&di==1>
data2|=0x01<
clk=1?
delay(>?
clk=0?
}
cs=1?
d0=1?
di=1?
clk=1?
if(data1==data2>
return(data1>?
}
5.键盘电路设计
6个按键,P2.2-P2.7接6个按键,P3.4接公共端,采用动态扫描方式检测键盘。
6.
uintkeyscan(>
{
uchartemp。
P33=0。
temp=P2&0xf0。
if(temp!
=0xf0>
{
Delayms(10>。
temp=P2&0xf0。
if(temp!
=0xf0>
{
switch(temp>
{
case0x70:
return1。
break。
case0xb0:
return2。
break。
case0xd0:
return3。
break。
case0xe0:
return4。
break。
}
}
}
}
显示模块采用6个共阳极数码管,采用动态扫描的方式进行显示。
电路图如下:
图6:
显示模块
voidDisplay(void>//显示温度的函数
{
P27=0。
//选中第一个位选
P0=LED[ucADC/2/100]。
。
//显示
//Delayms(1>。
delay1(200>。
P27=1。
P26=0。
//选中第一个位选
P0=LED[ucADC/2%100/10]。
//显示
//Delayms(1>。
delay1(200>。
P26=1。
P25=0。
//选中第一个位选
P0=(LED[ucADC/2%10]-0x80>。
//显示
//Delayms(1>。
delay1(200>。
P25=1。
P24=0。
//选中第一个位选
P0=LED[ucADC/2*10%10]。
//显示
//Delayms(1>。
delay1(200>。
P24=1。
}
voiddisplay2(uchara,ucharb>//显示通道的函数
{
P23=0。
P0=LED[a]。
//Delayms(5>。
delay1(200>。
P23=1。
P22=0。
P0=LED[b]。
//Delayms(5>。
delay1(200>。
P22=1。
}
6.软件设计
其他应用到的程序:
voidmain(void>
{
uintnum?
write=0?
flag=0?
channel=0?
init(>?
ucADC=read_add(2>?
TMOD=0x01?
ET0=1?
EA=1?
TH0=(65536-50000>/256?
TL0=(65536-50000>%256?
TR0=1?
while(1>
{
num=keyscan(>?
switch(num>
{
case1:
channel=0?
break?
case2:
channel=1?
break?
case3:
flag=1?
break?
case4:
flag=0?
break?
}
ucADC=GetValue0832(channel>?
Display(>?
display2(channel,1>?
if(write==1>
{
write=0?
write_add(2,ucADC>?
}
}
}
voidt0(>interrupt1//?
?
?
0
{
TH0=(65536-50000>/256?
TL0=(65536-50000>%256?
tcnt++?
if(tcnt==100>
{
tcnt=0?
write=1?
if(flag==1>
channel=~channel?
}
}
三.项目心得
系统基本实现了设计要求,通过这次课程设计,使我更加熟练的掌握了AT89C52、AT24C02、ADC0832等芯片的使用,熟悉了领用C51语言编写程序控制单片机。
5.参考文献
1、李全利,单片机原理及接口技术,高等教育出版社,2004
2、于永,51单片机常用模块