单片机设计倒计时器

  • 格式:doc
  • 大小:36.50 KB
  • 文档页数:7

下载文档原格式

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

单片机课程设计实验实验课程题目:倒计时器

班级:

姓名:

学号:

一、实验目的:

学习JD51单片机定时器时间计时处理、按键扫描及LED数码管显示的设计方法。

二、设计要求:

设计一个倒计时器,用数码管显示剩余时间,通电后显示初始值10.00表示设定初始值为10分钟,按开始/取消按钮(K4开关键)开始倒计时,再次按开始/取消按钮(K4开关键)则复位到10.00;复位后可按时间调整按钮(K1与K2开关键)调整倒计时的初始时间,当数码管显示00.00时蜂鸣响6声。

三、程序设计:

#include

#define uchar unsigned char

#define uint unsigned int

uchar Count = 0;

uint fs=0;

sbit BELL = P2^4; //设置P2.4口,为控制蜂鸣器发声的引脚

sbit K1 = P3^2;

sbit K2 = P3^3;

sbit K3 = P3^5;

uchar min = 10 ;

uchar sec = 0 ;

uchar ws[4] = {0x01,0x02,0x04,0x08};

uchar table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管的段码编码 (0-9)

uchar table_d[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带点数码管的段码编码 (0-9)

void delay(void) //误差 0us

{

unsigned char a,b;

for(b=1;b>0;b--)

for(a=7;a>0;a--);

}

void Delay(uint del) // 延时子程序,延时时间为 1ms * del { uint x,j;

for(j=0;j

for(x=0;x<=148;x++);

}

void Delay2(uint m)

{

while(--m);

}

void beep(uint n) //蜂鸣器响N次

{

uint i;

for(i=0;i

{

BELL=0;

Delay2(10000);

BELL=1;

Delay2(10000);

}

}

void Time0_Init() //初始化定时器 11.0592M 50ms

{ EA = 1 ;

TMOD = 0x01;

TH0= 0x4E;

TL0=0x58;

TR0 = 0;

ET0 = 1;

}

void time0() interrupt 1 /*定时器0中断程序*/

{

TH0= 0x4E;

TL0=0x58;

if (Count == 20)

{

Count = 0;

if(sec == 0)

{

if(min == 0)

{

min = 10;

}

else min--;

sec = 59;

}

else sec--;

}

else Count++;

if(min==0&&sec==0) /*调用蜂鸣器程序*/

{

beep(3);

min=0;

sec=0;TR0=0;

}

}

void display(void) //数码管每位动态显示{

P2 = 0xfe;

P0 = table[min/10];

Delay(2);

P2 = 0xfd;

P0 = table_d[min%10];

Delay(2);

P2 = 0xfb;

P0 = table[sec/10];

Delay(2);

P2 = 0xf7;

P0 = table[sec%10];

Delay(2);

P2=0xf0;

delay();

}

void key1() //按键功能函数

{

if(K1==0||K2==0||K3==0) //判断是否有按键按下 { display(); /*调用显示函数*/

if(K3==0)

{

if(K3==0)

{

if(fs==0) /*如果K3按下判定如果fs为0,开始计时*/

{

TR0 = 1;

}

else /*如果fs为1,计时器复位*/

{

min=10;

sec=0;

TR0=0;

}

while(!K3) ; /*按键消抖,每按一次只执行一次*/

Delay(10);

while(!K3) ;

fs=(!fs);

}

}

else if (K1==0) /*按键K1判定函数*/

{

if(K1==0)

{

if(TR0!=1)

{ min++;

if(min==100)

{

min=0;

}

while(!K1); /*按键K1消抖*/

delay();

while(!K1);

}

}

}

else /*按键K2判定函数*/

{ display(); /*调用显示函数*/

if(K2==0)

{

if(TR0!=1)

{ min--;

}

if(min==-1)