单片机MAX7219驱动显示的温度控制报警系统设计

更新时间:2023-04-14 02:31:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘要

本系统为基于单片机芯AT89C51的温度控制报警系统,能够测量0~100°的温度值,采用四位液晶显示测量数值。系统主要由51单片机最小系统、A/D 转换电路、模拟量输入电路、数码管驱动电路、数码管显示电路以及温度报警电路这几部分组成。单片机最小系统设计采用AT89C51单片机作为主控芯片,配以RC上电复位电路和12MHz震荡电路;本次设计功能简单,利用可调电阻RV1代替温度传感器AD590,利用ADC0808模数转换芯片转换温度测量值;为使系统更加稳定、简洁,采用MAX7219驱动数码管LED显示。本文对测控系统的硬件、软件的组成进行了分项、模块化逐步分析设计。通过硬件与软件的相结合,完成了本次系统设计的功能与参数。

关键字:单片机、MAX7219、温度控制、ADC0808

- 1 -

目录

摘要 ............................................................................................................................................. - 1 - 关键字:...................................................................................................................................... - 1 - 目录 ............................................................................................................................................. - 2 - 1 系统方案.................................................................................................................................. - 3 -

1.1设计目的........................................................................................................................ - 3 -

1.2设计任务与要求............................................................................................................ - 3 -

1.2设计原理与分析............................................................................................................ - 3 - 2系统理论分析与计算............................................................................................................... - 4 -

2.1 设计芯片选择及功能简介........................................................................................... - 4 -

2.1.1AT89C51简介 ..................................................................................................... - 4 -

2.1.2AT89C51的主要特性 ......................................................................................... - 4 -

2.1.3AT89C51引脚功能 ............................................................................................. - 4 -

2.2.1 ADC0808功能介绍 ........................................................................................ - 6 -

2.3.1 MAX7219功能介绍 ....................................................................................... - 8 - 3电路与程序设计..................................................................................................................... - 12 -

3.1电路的设计.................................................................................................................. - 12 -

3.1.1系统总体框图................................................................................................... - 12 -

3.1.2单片机最小系统电路原理图........................................................................... - 13 -

3.1.3ADC0808模数转换系统电路原理图 .............................................................. - 13 -

3.1.3MAX7219显示系统电路原理图...................................................................... - 14 -

3.1.4报警系统电路原理图....................................................................................... - 14 -

3.2程序的设计.................................................................................................................. - 14 -

3.2.1程序功能描述与设计思路............................................................................... - 14 -

3.2.2程序流程图....................................................................................................... - 15 - 4测试方案与测试结果............................................................................................................. - 16 -

4.1测试方案...................................................................................................................... - 16 -

4.2 测试条件与仪器......................................................................................................... - 16 -

4.3 测试结果及分析......................................................................................................... - 17 -

4.3.1测试结果(数据) ................................................................................................ - 17 -

4.3.2测试分析与结论............................................................................................... - 17 - 附录1:电路原理图................................................................................................................. - 18 - 附录2:电路源程序................................................................................................................. - 19 -

- 2 -

1 系统方案

本统主要由51单片机最小系统模块、A/D转换模块、数码管驱动模块、数码管显示模块以及温度报警模块这几部分组成。

1.1设计目的

1、利用51单片机实现家庭温度控制与报警系统的仿真与设计,加深对单片机的

理性认识,通过实践操作提高我们的动手能力以及理论联系实际的能力。2、熟悉ADC0808模/数转换器的工作原理,及其与单片机的接口方法和驱动程序

设计。

3、熟悉MAX7219的工作原理,与单片机的接口设计,以及驱动数码管的程序设

计方法。

4、熟悉AD590的工作原理以及ADC0808的接口与驱动程序的设计。

5、掌握温度控制报警系统的设计方法,提高单片机应用系统的设计和调试能力。

1.2设计任务与要求

利用AD590温度传感器的功能,将测得的数值通过ADC0808模/数转换器完成模/数转换;采用MAX7219完成数码管的驱动;用51单片机进行数据处理最终将所测电压值通过数码管完成显示;当温度低于30°、高于60°时,发出报警信号,温度测量范围在0—100°。

1.2设计原理与分析

1、当ADC0808完成数/模转换完由AD590发出的模拟信号后发出EOC信号通知单

片机接收转换后的数字信号,并且进行数据处理和驱动MAX7219去驱动数码管完成显示功能。

2、ADC080用到模拟通道1,启动START信息号线与P3^3连接,OE线与P3^1连

接,EOC与P3^2连接, CLOCK时钟输入端与P3^4连接。

3、通过单片机的控制,对AD590进行实时监控,当超出设定的温度值后,发出

报警信号。

- 3 -

2系统理论分析与计算

2.1 设计芯片选择及功能简介

2.1.1AT89C51简介

AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示AT89C51外形及引脚排列

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门电流。

- 4 -

当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.0 RXD(串行输入口)

P3.1 TXD(串行输出口)

P3.2 /INT0(外部中断0)

P3.3 /INT1(外部中断1)

P3.4 T0(记时器0外部输入)

P3.5 T1(记时器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)。

- 5 -

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:来自反向振荡器的输出。

振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

芯片擦除:

整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

2.2.1 ADC0808功能介绍

ADC0808是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。(1)ADC0808的内部逻辑结构

图2.4 ADC0808的内部逻辑结构

上图可知,ADC0808由一个8路模拟开关、一个地址锁存与译码器、一个A/D 转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2).引脚结构

- 6 -

图2.5 ADC0808引脚结构图

IN0-IN7:8条模拟量输入通道

ADC0808对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。

地址输入和控制线:4条。

ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。

表2.3 地址输入线的通道选择

表2.3 地址输入线的通道选择

数字量输出及控制线:11条。

ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进

- 7 -

行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.1 MAX7219功能介绍

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。。它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7 219的外部引脚分配如图2.7所示及内部结构如图2所示。

- 8 -

- 9 -

图2.7 MAX7219的外部引脚分配

图2 .8 MAX7219的内部引脚分配 各引脚的功能为:

DIN :串行数据输入端;

DOUT :串行数据输出端,用于级连扩展;

LOAD :装载数据输入;

CLK :串行时钟输入;

DIG0~DIG7:8位LED 位选线,从共阴极LED 中吸入电流; SEG A~SEG G 、DP 7段驱动和小数点驱动;

- 10 - ISET : 通过一个10k 电阻和Vcc 相连,设置段电流。

MAX7219内部的寄存器如图2.9:

主要有译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219才能工作。

图 2.9 MAX7219内部的相关寄存器

分别介绍如下:

(1)译码控制寄存器(X9H )

如图4所示,MAX7219有两种译码方式:B 译码方式和不译码方式。当选择不译码时,8个数据为分别一一对应7个段和小数点位;B 译码方式是BCD 译码,直接送数据就可以显示。实际应用中可以按位设置选择B 译

码或是不译码方式。

图2.10 MAX7219的译码控制寄存器 (2)扫描界限寄存器(XBH )

如图5所示,此寄存器用于设置显示的LED 的个数(1~8),比如当设置为0xX4时,LED 0~5显示。

图2.11 MAX7219的扫描界限控制寄存器

(3)亮度控制寄存器(XAH)

共有16级可选择,用于设置LED的显示亮度,从0xX0~0xXF

(4)关断模式寄存器(XCH)

共有两种模式选择:关断状态(最低位D0=0)、正常工作状态(D0=1)。(5)显示测试寄存器(XFH)

用于设置LED是测试状态还是正常工作状态,当测试状态时(最低位D 0=1)各位显示全亮,正常工作状态(D0=0)。

各寄存器具体操作见驱动程序详解。

读写时序说明

MAX7129是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与MAX7129通信,首先要先了解MAX7129的控制字。MAX7129的控制字格式如图2.12。

图2.12 控制字(即地址及命令字节)

如图,工作时,MAX7219规定一次接收16位数据,在接收的16位数据中:D15~D12可以与操作无关,可以任意写入,D11~D8决定所选通的内部寄存器地址,D7~D0为待显示数据或是初始化控制字。在CLK脉冲作用下,DIN的数据以串行方式依次移入内部16位寄存器,然后在一个LOAD上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见图2.13。

由于51是8位单片机故需要分两次来送数据。具体操作见驱动程序详解。

- 11 -

图2.13 数据读写时序

3电路与程序设计

3.1电路的设计

3.1.1系统总体框图

本统主要由51单片机最小系统模块、A/D转换模块、数码管驱动模块、数码管显示模块以及温度报警模块这几部分组成,系统框图所示如下:

- 12 -

3.1.2单片机最小系统电路原理图

3.1.3ADC0808模数转换系统电路原理图

- 13 -

3.1.3MAX7219显示系统电路原理图

3.1.4报警系统电路原理图

3.2程序的设计

3.2.1程序功能描述与设计思路

1、程序功能描述

根据题目要求软件部分主要实现ADC数据转换、与显示。1)ADC数据转换功能:8位数据的采集。

2)显示:通过MAX7219驱动程序驱动数码管显示。

- 14 -

2、程序设计思路

首先初始化MAX7219,然后初始化定时器,并打开定时器,为ADC0808提供时钟。最后开始ADC的转换,通过转换的值,检测是否报警,并送到MAX7219驱动LED显示。

3.2.2程序流程图

1、主程序流程图

2、MAX7219驱动LED显示子程序流程图

- 15 -

4测试方案与测试结果

4.1测试方案

1、硬件测试

经过电路硬件测试,电路工作正常。

2、软件仿真测试

经过Protuse软件仿真,电路工作正常。

3、硬件软件联调

经过软件与硬件共同调试,电路工作正常,满足给定任务的数据。4.2 测试条件与仪器

测试条件:检查多次,仿真电路结构正确,工作正常,检查无误。

测试仪器:proteus虚拟毫伏表。

- 16 -

4.3 测试结果及分析

4.3.1测试结果(数据)

4.3.2测试分析与结论

根据上述测试数据,,由此可以得出以下结论:

1、ADC0808的线性度的较好,不存在非线性转换。

2、ADC0808精度较大,仅8位,只能适用于一般精度不高的场合。

综上所述,本设计达到设计要求。

- 17 -

附录1:电路原理图

- 18 -

附录2:电路源程序

/*************************************************************** 程序功能:

1、实现MAX7219驱动

2、实现ADC0808驱动

3、温度控制及报警

***************************************************************/ #include

/****************** 定义MAX7219 内部寄存器*****************/ #define DECODE_MODE 0x09 //译码控制寄存器

#define INTENSITY 0x0A //亮度控制寄存器

#define SCAN_LIMIT 0x0B //扫描界限寄存器

#define SHUT_DOWN 0x0C //关断模式寄存器

#define DISPLAY_TEST 0x0F //测试控制寄存器

/********************** 定义端口信号**********************/

sbit DIN = P0^5; //串行数据输入

sbit CS = P0^6; //片选信号

sbit CLK = P0^7; //串行时钟

sbit ADC_CLK = P3^4; //ADC时钟

sbit START = P3^3; //ADC开始转化

sbit OE = P3^1; //ADC数据输出允许

sbit EOC = P3^2; //转换结束信号

sbit LED1=P3^6; //控制灯1

sbit LED2=P3^7; //控制灯2

sbit SPK=P3^5; //报警开关

/******************** 函数原型说明**********************/

void Init_Time();

void Init_max7219(void);

void Write7219(unsigned char address,unsigned char dat);

void Display_Num( unsigned char s);

void delay(unsigned long val);

unsigned char Read_Adc(void);

void alarm(temp);

/******************** 主函数**********************/

void main(void)

{unsigned char temp;

Init_max7219(); //初始化MAX7219

Init_Time(); //初始化定时器,为ADC0808提供工作时钟

while(1)

{

Read_Adc(); //开始通道1转换

- 19 -

while(EOC); //转换完成

temp=(float)((float)(Read_Adc())/255)*100;

alarm(temp);

Display_Num(temp);//显示电压

}

}

/********************************************************

* 函数原型:void Write7219(unsigned char address,unsigned char dat)

* 功能:向指定的MAX7219内部寄存器写入数据

* 参数: address = MAX7219内部寄存器地址

dat = 待写入的数据

********************************************************/

void Write7219(unsigned char address,unsigned char dat)

{

unsigned char i;

CS=0; //拉低片选线,选中器件

//发送地址

for (i=0;i<8;i++) //移位循环8次

{

CLK=0; //清零时钟总线

DIN=(bit)(address&0x80); //每次取高字节

address<<=1; //左移一位

CLK=1; //时钟上升沿,发送地址

}

//发送数据

for (i=0;i<8;i++)

{

CLK=0;

DIN=(bit)(dat&0x80);

dat<<=1;

CLK=1; //时钟上升沿,发送数据

}

CS=1; //发送结束,上升沿锁存数据

}

/*********************************************************

* 函数原型:void Init_max7219(void)

* 功能:对MAX7219进行初始化,设置MAX7219内部的控制寄存器

**********************************************************/

void Init_max7219(void)

{

Write7219(SHUT_DOWN,0x01); //开启正常工作模式(0xX1)Write7219(DISPLAY_TEST,0x00); //选择工作模式(0xX0)

- 20 -

Write7219(DECODE_MODE,0xff); //选用全译码模式

Write7219(SCAN_LIMIT,0x07); //8只LED全用

Write7219(INTENSITY,0x04); //设置初始亮度

}

/********************************************************* * 函数原型:void Display_Num( unsigned char val)

* 功能:显示数字

**********************************************************/ void Display_Num( unsigned char val)

{

unsigned char tab[3];

unsigned char num;

char i;

num = val;

for(i=0;i<3;i++){ //得到每一位

tab[i] = num%10;

num = num/10;

}

for(i=3;i>=0;i--){

if(i==0)

Write7219(i+1,tab[i]|0X80);

else

Write7219(i+1,tab[i]);

delay(1000);

}

}

/********************************************************* * 函数原型:void delay(unsigned long val)

* 功能:延时

**********************************************************/ void delay(unsigned long s)

{

while(s--);

}

/********************************************************* * 函数原型:unsigned char Read_Adc(void)

* 功能:转换并读取ADC的值

**********************************************************/ unsigned char Read_Adc(void)

{ unsigned char val,channel=0x01;

P1 = 0X00;

P1 |= channel;

START = 0;

START = 1;

- 21 -

本文来源:https://www.bwwdw.com/article/j1yq.html

Top