基于MCS51单片机的温度测量系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于MCS51单⽚机的温度测量系统
⽬录
第⼀章 MSC51单⽚机的结构与原理 (2)
1.1 MSC51单⽚机的发展 (2)
1.2 单⽚机的结构 (2)
1.2.1 MSC51单⽚机的基本结构 (2)
1.2.2 单⽚机的内部结构 (3)
1.3 单⽚机的引脚 (4)
1.4 MCS51的存储器结构 (5)
1.4.1 程序存储器ROM (5)
1.4.2 数据存储器RAM (5)
第⼆章温度控制系统硬件设计 (7)
2.1 系统使⽤的仪器设备及芯⽚ (7)
2.2 实验相关芯⽚介绍 (7)
2.2.1 串⾏E2PROM芯⽚AT24C02 (7)
2.2.2 串⾏A/D转换芯⽚TLC1549 (8)
2.2.3 8D锁存器74573 (10)
2.3 LED数码管显⽰器 (11)
第三章温度控制系统软件设计 (13)
3.1 温度控制系统软件实验内容 (13)
3.2 软件设计 (13)
3.3 程序的修改 (14)
3.4 程序流程图 (15)
第四章⼼得体会 (16)
附录(源程序) (17)
第⼀章 MSC51单⽚机的结构与原理
1.1 MSC51单⽚机的发展
随着集成电路技术的发展,单⽚微型计算机的功能也不断增强,许多⾼性能的新型机种不断涌现出来。

单⽚机以其功能强、体积⼩、可靠性⾼、造价低和开发周期短等优点,称为⾃动化和各个测控领域中⼴泛应⽤的器件,在⼯业⽣产中称为必不可少的器件,尤其是在⽇常⽣活中发挥的作⽤也越来越⼤。

单⽚机作为微型计算机的⼀个重要分⽀,应⽤⾯很⼴,发展很快。

⾃单⽚机诞⽣⾄今,已发展为上百种系列的近千个机种。

1.2 单⽚机的结构
1.2.1 MSC51单⽚机的基本结构
图1.1 单⽚机的基本结构
图中包括:
1. ⼀个8位中央处理器CPU 数据处理、测试位,置位,复位,位操作
2. 数据存储器RAM(128B与 SFR)在程序运⾏时存储⼯作变量和资料
3. 程序存储器ROM(4KB或8KB)永久性存储应⽤程序,掩模ROM、EPROM、EEPROM
4. 并⾏输⼊/输出⼝(I/O)作系统总线、扩展外存、I/O接⼝芯⽚
5. 串⾏输⼊/输出⼝(2条)串⾏通信、扩展I / O接⼝芯⽚
6. 定时/计数器(16位)计满溢出、中断标志置位、向CPU提出中断请求,与CPU之间独⽴⼯作
7. 中断控制系统 2个外中断、2个定时/计数器中断、1个串⾏⼝终端
8. 时钟电路内振外振
1.2.2 单⽚机的内部结构
单⽚机由 CPU 、存储器(包括 RAM 和 ROM )、 I/O 接⼝、定时 / 计数器、
中断控制功能等均集成在⼀块芯⽚上,⽚内各功能通过内部总线相互连接起来。

图1.2 单⽚机的内部结构
1.3 单⽚机的引脚
单⽚机实际有效的引脚共有40个,有三种封装形式。

引脚主要有:主电源引脚GND和VCC,时钟电路引脚,控制信号引脚,输⼊输出引脚,RST复位引脚,XTAL1、XTAL2接外部晶体的引脚等。

下图是DIP封装形式,这是普通的40脚双列直插形式。

为了尽可能缩⼩体积,减少引脚数,单⽚机的不少引脚具有第⼆功能,
也称为复⽤功能。

图1.3 单⽚机引脚图
1.4 MCS51的存储器结构
MCS-51的程序存储器与数据存储器是分开的,体系结构为哈佛结构。

1.4.1 程序存储器ROM
1、程序存储器作⽤及寻址范围
作⽤:存放指令(程序)的存储器,⽤PC作地址指针。

寻址范围:0000~FFFFH,共64KB;⽚内、⽚外统⼀编址。

⽚内:PC=0000~0FFFH;⽚外:PC=1000~FFFFH
2、ROM低端的⼏个特殊⼊⼝地址
0000H:CPU开始执⾏指令时的第⼀个取指单元,执⾏时PC的内容从0000H 开始;
0003H~0002B:中断专⽤固定⼊⼝地址(系统规定);
1.4.2 数据存储器RAM
1、⽚内128字节的数据存储器可分为三部分
(1)⼯作寄存器区0~3区
地址从00H~1FH,共有32个字节。

每8个字节(记作R0~R7)构成⼀个区,共4个区。

⼯作寄存器区的选择由程序状态字PSW中的RS1和RS0位的值来确定。

(2)位寻址区
该区域地址从20H到2FH,共16个字节,128位,使⽤指令可寻址到位。

(3)数据区
地址从30H到7FH,共80个字节,可作为⽤户数据存储器,按字节访问。

⽤户堆栈通常在该区域开辟。

2、特殊功能寄存器区SFR
8051把CPU中的专⽤寄存器、并⾏端⼝锁存器、串⾏⼝与定时器/计数器内
的控制寄存器等集中安排到⼀个区域,离散地分布在地址80H~FFH范围内,这个区域称为特殊功能寄存器区SFR。

图1.4 ⽚内数据存储器RAM地址空间
第⼆章温度控制系统硬件设计
2.1 系统使⽤的仪器设备及芯⽚
此温度控制系统使⽤的仪器和设备主要有PC机、WAVE软件、E51/S仿真器+POD8X5X仿真头、MULT_51C实验板、仿真器专⽤电源等,所使⽤的芯⽚有串⾏E2PROM芯⽚AT24C02、串⾏A/D转换芯⽚TLC1549、8D锁存器74573、LED数码显⽰器等。

2.2 实验相关芯⽚介绍
2.2.1 串⾏E2PROM芯⽚AT24C02
AT24C02是带I2C总线接⼝的E2PROM存储器,具有掉电记忆功能,并内含256×8位存储空间,具有+5V单电源供电、⼆线串⾏接⼝、低功耗CMOS技术、双向数据传输协议、8字节页⾯写模式、允许写部分页⾯、⾃定时写周期、内部结构
256X8(2K)、⼯作电压宽(2.5~5.5V)、擦写次数多(⼤于10000次)、写⼊速度快(⼩于10ms)⾼可靠性,数据保留时间长等特点。

图2.1 AT24C02芯⽚⼯作及引脚图
表2.1 AT24C02芯⽚引脚功能说明
序号符号功能直流电压(V)
1 A0 地址输⼊0
2 A1 地址输⼊0
3 A2 地址输⼊0
4 GND 接地0
5 SDA 串⾏数据输⼊/输出 4.5
6 SCL 串⾏时钟输⼊ 4.5
7 WP 写保护0
8 Vcc 电源 5
I2C数据传送过程如下:
图2.2 数据传送过程
在数据传送过程中,必须确认数据传送的开始和结束。

当时钟线SCL为⾼电平时,数据线SDA由⾼电平跳变为低电平定义
为“开始”信号;当SCL线为⾼电平时,SDA线发⽣低电平到⾼电平的跳变为“结束”信号。

开始和结束信号都是由主器件产⽣。

在开始信号以后,总线即被认为处于忙状态;在结束信号以后的⼀段时间内,总线被认为是空闲的。

在设计硬件中,该芯⽚串⾏实现与单⽚机传输数据的传送。

该芯⽚的SCL和SDA与单⽚机的P1.5与P1.6连接。

该设计中式实现设定温度的存储。

2.2.2 串⾏A/D转换芯⽚TLC1549
TLC1549是以10位开关电容逐次逼近式A/D转换器为基础⽽构造的⼀种低价位、⾼性能的8位CMOS A/D转换器,它以8位开关电容逐次逼近的⽅法实现A/D 转换,其转换速度⼩于17us,它能⽅便地采⽤三线串⾏接⼝⽅式与各种微处理器连接,构成各种廉价的测控应⽤系统。

具有⽚内提供4MHz内部系统时钟,并与操作控制⽤的外部I/O CLOCK相互独⽴、存取与转换时间转换速率达40000次/秒、差分⾼阻抗基准电压输⼊等特点。

图2.3 TLC1549芯⽚的引脚图
表2.2 LTC1549芯⽚引脚功能说明
序号符号功能电压(V)
1 REF+ 正基准电压输⼊端 2.5V≤REF+≤Vcc+0.1
2 ANALOG 模拟信号输⼊端1或0
3 REF- 负基准电压输⼊端-0.1V≤REF-≤2.5V
4 GND 接地0
5 /CS 芯⽚选择输⼊端VIN≥2V或≤0.8V
6 DATA OUT 转换结果数据串⾏输出端⾼位在前,低位在后
7 I/O CLOCK 外接输⼊/输出时钟输⼊端0
8 Vcc 电源3V~6V
单⽚机的P1⼝相关引脚相连,温度传感器和电阻分压后经其转换为数字量,将温度转换为数字量传⼊单⽚机。

本系统的温度采集模块,主要采⽤的是热敏电阻器NTC对温度进⾏测量,测量的温度的模拟量送⼊到A/D转换器
(TLC549),经转换成数字量输出。

实验图如下
图2.4 串⾏A/D转换图
2.2.3 8D锁存器74573
74HC373的输出端O0~O7可直接与总线相连。

当三态允许控制端OE为低电平时,O0~O7为正常逻辑状态,可⽤来驱动负载或总线。

当OE为⾼电平时,O0~O7呈⾼阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。

当锁存允许端LE为⾼电平时,O随数据D⽽变。

当LE为低电平时,O 被锁存在已建⽴的数据电平。

图2.5 8D锁存器74573的引脚排列
在硬件电路中使⽤两个74573,通过OC选
通其中⼀个锁存器,⼀个⽤于控制LED数码管的字段,通过P0⼝输⼊要显⽰的数码管字段所表⽰的8位,另⼀个⽤于控制LED 数码管的字位,将其输出端控制scanf0--scanf4选择哪⼀个数码管⼯作,scanf5与P2⼝联系,将其键盘输⼊读⼊,判断哪⼀个键按下。

2.3 LED数码管显⽰器
单⽚机中通常使⽤的是由7个发光⼆极管,即七段LED按“⽇”字排列成的数码管。

七段LED的阳极连在⼀起称为共阳极接法,⽽阴极连在⼀起称为极接法。

每段LED的笔画分别称为a、b、c、d、e、f、g,另有⼀段构成⼩数点。

图2.6 (a)LED器件(b)共阳极接法(c)共阴极接法
在选⽤共阴的L ED时,只要在某⼀个发光⼆极管加上⾼电平,该段即点亮,反之则暗。

⽽选共阳的LED时,要使某⼀段发光⼆极管发亮,则需加上低电平,反之则暗,为了保护各段LED不被损坏,需外加限流电阻。

为了要显⽰某个字形,则应使此字形的相应段点亮,也即送⼀个不同的电平组合代表的数据来控制LED的显⽰字形,此数据称为字符的段码。

数据字位数与LED段码的关系如表所⽰:
表2.3 数据字位数与LED段码的关系
数据位数D7 D6 D5 D4 D3 D2 D1 D0
LED段码dp g f e d c b a
在该设计中⽤到4个LED显⽰数码管,分别显⽰设计的温度和实际测量的温度。

与上述的锁存器配合,显⽰相应的数值。

实验电路图如下:
图2.7 静态按键、LED显⽰
第三章温度控制系统软件设计
3.1 温度控制系统软件实验内容
温度传感器和电阻分压后的电压经TLC1549连续采样、转换为数字量,通过编程得到实际温度值,送⼊DISP3和DISP4两个内部RAM单元中;通过键盘输⼊温度设定值,送⼊AT24C02中保存。

显⽰时从AT24C02中取出温度设定值,送⼊DISP1和DISP2两个内部RAM单元中。

显⽰程序将DISP1~DISP4中的内容显⽰在4位LED上。

通过对温度的设定值与实际值的⽐较、判断,实现温度控制。

3.2 软件设计
此程序是由4位LED数码管动态显⽰、静态按键显⽰、I2C总线实验—AT24C02串⾏E2PROM、串⾏A/D转换器TLC549等实验综合写成。

1. 主函数MAIN⼦程序
⾸先初始化所有的寄存器的值,包括定时器的初始值,设定温度的初始值,显⽰的初始值,按调⽤按键扫描,判断有⽆键按下,然后修改温度的设定值,再将设定后的值送⼊DISPLAY1/2中,在通过显⽰的时间是否为500ms,时间没到的话就继续循环等待,到了500MS后就可以通过AT24C02存储器写⼊重新设定的值,⽽同时由中断系统始终不断输出实测的和设定的温度。

2. 数码管动态显⽰⼦程序
经过定时器T1中断处理实现显⽰,分别调⽤DISOUT0实现选中数码管,在调⽤DISOUT1中的查表来实现数码管显⽰温度数值⽬的。

3. 按键处理⼦程序
通过按键控制设置温度加减,循环查询,通过检测p2⼝的按键,利⽤CJNE A,#0F0H ,MAY_KEY⽐较⽤SCAN5判断是否有键按下,按键“1”时,设定的温度
值加1,按键“2”时,设定的温度值减1。

4. A/D转换程序
利⽤TRANS调⽤ADCA实现采样温度的模拟值转换为数字值,再通过程序MOVC A,A+@DPRT查表得到实际的温度值。

5.读写功能(数据写⼊、读出⼦程序)
写⼊或者读出数据时,通过软件实现串⾏读出(BD_DATA)或写⼊(WD_DATA)数据到ACC中。

同时实现开始信号(BSTRAR)、停⽌信号(BSTOP)、读写字节
R/WBATE)的软件编写。

6.延时⼦程序
通过循环判断DJNE延时或定时器检查TFO是否为1 (JBC TFO,LP1)延时。

7. 查表程序
利⽤DB来实现查询。

3.3 程序的修改
在源程序的基础上修改了⼀段程序:将原来按键“1”设定的温度值加1,按键“2”设定的温度值减1修改为相反功能。

原来的程序修改的程序
WAIT: WAIT:
;*******按键处理********* ;*******按键处理*********
MOV A,TEMP_SET MOV A,TEMP_SET
SUBB A,TEMP CJNE A,TEMP,LOOP
JC OVER0 LOOP: JC OVER0
CLR RELAY CLR RELAY
AJMP PRO AJMP PRO
OVER0: OVER0:
SETB RELAY SETB RELAY
PRO: PRO:
LCALL KEY_SCAN LCALL KEY_SCAN
JZ PRO1_END JZ PRO1_END
CJNE A,#1,NO_1KEY CJNE A,#1,NO_1KEY
MOV A,TEMP_SET MOV A,TEMP_SET
CJNE A,#99,CMP1 JZ PRO_END CMP1:
JNC PRO_END
INC TEMP_SET DEC TEMP_SET
AJMP PRO_END AJMP PRO_END
NO_1KEY: NO_1KEY:
CJNE A,#2,PRO_END CJNE A,#2,PRO_END MOV A,TEMP_SET MOV A,TEMP_SET JZ PRO_END CJNE A,#99,CMP1 DEC TEMP_SET CMP1:JNC PR0_END
AJMP PRO_END INC TEMP_SET
AJMP PRO_END 3.4 程序流程图
图3.1 程序流程图
第四章⼼得体会
对于单⽚机的学习,我很是苦恼,刚开始我什么也不懂。

⼀个简单的程序也要看⼀个晚上。

可能是太幼稚了,刚开始为了计算机⼆级,⾃考根本就没有时间看单⽚机。

在忙完了这些才开始从头抓起,真的好吃⼒。

有时在课堂上我也会提出许多简单的问题(在同学看来都是不是问题的问题)可是我不会。

刚开始还是问可是后来就不问了但在课余时间我⽤了N备的时间为了⼀个简单的程序在不断的写,不断的记忆。

我知道只有先背过了,才有可能去了解,去运⽤。

虽然⼆级勉强过了,可是发觉⽐别⼈落后了⼀步总觉的落后了好多。

曾经⼀度的后悔,可是已经成为事实,此刻只有⽤不多的时间才能赶上。

在背了部分的程序后对程序渐渐有了信⼼,但还是总觉的不如别⼈,我就不断的告诉⾃⼰我不如别⼈,只有这样,我才能不断的激励⾃⼰要坚持学下去。

可是对于知识的积累还需要漫长的过程。

很遗憾的是考完试了,和其他的⼈⼀起放纵直到课程设计才回到课本中。

通过这次课程设计,使我对单⽚机有了进⼀步的了解,我不知道以后能够⽤到多少可我觉的既然我学了这⼀课程,我就要尽⼒
将他学好。

考试只是⼀个阶段的东西,考试只能说还⾏,不过我觉的我懂的太少,要想掌握还需要未来的不断努⼒。

课程设计为我们提供了⼀个从课本过度到⼯作中的⼀个平台。

但这次的课程设计⽼师已经把程序给了我们,开始我都看不懂,我想假如让我去编写⼀个程序,此时的我是编不出的。

要能够编出⼀个完整的程序需要⾛的路还很长。

学了单⽚机,我们此刻也只是在婴⼉阶段,还是刚出⽣的婴⼉,在学习的过程中,都是付出是别⼈⼏倍的时间,可是也得到了和别⼈相似或差些的成绩。

但是我始终相信机会给于有准备的⼈。

感谢在我成长中给与我帮助的同学和⽼师。

附录(源程序)
SEL0 EQU P3.5
SEL1 EQU P3.7
DOUT EQU P1.1
CIO EQU P1.0
CS EQU P1.2
RELAY EQU P1.3
DISP1 EQU 30H
DISP2 EQU 31H
DISP3 EQU 32H
DISP4 EQU 33H
COUNT EQU 34H
TEMP EQU 35H
TMP EQU 38H
TEMP_SET EQU 36H
KEY_LAST EQU 37H
CNT500MS EQU 39H
F_500MS EQU 21H .0
SCAN EQU 20H
SCAN1 EQU 20H.0
SCAN2 EQU 20H.1
SCAN3 EQU 20H.2
SCAN4 EQU 20H.3
SCAN5 EQU 20H.4
SCAN6 EQU 20H.5
SCAN7 EQU 20H.6
SCL EQU P1.5
SDA EQU P1.6
ORG 0000H
LJMP MAIN
ORG 001BH
AJMP DISPLAY
MAIN: MOV TMOD,#00010000B ;T1定时器⽅式1定时MOV TH1,#0ECH ;T1初始值MOV TL1,#78H
SETB ET1 ;允许T1中断
SETB PT1 ;设T1为⾼优先级
SETB EA ;允许CPU中断
SETB TR1 ;开启T1⼯作
MOV COUNT,#0
MOV CNT500MS,#0
CLR SET0
CLR SEL1
MOV DISP1,#2
MOV DISP2,#0
MOV DISP3,#0
MOV DISP4,#6
MOV R0,#00H
CLR F_500MS
LCALL RD_DATA ;读出芯⽚的初始值
CJNE A, #99,CMP0 ;判断温度是否超出99 CMP0: JC NO_OVER99
MOV R0,#00H ;芯⽚的⽚地址
MOV R1,#20 ;设初始温度
LCALL WR_DATA ;重新写⼊初始温度
LCALL RD_DATA ;再读出温度
NO_OVER99:
MOV TEMP_SET,A
MOV TMP,A
MOV B,#10 ;将温度转化为BCD码输出
DIV AB
MOV DISP2,B
MOV DISP1,A
WAIT:
;****************按键处理***********************
MOV A,TEMP_SET ;将温度再次写⼊A中
CJNE A,TEMP,LOOP ;所设温度与实测的温度⽐较LOOP: JC OVER0 ;判断是否溢出CLR RELAY ;没溢出继电器不响
AJMP PR0
OVER0:
SETB RELAY ;若溢出继电器响
PR0: LCALL KEY_SCAN ;调⽤键盘扫描
JZ PR01_END ;判断是否有键盘按下
CJNE A,#1,NO_1KEY ;判断是否为1键
MOV A,TEMP_SET
JZ PRO_END ;若⼩于0则不能再减1
DEC TEMP_SET ;温度减1
AJMP PRO_END
NO_1KEY:
CJNE A,#2,PRO_END ;判断按键是否为2键MOV A,TEMP_SET
CJNE A,#99,CMP1
CMP1: JNC PRO_END ;若⼤于99则不能加1
INC TEMP_SET ;温度加1
AJMP PRO_END
PRO_END:
MOV A, TEMP_SET ;这⼀段将温度转化为BCD码显⽰MOV B,#10
DIV AB
MOV DISP2,B
MOV DISP1,A
PRO1_END:
;**************************************************
JNB F_500MS,MYDS ;判断是否已经过500MS
CLR F_500MS ;若已经经过则清0
AJMP DS_PRO
MYDS:
AJMP WAIT ;若没经过则跳转到WAIN继续等待DS_PRO:
MOV A,TMP ;将之前的温度给A
CJNE A, TEMP_SET,NO_XD;判断现设温度是否与之前设的温度相等 AJMP NO_PROSET ;若相等直接跳转到NO_PROSET
;*******************不相等则记忆该函数****************
NO_XD:
MOV TMP,TEMP_SET ;若不想等则重新刷新温度
MOV R0,#0
MOV R1,TEMP_SET ;将重新的⽽温度赋给R1
LCALL WR_DATA ;把重设的温度送⼊芯⽚内
;*******************相等则不记忆********************
NO_PROSET:
LCALL TRANS ;调⽤数模转换,等到实测外部的温度MOV B,#10 DIV AB
MOV DISP3,A ;显⽰实测的温度。

相关文档
最新文档