1、基于MCS51单片机的温度测量系统第一章 MSC51单片机的结构与原理1.1 MSC51单片机的发展随着集成电路技术的发展,单片微型计算机的功能也不断增强,许多高性能的新型机种不断涌现出来。单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点,称为自动化和各个测控领域中广泛应用的器件,在工业生产中称为必不可少的器件,尤其是在日常生活中发挥的作用也越来越大。单片机作为微型计算机的一个重要分支,应用面很广,发展很快。自单片机诞生至今,已发展为上百种系列的近千个机种。1.2 单片机的结构1.2.1 MSC51单片机的基本结构 图1.1 单片机的基本结构图中包括:1. 一个8位中央处理器CPU
2、 数据处理、测试位,置位,复位,位操作2.数据存储器RAM(128B与 SFR) 在程序运行时存储工作变量和资料3. 程序存储器ROM(4KB或8KB) 永久性存储应用程序,掩模ROM、EPROM、EEPROM4. 并行输入/输出口(I/O) 作系统总线、扩展外存、I/O接口芯片5. 串行输入/输出口(2条) 串行通信、扩展I / O接口芯片6. 定时/计数器(16位) 计满溢出、中断标志置位、向CPU提出中断请求,与CPU之间独立工作7. 中断控制系统 2个外中断、2个定时/计数器中断、1个串行口终端8. 时钟电路 内振 外振1.2.2 单片机的内部结构单片机由 CPU 、存储器(包括 RA
3、M 和 ROM )、 I/O 接口、定时 / 计数器、中断控制功能等均集成在一块芯片上,片内各功能通过内部总线相互连接起来。 图1.2 单片机的内部结构1.3 单片机的引脚单片机实际有效的引脚共有40个,有三种封装形式。引脚主要有:主电源引脚GND和VCC,时钟电路引脚,控制信号引脚,输入输出引脚,RST复位引脚,XTAL1、XTAL2接外部晶体的引脚等。下图是DIP封装形式,这是普通的40脚双列直插形式。为了尽可能缩小体积,减少引脚数,单片机的不少引脚具有第二功能,也称为复用功能。图1.3 单片机引脚图1.4 MCS51的存储器结构 MCS-51的程序存储器与数据存储器是分开的,体系结构为哈
4、佛结构。1.4.1 程序存储器ROM 1、程序存储器作用及寻址范围 作用:存放指令(程序)的存储器,用PC作地址指针。寻址范围:0000FFFFH,共64KB;片内、片外统一编址。片内:PC=00000FFFH;片外:PC=1000FFFFH 2、ROM低端的几个特殊入口地址 0000H:CPU开始执行指令时的第一个取指单元,执行时PC的内容从0000H开始;0003H0002B:中断专用固定入口地址(系统规定);1.4.2 数据存储器RAM 1、片内128字节的数据存储器可分为三部分 (1)工作寄存器区03区地址从00H1FH,共有32个字节。每8个字节(记作R0R7)构成一个区,共4个区。
5、工作寄存器区的选择由程序状态字PSW中的RS1和RS0位的值来确定。(2)位寻址区该区域地址从20H到2FH,共16个字节,128位,使用指令可寻址到位。(3)数据区 地址从30H到7FH,共80个字节,可作为用户数据存储器,按字节访问。用户堆栈通常在该区域开辟。 2、特殊功能寄存器区SFR 8051把CPU中的专用寄存器、并行端口锁存器、串行口与定时器/计数器内的控制寄存器等集中安排到一个区域,离散地分布在地址80HFFH范围内,这个区域称为特殊功能寄存器区SFR。图1.4 片内数据存储器RAM地址空间第二章 温度控制系统硬件设计2.1 系统使用的仪器设备及芯片此温度控制系统使用的仪器和设备
6、主要有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存储器,具有掉电记忆功能,并内含2568位存储空间,具有+5V单电源供电、二线串行接口、低功耗CMOS技术、双向数据传输协议、8字节页面写模式、允许写部分页面、自定时写周期、内部结构 256X8(2K)、工作电压宽(2.55.5V)、擦写次数多(
7、大于10000次)、写入速度快(小于10ms)高可靠性,数据保留时间长等特点。 图2.1 AT24C02芯片工作及引脚图表2.1 AT24C02芯片引脚功能说明序号符号功能直流电压(V)1A0地址输入02A1地址输入03A2地址输入04GND接地05SDA串行数据输入/输出4.56SCL串行时钟输入4.57WP写保护08Vcc电源5 I2C数据传送过程如下:图2.2 数据传送过程在数据传送过程中,必须确认数据传送的开始和结束。当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平定义为“开始”信号;当SCL线为高电平时,SDA线发生低电平到高电平的跳变为“结束”信号。开始和结束信号都是由主
8、器件产生。在开始信号以后,总线即被认为处于忙状态;在结束信号以后的一段时间内,总线被认为是空闲的。在设计硬件中,该芯片串行实现与单片机传输数据的传送。该芯片的SCL和SDA与单片机的P1.5与P1.6连接。该设计中式实现设定温度的存储。2.2.2 串行A/D转换芯片TLC1549TLC1549是以10位开关电容逐次逼近式A/D转换器为基础而构造的一种低价位、高性能的8位CMOS A/D转换器,它以8位开关电容逐次逼近的方法实现A/D转换,其转换速度小于17us,它能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。具有片内提供4MHz内部系统时钟,并与操作控制用的外部I
9、/O CLOCK相互独立、存取与转换时间转换速率达40000次秒、差分高阻抗基准电压输入等特点。图2.3 TLC1549芯片的引脚图表2.2 LTC1549芯片引脚功能说明序号符号功能电压(V)1REF+正基准电压输入端2.5VREF+Vcc+0.12ANALOG模拟信号输入端1或03REF-负基准电压输入端-0.1VREF-2.5V4GND接地05/CS芯片选择输入端VIN2V或0.8V6DATA OUT转换结果数据串行输出端高位在前,低位在后7I/O CLOCK外接输入/输出时钟输入端08Vcc电源3V6V单片机的P1口相关引脚相连,温度传感器和电阻分压后经其转换为数字量,将温度转换为数字
10、量传入单片机。 本系统的温度采集模块,主要采用的是热敏电阻器NTC对温度进行测量,测量的温度的模拟量送入到A/D转换器(TLC549),经转换成数字量输出。实验图如下 图2.4 串行A/D转换图2.2.3 8D锁存器7457374HC373的输出端O0O7可直接与总线相连。当三态允许控制端OE为低电平时,O0O7为正常逻辑状态,可用来驱动负载或总线。当OE为高电平时,O0O7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。当锁存允许端LE为高电平时,O随数据D而变。当LE为低电平时,O被锁存在已建立的数据电平。图2.5 8D锁存器74573的引脚排列在硬件电路中使用两
11、个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
12、 ED时,只要在某一个发光二极管加上高电平,该段即点亮,反之则暗。而选共阳的LED时,要使某一段发光二极管发亮,则需加上低电平,反之则暗,为了保护各段LED不被损坏,需外加限流电阻。为了要显示某个字形,则应使此字形的相应段点亮,也即送一个不同的电平组合代表的数据来控制LED的显示字形,此数据称为字符的段码。数据字位数与LED段码的关系如表所示:表2.3 数据字位数与LED段码的关系数据位数D7D6D5D4D3D2D1D0LED段码dpgfedcba在该设计中用到4个LED显示数码管,分别显示设计的温度和实际测量的温度。与上述的锁存器配合,显示相应的数值。实验电路图如下:图2.7 静态按键、LE
13、D显示第3章 温度控制系统软件设计3.1 温度控制系统软件实验内容温度传感器和电阻分压后的电压经TLC1549连续采样、转换为数字量,通过编程得到实际温度值,送入DISP3和DISP4两个内部RAM单元中;通过键盘输入温度设定值,送入AT24C02中保存。显示时从AT24C02中取出温度设定值,送入DISP1和DISP2两个内部RAM单元中。显示程序将DISP1DISP4中的内容显示在4位LED上。通过对温度的设定值与实际值的比较、判断,实现温度控制。3.2 软件设计此程序是由4位LED数码管动态显示、静态按键显示、I2C总线实验AT24C02串行E2PROM、串行A/D转换器TLC549等实
14、验综合写成。1. 主函数MAIN子程序 首先初始化所有的寄存器的值,包括定时器的初始值,设定温度的初始值,显示的初始值,按调用按键扫描,判断有无键按下,然后修改温度的设定值,再将设定后的值送入DISPLAY1/2中,在通过显示的时间是否为500ms,时间没到的话就继续循环等待,到了500MS后就可以通过AT24C02存储器写入重新设定的值,而同时由中断系统始终不断输出实测的和设定的温度。2. 数码管动态显示子程序经过定时器T1中断处理实现显示,分别调用DISOUT0实现选中数码管,在调用DISOUT1中的查表来实现数码管显示温度数值目的。3. 按键处理子程序 通过按键控制设置温度加减,循环查询
15、,通过检测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是否为
16、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: P
17、RO: 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_ENDCMP1: JNC PRO_END INC TEMP_SET DEC TEMP_SET AJMP PRO_END AJMP PRO_ENDNO_1KEY: NO_1KEY: CJNE A,#2,PRO_END CJNE A,#2,PRO_END MOV A,TEMP_SET MOV A,TEMP_S
18、ET 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备的时间为了一个简单的程序在不
19、断的写,不断的记忆。我知道只有先背过了,才有可能去了解,去运用。虽然二级勉强过了,可是发觉比别人落后了一步总觉的落后了好多。曾经一度的后悔,可是已经成为事实,此刻只有用不多的时间才能赶上。在背了部分的程序后对程序渐渐有了信心,但还是总觉的不如别人,我就不断的告诉自己我不如别人,只有这样,我才能不断的激励自己要坚持学下去。可是对于知识的积累还需要漫长的过程。很遗憾的是考完试了,和其他的人一起放纵直到课程设计才回到课本中。通过这次课程设计,使我对单片机有了进一步的了解,我不知道以后能够用到多少可我觉的既然我学了这一课程,我就要尽力将他学好。考试只是一个阶段的东西,考试只能说还行,不过我觉的我懂的太
20、少,要想掌握还需要未来的不断努力。课程设计为我们提供了一个从课本过度到工作中的一个平台。但这次的课程设计老师已经把程序给了我们,开始我都看不懂,我想假如让我去编写一个程序,此时的我是编不出的。要能够编出一个完整的程序需要走的路还很长。学了单片机,我们此刻也只是在婴儿阶段,还是刚出生的婴儿,在学习的过程中,都是付出是别人几倍的时间,可是也得到了和别人相似或差些的成绩。但是我始终相信机会给于有准备的人。感谢在我成长中给与我帮助的同学和老师。附录(源程序) SEL0 EQU P3.5 SEL1 EQU P3.7 DOUT EQU P1.1 CIO EQU P1.0 CS EQU P1.2 RELAY
21、 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
22、SCL EQU P1.5 SDA EQU P1.6 ORG 0000H LJMP MAIN ORG 001BH AJMP DISPLAYMAIN: 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
23、 DISP4,#6 MOV R0,#00H CLR F_500MS LCALL RD_DATA ;读出芯片的初始值 CJNE A, #99,CMP0 ;判断温度是否超出99CMP0: 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,AWAIT:;*按键处理* MOV A,TEMP
24、_SET ;将温度再次写入A中 CJNE A,TEMP,LOOP ;所设温度与实测的温度比较LOOP: JC OVER0 ;判断是否溢出 CLR RELAY ;没溢出继电器不响 AJMP PR0OVER0: 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_ENDNO_1KEY: CJNE A,#2,PRO_END ;判断
25、按键是否为2键 MOV A,TEMP_SET CJNE A,#99,CMP1 CMP1: JNC PRO_END ;若大于99则不能加1 INC TEMP_SET ;温度加1 AJMP PRO_ENDPRO_END: MOV A, TEMP_SET ;这一段将温度转化为BCD码显示 MOV B,#10 DIV AB MOV DISP2,B MOV DISP1,APRO1_END:;* JNB F_500MS,MYDS ;判断是否已经过500MS CLR F_500MS ;若已经经过则清0 AJMP DS_PROMYDS: AJMP WAIT ;若没经过则跳转到WAIN继续等待DS_PRO: M
26、OV 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 ;显示实测的温度 MOV D
27、ISP4,B AJMP WAITDISOUT1: MOV DPTR,#TAB ;温度查表地址 MOVC A,A+DPTR ;将查表的温度送给A MOV P0,A ;将温度送给P0口显示 SETB SEL1 ;选中控制字段锁存器 NOP CLR SEL1 RETDISOUT0: MOV A,SCAN ;将控制允许端送给A MOV P0,A ;在送给P0口 SETB SEL0 ;选中控制字位 NOP CLR SEL0 RET;*; 显示程序;*DISPLAY: MOV TH1,#0ECH ;重新给T1赋值 MOV TL1,#78H PUSH ACC ;保护现场 PUSH PSW;*500MS产生程
28、序*中断延时 INC CNT500MS MOV A,CNT500MS CJNE A,#100,NO_500MS MOV CNT500MS,#0 SETB F_500MSNO_500MS: ;* INC COUNT ;控制数码管的显示顺序 MOV A,COUNT CJNE A,#1,NO_DIS1 ;显示第一个数码管 CLR SCAN1 SETB SCAN2 SETB SCAN3 SETB SCAN4 LCALL DISOUT0 MOV A,DISP1 LCALL DISOUT1 MOV A,DISP1 AJMP T1_ENDNO_DIS1: CJNE A,#2,NO_DIS2 ;显示第二个数码管 SETB SCAN1 CLR SCAN2 SETB SCAN3 SETB SCAN4 LCALL DISOUT0 MOV A,DISP2 LCALL DISOUT1 AJMP T1_ENDNO_DIS2:CJNE A,#3,NO_DIS3 ;显示第三个数码管 SETB SCAN1 CLR SCAN3 SETB SCAN2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1