在正常时间显示界面,同时按下2#、1#键取消或保持闹钟功能,右上角显示或不显示闹钟图像。
以下是个JS做的秒表 空格开始 再空格结束<html>
<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=gb2312">
<title>秒表 Stopwatch for Rubik's Cube China</title>
</head>
<style>
td,input,div,th{font:9pt verdana}
p {line-height:60%}
</style>
<body onkeyup="begin(event)" onkeydown="stop(event)" onload=rndCube()>
<script type=text/javascript>
var Max=25
var bestAve
var then
var nowDec
var nowBest
var nowWorst
var runing=0
var timeint
var i=0
var totalsec
var sec
var min
var subsec
var secdis
var mindis
var subsecdis
var datas=new Array()
var nowSecondes
function getAv(st,ed)
{
for(i=sti<=edi++)
{
datas.join(" ")
}
}
function stop(evt)
{
if (runing==1 &&evt.keyCode==32)
clearTimeout(timeint)
}
function toSeconds(dec)
{ var Ms,sec
var tmpDec=dec.split(":")
if(tmpDec[0]*10/10>0)
{
Ms=tmpDec[0]*60
return(Ms+tmpDec[1]*10/10)
}else{
return(tmpDec[1]*10/10)
}
}
function begin(evt)
{
if (evt.keyCode==32)
{
if (runing==0){
then=new Date()
runing=1
show()
}
else if (runing==1)
{
runing=2
}
else
{
ShowDatas(toSeconds(nowSeconds))
document.getElementById("watch").innerHTML="00:00.00"
runing=0
}
}
}
var a=0
function ShowDatas(dec)
{
if(dec==0){return false}
var newDec=get2(dec)
datas.push(newDec) //添加记录
SortDatas() //排序得到最大最小值
ShowDetails()
spanBest.innerHTML="<b style=color:red>"+sec2minsec(nowBest)+"</b>"
spanWorst.innerHTML="<b>"+sec2minsec(nowWorst)+"</b>"
var tmp1=0
for(i=0i<datas.lengthi++)
{
tmp1+=datas[i]
}
spanAv.innerHTML="<b>"+sec2minsec(get2(tmp1/datas.length))+"</b>"
}
var bestAve=new Array()
function sec2minsec(n)
{ if (n>60)
{
var tmpmins=Math.floor(n/60)
var tmpseconds=get2(n-tmpmins*60)
var tmpstring
if (tmpseconds<10)
{ tmpstring=tmpmins+":0"+tmpseconds
}
else tmpstring=tmpmins+":"+tmpseconds
return tmpstring
}
else return n
}
function ShowDetails()
{
if(datas.length>12){a=datas.length -12}
var tmpTd="<table cellspacing=1 bgcolor=olive><tr align=center bgcolor=EEEEEE><th width=50>1<th width=50>2<th width=50>3<th width=50>4<th width=50>"
tmpTd+="5<td width=50>6<th width=50>7<th width=50>8<th width=50>9<th width=50>10<th width=50>11<th width=50>12</tr><tr bgcolor=white>"
for(i=ai<(12+a)i++)
{
bestAve[i-a]=datas[i]//将当前12局成绩存入数组
tmpTd+="<td align=center>"
if(datas[i]==undefined){tmpTd+="-"}
else
{
if(datas[i]==nowBest || datas[i]==nowWorst)
{
tmpTd+=sec2minsec(datas[i])+"*"
}else
{
tmpTd+=sec2minsec(datas[i])
}
}
tmpTd+="</td>"
}
tmpTd+="</tr></table>"
//alert(datas.join(","))
div1.innerHTML=""
div1.innerHTML=tmpTd
rndCube()
document.focus()
}
function show()
{ var now=new Date()
diff=now.getTime()-then.getTime()
totalsec=Math.floor(diff/1000)
sec=totalsec%60
if(sec<10)
{
secdis="0"+sec
}
else
{
secdis=sec
}
min=(totalsec-sec)/60
if (min<10)
{
mindis="0"+min
}
else
{
mindis=min
}
subsec=Math.floor((diff%1000)/10)
if (subsec<10)
{
subsecdis="0"+subsec
}
else
{
subsecdis=subsec
}
nowSeconds=mindis+":"+secdis+"."+subsecdis
document.getElementById("watch").innerHTML=nowSeconds
timeint=setTimeout("show()",50)
}
function get2(dec) //取两位小数点
{
return Math.round(dec*100)/100
}
function SortDatas()//最大最小值
{
var tmpArr=new Array()
for(i=0i<datas.lengthi++)
{
tmpArr[i]=datas[i]
}
tmpArr.sort(function(a,b){ return a-b})
nowBest=tmpArr[0]
nowWorst=tmpArr[tmpArr.length-1]
ShowBestAv()
}
function mycls()
{
clearTimeout(timeint)
nowSeconds="00:00:00"
runing=0
datas=new Array()
ShowDatas(0)
ShowDetails()
document.getElementById("watch").innerHTML="00:00.00"
btn1.focus()
}
function ShowBestAv()
{
var av=0
bestAve.sort()
if(bestAve[11]==undefined){return false}
for(i=1i<bestAve.length-1i++)
{
av+=bestAve[i]
}
spanBestAv.innerHTML=get2(av/10)
//alert(bestAve)
}
</script>
<script>
function cancel()
{ clearTimeout(timeint)
nowSeconds="00:00:00"
runing=0
btn1.focus()
rndCube()
document.getElementById("watch").innerHTML="00:00.00"
}
function rndCube()
{
var move=""
var rndMove=new Array("R","L","F","B","U","D")
var add=0
var tmpRnd
var arr=new Array()
while(true)
{
if(add>=Max){break}
//tmpRnd=Math.round(Math.random()*5)
if(tmpRnd==arr[arr.length -1])
{ tmpRnd=Math.floor(Math.random()*6)
}
else
{ arr.push(tmpRnd)
add++
}
}
for(i=0i<arr.lengthi++)
{
var tmp=Math.floor(Math.random()*5)
if(tmp==4)
{ move+=rndMove[arr[i]]+"2"}
else if(tmp==2 || tmp==3)
{ move+=rndMove[arr[i]]+"'"}
else
{ move+=rndMove[arr[i]]}
move+=" "
}
rndDiv.innerHTML=move
}
</script>
<center>
<div id="watch" style="filter:shadraw(x=1,y=1,color=black)position:relativewidth: 359pxheight: 80px font-size:48ptfont-family:Arialfont-weight:boldcolor:navytext-align:center" >00:00.00</div>
<p>
<font size="2">用<font color="#000080"><b>空格</b></font>键<b>开始</b>(松开时触发)、<b>停止</b>(按下时触发)、<b>复位</b>(同时记录成绩),enjoy:)</font></p>
<p><b><font size="2" color="#FF0000">注意:</font></b><font size="2">请先最大化窗口或拉伸窗口使右边的滚动条不出现,否则空格键会让窗口滚动。</font></p>
<p><font size="2">下面的记录系统是魔方吧的MAN大侠编写。</font>
</p>
<div id=rndDiv style="font:12pt Arialfont-weight:bold"></div>
<input type=button value="清除所有记录" onclick=mycls()><input type=button value="不记录此次成绩" type=button onclick=cancel()div1.focus()>
<input type=button value="" style="width:0pxheight:0px" onclick="document.focus" id=btn1>
<div id=div1>
<table cellspacing=1 bgcolor=olive>
<tr bgcolor=#EEEEEE align=center>
<td width=50>1
<td width=50>2
<td width=50>3
<td width=50>4
<td width=50>5
<td width=50>6
<td width=50>7
<td width=50>8
<td width=50>9
<td width=50>10
<td width=50>11
<td width=50>12
</tr>
<tr bgcolor=white align=center>
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
<td width=50>-
</tr>
</table>
</div>
</center>
<table align=center>
<tr><td>最快:</td><td><span id=spanBest></span></td></tr>
<tr><td>最慢:</td><td><span id=spanWorst></span></td></tr>
<tr><td>平均:</td><td><span id=spanAv></span></td></tr>
<tr><td>最好平均:</td><td><span id=spanBestAv></span></td></tr>
</table>
</body>
</html>
秒表的设计程序用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 P3.6,START1循环判断开始按钮K1是否按下?
ACALL DELAY10延时10毫秒触点消抖
JB P3.6,START如果是干扰就返回
JNB P3.6,$等待按键松开
LJMP GN1 按键2按下则执行功能2START1: JB P3.7,START循环判断开始按钮K2是否按下?
ACALL DELAY10延时10毫秒触点消抖
JB P3.7,START1如果是干扰就返回
JNB P3.7,$
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 P3.6,B1
ACALL DELAY10延时10毫秒消抖
JB P3.6,C1
JNB P3.6,$等待按键松开
CPL F0
ZT1: MOV P3,#0FFH对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$循环判断开始按钮K1是否按下?
ACALL DELAY10延时10毫秒触点消抖
JB P3.6,ZT1如果是干扰就返回
JNB P3.6,$等待按键松开
LCALL DPLOP1
B1: JB P3.7,LOOP1
ACALL DELAY10延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$等待按键松开
AJMP OVERLOOP1: DJNZ R3,TIME1 2毫秒循环执行250次,时间约0.5秒
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 个位在BMOV DPTR,#NUMTAB 指定查表启始地址
DPLOP2: MOV A,A_BIT 取个位数
MOVC A,@A+DPTR 查个位数的7段代码
MOV P0,A 送出个位的7段代码
CLR P2.5 开个位显示
ACALL DELY1显示1毫秒
SETB P2.5关闭个位显示,防止鬼影
MOV A,B_BIT 取十位数
MOVC A,@A+DPTR 查十位数的7段代码
MOV P0,A 送出十位的7段代码
CLR P2.6 开十位显示
ACALL DELY1显示1毫秒
SETB P2.6关闭十位显示,防止鬼影插入一段判断定时过程中是否有按键输入的程序段
C2: JB P3.6,B2
ACALL DELAY10延时10毫秒消抖
JB P3.6,C2
JNB P3.6,$等待按键松开
ZT2:MOV P3,#0FFH对P3口初始化,设置为高电平,用于按键输入
JB P3.6,$循环判断开始按钮K1是否按下?
ACALL DELAY10延时10毫秒触点消抖
JB P3.6,ZT2如果是干扰就返回
JNB P3.6,$等待按键松开
B2: JB P3.7,LOOP2
ACALL DELAY10延时10毫秒消抖
JB P3.7,B1
JNB P3.7,$等待按键松开
AJMP OVERLOOP2: DJNZ R3,TIME2 2毫秒循环执行250次,时间约0.5秒
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
RET10毫秒延时子程序
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 P2.5 开个位显示
ACALL DELY1显示1毫秒
SETB P2.5关闭个位显示,防止鬼影
MOV A,B_BIT 取十位数
MOVC A,@A+DPTR 查十位数的7段代码
MOV P0,A 送出十位的7段代码
CLR P2.6 开十位显示
ACALL DELY1显示1毫秒
SETB P2.6关闭十位显示,防止鬼影
RET
END