单片机设计24秒倒计时

  • 格式:doc
  • 大小:57.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、具有24s计时功能。

2、设置外部操作开关,控制计时器的直接清零、启动和暂停 /连续功能。

3、计时器为24秒递减时,计时间隔为1秒。

4、计时器递减到零时,数码显示器不能灭灯,同时发出光电报警信号。

5、有直接清零然后恢复到24秒,准备重新开始计数。

学生在教师指导下,综合运用所学知识完成基于单片机的篮球比赛24秒计时器设计。要求设计一个24秒计时电路,并具有时间显示的功能。要求:

1、设置外部操作开关,控制计数器的直接清零、启动和暂停/连续计时。

2、要求计时电路递减计时,每隔1秒钟,计时器减1。

3、当计时器减到0时,显示器上显示00,同时发出光电报警信号。硬件电路:

设计思路:

选用AT89C51作为主控芯片,晶振是6KHz,机械周期为1ms,所以循环10次为1s。P0口作为段码输出,P2.0、P2.1作为位控,高电平有效。数码管是液晶显示,采用动态显示,两个串行口作为中断入口,高电平有效,启动T0定时器/计数器进行计数,低电平有效。图2.2.1是系统硬件设计电路图一。

时间设置完后,启动定时器T0开始定时计数。计时采用倒计时,比如:设置的时间为24秒钟,则在LED上显示24两位数。定时T0计数24秒后中断返回,继续定时计数下一个24秒;同时则在2位LED显示器上显示,表示时间已经过去1秒钟,即为23秒。这样一直持续下去。知道变为“00”时表示赛程结束。如果比赛中裁判叫停,则只要按下键,即可暂停计时。

程序设计:

根据以上流程图,可以用汇编语言编写出篮球计时器24秒倒计时程序,该程序包括主程序,中断程序,延时程序以及显示程序。# include

# include

# define uint unsigned int

# define uchar unsigned char

sbit w1=p2^0; //十位位选

sbit w2=p2^1; //个位位选

sbit key1=p1^0; //按键为选码

sbit key2=p1^1;

sbit key3=p1^2;

sbit BEEP=P2^7; //报警器控制位

uint num,num1,shi,ge;

uchar code table[ ]={0x3f,0x06,0x5b,0x4f, //数码管相应的段选码

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(unit z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=1 10;y>0;y--)

}

/*void delay1(uchar x) //x*0.14MS

{

uchar i;

while(x--)

{

for(i=0;i<13;i++) { }

}

}

void beep(void)

{

uchar i;

for (i=0;i<50:i++)

{

delay 1(4);

BEEP=!BEEP; //BEEP 取反

}

}*/

/*按键扫描函数*/

void keyscan()

{

if(key1==0) //开始计算

{

delay(5); //延时消抖

if(key1==0)

{

while(!key1); //松手检测 TR0=1;

}

}

if(key2==0) //暂停计数

{

delay(5); //延时消抖

if(key2==0)

{

while(!key2); //松手检测 TR0=0;

while(!key 3); //松手检测

num1=24;

TR0=1;

BEEP=1; //关闭蜂鸣器

}

}

}

void init()

{

num1=24;

TMOD=0x01;//设置定时器 0 为工作方式 1

TH0=(65536-50000)?256; //定时器 0 的高八位

TL0=(65536-50000)%256; //定时器0的低八位

EA=1; //开总中断

ET0=1; //开定时器 0 中断

TR0=1; // 启动定时器0 //TOCN 中有 TR0

}

/*数码管显示函数*/

void display(uchar shi,uchar ge)

{

P0=table[shi]; //十位显示

w1=1; w2=0; //选位设置

delay(2);

P0=table[ge]; //个位显示

w1=0; w2=1; //位选设置

delay(2);

if(num1==0) //如果24秒显示完成后,报警 {

TR0=0;

BEEP=0;

}

}

void main()

{

init();

while(1)

{

keyscan( );

if(num==20)

{

num=0;

num1--;

}

ge=num1%10; //个位

shi=num1/10; //十位

display(shi,ge);

}

}

void time1( ) interrupt 1 //定时器计数,50ms产生一次中断

{

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

num++;

}