基于单片机的双路信号检测系统综合设计毕业设计.docx
《基于单片机的双路信号检测系统综合设计毕业设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的双路信号检测系统综合设计毕业设计.docx(57页珍藏版)》请在冰豆网上搜索。
基于单片机的双路信号检测系统综合设计毕业设计
基于单片机的双路信号检测系统综合设计
1.设计任务概述
●设计一个能同时对环境温度和0V~2.5V直流电压进行检测的系统
●电压的检测采用TLC549串行ADC器件;
●对温度的检测采用LM75A数字温度传感器;
●检测结果以动态扫描方式显示在一个8位LED数码显示器上(可以同时显示,也可以轮流显示);
●结合Quick51核心板和SmartSOPC教学实验开发平台的有关实验电路完成系统原理图设计与程序设计;程序的调试在实验箱上完成。
●加入键盘的应用:
程序运行后,LED显示器显示“P”,表示处于“待命”状态,按下“1”键——进行电压测量并显示;按下“2”键——进行温度测量并显示;按下“3”键——电压与温度交替测量并显示;按下“8”键——返回“待命”状态
2.硬件电路设计
(1)系统组成框图
(2)单元电路分析
●微控制器AT89C51
Ø作用及优点
微控制器是整个程序的“大脑”,尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:
CPU、内存、内部和外部总线。
系统通过把编写的程序拷入为控制器中,实现对于对于其他部分的控制。
在本实验中,微控制器读取按键信息,确定应该哪一个功能能够板块工作,如按下2键,微控制器则通知温度测试板块工作,并且把测试的值显示在数码管上。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
Ø图形
Ø引脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
●数字温度计LM75A
Ø作用
LM75A是一个使用了内置带隙温度传感器和Σ-△模数转换技术的温度-数字转换器。
它也是一个温度检测器,可提供一个过热检测输出。
Ø组成
LM75A包含许多数据寄存器:
配置寄存器(Conf),用来存储器件的
某些配置,如器件的工作模式、OS工作模式、OS极性和OS故障队列等(在功能描述一节中有详细描述);温度寄存器(Temp),用来存储读取的数字温度;设定点寄存器(Tos&Thyst),用来存储可编程的过热关断和滞后限制,器件通过2线的串行I2C总线接口与控制器通信。
LM75A还包含一个开漏输出(OS),当温度超过编程限制的值时该输出有效。
LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。
Ø电路原理图
Ø功能框图
Ø工作原理
LM75A利用内置的分辨率为0.125℃的带隙传感器来测量器件的温度,并将模数转换得到的11位的二进制数的补码数据存放到器件Temp寄存器中。
Temp寄存器的数据可随时被I2C总线上的控制器读出。
读温度数据并不会影响在读操作过程中执行的转换操作。
●数字电压表TLC549
Ø作用
TLC549是单通道8位通用串行接口,主要是将把检测出来的模拟信号转换为数字信号,通过数码显示管显示出来。
Ø主要特性
8位分辨率A/D转换器
转换时间小于17微秒
内置的软件控制的采样-保持功能
宽的工作电压范围:
3~6V
串行操作接口
Ø电路原理图
Ø工作原理
把模拟电路转换为数字信号显示出来。
●LED数码显示器
Ø作用
七段式LED数码管是常见的电子设备显示器件,能够显示数字0~9以及部分字母和符号。
实际上的数码管常常会附加一个小数点,作为第八段。
Ø工作原理
数码管分为静态和动态两大类,每一类又有共阳和共阴之分。
静态数码管的特点是驱动方法简单、亮度高,但是连线比较多。
动态数码管常常以多位联体的形式提供,连线较少,但是要用动态扫描的方法驱动。
为了获得足够的亮度,限流电阻取值常常比较小。
多位联体的动态com是分开的。
扫描方法并不难,先把第1个数码管的显示数据送到abcde通com1,而其它数码管的数码管的显示数据送到延时一段时间,再显会看到明显的闪烁。
数码管段选信号abcdefg和dp(相当于数据线)是共用的,而位选信号fg和dp,同时选com信号禁止;延时一段时间(通常不超过10ms),再把第2个abcdefg和dp,同时选通com2,而其它数码管的comd信号禁止;示下一个。
注意,扫描整个数码管的频率应当保证在50Hz以上,否则会看到明显的闪烁。
Ø电路原理图
●键盘
Ø作用
起一个控制作用,通过按键的信息控制温度显示和压力显示。
Ø电路原理图
Ø工作原理
机械按键在按下和弹起时,都会产生“抖动”,这是一列短暂而不规则的脉冲。
在程序上,如果不做任何消抖动的处理,则会出现“按一次键,显示数据跳好几次”的现象。
在本实验的例程中,采用“带延时的双循环”检测法,有效地消除了按键抖动,从而确保按一次键马上就能执行并且仅执行一次动作。
在第1个循环里,每隔50ms检测一次按键,如果有键按下则立即退出循环。
后续程序会马上处理这个按键,并不需要额外的延时等待。
处理完按键动作后,进入第2个循环,该循环也是每隔50ms检测一次按键,一直等到刚才按下的键抬起后才会退出循环。
然后继续第1个循环。
(2)完整系统原理图
3.程序设计
(1)模块化程序设计的思路
本程序分为3个模块:
●主程序:
包括了延时函数,系统初始化函数,读出LM75A的温度值函数,字节型变量c转换为十进制字符串函数,温度显示函数,读取A/D转换结果函数,初始化ADC接口函数,ADC转换为电压值的函数,键盘扫描函数,主函数(会在后面详细介绍主函数的流程)。
温度和电压的检测函数都已经包括在主程序里面
●数码管扫描显示驱动程序:
包括了定时器T1的中断服务函数,清除数码管的所有显示函数,在数码管上显示字符函数,在数码管上显示字符串函数,显示指定位的小数点函数,数码管扫描显示初始化。
●标准80C51单片机模拟I2C总线的主机程序头文件:
这是有实验箱的厂家提供的程序
●8位A/D转换结果对应的电压数据表:
可直接用于显示电压值
注意:
以上程序中主程序为核心程序,其他程序是为了支撑主程序的功能而存在的。
(2)总的程序流程框图
LED显示器显示“P”
0键
系统初始化
1键
电压测量并显示
温度测量并显示
2键
检测按键信息
电压与温度交替测量并显示
3键
8键
LED显示器显示“P”
(3)各部分程序设计介绍
●温度检测
Ø流程图
读出LM75A的温度值
整数部分转换为字符串
分离符号,整数和小数部分
显示符号,整数和小数部分
清除所有显示
Ø所用函数的功能
LM75A_GetTemp()------读出LM75A的温度值并返回LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
ByteToStr()----------字节型变量c转换为十进制字符串
DispTemp()-----------在数码管上显示出温度值
I2C_Gets()---------主机通过I2C总线从从机接收多个字节的数据
Ø较特殊的处理方法
✓I2C起始和停止条件
其中一种情况是在SCL线是高电平时SDA线从高电平向低电平切换这个情况表示起始条件。
当SCL是高电平时SDA线由低电平向高电平切换表示停止条件。
✓LM75A_GetTemp函数中,0x00是温度寄存器。
函数首先将buf[0]给t,再将t左移8位,于是t的低8位为空,最后加上buf[1],结果为t的高8位为buf[0],低8为buf[1],通过右移5位去掉无关位,最后返回温度寄存器的数值。
●电压检测
Ø流程图
初始化ADC接口
读取A/D转换结果
将ADC值转换成电压值,并显示
Ø所用函数的功能
ReadAdc()------读取A/D转换结果
AdcInit()------初始化ADC接口
Delay_acd()----延时(t*10)ms
DispVol()-------将ADC值转换成电压值,并显示
Ø较特殊的处理方法
✓电压的显示的核心就是把模拟信号转化为数字信号
●按键检测
Ø流程图
读取按键值
通过函数的定义找到按键值所对应的key值
Ø所用函数的功能
KeyScan()-----找到按键值所对应的key值
●显示部分
Ø所用函数的功能
T1INTSVC()-----定时器T1的中断服务函数
DispClear()----清除数码管的所有显示
DispChar()-----在数码管上显示字符
DispStr()------在数码管上显示字符串
DispDotOn()----显示指定位的小数点
DispInit()-----数码管扫描显示初始化
Ø较特殊的处理方法
✓就是往DispBuf()里面的相应位置写入数据
●主程序部分
Ø流程图
与“总的系统流程图类似”,这里就不再画出,请见第7页
Ø较特殊的处理方法
✓就是通过一个循环,不断检测按键值,并且通过key的值实现不同的操作
✓在温度和电压交替显示时,我们使用了变量counter,以此将延时的时间变长,当counter在0-3时显示温度,当counter在3-12时显示电压。
4.系统调试
(1)硬件调试
●SmartSOPC实验箱
SmartSOPC多功能教学实验开发平台集众多种功能于一体,是SOPC、EDA、DSP、
ARM、ARM7SOC以及51教学实验、科研开发的最佳选择。
开发平台采用核心板加主板的结构,更换核心板即可实现不同的功能。
SmartSOPC多功能教学实验开发平台标配一台LA1024高性能逻辑分析仪。
LA1024分析仪是集逻辑分析仪、总线分析仪、逻辑笔等多种测量开发仪器于一身,是嵌入式系统开发利器、数字电路设计好帮手。
基于标配QuickSOPC核心板的开发平台可进行SOPC、EDA、DSP的开发和实验。
与一般的实验箱不同,SmartSOPC主板上大部分外设都不需要进行跳线设置,做实验时方便简单;此外每个外设的信号都设置了测试点,方面用户使用逻辑分析仪进行信号测量。
一切为设计为用户考虑是本开发平台的出发点。
考虑到核心板对用户的实用性,各核心板(Quick51除外)除设计最小系统外,还设计有按键、LED以及电源插座等。
用户通过在用户扩展PACK上实现自己的功能电路(如主板上的某部分电路),核心板就能脱离主板而单独使用,这样核心板可用于用户自己的设计中,亦可用于电子设计大赛。
●Quick51核心板
Quick51核心板是与SmartSOPC相配套的8051单片机核心板。
Quick51核心板是一款自由的,开放全部系统资源的单片机实验板。
单片机芯片采用philips最新推出的拥有64KBFlash的增强型8052内核单片机P89LV51RD2,工作电压3.3V。
Quick51核心板和SmartSOPC结合,可以完成各种实验,本次实验也是基于这两个硬件的基础之上完成的。
●跳线的连接情况
基本跳线设置:
跳线编号
跳线名称
跳线接法
功能描述
JP1
/EA跳线
VCC与/EA短接(默认)
执行存储于片内Flash的程序
/EA与GND短接
执行存储于片外Flash的程序
JP2
/PSEN跳线
/PSEN与GND断开(默认)
正常模式
/PSEN与GND短接
用于某些型号单片机的ISP下载
JP3
复位跳线
WDT与RST短接
看门狗复位
RST与RC短接(默认)
阻容复位
JP4~JP6
Flash扩展地址跳线
A16~A18全接GND(默认)
不使用扩展地址(64KB以内)
A16~A18分别接P10~P12
使用扩展地址(可达512KB)
JP7
串行口跳线
RXD短接、TXD短接(默认)
RXD、TXD用于串行口通信
RXD断开、TXD断开
RXD、TXD可作为I/O使用
电压检测的跳线设置:
SmartSOPC实验箱B2区JP6的跳线全部断开;
Quick51实验板J14的PB-LE用杜邦线连接到J9;
Quick51实验板的P1端口用8芯排线连接到SmartSOPC实验箱B3区的COM6;
Quick51的J11(PB端口)用8芯排线连接到SmartSOPC实验箱B3区的COM3;
Quick51实验板J5的/INT0用杜邦线连接到SmartSOPC实验箱D4区的nCS;
Quick51实验板J5的/INT1用杜邦线连接到SmartSOPC实验箱D4区的DAT;
Quick51实验板J5的T0用杜邦线连接到SmartSOPC实验箱D4区的CLK。
温度测试的跳线设置:
请参照《Quick51跳线设置表》检查Quick51电路板上跳线JP1~JP7是否为默认设置;
SmartSOPC实验箱C2区的SCL用杜邦线连接到Quick51实验板J5的RXD;
SmartSOPC实验箱C2区的SDA用杜邦线连接到Quick51实验板J5的TXD;
Quick51实验板J14的PB-LE用杜邦线连接到J9;
Quick51实验板的P1端口用8芯排线连接到SmartSOPC实验箱B3区的COM6;
Quick51的J11(PB端口)用8芯排线连接到SmartSOPC实验箱B3区的COM3;
SmartSOPC实验箱B2区JP6的跳线全部断开。
(2)软件调试
●按键0
数码显示管全部显示“p”
●按键1
数码管上显示出当前的电压采样结果,单位:
伏特(V)。
轻轻左右旋动SmartSOPC实验箱D4区的电位器,改变ADC采样电压,数码管上显示的结果会跟着变化。
同时用万用表测量焊盘ADIN处的电压值,与显示结果对比,看是否基本一致。
●按键2
SmartSOPC实验箱B3区的数码管实时地显示出当前温度,单位:
℃。
●按键3
电压值与温度值交替显示
●按键8
数码显示管全部显示“p”
5.附录
(1)主程序
#include"Disp.h"
#include"I2C.h"
#include"VolTab.h"
#include
#include
#include
//定义TLC549操作接口
sbitCS=P3^2;
sbitDAT=P3^3;
sbitCLK=P3^4;
//
sbitKEY1=P2^0;
sbitKEY2=P2^1;
sbitKEY3=P2^2;
sbitKEY8=P2^7;
unsignedcharkey;
unsignedintcounter;
/*****************************************************************
温度检测函数模块
*****************************************************************/
/*
函数:
LM75A_GetTemp
功能:
读出LM75A的温度值
返回:
LM75A温度寄存器的数值(乘以0.125可得到摄氏度值)
*/
intLM75A_GetTemp()
{
unsignedcharbuf[2];
intt;
I2C_Gets(0x90,0x00,2,buf);
t=buf[0];
t<<=8;
t+=buf[1];
t>>=5;//去掉无关位
returnt;
}
/*
函数:
ByteToStr()
功能:
字节型变量c转换为十进制字符串
*/
voidByteToStr(unsignedcharidata*s,unsignedcharc)
{
codeunsignedcharTab[]={100,10};
unsignedchari;
unsignedchart;
for(i=0;i<2;i++)
{
t=c/Tab[i];
*s++='0'+t;
c-=t*Tab[i];
}
*s++='0'+c;
*s='\0';
}
/*
函数:
DispTemp()
功能:
在数码管上显示出温度值
参数:
t:
补码,除以8以后才是真正温度值
*/
voidDispTemp(intt)
{
codeunsignedcharTab[8]="01345689";
unsignedcharbuf[4];
bits;//符号位
unsignedchari;//整数部分
unsignedchard;//小数部分
unsignedcharx;//临时变量
//分离出符号
s=0;
if(t<0)
{
s=1;
t=-t;
}
//分离出整数和小数部分
i=t/8;
d=t%8;
//整数部分转换成字符串
ByteToStr(buf,i);
x=4-strlen(buf);
//清除所有显示
DispClear();
//显示符号
if(s)DispChar(x,'-');
x++;
//显示整数部分
//if(buf[0]==0)
//{
x+=3;
buf[0]=buf[1];
buf[1]=buf[2];
buf[2]='\0';
//}
DispStr(x-5,buf);
//显示小数点
DispDotOn
(1);
//显示小数部分
DispChar(2,Tab[d]);
}
/*****************************************************************
tl549函数模块
*****************************************************************/
/*
函数:
ReadAdc()
功能:
读取A/D转换结果
返回:
8位ADC代码
*/
unsignedcharReadAdc()
{
unsignedchard;
unsignedcharn;
CS=0;
n=5;
while(--n!
=0);
n=8;
do
{
d<<=1;
if(DAT)d++;
CLK=1;
CLK=0;
}while(--n!
=0);
CS=1;
returnd;
}
/*
函数:
AdcInit()
功能:
初始化ADC接口
*/
voidAdcInit()
{
CS=1;
CLK=0;
DAT=1;
ReadAdc();
}
/*
函数:
Delay_acd()
功能:
延时(t*10)ms
*/
void