基于80C51的电子计时器的设计与实现毕业论文.doc

上传人:小小飞 文档编号:3919560 上传时间:2019-10-10 格式:DOC 页数:17 大小:226.50KB
返回 下载 相关 举报
基于80C51的电子计时器的设计与实现毕业论文.doc_第1页
第1页 / 共17页
基于80C51的电子计时器的设计与实现毕业论文.doc_第2页
第2页 / 共17页
基于80C51的电子计时器的设计与实现毕业论文.doc_第3页
第3页 / 共17页
基于80C51的电子计时器的设计与实现毕业论文.doc_第4页
第4页 / 共17页
基于80C51的电子计时器的设计与实现毕业论文.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《基于80C51的电子计时器的设计与实现毕业论文.doc》由会员分享,可在线阅读,更多相关《基于80C51的电子计时器的设计与实现毕业论文.doc(17页珍藏版)》请在三一文库上搜索。

1、塔里木大学信息工程学院单片机原理及应用课程论文目录1系统设计11.1方案设计12.硬件设计22.1系统电路设计23. 软件设计33.1软件设计概述34. 测试数据及设计结果4参考文献5附录6基于80C51的电子计时器的设计与实现XXX(塔里木大学信息工程学院, 阿拉尔市 843300)摘要: 本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,结合硬件电路设计计时器,将软、硬件有机地结合起来,使其能精确计时。关键词:计时器,单片机1系统设计1.1方案设计本设计利用STC89C52单片机的定时器/计数器定时和计数的原理,使其能精确计时。利用中断系统使其能实现开始暂停的功能。根据要求

2、知道秒表设计主要实现的功能是计时和显示。因此设置了两个按键和LCD显示时间,两个按键分别是开始、停止和复位按键。利用这两个建来实现秒表的全部功能,而LCD则能显示最多4.59.99秒的计时。电路原理图设计最基本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。硬件电路图按照图1.1进行设计。AT89C52单片机控制器复位电路开关电路LCD显示图1.1 数字秒表硬件电路基本原理图本设计中,数码管显示的数据存放在内存单元31H33H中。其中31H存放分钟变量,32H存放秒钟变量,33H存放10ms计数值,即存放毫秒位数据,每一地址单元内均为十进制BCD码。由于采用软件动态扫描

3、实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。显示时,先取出31H33H某一地址中的数据,然后查得对应的显示位,并从P1口输出,就能显示该地址单元的数据值。计时通过 中断完成,定时溢出中断周期为1ms,当一处中断后向CPU发出溢出中断请求,每发出一次中断请求就对毫秒计数单元进行加一,达到10次就对十毫秒位进行加一,依次类推,直到4.59.99秒重新复位。 再看按键的处理。这两个键可以采用中断的方法,也可以采用扫描的方法来识别。复位键主要功能在于数值复位,对于时间的要求不是很严格。而开始和停止键则是用于对时间的锁定,需要比较准确的控制。因此可以对复位按键采取扫描的方式。而

4、对开始和停止键采用外部中断的方式。设计中包括硬件电路的设计和系统程序的设计。其硬件电路主要有主控制器,显示电路和回零、启动、查看、停表电路等。主控制器采用单片机STC89C52,显示电路采用LCD显示计时时间,两个按键均采用触点式按键。2.硬件设计2.1系统电路设计图2系统电路图显示电路既可以选用液晶显示器,也可以选用数码管显示。我们采用的是数码管显示电路。用2个共阳极LED显示,LED是七段式显示器,内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较

5、少,可以节省单片机的I/O口。在设计中,我们采用LED动态显示,用P0口驱动显示。由于P0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。3. 软件设计3.1软件设计概述在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能,在具体需要时调用相应的模块即可。功能描述:用LCD1602液晶显示秒表,显示时

6、间为0.00.004.59.99秒,每秒自动加1;一个开始暂停键,一个清零键。这里采用顺序结构,通过对按键的扫描,判断要实现什么功能。如下所示:图3 程序流程图4. 测试数据及设计结果1、按下P1.0管脚的开关时,显示数据,如下图所示图4.1 系统运行图2、按下P1.1S管脚的开关时,数据清零,如下图所示图4.1 系统运行图参考文献1 刘国强,唐东红,李兴伟. 基于AT89C51单片机的高精度测温系统的研制J. 仪器仪表学报. 2005(S1)2 郑善锋,郑华杰,黄其智,尚志红. 利用微机数据处理提高温度测量精度J. 电路与系统学报. 2005(01)3 梁伟. 一种精密的热电阻测温方法J.

7、电子产品世界. 2003(15)4 李学礼,林海峰. 基于Proteus软件的单片机实验室建设J. 单片机与嵌入式系统应用. 2005(09)附录附录:(程序); 定义计时单元地址 MIN EQU 31H ;存放分钟变量 SEC EQU 32H ;存放秒钟变量 DEDA EQU 33H ;存放10ms计数值 ; 按键端口状况值 K1_N EQU 34H ;存放按键当前端口状况值 K1_P EQU 35H ;存放按键上次端口状况值 K1_C EQU 37H ;存放按键计数单元 X EQU 36H ;LCD 地址变量 ; 按键引脚定义 K1 EQU P3.3 ;按键1引脚定义 K2 EQU P3.

8、4 ;按键2引脚定义;LCD 引脚定义 RS EQU P3.5 ;LCD RS引脚定义 RW EQU P3.6 ;LCD RW引脚定义 E EQU P3.7 ;LCD RS引脚定义 ORG 0000H ;程序由地址0开始执行 JMP MAIN ORG 0BH ;定时器0中断地址设置 JMP T0_INT ; 主程序 MAIN: ;开始 MOV SP,#60H ;堆栈指针指向60H CLR E ;E=0,禁止读/写LCD ACALL SET_LCD ;调LCD控制子程序 ACALL INIT ;初始化变量 MOV K1_P,#01H ;按键上次端口设置1 ACALL INIT_TIMER ;调用

9、初始化定时器 ACALL MEU ;调用工作菜单子程序 LOOP:ACALL CONV ;时间计数处理 ACALL LOOP1 ;调用清零键子程序 ACALL KEY ;判断是否有键按下 JZ LOOP ;无键按下转LOOP MOV K1_P,K1_N ;交换数据 ACALL KEY0 ;调用按键功能子程序 JMP LOOP ;跳LOOP处循环 ; 初始变量清零子程序 INIT: ;初始变量清零 CLR A ;A清为零 MOV K1_C,A ;K1_C 初始为0 MOV DEDA,A ;百分秒DEDA初始为0 MOV SEC,A ;秒SEC初始为0 MOV MIN,A ;分MIN初始为0 MO

10、V K1_N,A ;K1_N初始为0 MOV K1_P,A ;K1_P初始为0 CLR TR0 ;启动中断 RET ; ;定时器初始化设置子程序 INIT_TIMER: ;定时器初始化 MOV TMOD,#00000001B ;定时器0模式1 MOV IE, #10000010B ;开通中断 MOV TL0,#LOW(65536-10000);定时初值装入低位 MOV TH0,#HIGH(65536-10000);定时初值装入高位 RET ;中断服务程序 T0_INT: ;定时器T0中断程序 PUSH ACC ;入栈保护 MOV TL0,#LOW(65536-10000) ;重加载 MOV T

11、H0,#HIGH(65536-10000) INC DEDA MOV A,DEDA ;10ms 计数值加1 CJNE A,#100,TT MOV DEDA,#0 INC SEC ;秒加1 MOV A,SEC CJNE A,#60,TT INC MIN ;分加1 MOV SEC,#0 MOV A,MIN CJNE A,#05,TT MOV DEDA,#0 ;百、分、秒单元清0 MOV SEC,#0 MOV MIN,#0 TT: POP ACC ;出栈 RETI ;中断程序返回 ; ;判断键是否按下子程序LOOP1: JB K2,LOOP2 ;判清零键是否按下 JMP MAIN ;跳转主程序处 L

12、OOP2: RET ; 判断K1键是否按下 KEY: CLR A ;A清零 MOV K1_N,A ;A值送入K1_N MOV C,K1 ;K1值送入C RLC A ;同进位标志左移一位 ORL K1_N,A ;两个位作逻辑OR运算 MOV A,K1_N ;K1_N值送入A XRL A,K1_P ;有键按下,A 中内容不为零 RET ;功能键子程序 ;K1键第一次按功能子程序 KEY0: MOV A, K1_P ;K1_P值送入A JB ACC.0,KEY3 ;A的0位是1,转KEY3 INC K1_C ;K1_C加1 MOV A, K1_C ;K1_C值送入A CJNE A,#01H,KEY1

13、 ;K1键是否第一次按? MOV DPTR,#MENU1 ;是,存入MENU1信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 SETB TR0 ;启动中断 RET ;K1键第二次按功能子程序 KEY1: MOV A,K1_C ;K1_C值送入A CJNE A,#02H,KEY2 ;K1键是否第二次按? MOV DPTR,#MENU2 ;是,存入MENU2信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 CLR TR0 ;停止中断 RET ; ;K1键第三次按功能子程序KEY2: MOV A, K1_C ;

14、K1_C值送入A CJNE A, #03H,KEY3 ;K1键是否第三次按? MOV DPTR,#MENU3 ;是,存入MENU3信息 MOV A, #1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 SETB TR0 ;启动中断 RET ;K1键第四按功能子程序KEY3: MOV A,K1_C ;K1_C值送入A CJNE A,#04H,KEY4 ;K1键是否第四次按? MOV DPTR,#MENU4 ;是,存入MENU4信息 MOV A,#1 ;设置第一行显示 CALL LCD_PRINT ;调用显示字符子程序 CLR TR0 ;启动中断 KEY4: RET ;子程

15、序返回 ; LCD显示 ; LCD控制子程序 SET_LCD: ; CLR E ACALL INIT_LCD ;初始化 LCD MOV R5,#10 ACALL DELAY MOV DPTR,#LMESS1 ;指针指到显示消息1 MOV A,#1 ;显示在第一行 ACALL LCD_PRINT ;调用显示字符子程序 MOV DPTR,#LMESS2 ;指针指到显示消息2 MOV A,#2 ;显示在第二行 ACALL LCD_PRINT ;调用显示字符子程序 RET LMESS1: DB ,0 ;LCD 第一行显示消息 LMESS2: DB TIME ,0 ;LCD 第二行显示消息 ;LCD初始

16、化子程序 INIT_LCD: MOV A,#38H ;设置8位、2行、5x7点阵 ACALL WR_COMM ; 调用写指令子程序 ACALL DELAY1 ;调用延时子程序 MOV A,#0CH ;开显示,光标不闪烁 ACALL WR_COMM ;调用写指令子程序 ; ACALL DELAY1 ;调用延时子程序 MOV A,#01H ;清除 LCD 显示屏 ACALL WR_COMM ;调用写指令子程序 ; ACALL DELAY1 ;调用延时子程序 RET ;写指令子程序 WR_COMM: MOV P1,A CLR RS ;RS=0,选择指令寄存器 CLR RW ;RW=0,选择写模式 S

17、ETB E ;E=1,允许读/写LCM ACALL DELAY1 ;调用延时子程序 CLR E ;E=0,禁止读/写LCM RET ;写数据子程序 WR_DATA: MOV P1,A SETB RS ;RS=1,选择数据寄存器 CLR RW ;RW=0,选择写模式 SETB E ;E=1,允许读/写LCD ACALL DE ;调用延时子程序 CLR E ;E=0,禁止读/写LCD ACALL DE ;调用延时子程序 RET ;清除该行 LCD 的字符 CLR_LINE: MOV R0,#24 CL1: MOV A,# ACALL WR_DATA DJNZ R0,CL1 RET ;LCD 存入工

18、作菜单 MEU: MOV DPTR,#MENU0 ;存入工作菜单 MOV A,#1 ;第一行CALL LCD_PRINT RET; 工作菜单 MENU0: DB SECOND-CLOCK 0 ,0 MENU1: DB BEGIN COUNT 1 ,0 MENU2: DB PAUST COUNT 2 ,0 MENU3: DB BEGIN COUNT 3 ,0 MENU4: DB PAUST COUNT 4 ,0 ;菜单显示子程序 ;一行、二行显示字符 LCD_PRINT: CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: ACALL CLR_LINE ;清除该行字符数据 MOV

19、A, #80H ;设置 LCD 的第一行地址 ACALL WR_COMM ;写入命令 JMP FILL LINE2: ACALL CLR_LINE ;清除该行字符数据 MOV A,#0C0H ;设置 LCD 的第二行地址 ACALL WR_COMM FILL: CLR A ;填入字符 MOVC A,A+DPTR ;由消息区取出字符 CJNE A,#0,LC1 ;判断是否为结束码 RET ;写入数据 LC1: ACALL WR_DATA INC DPTR ;指针加1 JMP FILL ;继续填入字符 RET ;转换数据子程 CONV: ;转换为 ASCII 码并显示 MOV X,#5 ;设置位置

20、 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#: ; MOV B,X ; ACALL LCDP2 ; MOV A,MIN ;加载分钟数据 INC X ;设置位置 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#: ; MOV B,X ; ACALL LCDP2 ; MOV A,SEC ;加载秒数数据 INC X ;设置位置 ACALL SKOW_LINE2 ;显示数据 INC X ; MOV A,#: ; MOV B,X ; CALL LCDP2 ; MOV A,DEDA ;加载秒数数据 INC X ;设置位置 ACALL SKOW_

21、LINE2 ;显示数据 RET ; ;在 LCD 的第二行显示数字 SKOW_LINE2: MOV B,#10 ;设置被除数 DIV AB ;结果A存商数,B存余数 ADD A,#30H ;A为十位数,转换为字符 PUSH B ;B放入堆栈暂存 MOV B,X ;设置 LCD 显示的位置 ACALL LCDP2 ;由 LCD 显示出来 POP B ;出栈 MOV A,B ;B为个位数 ADD A,#30H ;转换为字符 INC X ;LCD 显示位置加1 MOV B,X ;设置 LCD 显示的位置 ACALL LCDP2 ;由 LCD 显示出来 RET ;在LCD的第二行显示字符 LCDP2:

22、 PUSH ACC ; MOV A,B ;设置显示地址 ADD A,#0C0H ;设置LCD的第二行地址 CALL WR_COMM ;写入命令 POP ACC ;由堆栈取出A CALL WR_DATA ;写入数据 RET ;延时10MSDELAY: MOV R6,#50 D1:MOV R7,#100 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,DELAY RET ;延时5MS子程序 DELAY1: MOV R6,#25 DEY: MOV R7,#100 DJNZ R7,$ DJNZ R6,DEY RET ;延时500微秒 DE: DJNZ R7,$ RET END ;程序结束/

23、C语言#includereg51.h#includelcd1602.hsbit key1 = P10;sbit key2 = P11;unsigned char code disp_data1= SECOND-CLOCK 0;unsigned char code disp_dataq= BEGIN COUNT 1 ;unsigned char code disp_dataw= PAUST COUNT 2 ;unsigned char code disp_datae= BEGIN COUNT 3;unsigned char code disp_datar= PAUST COUNT 4;unsig

24、ned char code disp_data2=TIME 00:00:00:00 ; unsigned char count=0; unsigned char mm = 0; unsigned char m = 0; unsigned char f = 0; void config();void INIT_config();void TimeStop();void main()config();while(1)if(key2 = 0) TimeStop(); config(); count = 1; mm = 0; m = 0; f = 0; if(key1 = 0) if(count =

25、1) LCD_Print(0, 1, disp_dataq); INIT_config(); if( count = 2) TimeStop(); LCD_Print(0, 1, disp_dataw); if( count = 3) LCD_Print(0, 1, disp_datae); INIT_config(); if( count = 4) TimeStop(); LCD_Print(0, 1, disp_datar);count+;DelayMs(50);void config()LCD_INIT();DelayMs(5);LCD_Print(0, 0, disp_data1);L

26、CD_Print(1, 0, disp_data2); void INIT_config() TMOD = 0X01; TH0 = 0xfc; TL0 = 0x18; ET0 = 1; TR0 = 1; EA = 1; void TimeStop() EA = 0; TR0 = 0; void TimeRun() interrupt 1 static unsigned char i = 1;if(i = 10) i = 1; mm +; if( mm = 100) mm = 0; m +; if( m = 60) m = 0;f+; if(f = 60) f = 0 ; LCD_Print_word(1 , 15 , mm%10+48); LCD_Print_word(1 , 14 , mm/10+48); LCD_Print_word(1 , 12 , m%10+48); LCD_Print_word(1 , 11 , m/10+48); LCD_Print_word(1 , 10 , :); LCD_Print_word(1 , 9 , f%10+48); LCD_Print_word(1 , 8 , f/10+48); i+; TH0 = 0xfc; TL0 = 0x18;第 16 页 共 16 页

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1