标题:
单片机足球赛补时器电路与源程序设计
[打印本页]
作者:
151615111
时间:
2018-9-25 21:37
标题:
单片机足球赛补时器电路与源程序设计
足球赛补时牌设计:要求用
6
位数码管按照“
mm--ss”
格式动态显示补时及倒计时,并加
2
个按键(一个设置补时多少分钟,按一次加
1
,可循环设置
0-19
分钟,另一个按下,开始倒计时),计时到
0
时,驱动蜂鸣器发出响声,频率为
1/100ms
,持续
10s
。要求在
KEIL
中编写程序,用
PROTEUS
设计电路并仿真运行。(评分标准:高位没有数字时不显示:
A
;高位没有数字时显示
0
:
B
)
电路原理图如下:
TIM截图20180925213552.png
(167.79 KB, 下载次数: 52)
下载附件
电路图
2018-9-25 21:37 上传
单片机代码:
#include <reg51.h> //51单片机头文件
#include<intrins.h> //51库函数
#define uchar unsigned char
#define uint unsigned int
sbit DX = P2^6;//段选接P2.6引脚
sbit WX = P2^7; //位选接P2.7引脚
sbit BUZZ = P2^0;
char second = 0;
char minute = 0; //计数,时间(分钟)
/****
共阴级
table[10]表示不显示
table[11] 表示“-”
**************/
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
0x7d, 0x07, 0x7f, 0x6f, 0x00, 0x40};
uchar s[8];
uchar delay = 1;
uchar n = 0;
uint mm=0;
uchar speak = 0; //标识蜂鸣器是否开始发声
void delay_ms(uint t) //延时函数
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<110;j++);
}
void init()
{
EA = 1; //开全局中断
EX0 = 1;//INT0中断允许
IT0 = 1;//触发方式为下降沿触发
EX1 = 1;//INT0中断允许
IT1 = 1;//触发方式为下降沿触发
TMOD = 0x19; //T1软启动、定时器、工作方式1;T0硬启动、定时器、工作方式1
TH0 = 0x4C; //给定初值
TL0 = 0x00;
TH1 = 0xff; //给定初值
TL1 = 0x00;
ET0 = 1; //定时器中断打开
ET1 = 1;
TR0 = 0; //不启动定时器中断
TR1 = 0; //
}
void fun()
{
s[0] = table[second%10];
s[1] = table[second/10];
s[2] = table[11];
s[3] = table[11];
if(minute%10!=0)
s[4] = table[minute%10];
else
s[4] = table[10];
if(minute/10!=0)
s[5] = table[minute/10];
else
s[5] = table[10];
}
void dispaly()
{
uchar i;
uchar temp = 0xdf;
fun();
for(i=0;i<6;i++){
DX = 0;
WX = 0;
P0 = 0x00;
DX = 1;
P0 = s[ i];
DX = 0;
P0 = 0xff;
WX = 1;
P0 = temp;
WX = 0;
temp = _cror_(temp, 1);
TH1 = 0xff;
TL1 = 0x00;
TR1 = 1; //延时
while(delay<1);
delay = 0;
}
}
void main()
{
init();
while(1){
dispaly();
if(speak==1){
DX = 1;
P0 = table[10];
DX = 0;
P0 = 0xff;
WX = 1;
P0 = 0x01;
WX = 0;
BUZZ = 0;
TR1 = 1;
TL0 = 19664%256;
TH0 = 19664/256; //给定初值
// delay_ms(10000);
// TR1 = 0;
// speak=0;
}
}
}
void EX_INT0() interrupt 0
{
minute++;
if(minute > 19) minute=19;
}
void EX_INT1() interrupt 2
{
TR0 = 1;
}
void ET_T0() interrupt 1
{
TL0 = 19664%256;
TH0 = 19664/256; //给定初值
n++;
if(n==20){
n = 0;
if(minute ==0 && second==0){
TR0 = 0;
speak = 1;
}
else if(second==0){
minute --;
second = 59;
}
else{
second--;
}
}
}
void ET_T1() interrupt 3
{
if(speak==1){
mm++;
BUZZ = ~BUZZ;
TL0 = 19664%256;
TH0 = 19664/256; //给定初值
if(mm==200){
speak=0;
TR1 = 0;
}
}
delay=1;
}
复制代码
作者:
萌新求罩
时间:
2019-3-30 22:10
大佬厉害了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1