资源描述
基于单片机的温度数据采集系统实验报告
班 级:电技10—1班
姓 名:田波平
学 号:1012020108
指导老师:仲老师
题目:基于单片机的温度数据采集系统
一.设计要求
1.被测量温度围:0~120℃,温度分辨率为0.5℃。
2.被测温度点:2个,每5秒测量一次。
3.显示器要求:通道号2位,温度4位(精度到小数点后一位)。
显示方式为定点显示和轮流显示。
4.键盘要求:
(1)定点显示设定;(2)轮流显示设定;(3)其他功能键。
二.设计容
1.单片机与电源模块设计
单片机可选用AT89S51与其兼容系列,电源模块可以选用7805等稳压组件,本机输入电压围9-12v。
2.存储器设计
扩展串行I2C存储器AT24C02。
要求:
AT24C02的SCK接P3.2
AT24C02的SDA接P3.4
2.传感器与信号转换电路
温度传感器可以选用PTC热敏电阻,信号转换电路将PTC输出阻值转换为0-5V。
3.A/D转换器设计
A/D选用ADC0832。
要求:
ADC0832的CS端接P3.5
ADC0832的DI端接P3.6
ADC0832的DO端接P3.7
ADC0832的CLK端接P2.1
4.显示器设计。
6位共阳极LED显示器,段选(a-h)由P0口控制,位选由P2.2-P2.7控制。数码管由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.存储器设计
3.A/D转换器设计
4.显示器设计
5.键盘电路设计
6.系统软件设计
三.项目心得
四. 参考文献
一. 项目的研究意义
21世纪的今天,科学技术的发展日新月异,科学技术的进步同时也带动了测量技术的发展,现代控制设备不同于以前,它们在性能和结构发生了翻天覆地的变化。我们已经进入了高速发展的信息时代,测量技术是当今社会的主流,广泛地深入到应用工程的各个领域。
温度是工业、农业生产中常见的和最基本的参数之一,在生产过程中常需对温度进行检测和监控,采用微型机进行温度检测、数字显示、信息存储与实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用。伴随工业科技、农业科技的发展,温度测量需求越来越多,也越来越重要。但是在一些特定环境温度监测环境围大,测点距离远,布线很不方便。这时就要采用无线方式对温度数据进行采集。
本设计是以Atmel公司的AT89C52单片机作为控制核心,通过ADC0832模数转换对所测的温度进行数字量变化,且通过数码管进行相应的温度显示。
因为采用微型机进行温度检测、数字显示、信息存储与实时控制,对于提高生产效率和产品质量、节约能源等都有重要的作用,并且温度参数对工业生产的重要性,所以温度测量系统的精确度和智能化一直受到企业的重视。所以学习并研究温度测量与相关知识可做为一个较为实用的课题的方向,能获得较实用的知识和方法。因此温度测控技术是一个很实用、也很重要的技术,值得去研究掌握。它应用的领域也相当广泛,可以应用到消防电气的非破坏性温度检测,电力、电讯设备的过热故障预知检测,空调系统的温度检测,各类运输工具之组件的过热检测,保全与监视系统之应用,医疗与健诊的温度测试,化工、机械…等设备温度过热检测。因此前景是相当的可观。
二. 研究容
1. 单片机与电源模块设计
单片机: AT89C52简介
如图5.1-1所示为AT89C52芯片的引脚图。兼容标准MCS-51指令系统的AT89S52单片机是一个低功耗、高性能CHMOS的单片机,片含4KB在线可编程Flash存储器的单片机。它与通用80C51系列单片机的指令系统和引脚兼容。
AT89C52单片机片的Flash可允许在线重新编程,也可用通用非易失性存储编程器编程;片数据存储器含128字节的RAM;有40个引脚,32个外部双向输入/输出(I/O)端口;具有两个16位可编程定时器;中断系统是具有6个中断源、5个中断矢量、2级中断优先级的中断结构;震荡器频率0到33MHZ,因此我们在此选用12MHZ的晶振是比较合理的;具有片看门狗定时器;具有断电标志POF等等。AT89S51具有PDIP、TQFP和PLCC三种封装形式[8]。
图5.1-1 AT89S52引脚图
上图就是PDIP封装的引脚排列,下面介绍各引脚的功能。
5.2 AT89C52引脚说明
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-1 P3口的替代功能
引脚
符号
说明
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)建立一个起始条件。
总线时序
程序设计如下:
void start()//开始信号
{
sda=1;
delay();
sck=1;
delay();
sda=0;delay();
}
void stop()//结束信号
{
sda=0;
delay();
sck=1;
delay();
sda=1;
delay();
}
void respons()//应答
{
uchar i;sck=1;delay();
while((sda==1)&&i<250)
i++;
sck=0;
delay();
}
void init()//初始化
{ sda=1;
delay();
sck=1;
delay();
}
void write_byte(uchar date)//写字节
{
uchar i,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();
}
uchar read_byte()//读字节
{
uchar i,k;
sck=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{ sck=1;
delay();
k=(k<<1)|sda;
sck=0;
delay();
}
return k;
}
void write_add(uchar address,uchar date)//写入外存储器中
{
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar address)//从外存储器中读出数据
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
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°C to +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位数据(SGL、Odd)用于选择通道功能,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行输入。 在完成输入启动位、通道选择之后,就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。在程序读取二个数据后,我们可以加上检验来看看数据是否被正确读取。 下面
程序如下:
unsigned char GetValue0832(bit Channel)//AD转换后的数据
{
unsigned char i,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<<i;
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.
uint keyscan()
{
uchar temp;
P33=0;
temp=P2&0xf0;
if(temp!=0xf0)
{
Delayms(10);
temp=P2&0xf0;
if(temp!=0xf0)
{
switch(temp)
{
case 0x70:return 1;break;
case 0xb0:return 2;break;
case 0xd0:return 3;break;
case 0xe0:return 4;break;
}
}
}
}
显示模块采用6个共阳极数码管,采用动态扫描的方式进行 显示。电路图如下:
图6:显示模块
void Display(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;
}
void display2(uchar a,uchar b)//显示通道的函数
{
P23=0;
P0=LED[a];
//Delayms(5);
delay1(200);
P23=1;
P22=0;
P0=LED[b];
//Delayms(5);
delay1(200);
P22=1;
}
6. 软件设计
其他应用到的程序:
void main( void)
{
uint num;
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)
{
case 1:channel=0; break;
case 2:channel=1; break;
case 3:flag=1;break;
case 4:flag=0;break;
}
ucADC = GetValue0832(channel);
Display();display2(channel,1);
if(write==1)
{
write=0;
write_add(2,ucADC);
}
}
}
void t0() interrupt 1//定时器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语言编写程序控制单片机。
四. 参考文献
1、全利,单片机原理与接口技术,高等教育,2004
2、于永,51单片机常用模块与综合系统设计实例精讲,电子工业,2007
20 / 20
展开阅读全文