这个程序可以实现秒的计时,按键控制开始、暂停、清零功能,更多功能自己在看清程序的基础上进行改进。
#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秒表设计程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)