#include"reg52.h"
#define u8 unsigned char
#define u16 unsigned int
sbit UP_1 = P1^1 //第一队加分键
sbit DOWN_1 = P1^2 //第一队减分键
sbit UP_2 = P1^3 //第二队加分键
sbit DOWN_2 = P1^4 //第二队减分键
sbit Change = P1^5 //交换键
sbit Begin = P1^6 //开始键
sbit Pause = P1^7 //暂停键
sbit Beef = P2^4 //蜂鸣器
sbit duan = P2^3 //段选
sbit wei = P2^2 //位选
u8 Grate_1=0 //第一队计分
u8 Grate_2=0 //第二队计分
u8 Grate_change=0 //换场标志
u8 Time = 99 //总时间
u16 Flag=0 //计时次数
u8 leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
}
void InitTimer1(void)
{
TMOD = 0x10 //定时器1设为模式1
TH1 = 0xFC
TL1 = 0x18 //1ms
EA = 1 //开总中断
ET1 = 1 //开定时器1中断
// TR1 = 1 //
}
void delay(u8 d) //延时
{
u8 a,b,c
for(c=dc>0c--)
for(b=17b>0b--)
for(a=16a>0a--)
}
void beef(u8 d) //发声
{
u8 a,b,c
for(c=dc>0c--)
for(b=17b>0b--)
for(a=16a>0a--)
{
Beef=~Beef
}
}
void display(u8 grate_1,u8 grate_2,u8 time) //显示
{
u8 w1,w2,w3,w4,w7,w8
w1=grate_1/10 //计算第一队分数十位
w2=grate_1%10 //计算第一队分数个位
w3=grate_2/10 //计算第二队分数十位
w4=grate_2%10 //计算第二队分数个位
w7=time/10 //计算时间十位
w8=time%10 //计算时间个位
P0=0xff //消隐,该段显示第一队分数十位
wei=1
P0=0xfe //送位码
wei=0
P0=0xff
duan=1
P0=leddata[w1] //送段码
duan=0
delay(5)
P0=0xff //显示第一队分数个位
wei=1
P0=0xfd
wei=0
P0=0xff
duan=1
P0=leddata[w2]
duan=0
delay(5)
P0=0xff //显示第二队分数十位
wei=1
P0=0xf7
wei=0
P0=0xff
duan=1
P0=leddata[w3]
duan=0
delay(5)
P0=0xff //显示第二队分数个位
wei=1
P0=0xef
wei=0
P0=0xff
duan=1
P0=leddata[w4]
duan=0
delay(5)
P0=0xff //显示时间十位
wei=1
P0=0xbf
wei=0
P0=0xff
duan=1
P0=leddata[w7]
duan=0
delay(5)
P0=0xff //显示时间个位
wei=1
P0=0x7f
wei=0
P0=0xff
duan=1
P0=leddata[w8]
duan=0
delay(5)
}
void main()
{
InitTimer1() //初始化定时器1
UP_1 = 1 //以下初始化IO口
DOWN_1 = 1
UP_2 = 1
DOWN_2 = 1
Change = 1
Begin = 1
while(1)
{
if(UP_1==0) //如果第一队加分键按下
{
ET1 = 0 //关闭定时器1中断
delay(5) //稍加延时
while(UP_1==0)//等待按键抬起
Grate_1++ //第一队分数加1
ET1 = 1 //开启定时器1中断
}
if(DOWN_1==0) //如果第一队减分键按下
{
ET1 = 0
delay(5)
while(DOWN_1==0)
Grate_1-- //第一队分数减1
ET1 = 1
}
if(UP_2==0) //如果第二队加分键按下
{
ET1 = 0
delay(5)
while(UP_2==0)
Grate_2++ //第二队分数加1
ET1 = 1
}
if(DOWN_2==0) //如果第二队减分键按下
{
ET1 = 0
delay(5)
while(DOWN_2==0)
Grate_2-- //第二队分数减1
ET1 = 1
}
if(Change==0) //如果换场键按下
{
ET1 = 0
delay(5)
while(Change==0)
Grate_change=Grate_1 //一下三行语句完成分数交换显示
Grate_1=Grate_2
Grate_2=Grate_change
ET1 = 1
}
if(Begin==0) //如果开始键按下
{
delay(5)
while(Begin==0)
TR1 = 1 //开启定时器1
}
if(Pause==0)
{
delay(5)
while(Pause==0)
TR1=0
}
if(Time<=0) //如果时间计数到0
{
Time=99 //恢复初始时间
TR1 = 0 //关闭定时器1
beef(100) //发声
}
display(Grate_1,Grate_2,Time) //显示分数、时间
}
}
void Timer1Interrupt(void) interrupt 3 //定时器1中断函数
{
TH1 = 0xFC //重赋初值
TL1 = 0x18
Flag++ //中断次数加1
if(Flag>=1000)//1000次也就是1秒到
{
Flag=0
Time-- //秒变量减1
}
}
看板子是无法编程的,必须原理图才可以,这里有一个篮球计分程序,供参考。
UP1 EQU P1.1DOWN1 EQU P1.2
UP2 EQU P1.3
DOWN2 EQU P1.4
CHANGE EQU P1.5
BEGIN EQU P1.6
BEEF EQU P2.4
DUAN EQU P2.3
WEI EQU P2.2
GRATE1 EQU 30H
GRATE2 EQU 31H
GRATE_CHG EQU 33H
TIME EQU 34H
CNT EQU 35H
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP T1ISR
ORG 0030H
MAIN:
LCALL INITTIMER1
SETB UP1
SETB DOWN1
SETB UP2
SETB DOWN2
SETB CHANGE
SETB BEGIN
LOOP:
JB UP1,LOOP1
CLR ET1
MOV R7,#5
LCALL DELAY
JNB UP1,$
INC GRATE1
SETB ET1
SJMP LOOP6
LOOP1:
JB DOWN1,LOOP2
CLR ET1
MOV R7,#5
LCALL DELAY
JNB DOWN1,$
MOV A,GRATE1
DEC A
MOV GRATE1,A
SETB ET1
SJMP LOOP6
LOOP2:
JB UP2,LOOP3
CLR ET1
MOV R7,#5
LCALL DELAY
JNB UP2,$
INC GRATE2
SETB ET1
SJMP LOOP6
LOOP3:
JB DOWN2,LOOP4
CLR ET1
MOV R7,#5
LCALL DELAY
JNB DOWN2,$
MOV A,GRATE2
DEC A
MOV GRATE2,A
SETB ET1
SJMP LOOP6
LOOP4:
JB CHANGE,LOOP5
CLR ET1
MOV R7,#5
LCALL DELAY
JNB CHANGE,$
MOV GRATE_CHG,GRATE1
MOV GRATE1,GRATE2
MOV GRATE2,GRATE_CHG
SETB ET1
SJMP LOOP6
LOOP5:
JB BEGIN,LOOP6
MOV R7,#5
LCALL DELAY
JNB BEGIN,$
SETB TR1
LOOP6:
MOV A,TIME
JNZ LOOP7
MOV TIME,#99
CLR TR1
MOV R7,#100
LCALL BEEFE
LOOP7:
LCALL DISPLAY
LJMP LOOP
T1ISR:
CLR TR1
MOV TH1,#HIGH(65536-50000)
MOV TL1,#LOW(65536-50000)
SETB TR1
DJNZ CNT,T0E
MOV CNT,#20
DEC TIME
T0E:
RETI
INITTIMER1:
MOV TMOD,#10H
MOV TH1,#HIGH(65536-50000)
MOV TL1,#LOW(65536-50000)
SETB EA
SETB ET1
MOV CNT,#20
MOV TIME,#99
RET
DELAY:
MOV R2,#17
DLY:
MOV R3,#26
DJNZ R3,$
DJNZ R2,DLY
DJNZ R7,DELAY
RET
BEEFC:
MOV R2,#17
BEEFD:
MOV R3,#16
BEEFE:
CPL BEEF
DJNZ R3,BEEFE
DJNZ R2,BEEFD
DJNZ R7,BEEFC
RET
DISPLAY:
MOV A,GRATE1
MOV B,#10
DIV AB
MOV 40H,A
MOV 41H,B
MOV A,GRATE2
MOV B,#10
DIV AB
MOV 42H,A
MOV 43H,B
MOV A,TIME
MOV B,#10
DIV AB
MOV 46H,A
MOV 47H,B
MOV P0,#0FFH
SETB WEI
MOV P0,#0FEH
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,40H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
MOV P0,#0FFH
SETB WEI
MOV P0,#0FDH
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,41H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
MOV P0,#0FFH
SETB WEI
MOV P0,#0FBH
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,42H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
MOV P0,#0FFH
SETB WEI
MOV P0,#0F7H
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,43H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
MOV P0,#0FFH
SETB WEI
MOV P0,#0BFH
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,46H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
MOV P0,#0FFH
SETB WEI
MOV P0,#07FH
CLR WEI
MOV P0,#0FFH
SETB DUAN
MOV DPTR,#LEDTAB
MOV A,47H
MOVC A,@A+DPTR
MOV P0,A
CLR DUAN
MOV R7,#5
LCALL DELAY
RET
LEDTAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)