资源描述
2010年单片机原理及接口技术课程设计单片机原理及接口技术课程设计 题 目 世园会倒计时牌及温度表的设计 学院(部) 电子与控制学院 专 业 电气工程及其自动化 班 级 二班 学 号 学生姓名 指导老师 2011年1月6日说明书一、任务书题目4:世园会倒计时牌及温度表的设计设计要求(不能采用专用芯片):(1)显示倒计时天数以及小时、分钟(各2位)。(2)参数可手动设置(3)选择传感器,并设计相应的信号处理电路。(4)实现实时温度显示功能(每秒刷新一次),温度测量范围4060(5)可采用电池组供电和交流电源供电 扩充功能:(1)防止极性接反,电压不足时,报警提示。(2)剩余天数、时分秒、温度交替显示。二、摘要 本设计主要分为倒计时和温度显示功能两部分,实现天时分的显示和温度的采集并显示功能。时间显示年时分各两位,并能够手动设置日历参数;温度表采集温度并每秒刷新显示。设计时用8051单片机内部中断实现50ms的定时,然后用软件实现定时一天,逐次递减,最终实现倒计时。天时月的显示用74LS245驱动并用集成的8位数码显示管显示,温度的采集选用DS18B20温度传感器,驱动和显示和倒计时部分相同。由单片机把各个部分联系到一起,综合完成设计要求的实现。三、目录正文.4前 言.4显示倒计时方案.4温度表方案.4方 案.4(一)硬件部分 .4计时所用主要元器件.4主要硬件元件分析.5(二)软件部分.8倒计时的调试过程.9温度表的调试过程.9整体程序调试过程10(三)结 论11附录.12硬件原理图12程序清单.13程序框图.23 四、正 文前 言本倒计时牌以AT89C52单片机作为核心,最长可以倒计时99天。可以显示距倒计时时刻还有多长时间,显示格式为天(十位,个位)、时(十位、个位)、分(十位、个位);倒计时的时间可以人为设定;另外可以切换显示当前温度,显示格式为温度(符号,十位,个位)。本设计大致分为两大部分,即倒计时部分和温度表部分:倒计时部分:倒计时要求时间显示剩余时间天时分各两位,即六位,且参数可以手动设置。通过可以设置开关通过单片机片选接口对日期进行调解。利用单片机内部晶振计时,用软件实现满一天进位,显示倒计时。用六个八段LED数码显示管显示日期六位数字。温度表部分:温度表主要在于选择传感器和显示输出温度。传感器要求测量范围不小于-40+60且温度测量刷新时间不大于一秒钟。单片机读取传感器温度信息,经转换和显示程序通过I/O口输出。同样,显示输出也用四个八段LED数码显示管显示温度.方 案(一)硬件部分1.设计时所用主要元器件1) 8051芯片一个2) 74LS245芯片一个3) DS18B20温度传感器一个4) 三位数码显示管共两个5) 74LS138芯片一个6) V系列仿真器集成调试软件7) Proteus仿真模拟环境1.硬件如图1-1 2.硬件元件分析1)STC89C52单片机STC89C52提供以下标准功能:8k字节可重擦写Flash闪速存储器、2568字节内部RAM、32个可编程I/O口线、一个6向量两级中断结构,一个全双工串行通信口,片内振荡及时钟电路。同时,STC89C52可降至0Hz的静态逻辑操作,并支持两种软件可 选的节电工作模式。空闲方式停止CPU的工作, 图1-2但允许RAM、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 (1)电源及时钟引脚如图1-3,Vcc:电源接入引脚;GND:接地引脚;XTAL1:晶体振荡器接入的一个引脚(采用外部振荡器时,此引脚接地);XTAL2:晶体振荡器接入的另一个引脚(采用外部振荡器时,此引脚作为外部振荡信号的输入端)。(2)控制线引脚,RST:复位信号输入引脚。(3)并行I/O口引脚P0.0P0.7:一般I/O口引脚或数据/低位地址总线复用引脚;P1.0P1.7:一般I/O口引脚P2.0P2.7:一般I/O口引脚或数据/高位总线引脚;P3.0P3.7:一般I/O口引脚或第二功能引脚。在.6控制数码管显示倒计时,用P3口的P3.0-P3.3来控制数码管的选通信号,当其中一个引脚输出高电平时,其对应的数码管被选通用来显示时间。用P3.5来控制蜂鸣器工作,在主干道、主干道信号灯转换 图1-3的同时发声告知。在设置STC89C52的振荡频率时,采用内部时钟方式,如图所示。在单片机内部有一振荡电路,只要在单片机XTAL1和XTAL2引脚外接石英晶体(简称晶振),就构成了自激振荡器并在单片机内部产生时钟脉冲信号。图中电容器C1和C2的作用是稳定频率和快速起振,电容值在5-30pF,典型值为30pF。晶振CYS的振荡频率范围为1.2-12MHz,典型值为12MHz和6MHz。本次设计选择了12MHz。2)74LS138译码器如图1-4,74LS138的引脚图,译码器74LS138有三个输入端A2、A1、A0,八个输出端Y0-Y8,S3、S2、S1为三个控制输入端(使能控制端)只有控制输入端处于有效状态时,输入和输出之间才有相应的逻 辑关系。 图1-4 3)74LS245驱动器如图1-5,74LS245的引脚图,图表一为其功能表。图中G为使能端,DIR为方向控制端,A1-A8为A端的数据输入/输出,B1-B8为B端的数据输入/输出。74LS245是一种三态输出的8总线收发驱动器,无锁存功能。当G为低电平时,如果DIR为 高电平,则74LS245将A端的数据传送至B端;如果DIR为低电平,则74LS245将B 表1-1 端的数据传送至A端。在其他情况下不传送数据,输出呈高阻态。 图1-54)DS18B20温度传感器:如图1-6,DS18B20的引脚图单线数字温度传感器DS1820把温度信号直接转换成串行数字信号供微机处理。由于每片DS1820含有唯一的硅串行数所以在一条总线上可挂接任意 多个DS1820芯片。从DS1820读出的信息或写入DS1820的信息,仅需 图1-6要一根口线(单线接口)。读写及温度变换功率来源于数据总线,总线本身也可以向所挂接的DS1820供电,而无需额外电源。DS1820提供九位温度读数,构成多点温度检测系统而无需任何外围硬件。DS1820的测温原理:内部计数器对一个受温度影响的振荡器的脉冲计数,低温时振荡器的脉冲可以通过门电路,而当到达某一设置高温时振荡器的脉冲无法通过门电路。计数器设置为-55时的值,如果计数器到达0之前,门电路未关闭,则温度寄存器的值将增加,这表示当前温度高于-55。同时,计数器复位在当前温度值上,电路对振荡器的温度系数进行补偿,计数器重新开始计数直到回零。如果门电路仍然未关闭,则重复以上过程。温度表示值为9bit,高位为符号位。5)数码显示管如图1-7,8段LED数码管是一种显示设备。它是由若干个发光二极管组成的显示字段,a-g和dp为显示字段控制端。有共阳极和共阴极两种连接方式,在此设计中我们都用共阴极连接,即把所有的发光二极管的阴极连接一起。共阴数码管的公共端COM接低电平,当某个显示字段控制端接高电平时,对应的字段就点亮,当显示字段控制端接低电平时,该显示字段熄灭。由于每个显示字段显示通常需要十到几十毫安的驱动电流,因此显示控制信号必须经过驱动电路(即通过74LS245)才能使显示器正常工作。本设计中的显示器有两种,六位集成的和四位集成的,他们 图1-7功耗低,可靠性高。阴极通过CMOS管4010与单片机连接。(二)软件部分1、倒计时设计方案倒计时的方案选择主要分为手动设置日期、计满一分钟时间调整、显示输出。l 手动设置日期:本设计采用矩阵键盘开关,通过单片机的P2口输入到单片机,再通过软件实现区分、扫描查询方式,实现对参数的调整。l 计满一天日期调整:通过单片机内部定时器定时50ms进而定时扩大到一分,然后实现中断,中断程序实现日期调整。中断程序中,用软件实现闰年的判断及各月份总计天数的判断,以便完成分满减时,时满减天。l 显示输出:用六个八段LED显示管六位数字。显示管为共阴极,由74LS245芯片驱动。阴极通过CMOS管74LS245与单片机相连。完成输出显示。2、温度表方案:温度表主要分为:温度的采集及温度的处理显示。使用DS18B20温度传感器完成对温度的采集。DS18B20温度传感器符合我们设计对温度范围的要求及刷新频率的要求。通过单片机P1.3口将DS18B20温度传感器采集的温度传到单片机内部,通过单片机内部的软件程序完成温度的转换,再通过P0和P2口共同完成温度显示的输出。各口通过CMOS管74LS138和74LS245共同控制共阴极LED显示管的显示。同样,此三个八段LED显示管也由74LS245芯片驱动。 软件设计时应用模块化程序,单个实现每个模块的功能,与单独的硬件组合调试,均正确后再组装成一个整个的系统程序与整套硬件图族和调试。3、倒计时的调试过程把倒计时单独程序与硬件图结合,首先检验开关按钮是否正常工作。设置的是100天的日期显示,采用键盘扫描,进行切换。第一次调试时出现按一下开关,显示输出变化好几次的情况。经分析,知道了程序中没有判断开关按键是否抬起的程序,所以当开关按下时,会出现加减任意次的现象。加上判断开关按键抬起的程序后,经编译,程序正常执行。因为一天较长,所以先定时2s,使其2s产生定时中断,日期减一。4、温度表的调试过程把温度表单独程序与硬件图结合,调节Proteus仿真模拟环境中DS18B20温度传感器感应的温度值,看经P1.3口输入单片机再经单片机转换后数码管是否显示与DS18B20温度传感器所示的温度相同的数值。在调试过程中,程序与硬件结合后显示出现了问题。数码显示管能够正常地显示DS18B20温度传感器所示的温度值,及正负号和温度单位。5、整体程序调试过程倒计时程序与温度表程序综合为一个程序。编辑主程序,把倒计时程序和温度表程序作为子程序调用,完成整个程序的编译。但是,当倒计时切换至温度,再此返回时出错。然后经多次调节,显示输出符合要求。(三)结 论:经过硬件的选择连接和软件的编程调试基本按要求完成了此次的倒计时和温度表的设计。经过将两周的单片机课程设计,终于完成了我的倒计时和温度表的设计,虽然设计的并不是特别好,但从心底里说,还是高兴的,毕竟这次设计我花了很大的心血,高兴之余不得不深思呀!在本次设计的过程中,发现很多的问题,对单片机有了更深刻的认识,也巩固了单片机学习知识。最主要的是这次设计让我对硬件和软件的结合有了深一层次的的理解。通过这次课程设计让我认识到无论我们想做什么都是不容易得,都是要花费大量心血的。我们从理论到Proteus仿真模拟环境试验成功运行是我们的一大进步,但我们也要看到,我们还没有做出事物,我们还需继续努力,让自己更贴近实际,更好的做到理论联系实际。把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。参考文献:1 段晨东主编 2 蔡美琴 张为民 MCS-51系列单片机系统及其应用 高等教育出版社 19923 高峰 单片微机应用系统设计及实用技术 机械工程出版社 20044 杨全胜 现代微机原理与接口技术 电子工业出版社 20045 全国大学生电子设计竞赛组委会 全国大学生电子设计竞赛获 奖作品精选 (19941999) 北京理工大学出版社 2003.6 谢淑如 郑光钦 杨渝生 Protel PCB 99SE电路版设计 清华大学出版社7 张义和 王敏男 例说51单片机 人民邮电出版社 2008.4 五、附录:1、硬件原理图2、程序清单;变量定义DAY EQU 21H;存放天数HOUR EQU 22H;存放小时数MINUTE EQU 23H;存放分钟数DAYHIGH EQU 24H;存放显示的天数高位DAYLOW EQU 25H;存放显示的天数低位HOURHIGH EQU 26H;存放显示的小时数高位HOURLOW EQU 27H;存放显示的小时数低位MHIGH EQU 28H;存放显示的分钟数高位MLOW EQU 29H;存放显示的分钟数高位KEYVALUE EQU 2AH;存放键值CISHU EQU 2EH;存放计数次数FLAG1 BIT 00HSIGN BIT 01H;主程序ORG 0000H LJMP MAINORG 000BH LJMP DINGSHI;转到定时子程序ORG 0030H MAIN: MOV SP,#60H;开辟栈区 MOV TMOD,#01H;设置T0为定时器 MOV TH0,#00H MOV TL0,#0A0H;定时60MS计时初值 SETB EA SETB ET0 SETB PT0;定义定时子程序为高优先级 SETB TR0;定时器启动 MOV DAY,#32 MOV HOUR,#04 MOV MINUTE,#08 NOP AAA: LCALL FENLI LCALL KEYVALUEGET MOV A,KEYVALUE CJNE A,#01,NEXT1 LJMP S0 NEXT1: CJNE A,#02,NEXT2 LJMP S1 NEXT2:CJNE A,#03,NEXT3 LJMP S2 NEXT3:CJNE A,#04,NEXT4 LJMP S3 NEXT4: CJNE A,#05,NEXT5 LJMP S4 NEXT5: CJNE A,#06,NEXT6 LJMP S5 NEXT6: CJNE A,#07,NEXT7 LJMP S6 NEXT7: LCALL FENLI LCALL DISPLAY;调用显示程序 LJMP AAA S0: INC DAY ;天加一 MOV A,DAY CJNE A,#100,CONT0 MOV DAY,#00 LCALL FENLI CONT0: LJMP AAA RET S1: DEC DAY ;天减一 MOV A,DAY CJNE A,#0FFH,CONT1 MOV DAY,#099 LCALL FENLI CONT1: LJMP AAA RET S2: INC HOUR ;时加一 MOV A,HOUR CJNE A,#25,CONT2 MOV HOUR,#00 LCALL FENLI CONT2:LJMP AAA RET S3: DEC HOUR ;时减一 MOV A,HOUR CJNE A,#0FFH,CONT3 MOV HOUR,#23 LCALL FENLI CONT3: LJMP AAA RET S4: INC MINUTE ;分加一 MOV A,MINUTE CJNE A,#60,CONT4 MOV MINUTE,#00 LCALL FENLI CONT4: LJMP AAA RET S5: DEC MINUTE ;分减一 MOV A,MINUTE CJNE A,#0FFH,CONT5 MOV MINUTE,#59 LCALL FENLI CONT5:LJMP AAA RETS6: LCALL INIT_1820 LCALL GET_TEMPER LCALL DATA_PROC LCALL SEG_GEN MOV R1,#0FFH MOV R4,#3KEEP: LCALL DISPLAYWENDU DJNZ R1,KEEP DJNZ R4,KEEP LJMP AAA ; 初始化DS18B20的程序INIT_1820: SETB P1.3 NOP CLR P1.3 MOV R1,#3TSR1: MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB P1.3 NOP NOP NOP MOV R0,#25HTSR2: JNB P1.3,TSR3 DJNZ R0,TSR2 LJMP TSR4TSR3: SETB FLAG1 LJMP TSR5TSR4: CLR FLAG1 LJMP TSR6TSR5: MOV R0,#117 DJNZ R0,$TSR6: SETB P1.3 RET; 读出转换后的温度值GET_TEMPER:SETB P1.3 LCALL INIT_1820 JB FLAG1,TSS2 RETTSS2: MOV A,#0CCH LCALL WRITE_1820 MOV A,#44H LCALL WRITE_1820 LCALL DELAY LCALL INIT_1820 MOV A,#0CCH LCALL WRITE_1820 MOV A,#0BEH LCALL WRITE_1820 LCALL READ_1820 RET; 写DS18B20的程序WRITE_1820:MOV R2,#8 CLR CWR1: CLR P1.3 MOV R3,#6 DJNZ R3,$ RRC A MOV P1.3,C MOV R3,#23 DJNZ R3,$ SETB P1.3 NOP DJNZ R2,WR1 SETB P1.3 RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_1820: MOV R4,#2 MOV R1,#31HRE00: MOV R2,#8RE01: CLR C SETB P1.3 NOP NOP CLR P1.3 NOP NOP NOP SETB P1.3 MOV R3,#9RE10: DJNZ R3,RE10 MOV C,P1.3 MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV R1,A DEC R1 DJNZ R4,RE00 RET; 将从DS18B20中读出的温度数据进行转换DATA_PROC: CLR C CLR SIGN MOV A,30H RLC A JC NEG LJMP PRONEG: CLR C SETB SIGN MOV A,31H CPL A ADD A,#1 MOV 31H,A MOV A,30H CPL A ADDC A,#0 MOV 30H,APRO: MOV A,30H SWAP A ANL A,#0F0H MOV 32H,A MOV A,31H SWAP A ANL A,#0FH MOV R0,#32H ORL A,R0 MOV 32H,A RETSEG_GEN: MOV DPTR,#ZIXING_TAB JB SIGN,S_NEG MOV 33H,#00H SJMP S_INTS_NEG: MOV 33H,#40HS_INT: MOV A,32H MOV B,#10 DIV AB MOVC A,A+DPTR MOV 34H,A MOV A,B MOVC A,A+DPTR MOV 35H,A MOV 36H,#39H RET;显示测量温度DISPLAYWENDU: MOV R7,#0AH MOV R0,#33HPROG: MOV A,R7 MOV P1,A MOV A,R0 MOV P0,A LCALL DELAY INC R7 INC R0 MOV A,R7 CJNE A,#0EH,PROG MOV R7,#0AH RETDELAY: MOV R5,#2D1: MOV R6,#248 DJNZ R6,$ DJNZ R5,D1 RET;键值获取子程序KEYVALUEGET:MOV P2,#0F0H;置P2.4P2.6为入口 MOV A,P2;读P2口状态 ANL A,#0F0H XRL A,#0F0H JZ NOKEY;没有键按下 LCALL DL1MS;稳定MOV A,P2 ANL A,#0F0H;重读键值 XRL A,#0F0H JZ NOKEY;没有键按下 MOV R2,#11110111B;行扫描,从第三行开始 SCAN: MOV A,R2 MOV P2,A;再次给P2口赋值 MOV A,P2;读P1口状态 ANL A,#11110000B MOV R3,A CJNE A,#0F0H,KEYYES;有键按下 MOV A,R2 RR A;产生下次的行线输出 MOV R2,A XRL A,#01111111B;检测完否 JNZ SCAN NOKEY: MOV KEYVALUE,#09H;存放键值 RET KEYYES: MOV A,R2;取行扫描值 ANL A,#00001111B;计算行特征值 ORL A,R3;计算行特征码 MOV R4,A;暂存 MOV KEYVALUE,#01;设置按键键值初值 MOV DPTR,#KEY_TAB;特征码表首地址 JIANCE: MOV A,KEYVALUE MOVC A,A+DPTR XRL A,R4 JZ FIXED;键值已经找到 INC KEYVALUE MOV A,KEYVALUE CJNE A,#08,JIANCE;七个键是否全部检测完 AJMP NOKEY FIXED: MOV A,P2;判断键是否释放 ANL A,#0F0H XRL A,#0F0H JNZ FIXED LCALL DL1MS;延时消抖 MOV A,P2 ANL A,#0F0H XRL A,#0F0H JNZ FIXED RET;按键键值表 KEY_TAB: DB 00H,0EBH,0EDH,0EEH,0DBH,0DDH,0DEH,0BBH,;17七个键值;定时器T0中断处理程序 DINGSHI: PUSH ACC;入栈 PUSH PSW MOV TH0,#0FAH MOV TL0,#0A0H MOV 3FH,#00 INC CISHU MOV A,CISHU MOV 3FH,#100 CJNE A,3FH,GOON MOV CISHU,#00;重置 DEC MINUTE MOV A,MINUTE CJNE A,#00,GOON;一分钟完否 MOV MINUTE,#59 DEC HOUR;重置小时数 MOV A,HOUR CJNE A,#00,GOON MOV HOUR,#23 DEC DAY MOV A,DAY CJNE A,#00,GOON MOV DAY,#00 GOON: POP PSW POP ACC;出栈 RETI;位分离子程序 FENLI: MOV A,DAY MOV B,#10 DIV AB;天数不超过100,所以除10即可 MOV DAYHIGH,A;存储天数的高位 MOV DAYLOW,B;存储天数的低位 MOV A,HOUR MOV B,#10 DIV AB MOV HOURHIGH,A;存储小时数的高位 MOV HOURLOW,B;存储小时数的低位 MOV A,MINUTE MOV B,#10 DIV AB MOV MHIGH,A;存储分钟数的高位 MOV MLOW,B;存储分钟数的低位 RET;显示程序ORG 0500H;显示一位子程序 DISONE: MOV A,R1;取显示位置 MOV P1,A;显示 MOV DPTR,#ZIXING_TAB;取字型码表首地址 MOV A,R0;取显示数据 MOVC A,A+DPTR;取显示数据字型码 MOV P0,A;输出显示数据字型码 LCALL DL1MS;稳定显示20MS RET;显示子程序 DISPLAY: MOV R0,#DAYHIGH;读年份的高显示位单元地址 MOV A,P1;读取P1口内容 ANL A,#11111000B;P1口低三位的内容置0 MOV R1,A;暂存 XUNHUAN: ACALL DISONE;调用一位显示子程序 INC R1;修改显示位置输出口的地址 INC R0;修改显示数据地址 CJNE R0,#2AH,XUNHUAN;动态显示 RET;字型码表ZIXING_TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H;09;延时1MS子程序 DL1MS: MOV R5,#20 DEL1: MOV R6,#10 DEL0: NOP NOP NOP DJNZ R6,DEL0 DJNZ R5,DEL1 RET;延时5MS子程序 DL5MS: MOV R1,#50 DEL3: MOV R4,#20 DEL2: NOP NOP NOP DJNZ R4,DEL2 DJNZ R1,DEL3 RET3、流程图:主程序流程图:开始 初始化程序K1按下否?天数加一程序 K2按下否?天数减一程序小时加一程序K3按下否?K4按下否?小时减一程序K5按下否?分钟加一程序K6按下否?分钟减一程序K7按下否?温度显示程序调用显示程序倒计时程序图如下:开 始设置初值是否到一分分减1分是否减至-1将分置为59,时减1时是否减至-1将时置为23,天减1天是否减至-1将天置为00,时00,分00中断返回温度表子程序: 温度表显示子程序: 开始开始 读取转换完的温度值 调测量子程序 负数? 调温度显示程序 N Y 符号位输出“全灭”符号位输出“” RET 输出十位数字输出个位数字输出单位RET 26 / 26
展开阅读全文