51开发c语言计时函数 c 计时函数

基于51单片机的999倒计时C语言程序。

/*************************************

成都创新互联公司不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的网站建设、成都网站制作质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式成都全网营销需求,让再小的成都品牌网站建设也能产生价值!

要求是能进行9999秒倒计时

用C语言实现

*************************************/

#includeat89X51.h

#define uchar unsigned char

#define uint unsigned int

uchar num_qian,num_bai,num_shi,num_ge;//定义千位,百位,十位,个位。

uint time;//要显示的时间0~9999

uint tcnt;//计时单元

//*****************//

//以下是端口定义

//*****************//

sbit key_qian=P1^0;//按键"千加1"

sbit key_bai =P1^2;//按键"百加1"

sbit key_shi =P1^4;//按键"十加1"

sbit key_ge =P1^6;//按键"个加1"

sbit laba =P3^1;//喇叭

void delay(unsigned int z)//1毫秒延时子函数

{

unsigned int x,y;

for(x=z;x0;x--)

for(y=110;y0;y--);

}

//*****************//

//以下是七段数码管驱动程序

//*****************//

/**************************************************

** 功能描述: 中断接受字符串驱动程序

**占用引脚资源 P30

**占用系统资源 串口中断;中断向量4

***************************************************/

#define DUAN P0

#define WEI P2

unsigned char code dispcode[]=

{

0x3F,/*0*/

0x06,/*1*/

0x5B,/*2*/

0x4F,/*3*/

0x66,/*4*/

0x6D,/*5*/

0x7D,/*6*/

0x07,/*7*/

0x7F,/*8*/

0x6F,/*9*/

}; //共阴段码表

//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-

uchar code dispbitcode[]=

{0xef,0xdf,0xbf,0x7f}; //共阴位码表

uchar dispbuf[4],dispcount;//开辟四个显示缓冲区

void ledinit()/***初始化子函数,定时器0刷新显示内容***/

{

TMOD|=0x01; // 定时器0方式1

TH0=(65536-5000)/256; //定时器16位模式

TL0=(65536-5000)%256; //溢出时间:5ms

TR0=1; //开启定时器0

ET0=1; //使能定时器0

EA=1; //系统使能

}

void leddisp()//固定显示某些数字

{

dispbuf[0]=time/1000;

dispbuf[1]=time%1000/100;

dispbuf[2]=time%100/10;

dispbuf[3]=time%10;

}

void keytest()//按键检测程序

{

if(!key_qian)//如果千位按键

{

delay(5);//5毫秒延时去抖

if(!key_qian)//如果千位按键的确按下了

{

num_qian++;//千位数字加一

while(!key_qian);//等待按键松开

}

time+=num_qian*1000;//千位数字加1

}

if(!key_bai)//如果百位按键

{

delay(5);//5毫秒延时去抖

if(!key_bai)//如果百位按键的确按下了

{

num_bai++;//百位数字加一

while(!key_bai);//等待按键松开

}

time+=num_bai*100;//百位数字加1

}

if(!key_shi)//如果十位按键

{

delay(5);//5毫秒延时去抖

if(!key_shi)//如果十位按键的确按下了

{

num_shi++;//千位数字加一

while(!key_shi);//等待按键松开

}

time+=num_shi*10;//十位数字加1

}

if(!key_ge)//如果千位按键

{

delay(5);//5毫秒延时去抖

if(!key_ge)//如果个位按键的确按下了

{

num_qian++;//千位数字加一

while(!key_ge);//等待按键松开

}

time+=num_ge;//个位数字加1

}

}

void main()//主程序

{

ledinit();//数码管中断初始化,定时器0刷新显示内容

while(1)//大循环

{

if((!key_qian)||(!key_bai)||(!key_shi)||(!key_ge))//如果四个按键中的任何一个被按下

keytest();//执行按键检测程序

leddisp();//不断的刷新显示内容

}

}

//*************************************************

//以下是定时器0刷新数码管显示内容驱动程序

//*************************************************

/**************************************************

** 功能描述: 七段数码管驱动程序

**占用引脚资源: 数码管段选,数码管位选

**占用系统资源T0

***************************************************/

void t0(void) interrupt 1 //using 0

{

TH0=(65536-5000)/256; //5ms中断

TL0=(65536-5000)%256; //16位定时器模式

WEI=0xff;//关位选

DUAN=dispcode[dispbuf[dispcount]]; //段选

WEI=dispbitcode[dispcount]; //开位选

dispcount++;

if(dispcount==5)

dispcount=0;

tcnt++; //计数个数加一

if(tcnt==5*200)//满足1S了

{

tcnt=0;//计数个数归零

time--;//时间减一

if(time==0)//时间

while(1);

}

if(time10)//时间小于10

laba=~laba;//声音报警

}

这是9999秒倒计时的

用51单片机C语言版设计秒表倒计时

K1 EQU P1.0

K2 EQU P1.1

K3 EQU P1.2

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB ET0

SETB TR0

SETB EA

MOV R0,#9

MOV R1,#9

MOV R2,#0

MOV R3,#99

CLR 00H

CLR 01H

LOOP:

JB K1,LP01

JNB K1,$

CLR 01H

INC R3

CJNE R3,#100,LOOP0

MOV R3,#0

SJMP LOOP0

LP01:

JB K2,LP02

JNB K2,$

CLR 01H

CJNE R3,#0,LP011

MOV R3,#99

SJMP LOOP0

LP011:

DEC R3

SJMP LOOP0

LP02:

JB K3,LOOP

JNB K3,$

SETB 01H

SJMP LOOP

LOOP0:

MOV A,R3

MOV B,#10

DIV AB

MOV R0,B

MOV R1,A

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB TR0

MOV DPTR,#TABLE

T0C:

CPL 00H

JB 00H,T001

MOV P3,#0FDH

MOV A,R1

MOVC A,@A+DPTR

MOV P2,A

SJMP T002

T001:

MOV P3,#0FEH

MOV A,R0

MOVC A,@A+DPTR

MOV P2,A

T002:

JNB 01H,T0E

INC R2

MOV A,R2

CJNE A,#100,T0E

MOV R2,#0

MOV A,R0

JZ T003

DEC R0

SJMP T0E

T003:

MOV A,R1

JZ T004

DEC R1

MOV R0,#9

T0E:

RETI

T004:

CLR 01H

MOV R4,#16

T005:

CPL P0.0

LCALL DELAY

DJNZ R4,T005

RETI

DELAY:

MOV R6,#200

DLY:

MOV R7,#250

DJNZ R7,$

DJNZ R6,DLY

RET

TABLE: ; 共阴极数码管显示代码表

DB 3FH,06H,5BH,4FH,66H ;01234

DB 6DH,7DH,07H,7FH,6FH ;56789

END

51单片机C语言中delay函数是怎么定义和使用的?

定义一个延时xms毫秒的延时函数

void delay(unsigned int xms) // xms代表需要延时的毫秒数

{

unsigned int x,y;

for(x=xms;x》0;x--)

for(y=110;y》0;y--);

}

使用:

void Delay10us(uchar Ms)

{

uchar data i;

for(;Ms》0;Ms--)

for(i=26;i》0;i--);

}

i=[(延时值-1.75)*12/Ms-15]/4

扩展资料

1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。

2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。

3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

51单片机C语言程序中延时函数delay的原理是什么?

原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量

关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。

当然,如果你在汇编中编程,情况就不同了,因为每条指令使用一定数量的机器周期,你当然可以根据所有指令使用的总时间来计算特定延迟的总时间。

扩展资料:

定义延迟XMS毫秒的延迟函数

Voiddelay(unsignedintXMS)//XMS表示需要延迟的毫秒数

无符号intx,y;

For(x=XMS;X0;X-)

For(y=110;Y”0;Y-);

使用:

VoidDelay10us(ucharMs)

Uchar数据我;

(;女士“0;------Ms)

对于(I = 26)我 0;我-);

I=[(延迟值-1.75)*12/ms-15]/4


当前标题:51开发c语言计时函数 c 计时函数
链接地址:http://ybzwz.com/article/dojcdpj.html