用C语言编写秒表的程序(单片机控制的时钟设计)

用C语言编写秒表的程序(单片机控制的时钟设计),第1张

这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。

#include <reg51H>

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;

unsigned char keycnt;

unsigned int tcnt;

void main(void)

{

unsigned char i,j;

TMOD=0x02;

ET0=1;

EA=1;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

while(1)

{

if(P3_5==0)

{

for(i=20;i>0;i--)

for(j=248;j>0;j--);

if(P3_5==0)

{

keycnt++;

switch(keycnt)

{

case 1:

TH0=0x06;

TL0=0x06;

TR0=1;

break;

case 2:

TR0=0;

break;

case 3:

keycnt=0;

second=0;

P1=dispcode[second/10];

P2=dispcode[second%10];

break;

}

while(P3_5==0);

}

}

}

}

void t0(void) interrupt 1 using 0

{

tcnt++;

if(tcnt==4000)

{

tcnt=0;

second++;

if(second==100)

{

second=0;

}

P1=dispcode[second/10];

P2=dispcode[second%10];

}

}

秒表的设计程序

用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表,具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S),并启动倒计时功能。能用按键选择以上两功能之一。

三、程序代码:

A_BIT EQU 20H ;数码管个位数存放内存位置

B_BIT EQU 21H ;数码管十位数存放内存位置

TEMP EQU 22H ;计数器数值存放内存位置 ;开机初始化

MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

MOV P0,#0FFH;使显示时间数码管熄灭

CLR F0

CLR F1

MOV DPTR,#NUMTAB ;指定查表启始地址

;等待按键输入

;根据按键的输入判断执行什么功能;按键1按下则执行功能1

MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

MOV P0,#0FFH;使显示时间数码管熄灭

START:JB P36,START1;循环判断开始按钮K1是否按下

ACALL DELAY10;延时10毫秒触点消抖

JB P36,START;如果是干扰就返回

JNB P36,$;等待按键松开

LJMP GN1 ;按键2按下则执行功能2START1: JB P37,START;循环判断开始按钮K2是否按下

ACALL DELAY10;延时10毫秒触点消抖

JB P37,START1;如果是干扰就返回

JNB P37,$

LJMP GN2;数码管显示秒表时间的程序

GN1: ;先初始化

S1:MOV A,#0

MOV TEMP,A

GOON1: MOV R2,#2

JS1: MOV R3,#250

TIME1: MOV A,TEMP ;将TEMP中的十六进制数转换成10进制

MOV B,#10 ;10进制/10=10进制

DIV AB

MOV B_BIT,A ;十位在A

MOV A_BIT,B ;个位在B LCALL DPLOP1 ;插入一段判断定时过程中是否有按键输入的程序段

C1: JB P36,B1

ACALL DELAY10;延时10毫秒消抖

JB P36,C1

JNB P36,$;等待按键松开

CPL F0

ZT1: ; MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

JB P36,$;循环判断开始按钮K1是否按下

ACALL DELAY10;延时10毫秒触点消抖

JB P36,ZT1;如果是干扰就返回

JNB P36,$;等待按键松开

LCALL DPLOP1

B1: JB P37,LOOP1

ACALL DELAY10;延时10毫秒消抖

JB P37,B1

JNB P37,$;等待按键松开

AJMP OVERLOOP1: DJNZ R3,TIME1 ;2毫秒循环执行250次,时间约05秒

DJNZ R2,JS1 ;循环执行2次,时间为1 秒钟INC TEMP;满一秒钟对时间加1

MOV A,TEMP

CLR C

SUBB A,#60

JNZ GOON1;判断TEMP的数值是否为60不为60循环

ACALL OVER

RET

GN2: MOV A,#14H ; 设定倒计时的时间20S

MOV TEMP,A;数码管显示倒计时时间的程序

;初始化

MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

MOV P0,#14H;使显示时间为设定的倒计时时间 GOON2: MOV R2,#2

JS2: MOV R3,#250

TIME2: MOV A,TEMP ;将TEMP中的十六进制数转换成10进制

MOV B,#10 ;10进制/10=10进制

DIV AB

MOV B_BIT,A ;十位在A

MOV A_BIT,B ;个位在B MOV DPTR,#NUMTAB ;指定查表启始地址

DPLOP2: MOV A,A_BIT ;取个位数

MOVC A,@A+DPTR ;查个位数的7段代码

MOV P0,A ;送出个位的7段代码

CLR P25 ;开个位显示

ACALL DELY1;显示1毫秒

SETB P25;关闭个位显示,防止鬼影

MOV A,B_BIT ;取十位数

MOVC A,@A+DPTR ;查十位数的7段代码

MOV P0,A ;送出十位的7段代码

CLR P26 ;开十位显示

ACALL DELY1;显示1毫秒

SETB P26;关闭十位显示,防止鬼影 ;插入一段判断定时过程中是否有按键输入的程序段

C2: JB P36,B2

ACALL DELAY10;延时10毫秒消抖

JB P36,C2

JNB P36,$;等待按键松开

ZT2: MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

JB P36,$;循环判断开始按钮K1是否按下

ACALL DELAY10;延时10毫秒触点消抖

JB P36,ZT2;如果是干扰就返回

JNB P36,$;等待按键松开

B2: JB P37,LOOP2

ACALL DELAY10;延时10毫秒消抖

JB P37,B1

JNB P37,$;等待按键松开

AJMP OVERLOOP2: DJNZ R3,TIME2 ;2毫秒循环执行250次,时间约05秒

DJNZ R2,JS2 ;循环执行2次,时间为1 秒钟DEC TEMP;满一秒钟对时间减1

MOV A,TEMP

JNZ GOON2;判断TEMP的数值是否为0不为0循环

ACALL OVER

RET

;结束定时

OVER: AJMP START;退到开机初始化状态;1毫秒延时子程序

DELY1: MOV R4,#2

D1:MOV R5,#248

DJNZ R5,$

DJNZ R4,D1

RET;10毫秒延时子程序

DELAY10: MOV R4,#20

D2:MOV R5,#248

DJNZ R5,$

DJNZ R4,D2

RET;实验板上的两位一体的数码管0~9各数字的显示代码

NUMTAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H

DPLOP1: MOV A,A_BIT ;取个位数

MOVC A,@A+DPTR ;查个位数的7段代码

MOV P0,A ;送出个位的7段代码

CLR P25 ;开个位显示

ACALL DELY1;显示1毫秒

SETB P25;关闭个位显示,防止鬼影

MOV A,B_BIT ;取十位数

MOVC A,@A+DPTR ;查十位数的7段代码

MOV P0,A ;送出十位的7段代码

CLR P26 ;开十位显示

ACALL DELY1;显示1毫秒

SETB P26;关闭十位显示,防止鬼影

RET

END

运行程序如下:

LIBRARY IEEE;

USE IEEESTD_LOGIC_1164ALL;

USE IEEESTD_LOGIC_UNSIGNEDALL;

ENTITY MIAOBIAO IS

PORT (CLK,CLK1,STA,POS,STO,RST: IN STD_LOGIC;

CQ1,CQ2,CQ3,CQ4,CQ5,CQ6 : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

CLK2:OUT STD_LOGIC

);

END MIAOBIAO;

ARCHITECTURE BEHAV OF MIAOBIAO IS

BEGIN

PROCESS(CLK) --由频率为3MHz的时钟产生频率为100Hz的时钟

VARIABLE NUM:INTEGER RANGE 0 TO 15000;--定义计数器

VARIABLE Q:STD_LOGIC;

BEGIN

IF CLK'EVENT AND CLK='1' THEN

IF NUM=15000 THEN NUM:=0;Q:=NOT Q;--计数器每计数15000,时钟改变电平--值

ELSE NUM:=NUM+1;

END IF;

END IF;

CLK2<=Q;

END PROCESS;

PROCESS(CLK1,STA,POS,STO,RST)

VARIABLE CQI1:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE CQI2:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE CQI3:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE CQI4:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE CQI5:STD_LOGIC_VECTOR(3 DOWNTO 0);

VARIABLE CQI6:STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

IF STO='1' THEN CQI1:=(OTHERS=>'0');CQI2:=(OTHERS=>'0');CQI3:=(OTHERS=>'0');

CQI4:=(OTHERS=>'0');CQI5:=(OTHERS=>'0');CQI6:=(OTHERS=>'0');

ELSIF CLK1'EVENT AND CLK1='1' THEN

IF STA='1' THEN

IF RST='0' THEN

IF POS='0' THEN

IF CQI1="1001" THEN CQI1:=(OTHERS => '0');--百分秒位满十进--位

IF CQI2="1001" THEN CQI2:=(OTHERS => '0'); --十分秒位满十进--位

IF CQI3="1001" THEN CQI3:=(OTHERS => '0'); --秒位满十进位

IF CQI4="0101" THEN CQI4:=(OTHERS => '0'); --十秒位满六进位

IF CQI5="1001" THEN CQI5:=(OTHERS => '0'); --分位满十进位

IF CQI6="0101" THEN CQI6:=(OTHERS => '0'); --十分位满六进位

ELSE CQI6:=CQI6+1;

END IF;

ELSE CQI5:=CQI5+1;

END IF;

ELSE CQI4:=CQI4+1;

END IF;

ELSE CQI3:=CQI3+1;

END IF;

ELSE CQI2:=CQI2+1;

END IF;

ELSE CQI1:=CQI1+1;

END IF;

END IF;

END IF;

END IF;

IF RST='1' THEN

CQI1:=(OTHERS => '0');CQI2:=(OTHERS => '0');

CQI3:=(OTHERS => '0');CQI4:=(OTHERS => '0');

CQI5:=(OTHERS => '0');CQI6:=(OTHERS => '0');

END IF;

CQ1<=CQI1;CQ2<=CQI2;CQ3<=CQI3;

CQ4<=CQI4;CQ5<=CQI5;CQ6<=CQI6;

END IF;

END PROCESS;

END BEHAV;

以上就是关于用C语言编写秒表的程序(单片机控制的时钟设计)全部的内容,包括:用C语言编写秒表的程序(单片机控制的时钟设计)、单片机 按键秒表、跪求EDA秒表设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10094639.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存