求用单片机设计一个秒表AT89C51
做了一个4位数码管的,可以计时到9分59.9秒
KEYVAL EQU 30HDAT EQU 33HSCANLED EQU 39HCLK EQU 77HSEC EQU 78HSEC1 EQU 79HSEC2 EQU 7AHDOT BIT 00HORG 0000HLJMP MAINORG 0003HLJMP EXTINT0ORG 000BHLJMP T0ISR ;50ms定时ORG 001BHLJMP T1ISR ;扫描显示ORG 0030HMAIN: MOV SP,#5FH MOV TMOD,#11H MOV TH0,#03CH MOV TL0,#0B0H MOV TH1,#0ECH MOV TL1,#078H MOV KEYVAL,#2 MOV 33H,#10H MOV 34H,#10H MOV 35H,#10H MOV 36H,#10H MOV CLK,#0 SETB IT0 SETB EX0 CLR TR0 CLR ET0 MOV R2,#0 SETB TR1 SETB ET1 SETB EALOOP: MOV A,KEYVALLOOP1: JNZ LOOP2 ;启动 SETB TR0 SETB ET0 SJMP LOOPLOOP2: DEC A JNZ LOOP3 ;暂停 CLR TR0 CLR ET0 SJMP LOOPLOOP3: DEC A JNZ LOOP ;清零 MOV 36H,#0 MOV 35H,#0 MOV 34H,#0 MOV 33H,#0 SJMP LOOPEXTINT0: PUSH ACC INC KEYVAL MOV A,KEYVAL CJNE A,#3,EXT00EXT00: JC EXT01 MOV KEYVAL,#0EXT01: POP ACC RETIT0ISR: PUSH ACC CLR TR0 MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 INC CLK MOV A,CLK CJNE A,#2,T0ISRE MOV CLK,#0 INC 36H MOV A,36H CJNE A,#10,T0ISRE MOV 36H,#0 INC 35H MOV A,35H CJNE A,#10,T0ISRE MOV 35H,#0 INC 34H MOV A,34H CJNE A,#6,T0ISRE MOV 34H,#0 INC 33H MOV A,33H CJNE A,#10,T0ISRE MOV 33H,#0T0ISRE: POP ACC RETIT1ISR: PUSH ACC CLR TR1 MOV TH1,#0ECH MOV TL1,#78H SETB TR1 MOV DPTR,#LEDTABT100: MOV R0,#DAT MOV A,SCANLED ADD A,R0 MOV R0,A MOV A,SCANLED JNZ T101 MOV P2,#01H SETB DOT SJMP T1DIST101: DEC A JNZ T102 MOV P2,#02H CLR DOT SJMP T1DIST102: DEC A JNZ T103 MOV P2,#04H SETB DOT SJMP T1DIST103: MOV P2,#08H CLR DOTT1DIS: MOV A,@R0 MOVC A,@A+DPTR JNB DOT,T1DIS1 ORL A,#01HT1DIS1: CPL A MOV P0,A INC SCANLED MOV A,SCANLED CJNE A,#4,T1END MOV SCANLED,#0T1END: POP ACC RETILEDTAB: DB 0FCH ;"0" 00H DB 60H ;"1" 01H DB 0DAH ;"2" 02H DB 0F2H ;"3" 03H DB 66H ;"4" 04H DB 0B6H ;"5" 05H DB 0BEH ;"6" 06H DB 0E0H ;"7" 07H DB 0FEH ;"8" 08H DB 0F6H ;"9" 09H DB 0EEH ;"A" 0AH DB 3EH ;"B" 0BH DB 9CH ;"C" 0CH DB 7AH ;"D" 0DH DB 9EH ;"E" 0EH DB 8EH ;"F" 0FH DB 00H ;" " 10H
END
P3口都闲着,把三个按纽放在P3口,好写程序。三个按键什么作用?只计秒吗?最大是999.9秒吗?用c语言写吗?问题都不说清楚,就等什么程序?
;汇编程序如下。
;使用T0定时方式1,每隔50ms中断一次,用于修改时间及显示
;使用外部中断0、1,用于控制启动和清零
;========================================================
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP X0_INT
ORG 000BH
AJMP T0_INT
ORG 0013H
AJMP X1_INT
MAIN:
MOV TMOD,#01H ;T0定时方式1
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
MOV TL0, #(65536-50000) MOD 256;
SETB TR0
SETB ET0 ;开启定时中断
SETB EX0
SETB EX1
SETB EA ;定时器初始化结束,下面循环显示即可
MOV R1, #99H ;0~99计数.
MOV R7, #1 ;50ms计数.
MOV P0, #0C0H
MOV P2, #0C0H
LOOP:
SJMP LOOP
;-----------------------------------------------------------
DELAY: ;延时子程序.
AA4: MOV R4, #0
DJNZ R4, $
DJNZ R4, $
RET
;-----------------------------------------------------------
X0_INT: ;启动/停止
CPL F0
RETI
;-----------------------------------------------------------
X1_INT: ;清零
MOV R1, #0
MOV P0, #0C0H
MOV P2, #0C0H
RETI
;-----------------------------------------------------------
T0_INT: ;50ms中断执行一次.
MOV TL0, #(65536-50000) MOD 256;
MOV TH0, #(65536-50000) / 256 ;50ms@12MHz
DJNZ R7, T0_END ;中断不到20次.
MOV R7, #20
JNB F0, T0_END
MOV A, R1
ADD A, #1
DA A
MOV R1, A
ANL A, #0FH
MOV DPTR, #TAB
MOVC A, @A+DPTR ;查出段码
MOV P2, A
MOV A, R1
SWAP A
ANL A, #0FH
MOVC A, @A+DPTR ;查出段码
MOV P0, A ;显示十位数.
T0_END:
RETI
;-----------------------------------------------------------
TAB:
DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H, 90H
END
;===========================================================
;仿真截图如下:
对不起,我不会用汇编做,所以用c语言编了一个,希望对你有帮助
#include <reg51.h>
#define uchar unsigned char
sbit start=P3^6;
sbit stop=P3^5;
uchar code dulatab[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //数字编码0-9
uchar code welatab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位控制字
uchar msec,sec,min;
void delay(uchar time) //延时
{
uchar i,j;
for(i=0;i<time;i++)
{
for(j=0;j<110;j++)
;
}
}
void writeled(uchar num,uchar addr)
{
//关显示
P2=0xff;
//送数据
P0=dulatab[num];
//开显示
P2=welatab[addr];
delay(4);
}
void display(uchar msec,uchar sec,uchar min)
{
uchar msech,msecl,sech,secl,minh,minl;
msech=msec/10;
msecl=msec%10;
sech=sec/10;
secl=sec%10;
minh=min/10;
minl=min%10;
writeled(minh,0);
writeled(minl,1);
writeled(10,2);
writeled(sech,3);
writeled(secl,4);
writeled(10,5);
writeled(msech,6);
writeled(msecl,7);
}
void init()
{
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
// TR1=1;
EA=1;
ET1=1;
}
void keyscan()
{
if(start==0)
{
delay(2);
if(start==0)
{
TR1=~TR1;
while(start==0)
{
display(msec,sec,min);
}
}
}
if(stop==0&&TR1==0)
{
delay(2);
if(stop==0)
{
msec=0;
sec=0;
min=0;
while(stop==0)
{
display(msec,sec,min);
}
}
}
}
void main()
{
init();
while(1)
{
display(msec,sec,min);
keyscan();
}
}
void timer1() interrupt 3
{
TH1=0xd8;
TL1=0xf0;
msec++;
if(msec==100)
{
msec=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
}
}
}
}
用51单片机设计一个秒表,计时范围从00:00-59:59.
4];void dischg(){disdat[3]=sec%10;disdat[2]=sec\/10;disdat[1]=min%10;disdat[0]=min\/10;}void ext0() interrupt 0{key++;key%=3;}void t0isr() interrupt 1\/\/秒计时{TH0=0x3c;TL0=0xb0;time++;if(time==20){time=0;sec++;if(sec>59){sec=0;min++;if(min>59)...
单片机怎么设计一个0-9的一位数秒表,用定时器实现 c语言程序及其注释...
include<reg52.h> \/\/ 包含51单片机寄存器定义的头文件 unsigned char code Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};\/\/数码管显示0~9的段码表 unsigned char int_time; \/\/记录中断次数 unsigned char second; \/\/储存秒 \/ 函数功能:快速动态扫描...
利用51单片机,6个数码管设计一秒表。要求:刚开始时间为12点(120000...
define uint unsigned int define show P2 code table[16]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };code tuble[9]= { 0x00,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };uchar t_h,t_m,t_s;bit KEY=1;sbit wela=...
单片机AT89C51芯片完成简易秒表的设计(三个8字数码管从0~999秒)设置一...
unsigned char key_s, key_v;unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, \/\/ 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};\/\/ 4, 5, 6, 7, 8, 9, off unsigned char dis_buf[8]; \/\/ 显示缓冲区 unsigned char sec_bcd[8]; \/\/ 秒计数值, ...
利用单片机内部定时器设计一个秒表,显示最大值为 59.99 秒。
#define K1Pin0#define K2Pin1#define K3Pin2u8 key=0xff;\/\/消抖后的有效按键值u8 key_down=0x00;\/\/按键下降沿扫描结果,1有效u8 key_up=0x00; \/\/上升沿扫描结果,1有效u8 key_sc=0xff;\/\/上次扫描的按键值\/\/按键扫描程序void scanKey(){static u8 temp0;static u8 ms;u8 temp=0;if...
求一个51单片机延时1秒的程序,用汇编!!
DEL1S:MOV R7,#10 D1: MOV R6,#200 D2: MOV R5,#250 DJNZ R5,DJNZ R6,D2 DJNZ R7,D1 RET 说明:1、如果不使用R5、R6、R7可以用别的单元替换,比如换成30H、31H、32H等等 2、这个程序是12M时钟,如果时钟不同,要修改数值。如6M时钟,要把MOV R7,#10 修改成:MOV R7,#5 ...
51单片机制作一个秒表
\/\/功能:0~99秒的简易秒表设计,两个静态数码管,定时器采用中断方式#include"reg51.h"#define uchar unsigned char#define uint unsigned int uchar count=0; \/\/对50ms定时时间进行计数uchar miao=0; \/\/秒计数器 \/\/函数名:timer_1()\/\/函数功能:定时器T1的中断函数,T1在工作方式1下每5...
51单片机 秒表设计
\/\/ 51单片机 秒表,显示时间为0000—9999秒,启动、停止,(停止后再次启动复位)include<reg52.h> define uint unsigned int define uchar unsigned char uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar bai,shi;uint...
51单片机设计一个秒表,用两个数码管(任意相邻的两个)显示。
ORG 0000H JMP BEGIN ORG000BH LJMPT0INT ORG001BH LJMPT1INT LEDDEQU30H LEDCEQU 36H SECCEQU 37H TCNTEQU 3AH ORG 0030H ;--- TABLE: ; 共阴极数码管显示代码表 DB 0FCH;"0"00H DB 60H;"1"01H DB 0DAH;"2"02H DB 0F2H;"3"03H DB 66H;"4"04H DB 0B6H;"5"...
单片机秒表设计
显示部分由于硬件连接状态不明,无法提供程序,有些硬件方案要求一次发送所有的显示内容,这种可以直接参考我下面的部分。有些硬件方案可以分别更改每一位的显示内容,这样可以利用DispFlag的不同位代表不同的显示字符位置,并且在相应计数部分程序中置位,送入主程序显示,当然显示执行完毕后清零相关位是必须...
璩师醋酸: 用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),并启动倒计时功能.能用按键选择以上两功能之一. 三、程序代码: A_BIT EQU 20H ...
合肥市17073163470: 单片机AT89C51芯片完成简易秒表的设计(三个8字数码管从0~999秒)设置一个开始按钮和一个复位按钮,谢了! - ?
璩师醋酸: #include unsigned char data dis_digit; unsigned char key_s, key_v; unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off unsigned char dis_buf[8]; // 显示缓冲区 unsigned ...
合肥市17073163470: AT89C51单片机设计一个简易秒表? - ?
璩师醋酸: 定时器10ms中断 检测按键且10ms位加一 若10ms=10,100ms位加一 若10ms=10,1000ms位加一 以此内推 显示最好用LCD的 用数码管的也行 有疑问mail:290765583@163.com
合肥市17073163470: 用AT89C51设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加一.另设计一个“开始”按键和一 - ?
璩师醋酸: 因为分数低,只好给你说我的思路 因为是秒表,当然用定时器,我常用的是定时器0,工作方式1 TMOD=0X01;给一个溢满值3CB020次为一秒 if(counter> 19) {second++;conunter= 0;} 而后,动态显示,懂吧,用调用延迟 然后快加,每10ms快速加1,关了定时器0,换定时器1?至于暂停,也是一个中断吧,保持现状,就是变量值不改变,而后当然调用显示函数.再按下按键跳出循环.不知道行不行,参考而已
合肥市17073163470: 设计要求用AT89C51设计一个2位的LED数码显示作为“秒表”用C语言编写 - ?
璩师醋酸: #include#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;unsigned char j,k,c1,c0,m,n=255;unsigned char pp;unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delay(...
合肥市17073163470: 单片机计时器?
璩师醋酸: //1:用AT89C51单片机的定时/计数器T0产生一秒的 //定时时间,作为秒计数时间,当一秒产生时,秒 //计数加1,秒计数到60时,自动从0开始.单片机 //晶振频率为12MHZ //由于是刚刚注册,积分没有多少,请大家帮个忙,谢谢! #include<...
合肥市17073163470: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. - ?
璩师醋酸: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.
合肥市17073163470: 用at89c51单片机做一个秒表计时器 - ?
璩师醋酸: 参考一下:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/295f9639bccb7c2f96ddd86f.html
合肥市17073163470: 基于单片机89C51的计时器或秒表 - ?
璩师醋酸: 到我的空间,看“用AT89C51单片机设计一个秒表:00.0~99.9”,即可. 其中,也有“00~99秒”的内容,在后面的链接上.
合肥市17073163470: 用keiluVision5 AT89C5110秒秒表编程 - ?
璩师醋酸: 这是一个秒表,有按键实现 启动、暂停核清零功能.#include <reg51.H> sbit P3_5 =P3^5; unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00}; unsigned char second; ...