单片机MAX7219驱动显示的温度控制报警系统设计.docx
《单片机MAX7219驱动显示的温度控制报警系统设计.docx》由会员分享,可在线阅读,更多相关《单片机MAX7219驱动显示的温度控制报警系统设计.docx(29页珍藏版)》请在冰豆网上搜索。
单片机MAX7219驱动显示的温度控制报警系统设计
摘要
本系统为基于单片机芯AT89C51的温度控制报警系统,能够测量0~100°的温度值,采用四位液晶显示测量数值。
系统主要由51单片机最小系统、A/D转换电路、模拟量输入电路、数码管驱动电路、数码管显示电路以及温度报警电路这几部分组成。
单片机最小系统设计采用AT89C51单片机作为主控芯片,配以RC上电复位电路和12MHz震荡电路;本次设计功能简单,利用可调电阻RV1代替温度传感器AD590,利用ADC0808模数转换芯片转换温度测量值;为使系统更加稳定、简洁,采用MAX7219驱动数码管LED显示。
本文对测控系统的硬件、软件的组成进行了分项、模块化逐步分析设计,通过硬件与软件的相结合,完成了本次系统设计的功能与参数。
关键字:
单片机、MAX7219、温度控制、ADC0808
目录
摘要-2-
关键字:
-2-
目录-3-
1系统方案-4-
1.1设计目的-4-
1.2设计任务与要求-4-
1.3设计原理与分析-4-
2系统理论分析与计算-5-
2.1设计芯片选择及功能简介-5-
2.1.1AT89C51简介-5-
2.1.2AT89C51的主要特性-6-
2.1.3AT89C51引脚功能-6-
2.2.1ADC0808功能介绍-8-
2.2.2ADC0808的内部逻辑结构-8-
2.2.3ADC0808引脚结构-9-
2.3.1MAX7219功能介绍-10-
2.3.2MAX7219各引脚的功能-12-
2.3.3MAX7219内部的寄存器-12-
2.3.4MAX7219读写时序说明-14-
3电路与程序设计-15-
3.1电路的设计-15-
3.1.1系统总体框图-15-
3.1.2单片机最小系统电路原理图-16-
3.1.3ADC0808模数转换系统电路原理图-17-
3.1.3MAX7219显示系统电路原理图-17-
3.1.4报警系统电路原理图-18-
3.2程序的设计-18-
3.2.1程序功能描述与设计思路-18-
3.2.2程序流程图-18-
4测试方案与测试结果-20-
4.1测试方案-20-
4.2测试条件与仪器-20-
4.3测试结果及分析-20-
4.3.1测试结果(数据)-20-
4.3.2测试分析与结论-20-
参考文献-21-
附录1:
电路原理图-22-
附录2:
电路源程序-23-
1系统方案
本统主要由51单片机最小系统模块、A/D转换模块、数码管驱动模块、数码管显示模块以及温度报警模块这几部分组成。
1.1设计目的
1、利用51单片机实现家庭温度控制与报警系统的仿真与设计,加深对单片机的理性认识,通过实践操作提高我们的动手能力以及理论联系实际的能力。
2、熟悉ADC0808模/数转换器的工作原理,及其与单片机的接口方法和驱动程序设计。
3、熟悉MAX7219的工作原理,与单片机的接口设计,以及驱动数码管的程序设计方法。
4、熟悉AD590的工作原理以及ADC0808的接口与驱动程序的设计。
掌握温度控制报警系统的设计方法,提高单片机应用系统的设计和调试能力。
1.2设计任务与要求
利用AD590温度传感器的功能,将测得的数值通过ADC0808模/数转换器完成模/数转换;采用MAX7219完成数码管的驱动;用51单片机进行数据处理最终将所测电压值通过数码管完成显示;当温度低于30°、高于60°时,发出报警信号,温度测量范围在0—100°。
1.3设计原理与分析
1、当ADC0808完成数/模转换完由AD590发出的模拟信号后发出EOC信号通知单片机接收转换后的数字信号,并且进行数据处理和驱动MAX7219去驱动数码管完成显示功能。
2、ADC080用到模拟通道1,启动START信息号线与P3^3连接,OE线与P3^1连接,EOC与P3^2连接,CLOCK时钟输入端与P3^4连接。
3、通过单片机的控制,对AD590进行实时监控,当超出设定的温度值后,发出报警信号。
2系统理论分析与计算
2.1设计芯片选择及功能简介
2.1.1AT89C51简介
AT89C51是一种带4K字节FammableandErasableReadOnlyMemory)的低电压、高性LASH存储器(FPEROM—FlashProgr能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
外形及引脚排列如图所示AT89C51外形及引脚排列
。
图2.1AT89C51的引脚结构
2.1.2AT89C51的主要特性
1、与MCS-51兼容。
2、4K字节可编程FLASH存储器。
3、寿命:
1000写/擦循环。
4、数据保留时间:
10年。
5、全静态工作:
0Hz-24MHz。
6、三级程序存储器锁定。
7、128×8位内部RAM。
8、2可编程I/O线。
9、两个16位定时器/计数器。
10、5个中断源。
11、可编程串行通道。
12、低功耗的闲置和掉电模式。
13、片内振荡器和时钟电路。
2.1.3AT89C51引脚功能
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写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:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
芯片擦除:
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
2.2.1ADC0808功能介绍
ADC0808是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。
它是逐次逼近式A/D转换器,可以和单片机直接接口。
2.2.2ADC0808的内部逻辑结构
图2.2ADC0808的内部逻辑结构
上图可知,ADC0808由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
2.2.3ADC0808引脚结构
图2.3ADC0808引脚结构图
IN0-IN7:
8条模拟量输入通道
ADC0808对输入模拟量要求:
信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:
4条。
ALE为地址锁存允许输入线,高电平有效。
当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。
A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。
通道选择表如下表所示。
表2.1地址输入线的通道选择
C
B
A
选择的通道
0
0
0
IN0
0
0
1
IN1
0
1
0
IN2
0
1
1
IN3
1
0
0
IN4
1
0
1
IN5
1
1
0
IN6
1
1
1
IN7
表2.1地址输入线的通道选择
数字量输出及控制线:
11条。
ST为转换启动信号。
当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。
EOC为转换结束信号。
当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。
OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。
OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。
D7-D0为数字量输出线。
CLK为时钟输入信号线。
因ADC0808的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(+),VREF(-)为参考电压输入。
ADC0808应用说明:
(1)ADC0808内部带有输出锁存器,可以与AT89S51单片机直接相连。
(2)初始化时,使ST和OE信号全为低电平。
(3)送要转换的哪一通道的地址到A,B,C端口上。
(4)在ST端给出一个至少有100ns宽的正脉冲信号。
(5)是否转换完毕,我们根据EOC信号来判断。
(6)当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机。
2.3.1MAX7219功能介绍
MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。
该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。
。
它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。
此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。
MAX7219的外部引脚分配如图2.4所示及内部结构如图2.5所示。
图2.4 MAX7219的外部引脚分配
图2 .5MAX7219的内部引脚分配
2.3.2MAX7219各引脚的功能
DIN:
串行数据输入端;
DOUT:
串行数据输出端,用于级连扩展;
LOAD:
装载数据输入;
CLK:
串行时钟输入;
DIG0~DIG7:
8位LED位选线,从共阴极LED中吸入电流;
SEGA~SEGG、DP 7段驱动和小数点驱动;
ISET:
通过一个10k电阻和Vcc相连,设置段电流。
2.3.3MAX7219内部的寄存器
如图2.6:
主要有译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。
编程时只有正确操作这些寄存器,MAX7219才能工作。
图2.6 MAX7219内部的相关寄存器
分别介绍如下:
(1)译码控制寄存器(X9H)
如图2.7所示,MAX7219有两种译码方式:
B译码方式和不译码方式。
当选择不译码时,8个数据为分别一一对应7个段和小数点位;B译码方式是BCD译码,直接送数据就可以显示。
实际应用中可以按位设置选择B译码或是不译码方式。
图2.7 MAX7219的译码控制寄存器
(2)扫描界限寄存器(XBH)
如图2.8所示,此寄存器用于设置显示的LED的个数(1~8),比如当设置为0xX4时,LED0~5显示。
图2.8 MAX7219的扫描界限控制寄存器
(3)亮度控制寄存器(XAH)
共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF
(4)关断模式寄存器(XCH)
共有两种模式选择:
关断状态(最低位D0=0)、正常工作状态(D0=1)。
(5)显示测试寄存器(XFH)
用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位D0=1)各位显示全亮,正常工作状态(D0=0)。
各寄存器具体操作见驱动程序详解。
2.3.4MAX7219读写时序说明
MAX7129是SPI总线驱动方式。
它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。
要想与MAX7129通信,首先要先了解MAX7129的控制字。
MAX7129的控制字格式如图2.9
图2.9 控制字(即地址及命令字节)
如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:
D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。
在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。
注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。
工作时序图见图2.10。
由于51是8位单片机故需要分两次来送数据。
具体操作见驱动程序详解。
图2.10 数据读写时序
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图
本统主要由51单片机最小系统模块、A/D转换模块、数码管驱动模块、数码管显示模块以及温度报警模块这几部分组成,系统框图所示如下:
图3.1 系统总体方框图
3.1.2单片机最小系统电路原理图
图3.2 单片机最小系统电路原理图
3.1.3ADC0808模数转换系统电路原理图
图3.3 ADC0808模数转换系统电路原理图
3.1.3MAX7219显示系统电路原理图
图3.4 MAX7219显示系统电路原理图
3.1.4报警系统电路原理图
图3.5 报警系统电路原理图
3.2程序的设计
3.2.1程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现ADC数据转换、与显示。
1)ADC数据转换功能:
8位数据的采集。
2)显示:
通过MAX7219驱动程序驱动数码管显示。
2、程序设计思路
首先初始化MAX7219,然后初始化定时器,并打开定时器,为ADC0808提供时钟。
最后开始ADC的转换,通过转换的值,检测是否报警,并送到MAX7219驱动LED显示。
3.2.2程序流程图
1、主程序流程图
图3.6 主程序流程图
2、MAX7219驱动LED显示子程序流程图
图3.7MAX7219驱动LED显示子程序流程图
4测试方案与测试结果
4.1测试方案
1、硬件测试
经过电路硬件测试,电路工作正常。
2、软件仿真测试
经过Protuse软件仿真,电路工作正常。
3、硬件软件联调
经过软件与硬件共同调试,电路工作正常,满足给定任务的数据。
4.2测试条件与仪器
测试条件:
检查多次,仿真电路结构正确,工作正常,检查无误。
测试仪器:
proteus虚拟毫伏表。
4.3测试结果及分析
4.3.1测试结果(数据)
电压值
0
0.5
1
1.5
2
2.5
3
3.5
4
4.5
5
温度显示
0
9
19
30
40
50
59
70
80
90
100
表4.1
4.3.2测试分析与结论
根据上述测试数据,,由此可以得出以下结论:
1、ADC0808的线性度的较好,不存在非线性转换。
2、ADC0808精度较大,仅8位,只能适用于一般精度不高的场合。
综上所述,本设计达到设计要求。
参考文献
[1]张毅刚单片机原理及接口技术人民邮电出版社2008年10月
[2]谭浩强C程序设计(第三版)清华大学出版社2005年7月
[3]华成英模拟电子技术基本教程清华大学出版社2006年2月[5]张永瑞电子测量技术基础(第三版)西安电子科技大学出版社2004年4月
附录1:
电路原理图
附录2:
电路源程序
/***************************************************************
程序功能:
1、实现MAX7219驱动
2、实现ADC0808驱动
3、温度控制及报警
***************************************************************/
#include
/******************定义MAX7219内部寄存器*****************/
#defineDECODE_MODE0x09//译码控制寄存器
#defineINTENSITY0x0A//亮度控制寄存器
#defineSCAN_LIMIT0x0B//扫描界限寄存器
#defineSHUT_DOWN0x0C//关断模式寄存器
#defineDISPLAY_TEST0x0F//测试控制寄存器
/**********************定义端口信号**********************/
sbitDIN=P0^5;//串行数据输入
sbitCS=P0^6;//片选信号
sbitCLK=P0^7;//串行时钟
sbitADC_CLK=P3^4;//ADC时钟
sbitSTART=P3^3;//ADC开始转化
sbitOE=P3^1;//ADC数据输出允许
sbitEOC=P3^2;//转换结束信号
sbitLED1=P3^6;//控制灯1
sbitLED2=P3^7;//控制灯2
sbitSPK=P3^5;//报警开关
/********************函数原型说明**********************/
voidInit_Time();
voidInit_max7219(void);
voidWrite7219(unsignedcharaddress,unsignedchardat);
voidDisplay_Num(unsignedchars);
voiddelay(unsignedlongval);
unsignedcharRead_Adc(void);
voidalarm(temp);
/********************主函数**********************/
voidmain(void)
{unsignedchartemp;
Init_max7219();//初始化MAX7219
Init_Time();//初始化定时器,为ADC0808提供工作时钟
while
(1)
{
Read_Adc();//开始通道1转换
while(EOC);//转换完成
temp=(float)((float)(Read_Adc())/255)*100;
alarm(temp);
Display_Num(temp);//显示电压
}
}
/********************************************************
*函数原型:
voidWrite7219(unsignedcharaddress,unsignedchardat)
*功能:
向指定的MAX7219内部寄存器写入数据
*参数:
address=MAX7219内部寄存器地址
dat=待写入的数据
*****