单片机实验——秒表 (详细步骤)
51单片机电子秒表设计
![51单片机电子秒表设计](https://img.taocdn.com/s3/m/6c09ed9e51e79b8968022683.png)
实验二电子秒表设计(键盘状态转移法)一、实验内容用单片机实现电子秒表的功能,并采用0号键实现计时启动、停止和回零操作。
第一次按0号键,计时开始;第2次按0号键,计时停止;第3次按0号键,计时回零。
初始状态显示0.00;计时状态显示当前计时时间;停止计时显示最后计时时间。
二、实验程序设计对各个状态和各任务号分配如下:0状态:初始状态;1状态:计时状态;2状态:停止计时状态;123号任务:计时归零,显示初始值。
根据上述分析,建立状态表如下:程序流程图如图2.1所示。
表2.1 电子秒表键控状态表图2.1 电子秒表键控主程序流程图参考程序代码如下:LOAD BIT P1.2 ;串行命令加载,上升沿激活DIN BIT P1.0 ;串行数据输出,接CH451的数据输入DCLK BIT P1.1 ;串行数据时钟,上升沿激活DOUT BIT P3.3 ;INT1,键盘中断和键值数据输入,接CH451的数据输出KEY_F BIT 00H ;20H.0位作有键标志位ST EQU 21H ;存状态号KEY EQU 22H ;存放键盘中断中读取的键码KD EQU 23H ;存放键号MSEC EQU 24H ;百分之一秒计数单元SEC EQU 25H ;秒计数单元MIN EQU 26H ;分计数单元ORG 0000HAJMP MAINORG 000BH ;定时器中断入口LJMP CLOCKORG 0013HLJMP CH451_ INT1ORG 100HMAIN: MOV SP, #60H ;系统初始化MOV ST,#0CLR KEY_FMOV KD,#0MOV P1,#60H ;禁止P1接口上的其它芯片ACALL CH451_INIT ;CH451初始化DISP: LCALL DISPLAY ;当前计时值显示ML0: NOPJNB KEY_F,ML0 ;无按键等待CLR KEY_F ;有按键,清按键标志MOV DPTR, #STAB ;计算状态行地址MOV A, STMOV B, #2MUL ABADD A, DPLMOV DPL, AMOV A, BADDC A, DPHMOV DPH, A ;DPTR=#STAB + ST*2MOV A,KD ;读取次状态号RL A ;KD*2MOV R0,AMOVC A,@A+DPTR ;获得次状态号MOV ST,A ;更新STMOV A,R0INC AMOVC A,@A+DPTR ;得到任务号MOV B,#3MUL AB ;每个LJMP占3个字节MOV DPTR,#TASKJMP @A+DPTR ;散转TASK: LJMP P_0 ;跳转子程序0LJMP P_1 ;跳转子程序1LJMP P_2 ;跳转子程序2P_0: …;启动计时程序略,自己编写P_1: …;计时停止程序略,自己编写P_2: …;归零程序略,自己编写;状态表; K0;ST, PRSTAB:DB 1, 1 ; stat0DB 2, 2 ; stat1DB 0, 0 ; stat2;------------------------------------ ------------------------------------ CH451_INIT:略;CH451初始化子程序参考实验一;------------------------------------------------------------------------CH451_INT1: ;键盘中断子程序PUSH PSW ;现场保护PUSH ACCCLR EX1LCALL READ _CH451 ;读取键码ACALL GET_KD ;获得键号POP ACCPOP PSWSETB EX1CLR IE1 ;清中断标志RETI;------------------------------------------------------------------------ READ_CH451:; 略,参考实验一;------------------------------------------------------------------------GET_KD: ;获得键号子程序MOV A,KEYCJNE A,#40H,OUTMOV A,#0 ;0# 键;………在使用多个键的情况下,继续判断其它键号MOV KD,A ;存键号SETB KEY_F ;置有键标志位OUT: RET;------------------------------------------------------------------------CLOCK: ;略,定时器中断服务子程序,自己编写DISPLAY:略,显示子程序,自己编写;----------------------------------------------------------------------------END图2.2 定时器中断服务子程序流程图图2.3 显示子程序流程图二、实验操作步骤1. 打开KEILuvison3软件,建立工程,设置调试环境,实验板上电;2. 输入源程序,编译,连接,加载;3. 运行程序,观察数码管显示应为000.00;4. 按0键,启动计时,数码管显示计时时间;5. 再按0键,停止计时,数码管显示累计时时间;6. 再按0键,计时归零,数码管显示返回初始状态。
单片机课程设计-秒表
![单片机课程设计-秒表](https://img.taocdn.com/s3/m/9447c2dc16fc700aba68fc59.png)
单片机课程设计姓名: 学号: 设计课题: 指导老师: 同组人员: 设计时间: 一、设计目的1.单片机的基本原理及相关的简单应用。
2.掌握用单片机设计系统的一般步骤。
3.了解LED数码管的基本知识和驱动方法。
4•掌握单片机系统各个组成部分的作用以及分布位置5•学会运用单片机的硬件资源。
*********2009 年12 月16二、设计要求1、要求设计一个秒表,精度为00.01秒;2、显示位数为4位;3、有启动、停止、清零功能三、设计工具1.PC机一台2.TDN-MI教学实验系统台(配串行口通讯线)四、元器件4位数码管(1个)、30P瓷片电容(2个)、12M晶振(1个)、12*12键盘(2个)、面包板(1块)、连接线(若干)、10K排阻(1个)五、电路连接1、本系统中“启动/停止”按钮接在外部中断0 口(P3.2);2、本系统中“清零”按钮接在RST脚(第9管教);3、本系统的位选通信号接在P1 口的低四位;4、本系统的LED数据端口使用的是P0口,由于采用了共阴数码管,且面包板上空间有限,未加扩流三极管,只使用了上拉电阻。
5、为使电路工作更加稳定,加了上电复位电路。
详见下图06级电子信息工程单片机课程设计六、设计原理图1、3641数码管脚位图nO1DI01Gco6JGAAiiiiiA Ki i A ii i i ******; l E C D [ f F 帥fi c > r t or ij B C J> F r cDIG*neoA if F ;W*I0 6 61 4 2O O O OI ICM 32、系统电路图19七、程序流程图(1)主函数(2) LED动态扫描(3)外部中断0 (4)定时器0羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊//乂)人羽PIOA诲国庙第工酉&寅易咸诲〃!()Xe|sp piOA 诲国工酉易咸诲//!()Xe|dsip piOA滋国羽券回//:()l!U! P!OA************************* 国羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊Mj9X0'jZX020X0'PZX0'P9X0'99X0hX0'qgxo'90XO‘j£Xo}=[]o|qEl 」Eip psu6isun spoo! 0 = SOBjLU0 = snqsoeix 0 = i^nqsoeix jeqo psu6isunJvbElj = P|OH_se>rs| *qs !0v6e|j = 6e|d _sn;e;s l!qs !6e|j jeqo psu6isun e;epq3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3dD0lzlN00 Nld 羊羊羊羊羊羊羊羊羊羊羊羊羊 *//uM SUUiuj,,spnpuj# ”UN9bai”spnpuj#/羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊91/乙1/60 :晡目妞琴 SLOO:首1糾4視 即磷4》当尊回:#W韋戢 '可劃 '程日 黑44視:來壷44視華矽:@WW羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊羊,MW 6~o *申 //(冯亠)冯一骂占涯诲轟阴呦44孙爭〃! 0 = l^oeiiu*//单诲\[/孙爭〃 口陳舉滋a3i x 君〃冯园骂易咸诲孙爭// 冯三骂易咸诲孙爭// 冯二骂易咸诲孙爭// 冯一骂易咸诲孙爭// ws 韋戢 m WS 可劃/程日"II08X0 da ou!Qp# 0d a31 ou!Qp#:£vid = LC T IOS *qs 2v ・d = LO_|8S *qsiivid =旧 PS *qs :0vid = LV_|8S *qs!£v£d = JBSIO *qs3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.3f.44探屋削酗月寅屋工冒马£因舵90void key() 〃启动停止按钮释放键盘判断{if(ls_KeyS_Hold)if(Start_Stop){Is_KeyS_Hold = 0 ; EXO = 1 ;〃****************display(void delay() {unsigned int i ; for(i = 0; i<300; i++); }void display() {Sel_A1 = 1; Sel_B1 = 1; Sel_C1 = 1; Sel_D1 = 0;LED = table[xiaoshu2];delay();Sel_A1 = 1; Sel_B1 = 1; Sel_C1 = 0;//********************* void main() { init(); while(1){ key(); display 。
单片机秒表实验报告
![单片机秒表实验报告](https://img.taocdn.com/s3/m/6b0b9914580102020740be1e650e52ea5518ceae.png)
单片机秒表实验报告
实验目的:
使用单片机设计并实现一个秒表,能够精确计时。
实验原理:
单片机秒表的设计采用外部中断的方式进行计时。
当按下计时开始按钮时,单片机开始计时,并将计时结果显示在数码管上。
当按下计时停止按钮时,单片机停止计时,并将计时结果保存下来。
实验材料:
1. 单片机开发板
2. 4位数码管
3. 开始按钮
4. 停止按钮
5. 连接线
实验步骤:
1. 将4位数码管连接到单片机的相应引脚上。
2. 将开始按钮连接到单片机的外部中断引脚上。
3. 将停止按钮连接到单片机的外部中断引脚上。
4. 编写程序,设置外部中断的中断服务函数。
5. 在中断服务函数中实现计时功能,将计时结果显示在数码管上。
6. 在主函数中初始化单片机,开始计时。
7. 测试实验是否正常工作。
实验结果:
经过测试,单片机秒表实验正常工作。
当按下开始按钮时,数码管开始计时,实时显示计时结果。
当按下停止按钮时,数码管停止计时,并将计时结果保存下来。
实验总结:
通过本实验,我掌握了使用单片机设计秒表的方法和步骤,加深了对单片机的理解和应用。
同时,我还学会了使用外部中断进行计时,并将计时结果显示在数码管上。
这对于我今后的学习和实践有着重要的指导意义。
单片机实验程序(秒表)
![单片机实验程序(秒表)](https://img.taocdn.com/s3/m/646b6bfcfab069dc5022010e.png)
EXTRN CODE(GetbcdkEY,Display8)BUFFER1 DATA 40HBUFFER2 DATA 60HORG 0000HLJMP MAINORG 000BH ;定时器T0中断LJMP ITOPORG 1000HMAIN:CLR PSW.1 ;先清显示,再接收键盘输入MOV R0,#BUFFER1MOV A,#06H ;按键次数6次LCALL GetBCDKey ;调键盘程序MOV 20H,#1 ;循环次数MOV TMOD,#01H ;计时器T0选择方式一16位计数器MOV TL0,#18HMOV TH0,#0FCHSETB TR0 ;开计时器T0SETB ET0SETB EADAN: JB P1.0, $ ;比较P1.0口(暂停口),若为0,则往下执行,若为1,则在本行等待CLR TR0 ;关计时器,暂停秒表计数JNB P1.0,$ ;比较P1.0口(暂停口),若为1则往下执行,若为0,则在本行等待SETB TR0 ;开计时器,继续秒表计数JB P1.1, DAN ;比较P1.1口(清零口),若为1,则跳DAN(继续等待),若为0,则往下执行(全部清零)MOV 40H,#00 ;微秒单元清零MOV 41H,#00 ;毫秒单元清零MOV 42H,#00 ;秒单元清零SJMP DANITOP:PUSH PSWPUSH ACCMOV TL0,#18H ;计时器T0重新赋初值MOV TH0,#0FCHDJNZ 20H,LOOP ;减1,比较是否为0,不为0则跳LOOPMOV 20H,#1 ;重新赋循环次数MOV A,#01H ;微秒单元+ 1ADD A,40HDA A ;十进制调整MOV 40H,ACJNE A,#99H,LOOP ;微秒单元中的数字和99H比较,若小于等于99H,则跳转到LOOPMOV 40H,#00H ;微秒单元清零MOV A,#01H ;毫秒单元+1ADD A,41HDA AMOV 41H,ACJNE A,#10H,LOOPMOV 41H,#00H ;毫秒单元清零MOV A,#01H ;秒单元+ 1ADD A,42HDA AMOV 42H,ACJNE A,#60H,LOOP ;比较是否过了60秒?过了则清零MOV 42H,#00H ;秒单位请零LOOP:MOV R0,#40H ;寄存器赋初值,为下面做准备MOV R6,#03H ;次数3次MOV R1,#50H ;保存到50H单位中DECOMP:MOV A,@R0SW AP A ;高低字节互换ANL A,#0FH ;取高字节MOV @R1,A ;高字节存到R1INC R1 ;R1 地址+ 1MOV A,@R0ANL A,#0FHMOV @R1,A ;低字节存到R1INC R0INC R1DJNZ R6,DECOMP ;上面从LOOP开始整个的意思就是把40H中的微秒,毫秒,秒的数据放到50H中,然后下面开始在LED上显示MOV R0,#BUFFER2MOV BUFFER2,51HMOV BUFFER2+1,50HMOV BUFFER2+2,53HMOV BUFFER2+3,#10HMOV BUFFER2+4,55HMOV BUFFER2+5,54H MOV BUFFER2+6,#10H MOV BUFFER2+7,#10H LCALL Display8POP ACCPOP PSWRETIEND。
单片机课程设计之多功能秒表
![单片机课程设计之多功能秒表](https://img.taocdn.com/s3/m/a7ac06ba1a37f111f1855bc6.png)
单片机报告—————多功能秒表实验者:蒋晓婷班级:2008级电自9班学号:20080711304组员:丁秀香一、实验要求1.硬件电气原理图一张(含元器件清单一份;所有引脚标注清楚)2、软件程序清单一套(含主要程序流程图,全部源程序及详细的注释)3、使用功能说明书一份(含功能描述及操作指南和收获体会)4、软件在开发板上调试成功,并能成功表演,达到设计课题的要求二、实现要求秒表功能1、设计可以显示0.1—100s的秒表,最小单位为毫秒;2、通过按键控制秒表清零、暂停、继续、退出等功能;3、具有倒计时功能;4、秒表可以分组存储,批量显示;5、显示北京时间;6、可利用蜂鸣器添加提示音。
附加功能1、利用实时钟芯片,显示年月日以及星期;2、选择蜂鸣器电路,实现闹钟设置和报警功能;3、可以通过按键调整日期、时间;4、可以设置两组闹钟,闹钟时间到,蜂鸣器响;5、利用蜂鸣器实现整点报时。
三、硬件原理:ADUC848管脚图如下图所示。
Pin1~4:(P1.0~P1.3)作为矩阵式键盘或独立按键的输入,P1口只能用于输入,默认用于模拟输入,作为数字输入使用时应先往P1口相应引脚写0,这里可以用P0&=0xf0。
若P2、P3、P0口要作为输入,则应往相应引脚写1。
Pin5、6:AVDD、AGND,模拟电源输入。
Pin7、8:外部参考电压接入,Pin7接AGND。
片内DAC有2.5V内部参考,ADC有1.25V内部参考。
Pin9、10:(P1.4、P1.5)两路AD输入,可做差分输入,需要设置ADC的寄存器。
Pin11、12:(P1.6、P1.7)各200uA激励电流源,可配合RTD等做应用。
Pin13:两路AD输入做普通输入时的电压参考端,AD输入电压不能低于此引脚电压。
Pin14:片内DAC输出。
Pin15:复位引脚。
Pin16、17:单片机RS232接口的RXD(P3.0)TXD(P3.1)。
Pin18:(P3.2)外部中断0,用于红外接收和PS/2接口。
51单片机秒表程序设计
![51单片机秒表程序设计](https://img.taocdn.com/s3/m/bd127e1d4a35eefdc8d376eeaeaad1f3469311ad.png)
51单片机秒表程序设计1. 简介秒表是一种用于测量时间间隔的计时器,常见于体育比赛、实验室实验等场合。
本文将介绍如何使用51单片机设计一个简单的秒表程序。
2. 硬件准备•51单片机开发板•LCD液晶显示屏•按键开关•连接线3. 程序流程3.1 初始化设置1.设置LCD液晶显示屏为8位数据总线模式。
2.初始化LCD液晶显示屏。
3.设置按键开关为输入模式。
3.2 主程序循环1.显示初始界面,包括“00:00:00”表示计时器初始值。
2.等待用户按下开始/暂停按钮。
3.如果用户按下开始按钮,则开始计时,进入计时状态。
4.如果用户按下暂停按钮,则暂停计时,进入暂停状态。
5.在计时状态下,每隔1毫秒更新计时器的数值,并在LCD液晶显示屏上显示出来。
6.在暂停状态下,不更新计时器的数值,并保持显示当前数值。
3.3 计时器控制1.定义一个变量time用于存储当前的计时器数值,单位为毫秒。
2.定义一个变量running用于标记计时器的状态,0表示暂停,1表示运行。
3.定义一个变量start_time用于存储计时器开始的时间点。
4.定义一个变量pause_time用于存储计时器暂停的时间点。
5.在计时状态下,每隔1毫秒更新time的值为当前时间与start_time的差值,并将其转换为小时、分钟、秒的表示形式。
6.在暂停状态下,保持time的值不变。
3.4 按键检测1.检测按键开关是否被按下。
2.如果按键被按下,判断是开始/暂停按钮还是复位按钮。
3.如果是开始/暂停按钮,并且当前处于计时状态,则将计时状态设置为暂停状态,并记录暂停时间点为pause_time;如果当前处于暂停状态,则将计时状态设置为运行状态,并记录开始时间点为当前时间减去暂停时间的差值。
4.如果是复位按钮,则将计时器数值重置为0,并将计时状态设置为暂停。
4. 程序代码示例#include <reg51.h>// 定义LCD控制端口和数据端口sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_EN = P1^2;sbit LCD_D4 = P1^3;sbit LCD_D5 = P1^4;sbit LCD_D6 = P1^5;sbit LCD_D7 = P1^6;// 定义按键开关端口sbit START_PAUSE_BTN = P2^0;sbit RESET_BTN = P2^1;// 定义全局变量unsigned int time = 0; // 计时器数值,单位为毫秒bit running = 0; // 计时器状态,0表示暂停,1表示运行unsigned long start_time = 0; // 开始时间点unsigned long pause_time = 0; // 暂停时间点// 函数声明void delay(unsigned int ms);void lcd_init();void lcd_command(unsigned char cmd);void lcd_data(unsigned char dat);void lcd_string(unsigned char *str);void lcd_clear();void lcd_gotoxy(unsigned char x, unsigned char y);// 主函数void main() {// 初始化设置lcd_init();while (1) {// 显示初始界面lcd_clear();lcd_gotoxy(0, 0);lcd_string("00:00:00");// 等待用户按下开始/暂停按钮while (!START_PAUSE_BTN && !RESET_BTN);// 判断按钮类型并处理计时器状态if (START_PAUSE_BTN) {if (running) { // 当前处于计时状态,按下按钮将进入暂停状态 running = 0;pause_time = time;} else { // 当前处于暂停状态,按下按钮将进入计时状态running = 1;start_time = get_current_time() - pause_time;}} else if (RESET_BTN) { // 复位按钮按下,重置计时器time = 0;running = 0;}}}// 毫秒级延时函数void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--) {for (j = 110; j > 0; j--);}}// LCD初始化函数void lcd_init() {lcd_command(0x38); // 设置8位数据总线模式lcd_command(0x0C); // 显示开,光标关闭lcd_command(0x06); // 光标右移,不移动显示器lcd_command(0x01); // 清屏}// 向LCD发送指令函数void lcd_command(unsigned char cmd) {LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_D4 = cmd >> 4 & 1;LCD_D5 = cmd >> 5 & 1;LCD_D6 = cmd >> 6 & 1;LCD_D7 = cmd >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = cmd >> 0 & 1;LCD_D5 = cmd >> 1 & 1;LCD_D6 = cmd >> 2 & 1;LCD_D7 = cmd >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送数据函数void lcd_data(unsigned char dat) { LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_D4 = dat >> 4 & 1;LCD_D5 = dat >> 5 & 1;LCD_D6 = dat >> 6 & 1;LCD_D7 = dat >> 7 & 1;delay(1);LCD_EN = 0;LCD_D4 = dat >> 0 & 1;LCD_D5 = dat >> 1 & 1;LCD_D6 = dat >> 2 & 1;LCD_D7 = dat >> 3 & 1;delay(1);LCD_EN = 0;}// 向LCD发送字符串函数void lcd_string(unsigned char *str) {while (*str) {lcd_data(*str++);delay(5);}}// 清屏函数void lcd_clear() {lcd_command(0x01);}// 设置光标位置函数void lcd_gotoxy(unsigned char x, unsigned char y) {unsigned char addr;if (y == 0)addr = x | (0x80 + y);else if (y == 1)addr = x | (0xC0 + y);lcd_command(addr);}5. 总结本文介绍了使用51单片机设计一个简单的秒表程序。
单片机秒表计时器
![单片机秒表计时器](https://img.taocdn.com/s3/m/71588c19964bcf84b9d57b13.png)
目录摘要 (3)一、实训目的 (3)二、实训设备与器件 (3)(1)实验设备 (3)(2)实训器件 (3)三、实训步骤与要求 (4)(1)要求 (4)(2)方法 (4)(3)实训线路分析 (4)(4)软件设计 (4)(5)程序编制 (4)四、硬件系统设计 (4)五、软件系统设计 (5)六、系统调试 (9)七、实训总结与分析 (10)八、参考资料: (11)九、附录 (12)摘要:秒表是由单片机的P0口和P2口分别控制两个数码管,使数码管工作,循环显示从00—59。
同时,用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位,通常还使用石英晶体振荡器电路构成整个秒表的结构电路。
一、实训目的(1)利用单片机定时器中断和定时器计数方式实现秒定时。
(2)通过LED显示程序的调整,熟悉单片机与LED的接口技术,熟悉LED动态显示的控制过程。
(3)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。
(4)进一步学习单片机开发系统的整个流程。
二、实训设备与器件(1)实训设备:单片机开发系统、微机、万用表、电烙铁等。
(2)实训器件:名称数量7段数码管 2电阻10k 1电阻1k 8键盘开关 1电容10微法 1电容30皮法 2晶振12M 189C51 1万能板 1导线若干三、实训步骤与要求(1)要求:利用实训电路板,以2位LED右边1位显示个位,左边1位显示十位,实现秒表计时显示。
以一个按键开关实现启动、停止、清零等功能。
(2)方法:用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器0方式1计数,实现00--59计数。
(3)实验线路分析:采用实训电路板,其原理图参见附录。
两个7段LED 数码管分别由单片机的P0口和P2口控制,使数码管显示从00—59的字样。
用一个开关控制数码管的启动与停止,另外加上一个复位电路,使其能正常复位。
单片机-简易秒表-正计时时间可设置-倒计时时间可查询-报警三秒.doc.
![单片机-简易秒表-正计时时间可设置-倒计时时间可查询-报警三秒.doc.](https://img.taocdn.com/s3/m/144137b8102de2bd960588cd.png)
第一章设计内容和要求设计任务用AT89C52设计一个4位的LED数码作为多功能“秒表”。
设计目的1.学习数码管显示的结构和工作流程,实现数码管分组显示数字组合。
2.学习有关单片机的内容,进一步了解AT89C52芯片的相关功能。
3.复习C语言的相关知识。
4.培养自学能力和探索解决问题的能力。
设计要求显示时间为00分00秒-59分59秒,每1秒自动加1,另外设计一个“开始/暂停”键、一个“记录/查询”键、一个“清零”键、一个“模式切换”键、一个“时间设置”键、一个“复位”键。
秒表要求正计时时,可记录并且查询10组数据,倒计时时,时间用户可设置,并且时间到时蜂鸣器报警。
设计创新在基本设计基础上添加了正向查询10条记录后蜂鸣器同时报警。
设计意义简易秒表具有读取方便,显示直观,功能多样,电路简洁,成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
本次设计将基于单片机的工作原理,设计简易秒表的基本电路,深入的了解其工作原理,掌握其基本的工作特点。
同时简易秒表在生活中应用广泛,从实际出发,不断创新。
第二章方案设计与选择技术可行性20世纪以来,微电子,IC集成电路行业发展迅速,其中单片机行业发展最引人注目。
单片机利用大规模集成电路技术把中央处理器和数据存储器(RAM),程序存储器(ROM)及其他I/O通信口集成在一块芯片上,构成最小的计算机系统。
如今的单片机发展集成了更多的特殊功能单元,例如A/D,D/A转换器,通信控制,DMA,PWM控制输出单元等。
因此,只要外加一些扩展电路及必要的通道接口就可以构成各种计算机应用系统。
单片机除了具备体积小,价格低,速度快,用途广,可靠性高等特点,在硬件结构和指令设置上还有以下独特之处:1.存储器ROM和RAM是严格分工的。
前者存放程序,常数和数据表格,后者存放临时数据和变量。
2.采用面向控制的指令系统,构成的应用系统有较大的可靠性。
大部分测控功能由软件实现,故具有柔性特征,不须改变硬件系统就能适当的改变系统功能。
单片机设计秒表
![单片机设计秒表](https://img.taocdn.com/s3/m/1eb02c5ea55177232f60ddccda38376baf1fe083.png)
单片机设计秒表
设计一个单片机秒表需要以下步骤:
1. 选择合适的单片机:需要选择一个具有定时/计数器功能的单片机,比如常见的STC89C52、AT89S52等。
2. 连接外部硬件:将单片机与LCD显示屏、按键等外部硬件连接起来。
其中,LCD显示屏用于显示秒表的计时结果,按键用于启动/停止计时和复位秒表。
3. 编写程序:使用C语言或汇编语言编写单片机程序,实现秒表的计时、显示和控制功能。
具体包括:
a. 初始化各个端口和定时器/计数器,设置中断服务程序;
b. 等待用户按下启动按钮,开始计时,并对按键进行检测;
c. 每隔一定时间(比如10ms)更新计时器/计数器的值,并将其转换为小时、分钟、秒和毫秒的形式;
d. 将计时结果输出到LCD屏幕上,实时更新;
e. 如果用户按下停止按钮,则暂停计时;如果用户按下复位按钮,则清零计时器/计数器,并重新开始计时。
4. 调试测试:将程序下载到单片机中,通过按键测试和观察LCD 显示结果进行调试测试,确保秒表能够正常工作。
以上就是设计一个单片机秒表的基本步骤,需要充分了解单片机原理和编程知识才能完成。
利用51单片机制作秒表的详细过程
![利用51单片机制作秒表的详细过程](https://img.taocdn.com/s3/m/455521426bd97f192279e9b3.png)
利用51单片机制作秒表的详细过程
前面的话:
和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这个秒表制作出来,为了给以后的朋友们一些思路,一些参考,所以在这里我把自己制作的整个详细过程整理出来供大家参考。
我调试出来是没有问题的,各方面都稳定运行,由于我水平有限,中间可能会有不对的地方,欢迎大家指正,我们一起学习,一起进步!
我将分为三个部分来介绍:1.整体思路,2.硬件电路方面,3.软件编程方面。
1、整体思路
利用51单片机制作秒表时,我介绍精确到十分位(即0.1s)的制作,并让其拥有启动,暂停,复位三个功能。
用到的单片机部分:定时器部分,独立按键的检测与应用,数码管的显示,并结合一些简单的程序即可实现。
用5位数码管来进行显示,分别显示秒的十分位,秒的个位,秒的十位,分的个位,分的十位。
用定时器定时50ms,2个定时器中断即是0.1s,即秒的十分位,20个定时器中断即是1s,60个1s即是1分钟,通过程序将5位数码管的值分离出来,并进行显示。
这就是我在数码管显示方面的思路,如果不是太清楚,结合我下面软件编程方面的程序来看你可能就会明白,我会在那部分做详细介绍,看完了可能你就懂了。
利用独立按键设置启动/暂停键和清零键,利用独立按键的检测,若启动/暂停按键按下,秒表则启动或者暂停,按下复位键,秒表清零复位。
我在程序后面全都有注释,不用担心。
看完你就会明白了。
这是我制作的的流程图:。
《单片机原理与应用》秒表设计实验
![《单片机原理与应用》秒表设计实验](https://img.taocdn.com/s3/m/f5fe2ceecf2f0066f5335a8102d276a201296063.png)
《单片机原理与应用》秒表设计实验
一、实验目的和要求
1、掌握数码管显示的基本原理
2、掌握数码管动态和静态显示在单片机上的实现。
二、实验内容和原理
在编程软件配合下,要求实现如下功能:数码管的初始显示值为“00”;当1s产生时,秒计数器加1;秒计数器到60时清0,并从“00”重新开始,如此周而复始。
软件编程原理为:采用T0定时方式1中断法编程,其中1s定时采用20次50ms定时中断的方案实现,编程流程图如图3-1所示。
三、主要仪器设备
电脑、keil c51、Protues软件
四、操作方法与实验步骤
1、了解GL10实验箱中数码管硬件电路,电路如图5-1所示
图3-1 数码管硬件电路
2、启动PC机,按照GL10硬件安装指导书(附件2)和 GL10驱动程序安装指导书(附件完成PC和GL10实验箱的连接
3、打开预习完成的LED流水灯程序,建立本实验的项目文件,接着建立源程序,编译无误后,生成HEX文件。
4、利用杜邦线完成单片机IO口和CN19接插件电气连接。
5、运行STC-ISP软件,将程序烧写到单片机中,观察程序运行结果。
五、实验数据记录和处理
Keil代码:
电路图:
六、实验结果与分析仿真结果:
上板实操结果:
实验分析:
两位数码管,显示0-59的数值,实现秒表功能,每个一秒数码管的数值加一。
七、讨论和心得
本次实验采用T0定时方式1中断法编程,其中1s定时采用20次50ms定时中断的方案实现,经过本次实验我掌握了数码管显示的基本原理以及数码管动态和静态显示的方法,加深了我对中断程序和寄存器的理解。
单片机实验——秒表(详细步骤)
![单片机实验——秒表(详细步骤)](https://img.taocdn.com/s3/m/48677a0e240c844769eaeee5.png)
在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。本子情境中采用软件去抖。
{
delay(10);//延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测
temp=0; //将变量temp的值清零
shi=0; //将十位清零
ge=0; //将个位清零
TR0=0; //关闭定时器
}
}
display(shi,ge); //调用显示子函数
sbit key1=P3^0; //定义"启动"按钮
sbit key2=P3^1; //定义"停止"按钮
sbit key3=P3^2; //定义"复位"按钮
uchar temp,aa,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
TR0=1; //启动定时器开始工作
}
}
if(key2==0) //检测"停止"按钮是否按下
{
delay(10); //延时去抖动
if(key2==0) //再次检测"停止"按钮是否按下
{
单片机技术简易秒表教程
![单片机技术简易秒表教程](https://img.taocdn.com/s3/m/f459bef4d5bbfd0a795673d3.png)
GATE C/T
M1
M0 GATE C/T
M1
M0
0
0
0
0
0
0
0
1
T1
T0
指令:MOV TMOD,#01H;则可以使T0工作在方式1状态
若要设置T1为计数方式1,指令是怎样?
1
1
3
T0 分成两个独立的 8 位计数器, T1 在方式 3 时停止 工作
《单片机技术》项目化课程
2. C/T 定时器方式或计数器方式选择位
若C/T=1时, 为计数器方式; C/T = 0时, 为定时器方式。
3. GATE 定时器/
若GATE=0时, 则只要 TR0 (或 TR1)置 1, 定时器 /计数器就被选通, 而 不管 INT0 (或 INT1)的电平是高还是低。 若GATE=1时, INT0 (或INT1)引脚为高电平且TR0(或TR1 )置 1 时, 相应 的定时器 /计数器才被选通工作, 这时可用于测量在INTx端出现的正脉冲 的宽度。
(1)选择工作方式 (2)计算机定时器的初值 (3)重复循环次数。 (4)绘制程序流程图,编写程序。 (5)绘制PROTEUS图,调试程序。
《单片机技术》项目化课程
程序设计流程图(task4-3-3.asm)
开始 T0工作初始化 数码管显示的初始值
T0溢出标志位 N
TF0 = 1?
Y
T0重新赋初值
①
N (41H) +1
N (40H) +1
①
秒个位 (41H) = 9 ?
利用51单片机制作一个秒表的详细过程
![利用51单片机制作一个秒表的详细过程](https://img.taocdn.com/s3/m/996ba0acfc0a79563c1ec5da50e2524de518d0ee.png)
利用51单片机制作一个秒表的详细过程利用51单片机制作一个秒表的详细过程前面的话:和很多朋友一样,在学51单片机的过程中我们肯定会涉及到制作一个秒表,牵涉到把单片机的多个部分组合起来使用,这对于我们初学者来说可能显得有些困难,我同大家一样,百思不得其解,最后头都弄大了才把这个秒表制作出来,为了给以后的朋友们一些思路,一些参考,所以在这里我把自己制作的整个详细过程整理出来供大家参考。
我调试出来是没有问题的,各方面都稳定运行,由于我水平有限,中间可能会有不对的地方,欢迎大家指正,我们一起学习,一起进步!我将分为三个部分来介绍:1.整体思路,2.硬件电路方面,3.软件编程方面。
1.整体思路利用51单片机制作秒表时,我介绍精确到十分位(即0.1s)的制作,并让其拥有启动,暂停,复位三个功能。
用到的单片机部分:定时器部分,独立按键的检测与应用,数码管的显示,并结合一些简单的程序即可实现。
用5位数码管来进行显示,分别显示秒的十分位,秒的个位,秒的十位,分的个位,分的十位。
用定时器定时50ms,2个定时器中断即是0.1s,即秒的十分位,20个定时器中断即是1s,60个1s即是1分钟,通过程序将5位数码管的值分离出来,并进行显示。
这就是我在数码管显示方面的思路,如果不是太清楚,结合我下面软件编程方面的程序来看你可能就会明白,我会在那部分做详细介绍,看完了可能你就懂了。
利用独立按键设置启动/暂停键和清零键,利用独立按键的检测,若启动/暂停按键按下,秒表则启动或者暂停,按下复位键,秒表清零复位。
我在程序后面全都有注释,不用担心。
看完你就会明白了。
这是我制作的的流程图:“ms100”表示秒的十分位,'s'表示秒的个位,“s1”表示秒的十位,“min”表示分的个位,“min1”表示分的十位。
“cnt”表示秒的计数位,即多少个一秒,定时满一秒加1,“minu”表示分的计数位,即多少个一分钟,一分钟加1,这个流程图提供了大致思路,要结合下面的程序部分一起看。
单片机00.0~59.9秒表设计
![单片机00.0~59.9秒表设计](https://img.taocdn.com/s3/m/ca184bbf5fbfc77da369b16a.png)
目录1实验设计的目的和任务1.1 单片机秒表实验的概述1.2系统设计思路及描述1.3 系统设计任务和要求2软件与硬件设计2.1系统硬件方案设计2.2软件方案设计3 程序流程及实验效果3.1源程序及说明3.2原理图分析3.3实验效果1. 实验设计的目的和任务1.1单片机秒表实验的概述一、实验题目秒表系统设计——用STC89C52RC设计一个3位LED数码显示“秒表”,显示时间为00.0~59.9秒,每毫秒自动加一,每十毫秒自动加一秒。
二、增加功能增加一个“复位00.0”按键(即清零),一个“暂停”和“开始”按键,一个“复位60.0”按键(用来60秒倒计时),一个倒计时“逐渐自减”按键。
三,实验难点单片机电子秒表需要解决三个主要问题,一是有关单片机定时器(一个控制顺序计时,一个控制倒计时)的使用;二是如何实现LED的动态扫描显示;三是如何对键盘输入进行编程。
四、实验内容提要本实验利用单片机的定时器/计数器定时和记数的原理,结合集成电路芯片8051、LED 数码管以及实验板上的按键来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计时,数码管能够正确地显示时间。
其中本实验设计了四个开关按键:其中key2按键按下去时开始计时,即秒表开始键(同时也用作暂停键),key1按键按下去时数码管清零,复位为“00.0”,key3按键按下去时数码管复位为“60.0”(用于倒计时),key4按键按下去则是数码管开始“逐渐自减”倒计时。
实验的意义1)通过本次课程设计加深对单片机课程的全面认识复习和掌握,对单片机课程的应用进一步的了解。
2)掌握定时器、外部中断的设置和编程原理。
3)通过此次课程设计能够将单片机软硬件结合起来,对程序进行编辑,校验。
4)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零,并同时可以用数码管显示,在现实生活中应用广泛,具有现实意义实验仪器集成电路芯片8051,七段数码管,51hei单片机开发板,MCS-51系列单片机微机仿真实验系统中的软件(Keil uvision2)1.2系统设计思路及描述该实验要求进行计时并在数码管上显示时间,则可利用MCS-51系列单片机的芯片AT89C52的P3.4,P3.5,P3.6,P3.7作为按键的入口;定时器T0作为每0.1秒减一的定时器;定时器T1作为每0.1秒加一的定时器。
单片机秒表实验报告
![单片机秒表实验报告](https://img.taocdn.com/s3/m/8f51b2e5250c844769eae009581b6bd97f19bc3a.png)
单片机秒表实验报告实验目的:本实验旨在通过使用单片机搭建一个简单的秒表,掌握单片机的基本输入输出方法和定时器的使用,提高对单片机的编程能力。
实验器材:1. STC89C52单片机开发板2. 4位共阳数码管3. 74HC595移位寄存器4. 按钮开关5. 连接线实验原理:秒表是一种测量时间的工具,通常用于计时。
在本实验中,我们将使用单片机来实现一个简单的秒表功能。
通过使用定时器中断,每隔一定的时间更新数码管上显示的时间,实现秒表的计时功能。
同时,通过按下按钮开关,可以控制秒表的启动、暂停和复位。
实验步骤:1. 将STC89C52单片机开发板与4位共阳数码管、74HC595移位寄存器和按钮开关连接。
2. 将开发板上的相应引脚与数码管和移位寄存器的引脚连接,确保连接正确。
3. 在单片机的主函数中初始化定时器和外部中断,并设置定时器的中断时间为1秒。
4. 在定时器中断函数中,每隔1秒更新数码管上的显示时间。
可以使用循环方式实现时间的累加和更新。
5. 在外部中断函数中,根据按钮开关的状态,实现秒表的启动、暂停和复位功能。
6. 编译、下载程序到单片机开发板,并将开发板上电。
7. 按下按钮开关开始计时,再次按下暂停计时,再次按下继续计时,再次按下复位计时。
8. 观察数码管上显示的时间是否正确,并测试秒表功能是否正常。
实验结果:经过测试,本实验搭建的单片机秒表功能正常,能够准确计时,并可以通过按钮开关实现启动、暂停和复位功能。
结论:通过本实验,我们成功地使用单片机搭建了一个简单的秒表,并实现了基本的计时功能。
同时,通过掌握单片机的定时器和外部中断的使用,我们提高了对单片机的编程能力。
这对于进一步深入学习和应用单片机具有重要的意义。
单片机课程设计--数字式秒表
![单片机课程设计--数字式秒表](https://img.taocdn.com/s3/m/b5eb0c2add36a32d73758165.png)
湖南工学院单片机课程设说明书数字式秒表学生姓名:**系部:电气与信息工程系指导教师:**专业:自动化班级:自本1001班完成时间:2012年12月18号目录第1章数字式秒表的设计介绍 (1)1.1设计任务及功能要求 (1)1.2数字式秒表的方案介绍及工作原理说明 (1)第二章数字式秒表硬件系统的设计 (3)2.1 AT89S52芯片的介绍 (3)2.2 时钟电路的介绍 (4)2.3 复位电路的介绍 (4)2.4 键盘电路的介绍 (5)2.5 驱动及显示电路的介绍 (6)2.6 单片机下载口电路 (6)第三章数字式秒表软件系统的设计 (7)3.1 数字式秒表使用单片机资源情况 (7)3.2 主程序流程图 (8)3.3 秒表的工作流程图 (9)3.4 显示程序流程图 (10)3.5 按键扫描流程图 (11)3.6软件系统程序清单 (11)第4章设计结果及误差分析 (12)4.1 数字式秒表的设计结论及使用说明 (12)4.2 调试软件介绍 (12)4.3 程序仿真与结果 (13)4.4 KEIL uVision3简介 (15)4.5 proteus的简介 (15)4.5 误差分析及解决方法 (16)第五章数字式秒表的设计体会及课程教学建议 (17)5.1 秒表的课程设计体会 (17)5.2 课程教学建议 (17)参考文献 (19)附录A 原理图 (20)附录B PCB图、布局图、实物图 (21)附录C 程序 (24)附录 D 元器件清单 (26)第1章数字式秒表的设计介绍1.1设计任务及功能要求由单片机接收小键盘控制递增计时,由LED 显示模块计时时间,显示格式为 00-59(分)00-59(秒).00-99(毫秒),精确到0.01s的整数倍。
绘制系统硬件接线图,并进行系统仿真和实验。
画出程序流程图并编写程序实现系统功能。
使用单片机AT89S52作为主要控制芯片,以四位一体共阳极数码显示管通过三极管驱动作为显示部分,设计一个具有特定功能的数字式秒表。
单片机c语言秒表显示实验
![单片机c语言秒表显示实验](https://img.taocdn.com/s3/m/eb2683ac284ac850ad0242eb.png)
秒表显示实验一.实验目的1. 这个实验是设计一个程序,可以通过单片机让数码管显示从00开始每秒自动加一至99(不熟练的可先设计一个数码管的显示)到99后自动清零,从00开始继续计时。
2. 在做这个实验时要用到更新显缓存这种方法。
3. 让学生更熟悉keil软件的应用,对单片机C语言能更好的应用。
二. 实验过程1.对程序开发环境进行处理(打开软件,建工程,保存工程,建文件,文件加到工程里)。
2编程序,用更新显缓存:#include"AT89X51.H"//************************#define uchar unsigned char#define uint unsigned int//************************uint second;uchar disbuf[4];uchar codeLED[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,0x00}void delay_nms(unit nms){}//延时void update_disbuf(void){uint tmp16bit;tmp16bbit = second;disbuf[0] = LED[tmp16bit%10]tmp16bit=tmp16bit/10disbuf[1] = LED[tmp16bit%10]tmp16bit=tmp16bit/10disbuf[2] = LED[tmp16bit%10]tmp16bit=tmp16bit/10disbuf[3] = LED[tmp16bit%10]}void main(void){sp = 0x70;P1_4 = 0;P0 = 0xff;second = 0;update_disbuf();while(1){P0 = disbuf[0];delay nms(1000);second++;update_disbuf();}} //end3.完成整个程序:#include"AT89X51.H"#include"intrins.h"//==============================#define uint unsigned int#define uchar unsigned charuint second;uchar disbuf[4];sbit wei=P2^7;sbit duan=P2^6;uchar codeLED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f };//============================== void delay_ms(uint nms){uint i,j;for(i=0;i<nms;i++){for(j=0;j<99;j++){_nop_();_nop_();}}}//============================== void update_disbuf(){delay_ms(1000);second++;disbuf[0]=second%10;disbuf[1]=second/10%10;disbuf[2]=second/100%10;disbuf[3]=second/1000%10;}//============================== void main(){second=0;wei=1;P0=0xdf;wei=0;duan=1;P0=LED[0];while(1){update_disbuf();P0=LED[ disbuf[0]];}}4.对程序进行保存编译,无错后,点击target options,在点击OUTPUT后,生成.hex文件,将程序下载到开发板上,观察实验效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简易秒表制作
1子情境内容:制作简易秒表,利用按键构成键盘实现秒表的启动、停止与复位,利用LED数码管显示时间。
2 子情境目标:
(1)通过简易秒表的制作,进一步熟悉LED数码管与单片机的接口电路(2)学习定时/计数器、中断技术的综合运用并会使用简易键盘
3 知识点链接
独立式按键的使用:图5-49为按键与单片机的连接图。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。
其抖动过程如图5-50所示,抖动时间的长短与开关的机械特性有关,一般为5~10ms。
在触点抖动期间检测按键的通与断状态,可能导致判断出错。
即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。
为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。
本子情境中采用软件去抖。
图按键与单片机连接图图按键被按下时电压的变化
4 任务步骤
4.1 步骤一:PROTEUS电路设计,简易秒表的原理图如图5-51所示。
1、选取元器件
①单片机:AT89C51
②两位共阴极蓝色数码管:7SEG-MPX2-CC-BLUE
③排阻:RESPACK-8
④按钮:BUTTON
2、放置元器件、放置电源和地、连线、元器件属性设置
简易秒表的原理图如图5-51所示,整个电路设计操作都在ISIS平台中进
行。
与子情景3相似,故不详述。
图简易秒表的原理图4.2 步骤二:源程序设计与目标代码文件生成(1)程序流程图
主程序
图5-52 秒表流程图
(2)源程序设计
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定义"启动"按钮
sbit key2=P3^1; //定义"停止"按钮
sbit key3=P3^2; //定义"复位"按钮
uchar temp,aa,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71}; //共阴极数码管编码
void display(uchar shi,uchar ge); //声明显示子函数
void delay(uint z); //声明延时子函数
void init(); //声明初始化函数
void main()
{
init(); //调用初始化子程序
while(1)
{
if(key1==0) //检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为
0,那么!key1始终为1,程序就一直停在此
while语句处
TR0=1; //启动定时器开始工作
}
}
if(key2==0) //检测"停止"按钮是否按下
{
delay(10); //延时去抖动
if(key2==0) //再次检测"停止"按钮是否按下
{
while(!key2); //松手检测
TR0=0; //关闭定时器
}
}
if(key3==0) //检测"复位"按钮是否按下
{
delay(10); //延时去抖动
if(key3==0) //再次检测"复位"按钮是否按下
{
while(!key3); //松手检测
temp=0; //将变量temp的值清零
shi=0; //将十位清零
ge=0; //将个位清零
TR0=0; //关闭定时器
}
}
display(shi,ge); //调用显示子函数
}
}
void delay(uint z) //延时子函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar shi,uchar ge) //显示子程序
{
P2=0xbf;
P0=table[shi];
delay(10);
P2=0x7f;
P0=table[ge];
delay(10); //使用动态扫描的方法实现数码管显示
}
void init() //初始化子程序
{
temp=0;
TMOD=0x01; //使用定时器T0的方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定时50ms中断一次
EA=1; //中断总允许
ET0=1; //允许定时器T0中断
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;//重新赋初值
TL0=(65536-50000)%256;
aa++; //中断一次变量aa的值加1
if(aa==20) //中断20次后,定时时间为20*50ms=1000ms=1s,
将变量temp的值加1
{
aa=0;
temp++;
if(temp==60) //秒表到达60s后回零
{
temp=0;
}
shi=temp%100/10;
ge=temp%10; //分离个位和十位
}
}
4.3 步骤三:PROTEUS仿真
加载目标代码文件,双击编辑窗口的AT89C51器件,在弹出属性编辑对话框Program File一栏中单击打开按钮,出现文件浏览对话框,找到miaobiao.hex 文件,单击“打开”按钮,完成添加文件。
单击按钮,启动仿真,仿真运行片段如图所示。
按下“启动”按钮后,秒表开始计时,如图所示。
按下“停止”按钮,秒表停止计时。
按下“复位”按钮,秒表回到最初始的状态,如图所示。
图按下“启动”按钮后秒表开始计时
图按下“复位”按钮后,秒表回到最初始的状态
5 扩展练习
此子情境设计的秒表只能显示两位整数,如果要记录110跨栏12:88秒的成绩,则必须再增加两位数码管来显示小数位。
想想硬件和软件应该做如何改动。